From 3a05ab65b1c3712c45a27981d83265f63986616e Mon Sep 17 00:00:00 2001 From: Aaron Liu Date: Wed, 19 Oct 2022 16:10:56 -0700 Subject: [PATCH] [User Switcher] Change layout of menu. Change the layout of the menu in the fullscreen user switcher such that manage users is in its own partiion. Also add some dividers between the items. Fixes: 253609111 Test: I tested by going to the fullscreen user switcher menu on a large screen device. I have changed the orientation of the activity from portrait to landscape with the menu open. I have open and closed the menu repeatedly. I have clicked on all of the options of the menu as well. Change-Id: Ib6e74197f4bd6a28f1ae6371189c805ec5fcbf6f --- ...lscreen_userswitcher_menu_item_divider.xml | 20 +++++ .../SystemUI/res-keyguard/values/dimens.xml | 1 + .../systemui/user/UserSwitcherPopupMenu.kt | 4 +- .../user/ui/binder/UserSwitcherViewBinder.kt | 74 +++++++++++++------ 4 files changed, 73 insertions(+), 26 deletions(-) create mode 100644 packages/SystemUI/res-keyguard/drawable/fullscreen_userswitcher_menu_item_divider.xml diff --git a/packages/SystemUI/res-keyguard/drawable/fullscreen_userswitcher_menu_item_divider.xml b/packages/SystemUI/res-keyguard/drawable/fullscreen_userswitcher_menu_item_divider.xml new file mode 100644 index 0000000000000..de0e526a97c33 --- /dev/null +++ b/packages/SystemUI/res-keyguard/drawable/fullscreen_userswitcher_menu_item_divider.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res-keyguard/values/dimens.xml b/packages/SystemUI/res-keyguard/values/dimens.xml index 46f6ab2399d1d..0a55cf779683a 100644 --- a/packages/SystemUI/res-keyguard/values/dimens.xml +++ b/packages/SystemUI/res-keyguard/values/dimens.xml @@ -119,6 +119,7 @@ 248dp 12dp 4dp + 2dp 10dp 12dp 44dp diff --git a/packages/SystemUI/src/com/android/systemui/user/UserSwitcherPopupMenu.kt b/packages/SystemUI/src/com/android/systemui/user/UserSwitcherPopupMenu.kt index ee785b62bd509..088cd93bdf7e5 100644 --- a/packages/SystemUI/src/com/android/systemui/user/UserSwitcherPopupMenu.kt +++ b/packages/SystemUI/src/com/android/systemui/user/UserSwitcherPopupMenu.kt @@ -36,9 +36,7 @@ class UserSwitcherPopupMenu( private var adapter: ListAdapter? = null init { - setBackgroundDrawable( - res.getDrawable(R.drawable.bouncer_user_switcher_popup_bg, context.getTheme()) - ) + setBackgroundDrawable(null) setModal(false) setOverlapAnchor(true) } diff --git a/packages/SystemUI/src/com/android/systemui/user/ui/binder/UserSwitcherViewBinder.kt b/packages/SystemUI/src/com/android/systemui/user/ui/binder/UserSwitcherViewBinder.kt index 938417f9dbe39..968af59e6c453 100644 --- a/packages/SystemUI/src/com/android/systemui/user/ui/binder/UserSwitcherViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/user/ui/binder/UserSwitcherViewBinder.kt @@ -18,12 +18,15 @@ package com.android.systemui.user.ui.binder import android.content.Context +import android.view.Gravity import android.view.LayoutInflater import android.view.MotionEvent import android.view.View import android.view.ViewGroup import android.widget.BaseAdapter import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.LinearLayout.SHOW_DIVIDER_MIDDLE import android.widget.TextView import androidx.constraintlayout.helper.widget.Flow as FlowWidget import androidx.core.view.isVisible @@ -36,6 +39,7 @@ import com.android.systemui.R import com.android.systemui.classifier.FalsingCollector import com.android.systemui.user.UserSwitcherPopupMenu import com.android.systemui.user.UserSwitcherRootView +import com.android.systemui.user.shared.model.UserActionModel import com.android.systemui.user.ui.viewmodel.UserActionViewModel import com.android.systemui.user.ui.viewmodel.UserSwitcherViewModel import com.android.systemui.util.children @@ -168,15 +172,10 @@ object UserSwitcherViewBinder { onDismissed: () -> Unit, ): UserSwitcherPopupMenu { return UserSwitcherPopupMenu(context).apply { + this.setDropDownGravity(Gravity.END) this.anchorView = anchorView setAdapter(adapter) setOnDismissListener { onDismissed() } - setOnItemClickListener { _, _, position, _ -> - val itemPositionExcludingHeader = position - 1 - adapter.getItem(itemPositionExcludingHeader).onClicked() - dismiss() - } - show() } } @@ -186,38 +185,67 @@ object UserSwitcherViewBinder { private val layoutInflater: LayoutInflater, ) : BaseAdapter() { - private val items = mutableListOf() + private var sections = listOf>() override fun getCount(): Int { - return items.size + return sections.size } - override fun getItem(position: Int): UserActionViewModel { - return items[position] + override fun getItem(position: Int): List { + return sections[position] } override fun getItemId(position: Int): Long { - return getItem(position).viewKey + return position.toLong() } override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { - val view = - convertView - ?: layoutInflater.inflate( + val section = getItem(position) + val context = parent.context + val sectionView = + convertView as? LinearLayout + ?: LinearLayout(context, null).apply { + this.orientation = LinearLayout.VERTICAL + this.background = + parent.resources.getDrawable( + R.drawable.bouncer_user_switcher_popup_bg, + context.theme + ) + this.showDividers = SHOW_DIVIDER_MIDDLE + this.dividerDrawable = + context.getDrawable( + R.drawable.fullscreen_userswitcher_menu_item_divider + ) + } + sectionView.removeAllViewsInLayout() + + for (viewModel in section) { + val view = + layoutInflater.inflate( R.layout.user_switcher_fullscreen_popup_item, - parent, - false + /* parent= */ null ) - val viewModel = getItem(position) - view.requireViewById(R.id.icon).setImageResource(viewModel.iconResourceId) - view.requireViewById(R.id.text).text = - view.resources.getString(viewModel.textResourceId) - return view + view + .requireViewById(R.id.icon) + .setImageResource(viewModel.iconResourceId) + view.requireViewById(R.id.text).text = + view.resources.getString(viewModel.textResourceId) + view.setOnClickListener { viewModel.onClicked() } + sectionView.addView(view) + } + return sectionView } fun setItems(items: List) { - this.items.clear() - this.items.addAll(items) + val primarySection = + items.filter { + it.viewKey != UserActionModel.NAVIGATE_TO_USER_MANAGEMENT.ordinal.toLong() + } + val secondarySection = + items.filter { + it.viewKey == UserActionModel.NAVIGATE_TO_USER_MANAGEMENT.ordinal.toLong() + } + this.sections = listOf(primarySection, secondarySection) notifyDataSetChanged() } }