diff options
| author | 2024-01-23 22:24:31 +0000 | |
|---|---|---|
| committer | 2024-01-23 22:24:31 +0000 | |
| commit | ac9f7236c3488a770ffece4e17872d6902d49c09 (patch) | |
| tree | 45d12ac559230561a2a4b6ce4eb29b13156aa7ed | |
| parent | b6db54ac7950476d042fb1fe7059cc51ecc76645 (diff) | |
| parent | feaf673f9c3f7464530c234c6a10899a845936ad (diff) | |
Merge "Fix AodNotifIcons overlapping with date view in large weather clock" into main
8 files changed, 102 insertions, 1 deletions
diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml index ec4c7d5bf67e..8ec5ccd7a080 100644 --- a/packages/SystemUI/res/values/ids.xml +++ b/packages/SystemUI/res/values/ids.xml @@ -227,6 +227,7 @@ <item type="id" name="ambient_indication_container" /> <item type="id" name="status_view_media_container" /> <item type="id" name="smart_space_barrier_bottom" /> + <item type="id" name="weather_clock_date_and_icons_barrier_bottom" /> <!-- Privacy dialog --> <item type="id" name="privacy_dialog_close_app_button" /> diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt index 400b8bfff9b0..3c3ebdfc066b 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt @@ -89,6 +89,12 @@ object KeyguardClockViewBinder { } } } + launch { + if (!migrateClocksToBlueprint()) return@launch + viewModel.isAodIconsVisible.collect { + applyConstraints(clockSection, keyguardRootView, true) + } + } } } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt index ed7abff555e7..bc6c7cbf35fb 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt @@ -57,7 +57,6 @@ constructor( private var nicBindingDisposable: DisposableHandle? = null private val nicId = R.id.aod_notification_icon_container private lateinit var nic: NotificationIconContainer - private val smartSpaceBarrier = View.generateViewId() override fun addViews(constraintLayout: ConstraintLayout) { if (!KeyguardShadeMigrationNssl.isEnabled) { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt index b344d3b9afea..a1b3f270f642 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSection.kt @@ -19,6 +19,7 @@ package com.android.systemui.keyguard.ui.view.layout.sections import android.content.Context import android.view.View +import androidx.constraintlayout.widget.Barrier import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintSet import androidx.constraintlayout.widget.ConstraintSet.BOTTOM @@ -35,6 +36,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor import com.android.systemui.keyguard.shared.model.KeyguardSection import com.android.systemui.keyguard.ui.binder.KeyguardClockViewBinder import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel +import com.android.systemui.keyguard.ui.viewmodel.KeyguardSmartspaceViewModel import com.android.systemui.plugins.clocks.ClockController import com.android.systemui.plugins.clocks.ClockFaceLayout import com.android.systemui.res.R @@ -61,6 +63,7 @@ constructor( protected val keyguardClockViewModel: KeyguardClockViewModel, private val context: Context, private val splitShadeStateController: SplitShadeStateController, + val smartspaceViewModel: KeyguardSmartspaceViewModel, val blueprintInteractor: Lazy<KeyguardBlueprintInteractor>, ) : KeyguardSection() { override fun addViews(constraintLayout: ConstraintLayout) {} @@ -117,6 +120,35 @@ constructor( private fun getLargeClockFace(clock: ClockController): ClockFaceLayout = clock.largeClock.layout private fun getSmallClockFace(clock: ClockController): ClockFaceLayout = clock.smallClock.layout + + fun constrainWeatherClockDateIconsBarrier(constraints: ConstraintSet) { + constraints.apply { + if (keyguardClockViewModel.isAodIconsVisible.value) { + createBarrier( + R.id.weather_clock_date_and_icons_barrier_bottom, + Barrier.BOTTOM, + 0, + *intArrayOf(sharedR.id.bc_smartspace_view, R.id.aod_notification_icon_container) + ) + } else { + if (smartspaceViewModel.bcSmartspaceVisibility.value == VISIBLE) { + createBarrier( + R.id.weather_clock_date_and_icons_barrier_bottom, + Barrier.BOTTOM, + 0, + (sharedR.id.bc_smartspace_view) + ) + } else { + createBarrier( + R.id.weather_clock_date_and_icons_barrier_bottom, + Barrier.BOTTOM, + getDimen(ENHANCED_SMARTSPACE_HEIGHT), + (R.id.lockscreen_clock_view) + ) + } + } + } + } open fun applyDefaultConstraints(constraints: ConstraintSet) { val guideline = if (keyguardClockViewModel.clockShouldBeCentered.value) PARENT_ID @@ -173,6 +205,8 @@ constructor( } connect(R.id.lockscreen_clock_view, TOP, PARENT_ID, TOP, smallClockTopMargin) } + + constrainWeatherClockDateIconsBarrier(constraints) } private fun getDimen(name: String): Int { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt index f37d9f801db3..6763e0a1b798 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt @@ -27,6 +27,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.shared.model.SettingsClockSize import com.android.systemui.plugins.clocks.ClockController import com.android.systemui.res.R +import com.android.systemui.statusbar.notification.domain.interactor.NotificationsKeyguardInteractor import com.android.systemui.statusbar.policy.SplitShadeStateController import com.android.systemui.util.Utils import javax.inject.Inject @@ -44,6 +45,7 @@ constructor( private val keyguardClockInteractor: KeyguardClockInteractor, @Application private val applicationScope: CoroutineScope, private val splitShadeStateController: SplitShadeStateController, + notifsKeyguardInteractor: NotificationsKeyguardInteractor, ) { var burnInLayer: Layer? = null val useLargeClock: Boolean @@ -91,6 +93,13 @@ constructor( initialValue = false ) + val isAodIconsVisible: StateFlow<Boolean> = + notifsKeyguardInteractor.areNotificationsFullyHidden.stateIn( + scope = applicationScope, + started = SharingStarted.WhileSubscribed(), + initialValue = false + ) + // Needs to use a non application context to get display cutout. fun getSmallClockTopMargin(context: Context) = if (splitShadeStateController.shouldUseSplitNotificationShade(context.resources)) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt index 57b555989166..acb6ff0192e8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt @@ -19,12 +19,15 @@ package com.android.systemui.keyguard.ui.view.layout.sections import android.content.pm.PackageManager import android.content.res.Resources +import android.view.View.GONE +import android.view.View.VISIBLE import androidx.constraintlayout.widget.ConstraintSet import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel +import com.android.systemui.keyguard.ui.viewmodel.KeyguardSmartspaceViewModel import com.android.systemui.res.R import com.android.systemui.statusbar.policy.SplitShadeStateController import com.android.systemui.util.Utils @@ -49,8 +52,11 @@ class ClockSectionTest : SysuiTestCase() { @Mock private lateinit var keyguardClockInteractor: KeyguardClockInteractor @Mock private lateinit var keyguardClockViewModel: KeyguardClockViewModel @Mock private lateinit var splitShadeStateController: SplitShadeStateController + @Mock private lateinit var smartspaceViewModel: KeyguardSmartspaceViewModel @Mock private lateinit var blueprintInteractor: Lazy<KeyguardBlueprintInteractor> + private val bcSmartspaceVisibility: MutableStateFlow<Int> = MutableStateFlow(VISIBLE) private val clockShouldBeCentered: MutableStateFlow<Boolean> = MutableStateFlow(true) + private val isAodIconsVisible: MutableStateFlow<Boolean> = MutableStateFlow(true) private lateinit var underTest: ClockSection @@ -110,6 +116,8 @@ class ClockSectionTest : SysuiTestCase() { mContext.setMockPackageManager(packageManager) whenever(keyguardClockViewModel.clockShouldBeCentered).thenReturn(clockShouldBeCentered) + whenever(keyguardClockViewModel.isAodIconsVisible).thenReturn(isAodIconsVisible) + whenever(smartspaceViewModel.bcSmartspaceVisibility).thenReturn(bcSmartspaceVisibility) underTest = ClockSection( @@ -117,6 +125,7 @@ class ClockSectionTest : SysuiTestCase() { keyguardClockViewModel, mContext, splitShadeStateController, + smartspaceViewModel, blueprintInteractor ) } @@ -176,6 +185,40 @@ class ClockSectionTest : SysuiTestCase() { assetSmallClockTop(cs, expectedSmallClockTopMargin) } + @Test + fun testSmartspaceVisible_weatherClockDateAndIconsBarrierBottomBelowBCSmartspace() { + isAodIconsVisible.value = false + bcSmartspaceVisibility.value = VISIBLE + val cs = ConstraintSet() + underTest.applyDefaultConstraints(cs) + val referencedIds = cs.getReferencedIds(R.id.weather_clock_date_and_icons_barrier_bottom) + referencedIds.contentEquals(intArrayOf(com.android.systemui.shared.R.id.bc_smartspace_view)) + } + + @Test + fun testSmartspaceGone_weatherClockDateAndIconsBarrierBottomBelowSmartspaceDateWeather() { + isAodIconsVisible.value = false + bcSmartspaceVisibility.value = GONE + val cs = ConstraintSet() + underTest.applyDefaultConstraints(cs) + val referencedIds = cs.getReferencedIds(R.id.weather_clock_date_and_icons_barrier_bottom) + referencedIds.contentEquals(intArrayOf(R.id.lockscreen_clock_view)) + } + + @Test + fun testHasAodIcons_weatherClockDateAndIconsBarrierBottomBelowSmartspaceDateWeather() { + isAodIconsVisible.value = true + val cs = ConstraintSet() + underTest.applyDefaultConstraints(cs) + val referencedIds = cs.getReferencedIds(R.id.weather_clock_date_and_icons_barrier_bottom) + referencedIds.contentEquals( + intArrayOf( + com.android.systemui.shared.R.id.bc_smartspace_view, + R.id.aod_notification_icon_container + ) + ) + } + private fun setLargeClock(useLargeClock: Boolean) { whenever(keyguardClockViewModel.useLargeClock).thenReturn(useLargeClock) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt index 1b4573dafe5e..22a2e93eb10d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt @@ -34,12 +34,14 @@ import com.android.systemui.plugins.clocks.ClockController import com.android.systemui.plugins.clocks.ClockFaceConfig import com.android.systemui.plugins.clocks.ClockFaceController import com.android.systemui.shared.clocks.ClockRegistry +import com.android.systemui.statusbar.notification.domain.interactor.NotificationsKeyguardInteractor import com.android.systemui.statusbar.policy.SplitShadeStateController import com.android.systemui.util.mockito.whenever import com.android.systemui.util.settings.FakeSettings import com.google.common.truth.Truth.assertThat import kotlin.test.Test import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.TestCoroutineScheduler import kotlinx.coroutines.test.TestScope @@ -68,6 +70,8 @@ class KeyguardClockViewModelTest : SysuiTestCase() { @Mock private lateinit var clockFaceConfig: ClockFaceConfig @Mock private lateinit var eventController: ClockEventController @Mock private lateinit var splitShadeStateController: SplitShadeStateController + @Mock private lateinit var notifsKeyguardInteractor: NotificationsKeyguardInteractor + @Mock private lateinit var areNotificationsFullyHidden: Flow<Boolean> @Before fun setup() { @@ -90,12 +94,15 @@ class KeyguardClockViewModelTest : SysuiTestCase() { scope.backgroundScope ) keyguardClockInteractor = KeyguardClockInteractor(keyguardClockRepository) + whenever(notifsKeyguardInteractor.areNotificationsFullyHidden) + .thenReturn(areNotificationsFullyHidden) underTest = KeyguardClockViewModel( keyguardInteractor, keyguardClockInteractor, scope.backgroundScope, splitShadeStateController, + notifsKeyguardInteractor ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt index 5ca0439c1313..4a85909ae996 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt @@ -20,6 +20,7 @@ import com.android.systemui.keyguard.domain.interactor.keyguardClockInteractor import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope +import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationsKeyguardInteractor import com.android.systemui.statusbar.policy.splitShadeStateController val Kosmos.keyguardClockViewModel by @@ -29,5 +30,6 @@ val Kosmos.keyguardClockViewModel by keyguardClockInteractor = keyguardClockInteractor, applicationScope = applicationCoroutineScope, splitShadeStateController = splitShadeStateController, + notifsKeyguardInteractor = notificationsKeyguardInteractor, ) } |