summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chris Li <lihongyu@google.com> 2021-05-12 22:37:41 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-05-12 22:37:41 +0000
commit806b5b8ed6fdcf85a5958dd4d3cbec98a7406007 (patch)
tree60b7489eae6d99c9314a5e4707bb5f3ba45789c7
parent4d2b82b01fa9eb55238f6cee432bec108c7ee438 (diff)
parent43d99647e4748f2c2faba4e56268c931f6789290 (diff)
Merge "Determine whether to support activities in multi window (5/n)" into sc-dev
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTestCannotPairNonResizeableApps.kt22
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTestSupportPairNonResizeableApps.kt22
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTransition.kt29
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/BaseAppHelper.kt11
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/MultiWindowHelper.kt52
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenNotSupportNonResizable.kt22
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenSupportNonResizable.kt22
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromIntentNotSupportNonResizable.kt22
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromIntentSupportNonResizable.kt22
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromRecentNotSupportNonResizable.kt22
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromRecentSupportNonResizable.kt22
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenTransition.kt19
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java43
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskSupervisor.java3
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java2
-rw-r--r--services/core/java/com/android/server/wm/Task.java32
-rw-r--r--services/core/java/com/android/server/wm/TaskDisplayArea.java32
-rw-r--r--services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java2
-rw-r--r--services/core/java/com/android/server/wm/WindowOrganizerController.java13
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java26
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java44
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java1
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java4
23 files changed, 296 insertions, 193 deletions
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTestCannotPairNonResizeableApps.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTestCannotPairNonResizeableApps.kt
index 1f9ff4ab5638..b5198bb46a38 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTestCannotPairNonResizeableApps.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTestCannotPairNonResizeableApps.kt
@@ -18,7 +18,6 @@ package com.android.wm.shell.flicker.apppairs
import android.os.SystemClock
import android.platform.test.annotations.Presubmit
-import android.provider.Settings
import androidx.test.filters.FlakyTest
import androidx.test.filters.RequiresDevice
import com.android.server.wm.flicker.FlickerParametersRunnerFactory
@@ -27,6 +26,8 @@ import com.android.server.wm.flicker.FlickerTestParameterFactory
import com.android.server.wm.flicker.dsl.FlickerBuilder
import com.android.wm.shell.flicker.appPairsDividerIsInvisible
import com.android.wm.shell.flicker.helpers.AppPairsHelper
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.resetMultiWindowConfig
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.setSupportsNonResizableMultiWindow
import org.junit.After
import org.junit.Before
import org.junit.FixMethodOrder
@@ -49,7 +50,6 @@ import org.junit.runners.Parameterized
class AppPairsTestCannotPairNonResizeableApps(
testSpec: FlickerTestParameter
) : AppPairsTransition(testSpec) {
- var prevSupportNonResizableInMultiWindow = 0
override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit
get() = {
@@ -64,21 +64,15 @@ class AppPairsTestCannotPairNonResizeableApps(
}
@Before
- fun setup() {
- prevSupportNonResizableInMultiWindow = Settings.Global.getInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW)
- if (prevSupportNonResizableInMultiWindow == 1) {
- // Not support non-resizable in multi window
- Settings.Global.putInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW, 0)
- }
+ override fun setup() {
+ super.setup()
+ setSupportsNonResizableMultiWindow(instrumentation, -1)
}
@After
- fun teardown() {
- Settings.Global.putInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW,
- prevSupportNonResizableInMultiWindow)
+ override fun teardown() {
+ super.teardown()
+ resetMultiWindowConfig(instrumentation)
}
@FlakyTest
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTestSupportPairNonResizeableApps.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTestSupportPairNonResizeableApps.kt
index 1e3595c17f48..f2a375bb94f8 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTestSupportPairNonResizeableApps.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTestSupportPairNonResizeableApps.kt
@@ -18,7 +18,6 @@ package com.android.wm.shell.flicker.apppairs
import android.os.SystemClock
import android.platform.test.annotations.Presubmit
-import android.provider.Settings
import androidx.test.filters.FlakyTest
import androidx.test.filters.RequiresDevice
import com.android.server.wm.flicker.FlickerParametersRunnerFactory
@@ -27,6 +26,8 @@ import com.android.server.wm.flicker.FlickerTestParameterFactory
import com.android.server.wm.flicker.dsl.FlickerBuilder
import com.android.wm.shell.flicker.appPairsDividerIsVisible
import com.android.wm.shell.flicker.helpers.AppPairsHelper
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.resetMultiWindowConfig
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.setSupportsNonResizableMultiWindow
import org.junit.After
import org.junit.Before
import org.junit.FixMethodOrder
@@ -49,7 +50,6 @@ import org.junit.runners.Parameterized
class AppPairsTestSupportPairNonResizeableApps(
testSpec: FlickerTestParameter
) : AppPairsTransition(testSpec) {
- var prevSupportNonResizableInMultiWindow = 0
override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit
get() = {
@@ -64,21 +64,15 @@ class AppPairsTestSupportPairNonResizeableApps(
}
@Before
- fun setup() {
- prevSupportNonResizableInMultiWindow = Settings.Global.getInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW)
- if (prevSupportNonResizableInMultiWindow == 0) {
- // Support non-resizable in multi window
- Settings.Global.putInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW, 1)
- }
+ override fun setup() {
+ super.setup()
+ setSupportsNonResizableMultiWindow(instrumentation, 1)
}
@After
- fun teardown() {
- Settings.Global.putInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW,
- prevSupportNonResizableInMultiWindow)
+ override fun teardown() {
+ super.teardown()
+ resetMultiWindowConfig(instrumentation)
}
@FlakyTest
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTransition.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTransition.kt
index 741773e8f61a..1935bb97849c 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTransition.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTransition.kt
@@ -20,11 +20,9 @@ import android.app.Instrumentation
import android.content.Context
import android.platform.test.annotations.Presubmit
import android.system.helpers.ActivityHelper
-import android.util.Log
import android.view.Surface
import androidx.test.filters.FlakyTest
import androidx.test.platform.app.InstrumentationRegistry
-import com.android.compatibility.common.util.SystemUtil
import com.android.server.wm.flicker.FlickerBuilderProvider
import com.android.server.wm.flicker.FlickerTestParameter
import com.android.server.wm.flicker.dsl.FlickerBuilder
@@ -41,10 +39,14 @@ import com.android.server.wm.flicker.statusBarLayerIsAlwaysVisible
import com.android.server.wm.flicker.statusBarLayerRotatesScales
import com.android.server.wm.flicker.statusBarWindowIsAlwaysVisible
import com.android.wm.shell.flicker.helpers.AppPairsHelper
+import com.android.wm.shell.flicker.helpers.BaseAppHelper
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.getDevEnableNonResizableMultiWindow
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.setDevEnableNonResizableMultiWindow
import com.android.wm.shell.flicker.helpers.SplitScreenHelper
import com.android.wm.shell.flicker.testapp.Components
+import org.junit.After
+import org.junit.Before
import org.junit.Test
-import java.io.IOException
abstract class AppPairsTransition(protected val testSpec: FlickerTestParameter) {
protected val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation()
@@ -62,6 +64,21 @@ abstract class AppPairsTransition(protected val testSpec: FlickerTestParameter)
protected var primaryTaskId = ""
protected var secondaryTaskId = ""
protected var nonResizeableTaskId = ""
+ private var prevDevEnableNonResizableMultiWindow = 0
+
+ @Before
+ open fun setup() {
+ prevDevEnableNonResizableMultiWindow = getDevEnableNonResizableMultiWindow(context)
+ if (prevDevEnableNonResizableMultiWindow != 0) {
+ // Turn off the development option
+ setDevEnableNonResizableMultiWindow(context, 0)
+ }
+ }
+
+ @After
+ open fun teardown() {
+ setDevEnableNonResizableMultiWindow(context, prevDevEnableNonResizableMultiWindow)
+ }
@FlickerBuilderProvider
fun buildFlicker(): FlickerBuilder {
@@ -117,11 +134,7 @@ abstract class AppPairsTransition(protected val testSpec: FlickerTestParameter)
}
internal fun executeShellCommand(cmd: String) {
- try {
- SystemUtil.runShellCommand(instrumentation, cmd)
- } catch (e: IOException) {
- Log.d("AppPairsTest", "executeShellCommand error! $e")
- }
+ BaseAppHelper.executeShellCommand(instrumentation, cmd)
}
internal fun composePairsCommand(
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/BaseAppHelper.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/BaseAppHelper.kt
index 006b569146e4..4fe69ad7fabe 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/BaseAppHelper.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/BaseAppHelper.kt
@@ -21,11 +21,14 @@ import android.content.ComponentName
import android.content.pm.PackageManager.FEATURE_LEANBACK
import android.content.pm.PackageManager.FEATURE_LEANBACK_ONLY
import android.support.test.launcherhelper.LauncherStrategyFactory
+import android.util.Log
import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiObject2
import androidx.test.uiautomator.Until
+import com.android.compatibility.common.util.SystemUtil
import com.android.server.wm.flicker.helpers.StandardAppHelper
import com.android.server.wm.traces.parser.toWindowName
+import java.io.IOException
abstract class BaseAppHelper(
instrumentation: Instrumentation,
@@ -56,5 +59,13 @@ abstract class BaseAppHelper(
companion object {
private const val APP_CLOSE_WAIT_TIME_MS = 3_000L
+
+ fun executeShellCommand(instrumentation: Instrumentation, cmd: String) {
+ try {
+ SystemUtil.runShellCommand(instrumentation, cmd)
+ } catch (e: IOException) {
+ Log.e("BaseAppHelper", "executeShellCommand error! $e")
+ }
+ }
}
}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/MultiWindowHelper.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/MultiWindowHelper.kt
new file mode 100644
index 000000000000..7f99e62b36b0
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/MultiWindowHelper.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.flicker.helpers
+
+import android.app.Instrumentation
+import android.content.ComponentName
+import android.content.Context
+import android.provider.Settings
+
+class MultiWindowHelper(
+ instrumentation: Instrumentation,
+ activityLabel: String,
+ componentsInfo: ComponentName
+) : BaseAppHelper(instrumentation, activityLabel, componentsInfo) {
+
+ companion object {
+ fun getDevEnableNonResizableMultiWindow(context: Context): Int =
+ Settings.Global.getInt(context.contentResolver,
+ Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW)
+
+ fun setDevEnableNonResizableMultiWindow(context: Context, configValue: Int) =
+ Settings.Global.putInt(context.contentResolver,
+ Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW, configValue)
+
+ fun setSupportsNonResizableMultiWindow(instrumentation: Instrumentation, configValue: Int) =
+ executeShellCommand(
+ instrumentation,
+ createConfigSupportsNonResizableMultiWindowCommand(configValue))
+
+ fun resetMultiWindowConfig(instrumentation: Instrumentation) =
+ executeShellCommand(instrumentation, resetMultiWindowConfigCommand)
+
+ private fun createConfigSupportsNonResizableMultiWindowCommand(configValue: Int): String =
+ "wm set-multi-window-config --supportsNonResizable $configValue"
+
+ private const val resetMultiWindowConfigCommand: String = "wm reset-multi-window-config"
+ }
+}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenNotSupportNonResizable.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenNotSupportNonResizable.kt
index 04f97c8a4c99..c18c122d974c 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenNotSupportNonResizable.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenNotSupportNonResizable.kt
@@ -17,7 +17,6 @@
package com.android.wm.shell.flicker.legacysplitscreen
import android.platform.test.annotations.Presubmit
-import android.provider.Settings
import android.view.Surface
import androidx.test.filters.RequiresDevice
import com.android.server.wm.flicker.FlickerParametersRunnerFactory
@@ -27,6 +26,8 @@ import com.android.server.wm.flicker.dsl.FlickerBuilder
import com.android.server.wm.flicker.helpers.canSplitScreen
import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper
import com.android.wm.shell.flicker.dockedStackDividerIsInvisible
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.resetMultiWindowConfig
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.setSupportsNonResizableMultiWindow
import com.android.wm.shell.flicker.helpers.SplitScreenHelper
import org.junit.After
import org.junit.Assert
@@ -51,7 +52,6 @@ import org.junit.runners.Parameterized
class EnterSplitScreenNotSupportNonResizable(
testSpec: FlickerTestParameter
) : LegacySplitScreenTransition(testSpec) {
- var prevSupportNonResizableInMultiWindow = 0
override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit
get() = { configuration ->
@@ -76,21 +76,15 @@ class EnterSplitScreenNotSupportNonResizable(
splitScreenApp.defaultWindowName)
@Before
- fun setup() {
- prevSupportNonResizableInMultiWindow = Settings.Global.getInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW)
- if (prevSupportNonResizableInMultiWindow == 1) {
- // Not support non-resizable in multi window
- Settings.Global.putInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW, 0)
- }
+ override fun setup() {
+ super.setup()
+ setSupportsNonResizableMultiWindow(instrumentation, -1)
}
@After
- fun teardown() {
- Settings.Global.putInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW,
- prevSupportNonResizableInMultiWindow)
+ override fun teardown() {
+ super.teardown()
+ resetMultiWindowConfig(instrumentation)
}
@Presubmit
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenSupportNonResizable.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenSupportNonResizable.kt
index 2832bb4d15d4..d5b9a135ba8c 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenSupportNonResizable.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/EnterSplitScreenSupportNonResizable.kt
@@ -17,7 +17,6 @@
package com.android.wm.shell.flicker.legacysplitscreen
import android.platform.test.annotations.Presubmit
-import android.provider.Settings
import android.view.Surface
import androidx.test.filters.RequiresDevice
import com.android.server.wm.flicker.FlickerParametersRunnerFactory
@@ -27,6 +26,8 @@ import com.android.server.wm.flicker.dsl.FlickerBuilder
import com.android.server.wm.flicker.helpers.launchSplitScreen
import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper
import com.android.wm.shell.flicker.dockedStackDividerIsVisible
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.resetMultiWindowConfig
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.setSupportsNonResizableMultiWindow
import com.android.wm.shell.flicker.helpers.SplitScreenHelper
import org.junit.After
import org.junit.Before
@@ -50,7 +51,6 @@ import org.junit.runners.Parameterized
class EnterSplitScreenSupportNonResizable(
testSpec: FlickerTestParameter
) : LegacySplitScreenTransition(testSpec) {
- var prevSupportNonResizableInMultiWindow = 0
override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit
get() = { configuration ->
@@ -73,21 +73,15 @@ class EnterSplitScreenSupportNonResizable(
splitScreenApp.defaultWindowName)
@Before
- fun setup() {
- prevSupportNonResizableInMultiWindow = Settings.Global.getInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW)
- if (prevSupportNonResizableInMultiWindow != 1) {
- // Support non-resizable in multi window
- Settings.Global.putInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW, 1)
- }
+ override fun setup() {
+ super.setup()
+ setSupportsNonResizableMultiWindow(instrumentation, 1)
}
@After
- fun teardown() {
- Settings.Global.putInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW,
- prevSupportNonResizableInMultiWindow)
+ override fun teardown() {
+ super.teardown()
+ resetMultiWindowConfig(instrumentation)
}
@Presubmit
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromIntentNotSupportNonResizable.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromIntentNotSupportNonResizable.kt
index 32afd190af2b..612018e39f13 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromIntentNotSupportNonResizable.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromIntentNotSupportNonResizable.kt
@@ -17,7 +17,6 @@
package com.android.wm.shell.flicker.legacysplitscreen
import android.platform.test.annotations.Presubmit
-import android.provider.Settings
import android.view.Surface
import androidx.test.filters.RequiresDevice
import com.android.server.wm.flicker.FlickerParametersRunnerFactory
@@ -32,6 +31,8 @@ import com.android.server.wm.flicker.layerBecomesVisible
import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper
import com.android.wm.shell.flicker.DOCKED_STACK_DIVIDER
import com.android.wm.shell.flicker.dockedStackDividerIsInvisible
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.resetMultiWindowConfig
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.setSupportsNonResizableMultiWindow
import com.android.wm.shell.flicker.helpers.SplitScreenHelper
import org.junit.After
import org.junit.Before
@@ -53,7 +54,6 @@ import org.junit.runners.Parameterized
class LegacySplitScreenFromIntentNotSupportNonResizable(
testSpec: FlickerTestParameter
) : LegacySplitScreenTransition(testSpec) {
- var prevSupportNonResizableInMultiWindow = 0
override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit
get() = { configuration ->
@@ -77,21 +77,15 @@ class LegacySplitScreenFromIntentNotSupportNonResizable(
WindowManagerStateHelper.SNAPSHOT_WINDOW_NAME)
@Before
- fun setup() {
- prevSupportNonResizableInMultiWindow = Settings.Global.getInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW)
- if (prevSupportNonResizableInMultiWindow == 1) {
- // Not support non-resizable in multi window
- Settings.Global.putInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW, 0)
- }
+ override fun setup() {
+ super.setup()
+ setSupportsNonResizableMultiWindow(instrumentation, -1)
}
@After
- fun teardown() {
- Settings.Global.putInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW,
- prevSupportNonResizableInMultiWindow)
+ override fun teardown() {
+ super.teardown()
+ resetMultiWindowConfig(instrumentation)
}
@Presubmit
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromIntentSupportNonResizable.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromIntentSupportNonResizable.kt
index af307580df3f..65062f9acc7d 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromIntentSupportNonResizable.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromIntentSupportNonResizable.kt
@@ -17,7 +17,6 @@
package com.android.wm.shell.flicker.legacysplitscreen
import android.platform.test.annotations.Presubmit
-import android.provider.Settings
import android.view.Surface
import androidx.test.filters.RequiresDevice
import com.android.server.wm.flicker.FlickerParametersRunnerFactory
@@ -30,6 +29,8 @@ import com.android.server.wm.flicker.layerBecomesVisible
import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper
import com.android.wm.shell.flicker.DOCKED_STACK_DIVIDER
import com.android.wm.shell.flicker.dockedStackDividerIsVisible
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.resetMultiWindowConfig
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.setSupportsNonResizableMultiWindow
import com.android.wm.shell.flicker.helpers.SplitScreenHelper
import org.junit.After
import org.junit.Before
@@ -51,7 +52,6 @@ import org.junit.runners.Parameterized
class LegacySplitScreenFromIntentSupportNonResizable(
testSpec: FlickerTestParameter
) : LegacySplitScreenTransition(testSpec) {
- var prevSupportNonResizableInMultiWindow = 0
override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit
get() = { configuration ->
@@ -75,21 +75,15 @@ class LegacySplitScreenFromIntentSupportNonResizable(
WindowManagerStateHelper.SNAPSHOT_WINDOW_NAME)
@Before
- fun setup() {
- prevSupportNonResizableInMultiWindow = Settings.Global.getInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW)
- if (prevSupportNonResizableInMultiWindow == 0) {
- // Support non-resizable in multi window
- Settings.Global.putInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW, 1)
- }
+ override fun setup() {
+ super.setup()
+ setSupportsNonResizableMultiWindow(instrumentation, 1)
}
@After
- fun teardown() {
- Settings.Global.putInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW,
- prevSupportNonResizableInMultiWindow)
+ override fun teardown() {
+ super.teardown()
+ resetMultiWindowConfig(instrumentation)
}
@Presubmit
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromRecentNotSupportNonResizable.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromRecentNotSupportNonResizable.kt
index 8c6275821b97..37207875e372 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromRecentNotSupportNonResizable.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromRecentNotSupportNonResizable.kt
@@ -17,7 +17,6 @@
package com.android.wm.shell.flicker.legacysplitscreen
import android.platform.test.annotations.Presubmit
-import android.provider.Settings
import android.view.Surface
import androidx.test.filters.RequiresDevice
import com.android.server.wm.flicker.FlickerParametersRunnerFactory
@@ -33,6 +32,8 @@ import com.android.server.wm.flicker.layerBecomesVisible
import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper
import com.android.wm.shell.flicker.DOCKED_STACK_DIVIDER
import com.android.wm.shell.flicker.dockedStackDividerIsInvisible
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.resetMultiWindowConfig
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.setSupportsNonResizableMultiWindow
import com.android.wm.shell.flicker.helpers.SplitScreenHelper
import org.junit.After
import org.junit.Before
@@ -54,7 +55,6 @@ import org.junit.runners.Parameterized
class LegacySplitScreenFromRecentNotSupportNonResizable(
testSpec: FlickerTestParameter
) : LegacySplitScreenTransition(testSpec) {
- var prevSupportNonResizableInMultiWindow = 0
override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit
get() = { configuration ->
@@ -78,21 +78,15 @@ class LegacySplitScreenFromRecentNotSupportNonResizable(
WindowManagerStateHelper.SNAPSHOT_WINDOW_NAME)
@Before
- fun setup() {
- prevSupportNonResizableInMultiWindow = Settings.Global.getInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW)
- if (prevSupportNonResizableInMultiWindow == 1) {
- // Not support non-resizable in multi window
- Settings.Global.putInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW, 0)
- }
+ override fun setup() {
+ super.setup()
+ setSupportsNonResizableMultiWindow(instrumentation, -1)
}
@After
- fun teardown() {
- Settings.Global.putInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW,
- prevSupportNonResizableInMultiWindow)
+ override fun teardown() {
+ super.teardown()
+ resetMultiWindowConfig(instrumentation)
}
@Presubmit
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromRecentSupportNonResizable.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromRecentSupportNonResizable.kt
index 5b48f8a1df1d..61ebcd2af5de 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromRecentSupportNonResizable.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenFromRecentSupportNonResizable.kt
@@ -17,7 +17,6 @@
package com.android.wm.shell.flicker.legacysplitscreen
import android.platform.test.annotations.Presubmit
-import android.provider.Settings
import android.view.Surface
import androidx.test.filters.RequiresDevice
import com.android.server.wm.flicker.FlickerParametersRunnerFactory
@@ -31,6 +30,8 @@ import com.android.server.wm.flicker.layerBecomesVisible
import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper
import com.android.wm.shell.flicker.DOCKED_STACK_DIVIDER
import com.android.wm.shell.flicker.dockedStackDividerIsVisible
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.resetMultiWindowConfig
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.setSupportsNonResizableMultiWindow
import com.android.wm.shell.flicker.helpers.SplitScreenHelper
import org.junit.After
import org.junit.Before
@@ -52,7 +53,6 @@ import org.junit.runners.Parameterized
class LegacySplitScreenFromRecentSupportNonResizable(
testSpec: FlickerTestParameter
) : LegacySplitScreenTransition(testSpec) {
- var prevSupportNonResizableInMultiWindow = 0
override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit
get() = { configuration ->
@@ -76,21 +76,15 @@ class LegacySplitScreenFromRecentSupportNonResizable(
WindowManagerStateHelper.SNAPSHOT_WINDOW_NAME)
@Before
- fun setup() {
- prevSupportNonResizableInMultiWindow = Settings.Global.getInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW)
- if (prevSupportNonResizableInMultiWindow == 0) {
- // Support non-resizable in multi window
- Settings.Global.putInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW, 1)
- }
+ override fun setup() {
+ super.setup()
+ setSupportsNonResizableMultiWindow(instrumentation, 1)
}
@After
- fun teardown() {
- Settings.Global.putInt(context.contentResolver,
- Settings.Global.DEVELOPMENT_ENABLE_NON_RESIZABLE_MULTI_WINDOW,
- prevSupportNonResizableInMultiWindow)
+ override fun teardown() {
+ super.teardown()
+ resetMultiWindowConfig(instrumentation)
}
@Presubmit
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenTransition.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenTransition.kt
index 8684ba52bd52..e8d4d1e9ada2 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenTransition.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/legacysplitscreen/LegacySplitScreenTransition.kt
@@ -32,7 +32,11 @@ import com.android.server.wm.flicker.helpers.wakeUpAndGoToHomeScreen
import com.android.server.wm.flicker.repetitions
import com.android.server.wm.flicker.startRotation
import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.getDevEnableNonResizableMultiWindow
+import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.setDevEnableNonResizableMultiWindow
import com.android.wm.shell.flicker.helpers.SplitScreenHelper
+import org.junit.After
+import org.junit.Before
import org.junit.Test
abstract class LegacySplitScreenTransition(protected val testSpec: FlickerTestParameter) {
@@ -44,6 +48,21 @@ abstract class LegacySplitScreenTransition(protected val testSpec: FlickerTestPa
protected val nonResizeableApp = SplitScreenHelper.getNonResizeable(instrumentation)
protected val LAUNCHER_PACKAGE_NAME = LauncherStrategyFactory.getInstance(instrumentation)
.launcherStrategy.supportedLauncherPackage
+ private var prevDevEnableNonResizableMultiWindow = 0
+
+ @Before
+ open fun setup() {
+ prevDevEnableNonResizableMultiWindow = getDevEnableNonResizableMultiWindow(context)
+ if (prevDevEnableNonResizableMultiWindow != 0) {
+ // Turn off the development option
+ setDevEnableNonResizableMultiWindow(context, 0)
+ }
+ }
+
+ @After
+ open fun teardown() {
+ setDevEnableNonResizableMultiWindow(context, prevDevEnableNonResizableMultiWindow)
+ }
/**
* List of windows that are ignored when verifying that visible elements appear on 2
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 9f51d97d3707..8c4b75bf1622 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -2483,39 +2483,52 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
/**
- * @return whether this activity supports split-screen multi-window and can be put in the docked
- * root task.
+ * @return whether this activity supports split-screen multi-window and can be put in
+ * split-screen.
*/
@Override
public boolean supportsSplitScreenWindowingMode() {
- // An activity can not be docked even if it is considered resizeable because it only
- // supports picture-in-picture mode but has a non-resizeable resizeMode
- return super.supportsSplitScreenWindowingMode()
- && mAtmService.mSupportsSplitScreenMultiWindow && supportsMultiWindow();
+ return supportsSplitScreenWindowingModeInDisplayArea(getDisplayArea());
}
/**
- * @return whether this activity supports freeform multi-window and can be put in the freeform
- * root task.
+ * @return whether this activity supports split-screen multi-window and can be put in
+ * split-screen if it is in the given {@link TaskDisplayArea}.
*/
+ boolean supportsSplitScreenWindowingModeInDisplayArea(@Nullable TaskDisplayArea tda) {
+ return super.supportsSplitScreenWindowingMode()
+ && mAtmService.mSupportsSplitScreenMultiWindow
+ && supportsMultiWindowInDisplayArea(tda);
+ }
+
boolean supportsFreeform() {
- return mAtmService.mSupportsFreeformWindowManagement && supportsMultiWindow();
+ return supportsFreeformInDisplayArea(getDisplayArea());
}
/**
- * @return whether this activity supports multi-window.
+ * @return whether this activity supports freeform multi-window and can be put in the freeform
+ * windowing mode if it is in the given {@link TaskDisplayArea}.
*/
+ boolean supportsFreeformInDisplayArea(@Nullable TaskDisplayArea tda) {
+ return mAtmService.mSupportsFreeformWindowManagement
+ && supportsMultiWindowInDisplayArea(tda);
+ }
+
boolean supportsMultiWindow() {
- return mAtmService.mSupportsMultiWindow && !isActivityTypeHome()
- && (isResizeable() || mAtmService.mDevEnableNonResizableMultiWindow);
+ return supportsMultiWindowInDisplayArea(getDisplayArea());
}
- // TODO(b/176061101) replace supportsMultiWindow() after fixing tests.
- boolean supportsMultiWindow2() {
+ /**
+ * @return whether this activity supports multi-window if it is in the given
+ * {@link TaskDisplayArea}.
+ */
+ boolean supportsMultiWindowInDisplayArea(@Nullable TaskDisplayArea tda) {
+ if (isActivityTypeHome()) {
+ return false;
+ }
if (!mAtmService.mSupportsMultiWindow) {
return false;
}
- final TaskDisplayArea tda = getDisplayArea();
if (tda == null) {
return false;
}
diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
index 8583061a3986..4edcfa907a60 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
@@ -1684,7 +1684,8 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
// Leave the task in its current root task or a fullscreen root task if it isn't
// resizeable and the preferred root task is in multi-window mode.
- if (inMultiWindowMode && !task.supportsMultiWindow()) {
+ if (inMultiWindowMode
+ && !task.supportsMultiWindowInDisplayArea(rootTask.getDisplayArea())) {
Slog.w(TAG, "Can not move unresizeable task=" + task + " to multi-window root task="
+ rootTask + " Moving to a fullscreen root task instead.");
if (prevRootTask != null) {
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index ab7e65cc64e8..0879ddd53a39 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -3046,7 +3046,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
// There is a 1-to-1 relationship between root task and task when not in
// primary split-windowing mode.
if (task.getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY
- && r.supportsSplitScreenWindowingMode()
+ && r.supportsSplitScreenWindowingModeInDisplayArea(task.getDisplayArea())
&& (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY
|| windowingMode == WINDOWING_MODE_UNDEFINED)) {
return true;
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index be01173415a5..3f0915a615a9 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -1977,32 +1977,46 @@ class Task extends WindowContainer<WindowContainer> {
@Override
public boolean supportsSplitScreenWindowingMode() {
+ return supportsSplitScreenWindowingModeInDisplayArea(getDisplayArea());
+ }
+
+ boolean supportsSplitScreenWindowingModeInDisplayArea(@Nullable TaskDisplayArea tda) {
final Task topTask = getTopMostTask();
return super.supportsSplitScreenWindowingMode()
- && (topTask == null || topTask.supportsSplitScreenWindowingModeInner());
+ && (topTask == null || topTask.supportsSplitScreenWindowingModeInner(tda));
}
- private boolean supportsSplitScreenWindowingModeInner() {
+ private boolean supportsSplitScreenWindowingModeInner(@Nullable TaskDisplayArea tda) {
return super.supportsSplitScreenWindowingMode()
&& mAtmService.mSupportsSplitScreenMultiWindow
- && supportsMultiWindow();
+ && supportsMultiWindowInDisplayArea(tda);
}
boolean supportsFreeform() {
- return mAtmService.mSupportsFreeformWindowManagement && supportsMultiWindow();
+ return supportsFreeformInDisplayArea(getDisplayArea());
+ }
+
+ /**
+ * @return whether this task supports freeform multi-window if it is in the given
+ * {@link TaskDisplayArea}.
+ */
+ boolean supportsFreeformInDisplayArea(@Nullable TaskDisplayArea tda) {
+ return mAtmService.mSupportsFreeformWindowManagement
+ && supportsMultiWindowInDisplayArea(tda);
}
boolean supportsMultiWindow() {
- return mAtmService.mSupportsMultiWindow
- && (isResizeable() || mAtmService.mDevEnableNonResizableMultiWindow);
+ return supportsMultiWindowInDisplayArea(getDisplayArea());
}
- // TODO(b/176061101) replace supportsMultiWindow() after fixing tests.
- boolean supportsMultiWindow2() {
+ /**
+ * @return whether this task supports multi-window if it is in the given
+ * {@link TaskDisplayArea}.
+ */
+ boolean supportsMultiWindowInDisplayArea(@Nullable TaskDisplayArea tda) {
if (!mAtmService.mSupportsMultiWindow) {
return false;
}
- final TaskDisplayArea tda = getDisplayArea();
if (tda == null) {
return false;
}
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java
index 368e6dd610e8..ccfdb8c23679 100644
--- a/services/core/java/com/android/server/wm/TaskDisplayArea.java
+++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java
@@ -1614,18 +1614,18 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> {
boolean supportsPip = mAtmService.mSupportsPictureInPicture;
if (supportsMultiWindow) {
if (task != null) {
- supportsSplitScreen = task.supportsSplitScreenWindowingMode();
- supportsFreeform = task.supportsFreeform();
- supportsMultiWindow = task.supportsMultiWindow()
+ supportsSplitScreen = task.supportsSplitScreenWindowingModeInDisplayArea(this);
+ supportsFreeform = task.supportsFreeformInDisplayArea(this);
+ supportsMultiWindow = task.supportsMultiWindowInDisplayArea(this)
// When the activity needs to be moved to PIP while the Task is not in PIP,
// it can be moved to a new created PIP Task, so WINDOWING_MODE_PINNED is
// always valid for Task as long as the device supports it.
|| (windowingMode == WINDOWING_MODE_PINNED && supportsPip);
} else if (r != null) {
- supportsSplitScreen = r.supportsSplitScreenWindowingMode();
- supportsFreeform = r.supportsFreeform();
+ supportsSplitScreen = r.supportsSplitScreenWindowingModeInDisplayArea(this);
+ supportsFreeform = r.supportsFreeformInDisplayArea(this);
supportsPip = r.supportsPictureInPicture();
- supportsMultiWindow = r.supportsMultiWindow();
+ supportsMultiWindow = r.supportsMultiWindowInDisplayArea(this);
}
}
@@ -2078,14 +2078,15 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> {
task.finishAllActivitiesImmediately();
} else {
// Reparent task to corresponding launch root or display area.
- final WindowContainer launchRoot = task.supportsSplitScreenWindowingMode()
- ? toDisplayArea.getLaunchRootTask(
- task.getWindowingMode(),
- task.getActivityType(),
- null /* options */,
- null /* sourceTask */,
- 0 /* launchFlags */)
- : null;
+ final WindowContainer launchRoot =
+ task.supportsSplitScreenWindowingModeInDisplayArea(toDisplayArea)
+ ? toDisplayArea.getLaunchRootTask(
+ task.getWindowingMode(),
+ task.getActivityType(),
+ null /* options */,
+ null /* sourceTask */,
+ 0 /* launchFlags */)
+ : null;
task.reparent(launchRoot == null ? toDisplayArea : launchRoot, POSITION_TOP);
// Set the windowing mode to undefined by default to let the root task inherited the
@@ -2101,7 +2102,8 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> {
if (lastReparentedRootTask != null) {
if (toDisplayArea.isSplitScreenModeActivated()
- && !lastReparentedRootTask.supportsSplitScreenWindowingMode()) {
+ && !lastReparentedRootTask.supportsSplitScreenWindowingModeInDisplayArea(
+ toDisplayArea)) {
// Dismiss split screen if the last reparented root task doesn't support split mode.
mAtmService.getTaskChangeNotificationController()
.notifyActivityDismissingDockedRootTask();
diff --git a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
index 0bc799996abb..cc0471c30f5f 100644
--- a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
+++ b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java
@@ -612,7 +612,7 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier {
private boolean shouldLaunchUnresizableAppInFreeform(ActivityRecord activity,
TaskDisplayArea displayArea) {
- if (!activity.supportsFreeform() || activity.isResizeable()) {
+ if (!activity.supportsFreeformInDisplayArea(displayArea) || activity.isResizeable()) {
return false;
}
diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java
index c29211f3bb65..2ff36838611c 100644
--- a/services/core/java/com/android/server/wm/WindowOrganizerController.java
+++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java
@@ -569,14 +569,15 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
if (newParent.asTaskDisplayArea() != null) {
// For now, reparenting to displayarea is different from other reparents...
as.reparent(newParent.asTaskDisplayArea(), hop.getToTop());
- } else {
+ } else if (newParent.asTask() != null) {
if (newParent.inMultiWindowMode() && task.isLeafTask()) {
if (newParent.inPinnedWindowingMode()) {
Slog.w(TAG, "Can't support moving a task to another PIP window..."
+ " newParent=" + newParent + " task=" + task);
return 0;
}
- if (!task.supportsMultiWindow()) {
+ if (!task.supportsMultiWindowInDisplayArea(
+ newParent.asTask().getDisplayArea())) {
Slog.w(TAG, "Can't support task that doesn't support multi-window"
+ " mode in multi-window mode... newParent=" + newParent
+ " task=" + task);
@@ -586,6 +587,9 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
task.reparent((Task) newParent,
hop.getToTop() ? POSITION_TOP : POSITION_BOTTOM,
false /*moveParents*/, "sanitizeAndApplyHierarchyOp");
+ } else {
+ throw new RuntimeException("Can only reparent task to another task or"
+ + " taskDisplayArea, but not " + newParent);
}
} else {
final Task rootTask = (Task) (
@@ -641,6 +645,9 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
}
final boolean newParentInMultiWindow = newParent.inMultiWindowMode();
+ final TaskDisplayArea newParentTda = newParent.asTask() != null
+ ? newParent.asTask().getDisplayArea()
+ : newParent.asTaskDisplayArea();
final WindowContainer finalCurrentParent = currentParent;
Slog.i(TAG, "reparentChildrenTasksHierarchyOp"
+ " currentParent=" + currentParent + " newParent=" + newParent + " hop=" + hop);
@@ -656,7 +663,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
// are reparenting from.
return;
}
- if (newParentInMultiWindow && !task.supportsMultiWindow()) {
+ if (newParentInMultiWindow && !task.supportsMultiWindowInDisplayArea(newParentTda)) {
Slog.e(TAG, "reparentChildrenTasksHierarchyOp non-resizeable task to multi window,"
+ " task=" + task);
return;
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
index ddaf3ab617d0..9a89626458c7 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -2034,20 +2034,29 @@ public class ActivityRecordTests extends WindowTestsBase {
.setScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE)
.build();
- // Non-resizable
+ // Not allow non-resizable
mAtm.mForceResizableActivities = false;
+ mAtm.mSupportsNonResizableMultiWindow = -1;
mAtm.mDevEnableNonResizableMultiWindow = false;
assertFalse(activity.supportsSplitScreenWindowingMode());
// Force resizable
mAtm.mForceResizableActivities = true;
+ mAtm.mSupportsNonResizableMultiWindow = -1;
mAtm.mDevEnableNonResizableMultiWindow = false;
assertTrue(activity.supportsSplitScreenWindowingMode());
- // Allow non-resizable
+ // Use development option to allow non-resizable
mAtm.mForceResizableActivities = false;
+ mAtm.mSupportsNonResizableMultiWindow = -1;
mAtm.mDevEnableNonResizableMultiWindow = true;
assertTrue(activity.supportsSplitScreenWindowingMode());
+
+ // Always allow non-resizable
+ mAtm.mForceResizableActivities = false;
+ mAtm.mSupportsNonResizableMultiWindow = 1;
+ mAtm.mDevEnableNonResizableMultiWindow = false;
+ assertTrue(activity.supportsSplitScreenWindowingMode());
}
@Test
@@ -2058,20 +2067,29 @@ public class ActivityRecordTests extends WindowTestsBase {
.setScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE)
.build();
- // Non-resizable
+ // Not allow non-resizable
mAtm.mForceResizableActivities = false;
+ mAtm.mSupportsNonResizableMultiWindow = -1;
mAtm.mDevEnableNonResizableMultiWindow = false;
assertFalse(activity.supportsFreeform());
// Force resizable
mAtm.mForceResizableActivities = true;
+ mAtm.mSupportsNonResizableMultiWindow = -1;
mAtm.mDevEnableNonResizableMultiWindow = false;
assertTrue(activity.supportsFreeform());
- // Allow non-resizable
+ // Use development option to allow non-resizable
mAtm.mForceResizableActivities = false;
+ mAtm.mSupportsNonResizableMultiWindow = -1;
mAtm.mDevEnableNonResizableMultiWindow = true;
assertTrue(activity.supportsFreeform());
+
+ // Always allow non-resizable
+ mAtm.mForceResizableActivities = false;
+ mAtm.mSupportsNonResizableMultiWindow = 1;
+ mAtm.mDevEnableNonResizableMultiWindow = false;
+ assertTrue(activity.supportsFreeform());
}
@Test
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
index 618de21bb158..2558259370d2 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
@@ -320,8 +320,8 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase {
.build();
final Task task = activity.getTask();
- assertTrue(activity.supportsMultiWindow2());
- assertTrue(task.supportsMultiWindow2());
+ assertTrue(activity.supportsMultiWindow());
+ assertTrue(task.supportsMultiWindow());
}
@Test
@@ -336,14 +336,14 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase {
// Device config as not support.
mAtm.mSupportsNonResizableMultiWindow = -1;
- assertFalse(activity.supportsMultiWindow2());
- assertFalse(task.supportsMultiWindow2());
+ assertFalse(activity.supportsMultiWindow());
+ assertFalse(task.supportsMultiWindow());
// Device config as always support.
mAtm.mSupportsNonResizableMultiWindow = 1;
- assertTrue(activity.supportsMultiWindow2());
- assertTrue(task.supportsMultiWindow2());
+ assertTrue(activity.supportsMultiWindow());
+ assertTrue(task.supportsMultiWindow());
// The default config is relying on the screen size.
mAtm.mSupportsNonResizableMultiWindow = 0;
@@ -351,14 +351,14 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase {
// Supports on large screen.
tda.getConfiguration().smallestScreenWidthDp = mAtm.mLargeScreenSmallestScreenWidthDp;
- assertTrue(activity.supportsMultiWindow2());
- assertTrue(task.supportsMultiWindow2());
+ assertTrue(activity.supportsMultiWindow());
+ assertTrue(task.supportsMultiWindow());
// Not supports on small screen.
tda.getConfiguration().smallestScreenWidthDp = mAtm.mLargeScreenSmallestScreenWidthDp - 1;
- assertFalse(activity.supportsMultiWindow2());
- assertFalse(task.supportsMultiWindow2());
+ assertFalse(activity.supportsMultiWindow());
+ assertFalse(task.supportsMultiWindow());
}
@Test
@@ -381,14 +381,14 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase {
// Ignore the activity min width/height for determine multi window eligibility.
mAtm.mRespectsActivityMinWidthHeightMultiWindow = -1;
- assertTrue(activity.supportsMultiWindow2());
- assertTrue(task.supportsMultiWindow2());
+ assertTrue(activity.supportsMultiWindow());
+ assertTrue(task.supportsMultiWindow());
// Always check the activity min width/height.
mAtm.mRespectsActivityMinWidthHeightMultiWindow = 1;
- assertFalse(activity.supportsMultiWindow2());
- assertFalse(task.supportsMultiWindow2());
+ assertFalse(activity.supportsMultiWindow());
+ assertFalse(task.supportsMultiWindow());
// The default config is relying on the screen size.
mAtm.mRespectsActivityMinWidthHeightMultiWindow = 0;
@@ -396,14 +396,14 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase {
// Ignore on large screen.
tda.getConfiguration().smallestScreenWidthDp = mAtm.mLargeScreenSmallestScreenWidthDp;
- assertTrue(activity.supportsMultiWindow2());
- assertTrue(task.supportsMultiWindow2());
+ assertTrue(activity.supportsMultiWindow());
+ assertTrue(task.supportsMultiWindow());
// Check on small screen.
tda.getConfiguration().smallestScreenWidthDp = mAtm.mLargeScreenSmallestScreenWidthDp - 1;
- assertFalse(activity.supportsMultiWindow2());
- assertFalse(task.supportsMultiWindow2());
+ assertFalse(activity.supportsMultiWindow());
+ assertFalse(task.supportsMultiWindow());
}
@Test
@@ -429,14 +429,14 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase {
// Always check the activity min width/height.
mAtm.mSupportsNonResizableMultiWindow = 1;
- assertTrue(activity.supportsMultiWindow2());
- assertTrue(task.supportsMultiWindow2());
+ assertTrue(activity.supportsMultiWindow());
+ assertTrue(task.supportsMultiWindow());
// The default config is relying on the screen size. Check for small screen
mAtm.mSupportsNonResizableMultiWindow = 0;
- assertTrue(activity.supportsMultiWindow2());
- assertTrue(task.supportsMultiWindow2());
+ assertTrue(activity.supportsMultiWindow());
+ assertTrue(task.supportsMultiWindow());
}
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java
index 61b700253d6b..42ef08630500 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SystemServicesTestRule.java
@@ -488,6 +488,7 @@ public class SystemServicesTestRule implements TestRule {
mLargeScreenSmallestScreenWidthDp = 600;
mSupportsNonResizableMultiWindow = 0;
mRespectsActivityMinWidthHeightMultiWindow = 0;
+ mForceResizableActivities = false;
doReturn(mock(IPackageManager.class)).when(this).getPackageManager();
// allow background activity starts by default
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
index 8c87befef4f9..3f1248a5fff7 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java
@@ -1193,13 +1193,13 @@ public class WindowOrganizerTests extends WindowTestsBase {
splitPrimaryRootTask.mRemoteToken.toWindowContainerToken(), true /* onTop */);
// Can't reparent non-resizable to split screen
- mAtm.mDevEnableNonResizableMultiWindow = false;
+ mAtm.mSupportsNonResizableMultiWindow = -1;
mAtm.mWindowOrganizerController.applyTransaction(wct);
assertEquals(rootTask, activity.getRootTask());
// Allow reparent non-resizable to split screen
- mAtm.mDevEnableNonResizableMultiWindow = true;
+ mAtm.mSupportsNonResizableMultiWindow = 1;
mAtm.mWindowOrganizerController.applyTransaction(wct);
assertEquals(splitPrimaryRootTask, activity.getRootTask());