Loading libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/multiinstance/ManageWindowsViewContainer.kt +29 −14 Original line number Diff line number Diff line Loading @@ -31,8 +31,11 @@ import android.view.View import android.view.View.ALPHA import android.view.View.SCALE_X import android.view.View.SCALE_Y import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.view.ViewGroup.MarginLayoutParams import android.view.WindowManager import android.widget.LinearLayout import android.widget.ScrollView import android.window.TaskSnapshot import com.android.wm.shell.shared.R Loading Loading @@ -107,14 +110,21 @@ abstract class ManageWindowsViewContainer( ) { private val animators = mutableListOf<Animator>() private val iconViews = mutableListOf<SurfaceView>() val rootView: LinearLayout = LinearLayout(context) var menuHeight = 0 val scrollableMenuView: ScrollView = ScrollView(context).apply { isVerticalScrollBarEnabled = false } private val menuBaseView: LinearLayout = LinearLayout(context) var scrollableMenuHeight = 0 var menuWidth = 0 var onIconClickListener: ((Int) -> Unit)? = null var onOutsideClickListener: (() -> Unit)? = null init { rootView.orientation = LinearLayout.VERTICAL val menuLayoutParams = WindowManager.LayoutParams(WRAP_CONTENT, WRAP_CONTENT) menuLayoutParams.flags = WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE scrollableMenuView.addView(menuBaseView, menuLayoutParams) menuBaseView.orientation = LinearLayout.VERTICAL val menuBackground = ShapeDrawable() val menuRadius = getDimensionPixelSize(MENU_RADIUS_DP) menuBackground.shape = RoundRectShape( Loading @@ -123,13 +133,14 @@ abstract class ManageWindowsViewContainer( null ) menuBackground.paint.color = menuBackgroundColor rootView.background = menuBackground rootView.elevation = getDimensionPixelSize(MENU_ELEVATION_DP) rootView.setOnTouchListener { _, event -> scrollableMenuView.background = menuBackground scrollableMenuView.elevation = getDimensionPixelSize(MENU_ELEVATION_DP) scrollableMenuView.setOnTouchListener { _, event -> if (event.actionMasked == ACTION_OUTSIDE) { onOutsideClickListener?.invoke() } return@setOnTouchListener true // Do not consume a touch event that may be used for menu scrolling. return@setOnTouchListener false } } Loading @@ -142,8 +153,7 @@ abstract class ManageWindowsViewContainer( snapshotList: List<Pair<Int, Bitmap?>> ) { menuWidth = 0 menuHeight = 0 rootView.removeAllViews() menuBaseView.removeAllViews() val instanceIconHeight = getDimensionPixelSize(ICON_HEIGHT_DP) val instanceIconWidth = getDimensionPixelSize(ICON_WIDTH_DP) val iconRadius = getDimensionPixelSize(ICON_RADIUS_DP) Loading @@ -157,8 +167,12 @@ abstract class ManageWindowsViewContainer( if (iconCount % MENU_MAX_ICONS_PER_ROW == 0) { rowLayout = LinearLayout(context) rowLayout.orientation = LinearLayout.HORIZONTAL rootView.addView(rowLayout) menuHeight += (instanceIconHeight + iconMargin).toInt() menuBaseView.addView(rowLayout) val addedHeight = (instanceIconHeight + iconMargin).toInt() // Increase ScrollView height up to the limit. if (iconCount < MENU_MAX_ICONS_PER_ROW * MENU_MAX_ROWS_BEFORE_SCROLL) { scrollableMenuHeight += addedHeight } } val croppedBitmap = snapshotBitmap?.let { cropBitmap(it) } Loading Loading @@ -201,7 +215,7 @@ abstract class ManageWindowsViewContainer( } // Add margin again for the right/bottom of the menu. menuWidth += iconMargin.toInt() menuHeight += iconMargin.toInt() scrollableMenuHeight += iconMargin.toInt() } private fun cropBitmap( Loading Loading @@ -235,7 +249,7 @@ abstract class ManageWindowsViewContainer( /** Play the animation for opening the menu. */ fun animateOpen() { animateView(rootView, MENU_BOUNDS_SHRUNK_SCALE, MENU_BOUNDS_FULL_SCALE, animateView(scrollableMenuView, MENU_BOUNDS_SHRUNK_SCALE, MENU_BOUNDS_FULL_SCALE, MENU_START_ALPHA, MENU_FULL_ALPHA ) for (view in iconViews) { Loading @@ -248,7 +262,7 @@ abstract class ManageWindowsViewContainer( /** Play the animation for closing the menu. */ fun animateClose(callback: () -> Unit) { animateView(rootView, MENU_BOUNDS_FULL_SCALE, MENU_BOUNDS_SHRUNK_SCALE, animateView(scrollableMenuView, MENU_BOUNDS_FULL_SCALE, MENU_BOUNDS_SHRUNK_SCALE, MENU_FULL_ALPHA, MENU_START_ALPHA ) for (view in iconViews) { Loading Loading @@ -317,6 +331,7 @@ abstract class ManageWindowsViewContainer( private const val ICON_MARGIN_DP = 16f private const val MENU_ELEVATION_DP = 1f private const val MENU_MAX_ICONS_PER_ROW = 3 private const val MENU_MAX_ROWS_BEFORE_SCROLL = 2 private const val MENU_BOUNDS_ANIM_DURATION = 200L private const val MENU_BOUNDS_SHRUNK_SCALE = 0.8f private const val MENU_BOUNDS_FULL_SCALE = 1f Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopHandleManageWindowsMenu.kt +2 −2 Original line number Diff line number Diff line Loading @@ -82,10 +82,10 @@ class DesktopHandleManageWindowsMenu( x = menuPosition.x, y = menuPosition.y, width = menuView.menuWidth, height = menuView.menuHeight, height = menuView.scrollableMenuHeight, flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, view = menuView.rootView, view = menuView.scrollableMenuView, ignoreCutouts = desktopState.canEnterDesktopModeOrShowAppHandle, ) } Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopHeaderManageWindowsMenu.kt +6 −6 Original line number Diff line number Diff line Loading @@ -66,8 +66,8 @@ class DesktopHeaderManageWindowsMenu( init { createMenu(snapshotList, onIconClickListener, onOutsideClickListener) menuView.rootView.pivotX = 0f menuView.rootView.pivotY = 0f menuView.scrollableMenuView.pivotX = 0f menuView.scrollableMenuView.pivotY = 0f animateOpen() } Loading Loading @@ -95,10 +95,10 @@ class DesktopHeaderManageWindowsMenu( x = position.x, y = position.y, width = menuView.menuWidth, height = menuView.menuHeight, height = menuView.scrollableMenuHeight, flags = flags, forciblyShownTypes = systemBars(), view = menuView.rootView view = menuView.scrollableMenuView ) } Loading @@ -111,7 +111,7 @@ class DesktopHeaderManageWindowsMenu( .build() val lp = WindowManager.LayoutParams( menuView.menuWidth, menuView.menuHeight, menuView.scrollableMenuHeight, WindowManager.LayoutParams.TYPE_APPLICATION, flags, PixelFormat.TRANSPARENT Loading @@ -126,7 +126,7 @@ class DesktopHeaderManageWindowsMenu( displayController.getDisplay(callerTaskInfo.displayId), windowManager, "MaximizeMenu" ) menuView.let { viewHost.setView(it.rootView, lp) } menuView.let { viewHost.setView(it.scrollableMenuView, lp) } val t = surfaceControlTransactionSupplier.get() t.setLayer(leash, TaskConstants.TASK_CHILD_LAYER_FLOATING_MENU) .setPosition(leash, position.x.toFloat(), position.y.toFloat()) Loading Loading
libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/multiinstance/ManageWindowsViewContainer.kt +29 −14 Original line number Diff line number Diff line Loading @@ -31,8 +31,11 @@ import android.view.View import android.view.View.ALPHA import android.view.View.SCALE_X import android.view.View.SCALE_Y import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.view.ViewGroup.MarginLayoutParams import android.view.WindowManager import android.widget.LinearLayout import android.widget.ScrollView import android.window.TaskSnapshot import com.android.wm.shell.shared.R Loading Loading @@ -107,14 +110,21 @@ abstract class ManageWindowsViewContainer( ) { private val animators = mutableListOf<Animator>() private val iconViews = mutableListOf<SurfaceView>() val rootView: LinearLayout = LinearLayout(context) var menuHeight = 0 val scrollableMenuView: ScrollView = ScrollView(context).apply { isVerticalScrollBarEnabled = false } private val menuBaseView: LinearLayout = LinearLayout(context) var scrollableMenuHeight = 0 var menuWidth = 0 var onIconClickListener: ((Int) -> Unit)? = null var onOutsideClickListener: (() -> Unit)? = null init { rootView.orientation = LinearLayout.VERTICAL val menuLayoutParams = WindowManager.LayoutParams(WRAP_CONTENT, WRAP_CONTENT) menuLayoutParams.flags = WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE scrollableMenuView.addView(menuBaseView, menuLayoutParams) menuBaseView.orientation = LinearLayout.VERTICAL val menuBackground = ShapeDrawable() val menuRadius = getDimensionPixelSize(MENU_RADIUS_DP) menuBackground.shape = RoundRectShape( Loading @@ -123,13 +133,14 @@ abstract class ManageWindowsViewContainer( null ) menuBackground.paint.color = menuBackgroundColor rootView.background = menuBackground rootView.elevation = getDimensionPixelSize(MENU_ELEVATION_DP) rootView.setOnTouchListener { _, event -> scrollableMenuView.background = menuBackground scrollableMenuView.elevation = getDimensionPixelSize(MENU_ELEVATION_DP) scrollableMenuView.setOnTouchListener { _, event -> if (event.actionMasked == ACTION_OUTSIDE) { onOutsideClickListener?.invoke() } return@setOnTouchListener true // Do not consume a touch event that may be used for menu scrolling. return@setOnTouchListener false } } Loading @@ -142,8 +153,7 @@ abstract class ManageWindowsViewContainer( snapshotList: List<Pair<Int, Bitmap?>> ) { menuWidth = 0 menuHeight = 0 rootView.removeAllViews() menuBaseView.removeAllViews() val instanceIconHeight = getDimensionPixelSize(ICON_HEIGHT_DP) val instanceIconWidth = getDimensionPixelSize(ICON_WIDTH_DP) val iconRadius = getDimensionPixelSize(ICON_RADIUS_DP) Loading @@ -157,8 +167,12 @@ abstract class ManageWindowsViewContainer( if (iconCount % MENU_MAX_ICONS_PER_ROW == 0) { rowLayout = LinearLayout(context) rowLayout.orientation = LinearLayout.HORIZONTAL rootView.addView(rowLayout) menuHeight += (instanceIconHeight + iconMargin).toInt() menuBaseView.addView(rowLayout) val addedHeight = (instanceIconHeight + iconMargin).toInt() // Increase ScrollView height up to the limit. if (iconCount < MENU_MAX_ICONS_PER_ROW * MENU_MAX_ROWS_BEFORE_SCROLL) { scrollableMenuHeight += addedHeight } } val croppedBitmap = snapshotBitmap?.let { cropBitmap(it) } Loading Loading @@ -201,7 +215,7 @@ abstract class ManageWindowsViewContainer( } // Add margin again for the right/bottom of the menu. menuWidth += iconMargin.toInt() menuHeight += iconMargin.toInt() scrollableMenuHeight += iconMargin.toInt() } private fun cropBitmap( Loading Loading @@ -235,7 +249,7 @@ abstract class ManageWindowsViewContainer( /** Play the animation for opening the menu. */ fun animateOpen() { animateView(rootView, MENU_BOUNDS_SHRUNK_SCALE, MENU_BOUNDS_FULL_SCALE, animateView(scrollableMenuView, MENU_BOUNDS_SHRUNK_SCALE, MENU_BOUNDS_FULL_SCALE, MENU_START_ALPHA, MENU_FULL_ALPHA ) for (view in iconViews) { Loading @@ -248,7 +262,7 @@ abstract class ManageWindowsViewContainer( /** Play the animation for closing the menu. */ fun animateClose(callback: () -> Unit) { animateView(rootView, MENU_BOUNDS_FULL_SCALE, MENU_BOUNDS_SHRUNK_SCALE, animateView(scrollableMenuView, MENU_BOUNDS_FULL_SCALE, MENU_BOUNDS_SHRUNK_SCALE, MENU_FULL_ALPHA, MENU_START_ALPHA ) for (view in iconViews) { Loading Loading @@ -317,6 +331,7 @@ abstract class ManageWindowsViewContainer( private const val ICON_MARGIN_DP = 16f private const val MENU_ELEVATION_DP = 1f private const val MENU_MAX_ICONS_PER_ROW = 3 private const val MENU_MAX_ROWS_BEFORE_SCROLL = 2 private const val MENU_BOUNDS_ANIM_DURATION = 200L private const val MENU_BOUNDS_SHRUNK_SCALE = 0.8f private const val MENU_BOUNDS_FULL_SCALE = 1f Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopHandleManageWindowsMenu.kt +2 −2 Original line number Diff line number Diff line Loading @@ -82,10 +82,10 @@ class DesktopHandleManageWindowsMenu( x = menuPosition.x, y = menuPosition.y, width = menuView.menuWidth, height = menuView.menuHeight, height = menuView.scrollableMenuHeight, flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, view = menuView.rootView, view = menuView.scrollableMenuView, ignoreCutouts = desktopState.canEnterDesktopModeOrShowAppHandle, ) } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopHeaderManageWindowsMenu.kt +6 −6 Original line number Diff line number Diff line Loading @@ -66,8 +66,8 @@ class DesktopHeaderManageWindowsMenu( init { createMenu(snapshotList, onIconClickListener, onOutsideClickListener) menuView.rootView.pivotX = 0f menuView.rootView.pivotY = 0f menuView.scrollableMenuView.pivotX = 0f menuView.scrollableMenuView.pivotY = 0f animateOpen() } Loading Loading @@ -95,10 +95,10 @@ class DesktopHeaderManageWindowsMenu( x = position.x, y = position.y, width = menuView.menuWidth, height = menuView.menuHeight, height = menuView.scrollableMenuHeight, flags = flags, forciblyShownTypes = systemBars(), view = menuView.rootView view = menuView.scrollableMenuView ) } Loading @@ -111,7 +111,7 @@ class DesktopHeaderManageWindowsMenu( .build() val lp = WindowManager.LayoutParams( menuView.menuWidth, menuView.menuHeight, menuView.scrollableMenuHeight, WindowManager.LayoutParams.TYPE_APPLICATION, flags, PixelFormat.TRANSPARENT Loading @@ -126,7 +126,7 @@ class DesktopHeaderManageWindowsMenu( displayController.getDisplay(callerTaskInfo.displayId), windowManager, "MaximizeMenu" ) menuView.let { viewHost.setView(it.rootView, lp) } menuView.let { viewHost.setView(it.scrollableMenuView, lp) } val t = surfaceControlTransactionSupplier.get() t.setLayer(leash, TaskConstants.TASK_CHILD_LAYER_FLOATING_MENU) .setPosition(leash, position.x.toFloat(), position.y.toFloat()) Loading