summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml4
-rw-r--r--libs/WindowManager/Shell/res/values/dimen.xml8
-rw-r--r--libs/WindowManager/Shell/res/values/strings.xml2
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt111
4 files changed, 87 insertions, 38 deletions
diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml
index 35ef2393bb9b..37596182f05b 100644
--- a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml
+++ b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml
@@ -38,7 +38,7 @@
<Button
android:layout_width="94dp"
android:layout_height="60dp"
- android:id="@+id/maximize_menu_maximize_button"
+ android:id="@+id/maximize_menu_size_toggle_button"
style="?android:attr/buttonBarButtonStyle"
android:stateListAnimator="@null"
android:importantForAccessibility="yes"
@@ -48,7 +48,7 @@
android:alpha="0"/>
<TextView
- android:id="@+id/maximize_menu_maximize_window_text"
+ android:id="@+id/maximize_menu_size_toggle_button_text"
android:layout_width="94dp"
android:layout_height="18dp"
android:textSize="11sp"
diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml
index 1f1565160965..df1e2248872b 100644
--- a/libs/WindowManager/Shell/res/values/dimen.xml
+++ b/libs/WindowManager/Shell/res/values/dimen.xml
@@ -492,8 +492,12 @@
<dimen name="desktop_mode_maximize_menu_buttons_outline_stroke">1dp</dimen>
<!-- The radius of the inner fill of the maximize menu buttons. -->
<dimen name="desktop_mode_maximize_menu_buttons_fill_radius">4dp</dimen>
- <!-- The padding between the outline and fill of the maximize menu buttons. -->
- <dimen name="desktop_mode_maximize_menu_buttons_fill_padding">4dp</dimen>
+ <!-- The padding between the outline and fill of the maximize menu snap and maximize buttons. -->
+ <dimen name="desktop_mode_maximize_menu_snap_and_maximize_buttons_fill_padding">4dp</dimen>
+ <!-- The vertical padding between the outline and fill of the maximize menu restore button. -->
+ <dimen name="desktop_mode_maximize_menu_restore_button_fill_vertical_padding">13dp</dimen>
+ <!-- The horizontal padding between the outline and fill of the maximize menu restore button. -->
+ <dimen name="desktop_mode_maximize_menu_restore_button_fill_horizontal_padding">21dp</dimen>
<!-- The corner radius of the maximize menu. -->
<dimen name="desktop_mode_maximize_menu_corner_radius">8dp</dimen>
diff --git a/libs/WindowManager/Shell/res/values/strings.xml b/libs/WindowManager/Shell/res/values/strings.xml
index 621e2aacd673..afac9f6433a3 100644
--- a/libs/WindowManager/Shell/res/values/strings.xml
+++ b/libs/WindowManager/Shell/res/values/strings.xml
@@ -319,6 +319,8 @@
<string name="desktop_mode_non_resizable_snap_text">App can\'t be moved here</string>
<!-- Accessibility text for the Maximize Menu's maximize button [CHAR LIMIT=NONE] -->
<string name="desktop_mode_maximize_menu_maximize_button_text">Maximize</string>
+ <!-- Accessibility text for the Maximize Menu's restore button [CHAR LIMIT=NONE] -->
+ <string name="desktop_mode_maximize_menu_restore_button_text">Restore</string>
<!-- Accessibility text for the Maximize Menu's snap left button [CHAR LIMIT=NONE] -->
<string name="desktop_mode_maximize_menu_snap_left_button_text">Snap left</string>
<!-- Accessibility text for the Maximize Menu's snap right button [CHAR LIMIT=NONE] -->
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt
index 0cb219ae4b81..3ae5a1afc7e2 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt
@@ -62,6 +62,7 @@ import com.android.wm.shell.R
import com.android.wm.shell.RootTaskDisplayAreaOrganizer
import com.android.wm.shell.common.DisplayController
import com.android.wm.shell.common.SyncTransactionQueue
+import com.android.wm.shell.desktopmode.calculateMaximizeBounds
import com.android.wm.shell.shared.animation.Interpolators.EMPHASIZED_DECELERATE
import com.android.wm.shell.shared.animation.Interpolators.FAST_OUT_LINEAR_IN
import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalViewHostViewContainer
@@ -73,7 +74,8 @@ import java.util.function.Supplier
/**
* Menu that appears when user long clicks the maximize button. Gives the user the option to
- * maximize the task or snap the task to the right or left half of the screen.
+ * maximize the task or restore previous task bounds from the maximized state and to snap the task
+ * to the right or left half of the screen.
*/
class MaximizeMenu(
private val syncQueue: SyncTransactionQueue,
@@ -176,6 +178,7 @@ class MaximizeMenu(
"MaximizeMenu")
maximizeMenuView = MaximizeMenuView(
context = decorWindowContext,
+ sizeToggleDirection = getSizeToggleDirection(),
menuHeight = menuHeight,
menuPadding = menuPadding,
).also { menuView ->
@@ -202,6 +205,18 @@ class MaximizeMenu(
}
}
+ private fun getSizeToggleDirection(): MaximizeMenuView.SizeToggleDirection {
+ val maximizeBounds = calculateMaximizeBounds(
+ displayController.getDisplayLayout(taskInfo.displayId)!!,
+ taskInfo
+ )
+ val maximized = taskInfo.configuration.windowConfiguration.bounds.equals(maximizeBounds)
+ return if (maximized)
+ MaximizeMenuView.SizeToggleDirection.RESTORE
+ else
+ MaximizeMenuView.SizeToggleDirection.MAXIMIZE
+ }
+
private fun loadDimensionPixelSize(resourceId: Int): Int {
return if (resourceId == Resources.ID_NULL) {
0
@@ -236,18 +251,19 @@ class MaximizeMenu(
* resizing a Task.
*/
class MaximizeMenuView(
- context: Context,
+ private val context: Context,
+ private val sizeToggleDirection: SizeToggleDirection,
private val menuHeight: Int,
- private val menuPadding: Int,
+ private val menuPadding: Int
) {
val rootView = LayoutInflater.from(context)
.inflate(R.layout.desktop_mode_window_decor_maximize_menu, null /* root */) as ViewGroup
private val container = requireViewById(R.id.container)
private val overlay = requireViewById(R.id.maximize_menu_overlay)
- private val maximizeText =
- requireViewById(R.id.maximize_menu_maximize_window_text) as TextView
- private val maximizeButton =
- requireViewById(R.id.maximize_menu_maximize_button) as Button
+ private val sizeToggleButtonText =
+ requireViewById(R.id.maximize_menu_size_toggle_button_text) as TextView
+ private val sizeToggleButton =
+ requireViewById(R.id.maximize_menu_size_toggle_button) as Button
private val snapWindowText =
requireViewById(R.id.maximize_menu_snap_window_text) as TextView
private val snapRightButton =
@@ -263,8 +279,6 @@ class MaximizeMenu(
.getDimensionPixelSize(R.dimen.desktop_mode_maximize_menu_buttons_outline_radius)
private val outlineStroke = context.resources
.getDimensionPixelSize(R.dimen.desktop_mode_maximize_menu_buttons_outline_stroke)
- private val fillPadding = context.resources
- .getDimensionPixelSize(R.dimen.desktop_mode_maximize_menu_buttons_fill_padding)
private val fillRadius = context.resources
.getDimensionPixelSize(R.dimen.desktop_mode_maximize_menu_buttons_fill_radius)
@@ -324,7 +338,7 @@ class MaximizeMenu(
return@setOnHoverListener false
}
- maximizeButton.setOnClickListener { onMaximizeClickListener?.invoke() }
+ sizeToggleButton.setOnClickListener { onMaximizeClickListener?.invoke() }
snapRightButton.setOnClickListener { onRightSnapClickListener?.invoke() }
snapLeftButton.setOnClickListener { onLeftSnapClickListener?.invoke() }
rootView.setOnTouchListener { _, event ->
@@ -335,9 +349,17 @@ class MaximizeMenu(
true
}
+ val btnTextId = if (sizeToggleDirection == SizeToggleDirection.RESTORE)
+ R.string.desktop_mode_maximize_menu_restore_button_text
+ else
+ R.string.desktop_mode_maximize_menu_maximize_button_text
+ val btnText = context.resources.getText(btnTextId)
+ sizeToggleButton.contentDescription = btnText
+ sizeToggleButtonText.text = btnText
+
// To prevent aliasing.
- maximizeButton.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
- maximizeText.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
+ sizeToggleButton.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
+ sizeToggleButtonText.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
}
/** Bind the menu views to the new [RunningTaskInfo] data. */
@@ -348,8 +370,8 @@ class MaximizeMenu(
rootView.background.setTint(style.backgroundColor)
// Maximize option.
- maximizeButton.background = style.maximizeOption.drawable
- maximizeText.setTextColor(style.textColor)
+ sizeToggleButton.background = style.maximizeOption.drawable
+ sizeToggleButtonText.setTextColor(style.textColor)
// Snap options.
snapWindowText.setTextColor(style.textColor)
@@ -358,8 +380,8 @@ class MaximizeMenu(
/** Animate the opening of the menu */
fun animateOpenMenu(onEnd: () -> Unit) {
- maximizeButton.setLayerType(View.LAYER_TYPE_HARDWARE, null)
- maximizeText.setLayerType(View.LAYER_TYPE_HARDWARE, null)
+ sizeToggleButton.setLayerType(View.LAYER_TYPE_HARDWARE, null)
+ sizeToggleButtonText.setLayerType(View.LAYER_TYPE_HARDWARE, null)
menuAnimatorSet = AnimatorSet()
menuAnimatorSet?.playTogether(
ObjectAnimator.ofFloat(rootView, SCALE_Y, STARTING_MENU_HEIGHT_SCALE, 1f)
@@ -388,9 +410,9 @@ class MaximizeMenu(
// Scale up the children of the maximize menu so that the menu
// scale is cancelled out and only the background is scaled.
val value = animatedValue as Float
- maximizeButton.scaleY = value
+ sizeToggleButton.scaleY = value
snapButtonsLayout.scaleY = value
- maximizeText.scaleY = value
+ sizeToggleButtonText.scaleY = value
snapWindowText.scaleY = value
}
},
@@ -409,9 +431,9 @@ class MaximizeMenu(
startDelay = CONTROLS_ALPHA_OPEN_MENU_ANIMATION_DELAY_MS
addUpdateListener {
val value = animatedValue as Float
- maximizeButton.alpha = value
+ sizeToggleButton.alpha = value
snapButtonsLayout.alpha = value
- maximizeText.alpha = value
+ sizeToggleButtonText.alpha = value
snapWindowText.alpha = value
}
},
@@ -423,8 +445,8 @@ class MaximizeMenu(
)
menuAnimatorSet?.addListener(
onEnd = {
- maximizeButton.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
- maximizeText.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
+ sizeToggleButton.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
+ sizeToggleButtonText.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
onEnd.invoke()
}
)
@@ -433,8 +455,8 @@ class MaximizeMenu(
/** Animate the closing of the menu */
fun animateCloseMenu(onEnd: (() -> Unit)) {
- maximizeButton.setLayerType(View.LAYER_TYPE_HARDWARE, null)
- maximizeText.setLayerType(View.LAYER_TYPE_HARDWARE, null)
+ sizeToggleButton.setLayerType(View.LAYER_TYPE_HARDWARE, null)
+ sizeToggleButtonText.setLayerType(View.LAYER_TYPE_HARDWARE, null)
cancelAnimation()
menuAnimatorSet = AnimatorSet()
menuAnimatorSet?.playTogether(
@@ -464,9 +486,9 @@ class MaximizeMenu(
// Scale up the children of the maximize menu so that the menu
// scale is cancelled out and only the background is scaled.
val value = animatedValue as Float
- maximizeButton.scaleY = value
+ sizeToggleButton.scaleY = value
snapButtonsLayout.scaleY = value
- maximizeText.scaleY = value
+ sizeToggleButtonText.scaleY = value
snapWindowText.scaleY = value
}
},
@@ -485,9 +507,9 @@ class MaximizeMenu(
duration = ALPHA_ANIMATION_DURATION_MS
addUpdateListener {
val value = animatedValue as Float
- maximizeButton.alpha = value
+ sizeToggleButton.alpha = value
snapButtonsLayout.alpha = value
- maximizeText.alpha = value
+ sizeToggleButtonText.alpha = value
snapWindowText.alpha = value
}
},
@@ -498,8 +520,8 @@ class MaximizeMenu(
)
menuAnimatorSet?.addListener(
onEnd = {
- maximizeButton.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
- maximizeText.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
+ sizeToggleButton.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
+ sizeToggleButtonText.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
onEnd?.invoke()
}
)
@@ -509,8 +531,8 @@ class MaximizeMenu(
/** Request that the accessibility service focus on the menu. */
fun requestAccessibilityFocus() {
// Focus the first button in the menu by default.
- maximizeButton.post {
- maximizeButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)
+ sizeToggleButton.post {
+ sizeToggleButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED)
}
}
@@ -685,15 +707,31 @@ class MaximizeMenu(
paint.color = strokeAndFillColor
paint.style = Paint.Style.FILL
})
+
+ val (horizontalFillPadding, verticalFillPadding) =
+ if (sizeToggleDirection == SizeToggleDirection.MAXIMIZE) {
+ context.resources.getDimensionPixelSize(R.dimen
+ .desktop_mode_maximize_menu_snap_and_maximize_buttons_fill_padding) to
+ context.resources.getDimensionPixelSize(R.dimen
+ .desktop_mode_maximize_menu_snap_and_maximize_buttons_fill_padding)
+ } else {
+ context.resources.getDimensionPixelSize(R.dimen
+ .desktop_mode_maximize_menu_restore_button_fill_horizontal_padding) to
+ context.resources.getDimensionPixelSize(R.dimen
+ .desktop_mode_maximize_menu_restore_button_fill_vertical_padding)
+ }
+
return LayerDrawable(layers.toTypedArray()).apply {
when (numberOfLayers) {
3 -> {
setLayerInset(1, outlineStroke)
- setLayerInset(2, fillPadding)
+ setLayerInset(2, horizontalFillPadding, verticalFillPadding,
+ horizontalFillPadding, verticalFillPadding)
}
4 -> {
setLayerInset(intArrayOf(1, 2), outlineStroke)
- setLayerInset(3, fillPadding)
+ setLayerInset(3, horizontalFillPadding, verticalFillPadding,
+ horizontalFillPadding, verticalFillPadding)
}
else -> error("Unexpected number of layers: $numberOfLayers")
}
@@ -737,6 +775,11 @@ class MaximizeMenu(
enum class SnapToHalfSelection {
NONE, LEFT, RIGHT
}
+
+ /** The possible selection states of the size toggle button in the maximize menu. */
+ enum class SizeToggleDirection {
+ MAXIMIZE, RESTORE
+ }
}
companion object {