diff --git a/packages/SystemUI/res/drawable/ic_account_circle.xml b/packages/SystemUI/res/drawable/ic_account_circle.xml new file mode 100644 index 0000000000000..5ca99f32771bd --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_account_circle.xml @@ -0,0 +1,24 @@ + + + + diff --git a/packages/SystemUI/res/drawable/ic_account_circle_filled.xml b/packages/SystemUI/res/drawable/ic_account_circle_filled.xml new file mode 100644 index 0000000000000..47c553b521238 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_account_circle_filled.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/packages/SystemUI/res/drawable/ic_manage_users.xml b/packages/SystemUI/res/drawable/ic_manage_users.xml new file mode 100644 index 0000000000000..3a0805de12306 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_manage_users.xml @@ -0,0 +1,23 @@ + + + + diff --git a/packages/SystemUI/res/layout/user_switcher_fullscreen.xml b/packages/SystemUI/res/layout/user_switcher_fullscreen.xml index 7b95cf3cfa34b..1633e52e7a6c5 100644 --- a/packages/SystemUI/res/layout/user_switcher_fullscreen.xml +++ b/packages/SystemUI/res/layout/user_switcher_fullscreen.xml @@ -21,6 +21,7 @@ android:id="@+id/user_switcher_root" android:layout_width="match_parent" android:layout_height="match_parent" + android:layout_marginBottom="64dp" android:layout_marginEnd="60dp" android:layout_marginStart="60dp"> diff --git a/packages/SystemUI/res/layout/user_switcher_fullscreen_popup_item.xml b/packages/SystemUI/res/layout/user_switcher_fullscreen_popup_item.xml index 8d02429150f0f..401c4bdd55b69 100644 --- a/packages/SystemUI/res/layout/user_switcher_fullscreen_popup_item.xml +++ b/packages/SystemUI/res/layout/user_switcher_fullscreen_popup_item.xml @@ -29,17 +29,19 @@ diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index 15147786e557d..faf518e73e6d7 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -88,6 +88,7 @@ #77000000 @android:color/system_neutral1_900 + @*android:color/text_color_primary_device_default_dark #E5FFFFFF diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 3e9e00129bf72..6a34adadcffef 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2404,4 +2404,6 @@ Add @*android:string/supervised_user_creation_label + + Manage users diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java index f1093d18a28b4..7a7af4dcc9354 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java @@ -429,7 +429,7 @@ public class UserSwitcherController implements Dumpable { } boolean createIsRestricted() { - return mAddUsersFromLockScreen; + return !mAddUsersFromLockScreen; } boolean canCreateSupervisedUser() { @@ -1009,9 +1009,9 @@ public class UserSwitcherController implements Dumpable { protected static Drawable getIconDrawable(Context context, UserRecord item) { int iconRes; if (item.isAddUser) { - iconRes = R.drawable.ic_add_circle; + iconRes = R.drawable.ic_account_circle; } else if (item.isGuest) { - iconRes = R.drawable.ic_avatar_guest_user; + iconRes = R.drawable.ic_account_circle_filled; } else if (item.isAddSupervisedUser) { iconRes = R.drawable.ic_add_supervised_user; } else { diff --git a/packages/SystemUI/src/com/android/systemui/user/UserSwitcherActivity.kt b/packages/SystemUI/src/com/android/systemui/user/UserSwitcherActivity.kt index 02e71897500f5..41da44acfbf0a 100644 --- a/packages/SystemUI/src/com/android/systemui/user/UserSwitcherActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/user/UserSwitcherActivity.kt @@ -27,11 +27,10 @@ import android.graphics.drawable.InsetDrawable import android.graphics.drawable.LayerDrawable import android.os.Bundle import android.os.UserManager +import android.provider.Settings import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.view.WindowInsets -import android.view.WindowInsets.Type import android.widget.AdapterView import android.widget.ArrayAdapter import android.widget.ImageView @@ -72,6 +71,17 @@ class UserSwitcherActivity @Inject constructor( private var popupMenu: UserSwitcherPopupMenu? = null private lateinit var addButton: View private var addUserRecords = mutableListOf() + // When the add users options become available, insert another option to manage users + private val manageUserRecord = UserRecord( + null /* info */, + null /* picture */, + false /* isGuest */, + false /* isCurrent */, + false /* isAddUser */, + false /* isRestricted */, + false /* isSwitchToEnabled */, + false /* isAddSupervisedUser */ + ) private val adapter = object : BaseUserAdapter(userSwitcherController) { override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { @@ -103,7 +113,18 @@ class UserSwitcherActivity @Inject constructor( return view } + override fun getName(context: Context, item: UserRecord): String { + return if (item == manageUserRecord) { + getString(R.string.manage_users) + } else { + super.getName(context, item) + } + } + fun findUserIcon(item: UserRecord): Drawable { + if (item == manageUserRecord) { + return getDrawable(R.drawable.ic_manage_users) + } if (item.info == null) { return getIconDrawable(this@UserSwitcherActivity, item) } @@ -168,20 +189,11 @@ class UserSwitcherActivity @Inject constructor( super.onCreate(savedInstanceState) setContentView(R.layout.user_switcher_fullscreen) + window.decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE + or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) - parent = requireViewById(R.id.user_switcher_root).apply { - setOnApplyWindowInsetsListener { - v: View, insets: WindowInsets -> - v.apply { - val l = getPaddingLeft() - val t = getPaddingTop() - val r = getPaddingRight() - setPadding(l, t, r, insets.getInsets(Type.systemBars()).bottom) - } - - WindowInsets.CONSUMED - } - } + parent = requireViewById(R.id.user_switcher_root) requireViewById(R.id.cancel).apply { setOnClickListener { @@ -209,7 +221,12 @@ class UserSwitcherActivity @Inject constructor( R.layout.user_switcher_fullscreen_popup_item, layoutInflater, { item: UserRecord -> adapter.getName(this@UserSwitcherActivity, item) }, - { item: UserRecord -> adapter.findUserIcon(item) } + { item: UserRecord -> adapter.findUserIcon(item).mutate().apply { + setTint(resources.getColor( + R.color.user_switcher_fullscreen_popup_item_tint, + getTheme() + )) + } } ) popupMenuAdapter.addAll(items) @@ -223,10 +240,17 @@ class UserSwitcherActivity @Inject constructor( } // -1 for the header val item = popupMenuAdapter.getItem(pos - 1) - adapter.onUserListItemClicked(item) + if (item == manageUserRecord) { + val i = Intent().setAction(Settings.ACTION_USER_SETTINGS) + this@UserSwitcherActivity.startActivity(i) + } else { + adapter.onUserListItemClicked(item) + } dismiss() popupMenu = null + + this@UserSwitcherActivity.finish() } show() @@ -243,6 +267,7 @@ class UserSwitcherActivity @Inject constructor( } } parent.removeViews(start, count) + addUserRecords.clear() val flow = requireViewById(R.id.flow) for (i in 0 until adapter.getCount()) { @@ -272,6 +297,7 @@ class UserSwitcherActivity @Inject constructor( } if (!addUserRecords.isEmpty()) { + addUserRecords.add(manageUserRecord) addButton.visibility = View.VISIBLE } else { addButton.visibility = View.GONE diff --git a/packages/SystemUI/src/com/android/systemui/user/UserSwitcherPopupMenu.kt b/packages/SystemUI/src/com/android/systemui/user/UserSwitcherPopupMenu.kt index 896354737e463..754a9342bfb0e 100644 --- a/packages/SystemUI/src/com/android/systemui/user/UserSwitcherPopupMenu.kt +++ b/packages/SystemUI/src/com/android/systemui/user/UserSwitcherPopupMenu.kt @@ -42,7 +42,7 @@ class UserSwitcherPopupMenu( setBackgroundDrawable( res.getDrawable(R.drawable.bouncer_user_switcher_popup_bg, context.getTheme()) ) - setModal(true) + setModal(false) setOverlapAnchor(true) }