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)
}