Loading packages/SystemUI/aconfig/systemui.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -2040,6 +2040,16 @@ flag { } } flag { name: "clear_shortcut_icon_tint" namespace: "systemui" description: "Clear any tint present on incoming lockscreen shortcuts icons" bug: "394282762" metadata { purpose: PURPOSE_BUGFIX } } flag { name: "screen_off_animation_guard_enabled" namespace: "systemui" Loading packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModel.kt +14 −4 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ package com.android.systemui.keyguard.ui.viewmodel import androidx.annotation.VisibleForTesting import com.android.app.tracing.FlowTracing.traceEmissionCount import com.android.app.tracing.coroutines.flow.flowName import com.android.systemui.Flags import com.android.systemui.common.shared.model.Icon import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardQuickAffordanceInteractor Loading @@ -29,7 +31,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.quickaffordance.ActivationState import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancePosition import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.shared.Flags import com.android.systemui.shared.Flags as SharedFlags import com.android.systemui.shared.keyguard.shared.model.KeyguardQuickAffordanceSlots import com.android.systemui.utils.coroutines.flow.flatMapLatestConflated import javax.inject.Inject Loading Loading @@ -159,7 +161,7 @@ constructor( /** An observable for the view-model of the "start button" quick affordance. */ val startButton: Flow<KeyguardQuickAffordanceViewModel> = if (Flags.newCustomizationPickerUi()) { if (SharedFlags.newCustomizationPickerUi()) { previewAffordances.flatMapLatestConflated { button( position = KeyguardQuickAffordancePosition.BOTTOM_START, Loading @@ -172,7 +174,7 @@ constructor( /** An observable for the view-model of the "end button" quick affordance. */ val endButton: Flow<KeyguardQuickAffordanceViewModel> = if (Flags.newCustomizationPickerUi()) { if (SharedFlags.newCustomizationPickerUi()) { previewAffordances.flatMapLatestConflated { button( position = KeyguardQuickAffordancePosition.BOTTOM_END, Loading Loading @@ -297,7 +299,7 @@ constructor( configKey = configKey, isVisible = true, animateReveal = animateReveal, icon = icon, icon = nonTintedIcon(icon), onClicked = { parameters -> quickAffordanceInteractor.onQuickAffordanceTriggered( configKey = parameters.configKey, Loading @@ -317,6 +319,14 @@ constructor( } } @VisibleForTesting fun nonTintedIcon(icon: Icon): Icon = if (Flags.clearShortcutIconTint() && icon is Icon.Loaded) { icon.apply { drawable.setTintList(null) } } else { icon } companion object { // We select a value that's less than 1.0 because we want floating point math precision to // not be a factor in determining whether the affordance UI is fully opaque. The number we Loading packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt +31 −0 Original line number Diff line number Diff line Loading @@ -19,7 +19,9 @@ package com.android.systemui.keyguard.ui.viewmodel import android.app.admin.DevicePolicyManager import android.content.Intent import android.graphics.drawable.Drawable import android.os.UserHandle import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest Loading Loading @@ -89,6 +91,9 @@ import org.mockito.ArgumentMatchers import org.mockito.Mock import org.mockito.Mockito import org.mockito.MockitoAnnotations import org.mockito.kotlin.isNull import org.mockito.kotlin.verify import org.mockito.kotlin.verifyNoInteractions @SmallTest @RunWith(AndroidJUnit4::class) Loading Loading @@ -350,6 +355,32 @@ class KeyguardQuickAffordancesCombinedViewModelTest : SysuiTestCase() { ) } @Test @EnableFlags(com.android.systemui.Flags.FLAG_CLEAR_SHORTCUT_ICON_TINT) fun nonTintedIcon_clearsTintFromIcon() = testScope.runTest { val icon: Icon.Loaded = mock() val drawable: Drawable = mock() whenever(icon.drawable).thenReturn(drawable) underTest.nonTintedIcon(icon) verify(drawable).setTintList(isNull()) } @Test @DisableFlags(com.android.systemui.Flags.FLAG_CLEAR_SHORTCUT_ICON_TINT) fun nonTintedIcon_noInteractionWithDrawable() = testScope.runTest { val icon: Icon.Loaded = mock() val drawable: Drawable = mock() whenever(icon.drawable).thenReturn(drawable) underTest.nonTintedIcon(icon) verifyNoInteractions(drawable) } @Test fun startButton_hiddenWhenDevicePolicyDisablesAllKeyguardFeatures() = testScope.runTest { Loading Loading
packages/SystemUI/aconfig/systemui.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -2040,6 +2040,16 @@ flag { } } flag { name: "clear_shortcut_icon_tint" namespace: "systemui" description: "Clear any tint present on incoming lockscreen shortcuts icons" bug: "394282762" metadata { purpose: PURPOSE_BUGFIX } } flag { name: "screen_off_animation_guard_enabled" namespace: "systemui" Loading
packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModel.kt +14 −4 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ package com.android.systemui.keyguard.ui.viewmodel import androidx.annotation.VisibleForTesting import com.android.app.tracing.FlowTracing.traceEmissionCount import com.android.app.tracing.coroutines.flow.flowName import com.android.systemui.Flags import com.android.systemui.common.shared.model.Icon import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardQuickAffordanceInteractor Loading @@ -29,7 +31,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.quickaffordance.ActivationState import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancePosition import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.shared.Flags import com.android.systemui.shared.Flags as SharedFlags import com.android.systemui.shared.keyguard.shared.model.KeyguardQuickAffordanceSlots import com.android.systemui.utils.coroutines.flow.flatMapLatestConflated import javax.inject.Inject Loading Loading @@ -159,7 +161,7 @@ constructor( /** An observable for the view-model of the "start button" quick affordance. */ val startButton: Flow<KeyguardQuickAffordanceViewModel> = if (Flags.newCustomizationPickerUi()) { if (SharedFlags.newCustomizationPickerUi()) { previewAffordances.flatMapLatestConflated { button( position = KeyguardQuickAffordancePosition.BOTTOM_START, Loading @@ -172,7 +174,7 @@ constructor( /** An observable for the view-model of the "end button" quick affordance. */ val endButton: Flow<KeyguardQuickAffordanceViewModel> = if (Flags.newCustomizationPickerUi()) { if (SharedFlags.newCustomizationPickerUi()) { previewAffordances.flatMapLatestConflated { button( position = KeyguardQuickAffordancePosition.BOTTOM_END, Loading Loading @@ -297,7 +299,7 @@ constructor( configKey = configKey, isVisible = true, animateReveal = animateReveal, icon = icon, icon = nonTintedIcon(icon), onClicked = { parameters -> quickAffordanceInteractor.onQuickAffordanceTriggered( configKey = parameters.configKey, Loading @@ -317,6 +319,14 @@ constructor( } } @VisibleForTesting fun nonTintedIcon(icon: Icon): Icon = if (Flags.clearShortcutIconTint() && icon is Icon.Loaded) { icon.apply { drawable.setTintList(null) } } else { icon } companion object { // We select a value that's less than 1.0 because we want floating point math precision to // not be a factor in determining whether the affordance UI is fully opaque. The number we Loading
packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt +31 −0 Original line number Diff line number Diff line Loading @@ -19,7 +19,9 @@ package com.android.systemui.keyguard.ui.viewmodel import android.app.admin.DevicePolicyManager import android.content.Intent import android.graphics.drawable.Drawable import android.os.UserHandle import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest Loading Loading @@ -89,6 +91,9 @@ import org.mockito.ArgumentMatchers import org.mockito.Mock import org.mockito.Mockito import org.mockito.MockitoAnnotations import org.mockito.kotlin.isNull import org.mockito.kotlin.verify import org.mockito.kotlin.verifyNoInteractions @SmallTest @RunWith(AndroidJUnit4::class) Loading Loading @@ -350,6 +355,32 @@ class KeyguardQuickAffordancesCombinedViewModelTest : SysuiTestCase() { ) } @Test @EnableFlags(com.android.systemui.Flags.FLAG_CLEAR_SHORTCUT_ICON_TINT) fun nonTintedIcon_clearsTintFromIcon() = testScope.runTest { val icon: Icon.Loaded = mock() val drawable: Drawable = mock() whenever(icon.drawable).thenReturn(drawable) underTest.nonTintedIcon(icon) verify(drawable).setTintList(isNull()) } @Test @DisableFlags(com.android.systemui.Flags.FLAG_CLEAR_SHORTCUT_ICON_TINT) fun nonTintedIcon_noInteractionWithDrawable() = testScope.runTest { val icon: Icon.Loaded = mock() val drawable: Drawable = mock() whenever(icon.drawable).thenReturn(drawable) underTest.nonTintedIcon(icon) verifyNoInteractions(drawable) } @Test fun startButton_hiddenWhenDevicePolicyDisablesAllKeyguardFeatures() = testScope.runTest { Loading