Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 39f53566 authored by Alexander Hendrich's avatar Alexander Hendrich
Browse files

[flexiglass] Fix blurry user switcher icon for default image

The UserSwitcherInteractor serves the user's image as Drawable. In case the user doesn't have an image, it serves a vector graphic as Drawable as default.
Later on, when we want to draw the user's image in the UI for the user switcher on bouncer, we generate a bitmap out of the Drawable in BouncerOverlayContentViewModel. Without providing a desired size, the resulting bitmap has 48x48px resolution. The displayed image however has a size of 190dp, resulting in the vector graphic being displayed as an upscaled and pixelated image.

This CL fixes this by providing a desired size for the Drawable to Bitmap conversion. For users that already have an image, there should be no change as the Drawable is already generated from a Bitmap with the same size.

I'm using the same bouncer_user_switcher_icon_size value everywhere now.

Fixes: 419279298
Test: manual
Flag: com.android.systemui.scene_container
Change-Id: I9f3d537410595c1f02f1b2e3b23d3bc944cf2bc4
parent 5a136f7b
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.semantics.role
@@ -860,6 +861,8 @@ private fun UserSwitcher(viewModel: BouncerOverlayContentViewModel, modifier: Mo

    val selectedUserImage by viewModel.selectedUserImage.collectAsStateWithLifecycle(null)
    val dropdownItems by viewModel.userSwitcherDropdown.collectAsStateWithLifecycle(emptyList())
    val userSwitcherIconSize = dimensionResource(R.dimen.bouncer_user_switcher_icon_size)
    val dropDownWidth = userSwitcherIconSize + UserSwitcherDropdownExtraWidth

    Column(
        horizontalAlignment = Alignment.CenterHorizontally,
@@ -870,7 +873,7 @@ private fun UserSwitcher(viewModel: BouncerOverlayContentViewModel, modifier: Mo
            Image(
                bitmap = it.asImageBitmap(),
                contentDescription = null,
                modifier = Modifier.size(SelectedUserImageSize).sysuiResTag("user_icon"),
                modifier = Modifier.size(userSwitcherIconSize).sysuiResTag("user_icon"),
            )
        }

@@ -885,7 +888,7 @@ private fun UserSwitcher(viewModel: BouncerOverlayContentViewModel, modifier: Mo
                        Modifier
                            // Remove the built-in padding applied inside PlatformButton:
                            .padding(vertical = 0.dp)
                            .width(UserSwitcherDropdownWidth)
                            .width(dropDownWidth)
                            .height(UserSwitcherDropdownHeight),
                    colors =
                        ButtonDefaults.buttonColors(
@@ -914,6 +917,7 @@ private fun UserSwitcher(viewModel: BouncerOverlayContentViewModel, modifier: Mo
                UserSwitcherDropdownMenu(
                    isExpanded = isDropdownExpanded,
                    items = dropdownItems,
                    dropDownWidth = dropDownWidth,
                    onDismissed = { setDropdownExpanded(false) },
                )
            }
@@ -929,6 +933,7 @@ private fun UserSwitcher(viewModel: BouncerOverlayContentViewModel, modifier: Mo
private fun UserSwitcherDropdownMenu(
    isExpanded: Boolean,
    items: List<BouncerOverlayContentViewModel.UserSwitcherDropdownItemViewModel>,
    dropDownWidth: Dp,
    onDismissed: () -> Unit,
) {
    val context = LocalContext.current
@@ -945,7 +950,7 @@ private fun UserSwitcherDropdownMenu(
            expanded = isExpanded,
            onDismissRequest = onDismissed,
            offset = DpOffset(x = 0.dp, y = -UserSwitcherDropdownHeight),
            modifier = Modifier.width(UserSwitcherDropdownWidth).sysuiResTag("user_list_dropdown"),
            modifier = Modifier.width(dropDownWidth).sysuiResTag("user_list_dropdown"),
        ) {
            items.forEach { userSwitcherDropdownItem ->
                DropdownMenuItem(
@@ -1001,8 +1006,7 @@ private fun animatedAlpha(offset: Float): Float {
    return max(0f, (a * (abs(offset) - m).pow(2) + b).toFloat())
}

private val SelectedUserImageSize = 190.dp
private val UserSwitcherDropdownWidth = SelectedUserImageSize + 2 * 29.dp
private val UserSwitcherDropdownExtraWidth = 2 * 29.dp
private val UserSwitcherDropdownHeight = 60.dp

private object SceneKeys {
+8 −1
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.keyguard.domain.interactor.KeyguardDismissActionInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardMediaKeyInteractor
import com.android.systemui.lifecycle.ExclusiveActivatable
import com.android.systemui.res.R
import com.android.systemui.user.ui.viewmodel.UserSwitcherViewModel
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
@@ -180,7 +181,13 @@ constructor(

            launch {
                userSwitcher.selectedUser
                    .map { it.image.toBitmap() }
                    .map {
                        val iconSize =
                            applicationContext.resources.getDimensionPixelSize(
                                R.dimen.bouncer_user_switcher_icon_size
                            )
                        it.image.toBitmap(iconSize, iconSize)
                    }
                    .collect { _selectedUserImage.value = it }
            }