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

Commit 454655dd authored by Lucas Silva's avatar Lucas Silva Committed by Android (Google) Code Review
Browse files

Merge changes Iaf357542,I0b27572f,Iddb908b3 into main

* changes:
  Only listen to AppWidgetHost if communal is showing
  Fix widget view memory leak on hub
  Avoid transitioning to GH from dozing/AOD when occluded
parents 071205eb 865d8ce1
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -1314,6 +1314,16 @@ flag {
  is_fixed_read_only: true
}

flag {
  name: "restrict_communal_app_widget_host_listening"
  namespace: "systemui"
  description: "Only listens to AppWidgetHost when the communal hub is showing"
  bug: "406044666"
  metadata {
    purpose: PURPOSE_BUGFIX
  }
}

flag {
    name: "dream_overlay_updated_font"
    namespace: "systemui"
+24 −0
Original line number Diff line number Diff line
@@ -140,6 +140,30 @@ class CommunalAppWidgetViewModelTest(flags: FlagsParameterization) : SysuiTestCa
                )
        }

    @Test
    fun removeListener() =
        kosmos.runTest {
            val listener = mock<AppWidgetHostListener>()

            underTest.setListener(123, listener)
            runAll()
            underTest.removeListener(123)

            verify(appWidgetHost).removeListener(123)
        }

    @Test
    fun removeListener_HSUM() =
        kosmos.runTest {
            fakeGlanceableHubMultiUserHelper.setIsInHeadlessSystemUser(true)
            val listener = mock<AppWidgetHostListener>()

            underTest.setListener(123, listener)
            runAll()

            verify(listener).updateAppWidget(any())
        }

    private fun Kosmos.runAll() {
        runCurrent()
        fakeExecutor.runAllReady()
+36 −3
Original line number Diff line number Diff line
@@ -18,15 +18,20 @@ package com.android.systemui.communal.widgets

import android.appwidget.AppWidgetProviderInfo
import android.content.pm.UserInfo
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.Flags.FLAG_COMMUNAL_HUB
import com.android.systemui.Flags.FLAG_RESTRICT_COMMUNAL_APP_WIDGET_HOST_LISTENING
import com.android.systemui.SysuiTestCase
import com.android.systemui.communal.data.repository.fakeCommunalWidgetRepository
import com.android.systemui.communal.domain.interactor.CommunalInteractor
import com.android.systemui.communal.domain.interactor.communalInteractor
import com.android.systemui.communal.domain.interactor.communalSceneInteractor
import com.android.systemui.communal.domain.interactor.communalSettingsInteractor
import com.android.systemui.communal.domain.interactor.setCommunalEnabled
import com.android.systemui.communal.shared.model.CommunalScenes
import com.android.systemui.communal.shared.model.FakeGlanceableHubMultiUserHelper
import com.android.systemui.communal.shared.model.fakeGlanceableHubMultiUserHelper
import com.android.systemui.coroutines.collectLastValue
@@ -35,12 +40,13 @@ import com.android.systemui.flags.fakeFeatureFlagsClassic
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.kosmos.runCurrent
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testDispatcher
import com.android.systemui.kosmos.testScope
import com.android.systemui.settings.fakeUserTracker
import com.android.systemui.testKosmos
import com.android.systemui.user.data.repository.fakeUserRepository
import com.android.systemui.user.domain.interactor.userLockedInteractor
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.flow.MutableSharedFlow
@@ -96,7 +102,6 @@ class CommunalAppWidgetHostStartableTest : SysuiTestCase() {
                kosmos.testDispatcher,
                { widgetManager },
                helper,
                kosmos.userLockedInteractor,
            )
    }

@@ -122,7 +127,8 @@ class CommunalAppWidgetHostStartableTest : SysuiTestCase() {
        }

    @Test
    fun communalShowingStartsAppWidgetHost() =
    @DisableFlags(FLAG_RESTRICT_COMMUNAL_APP_WIDGET_HOST_LISTENING)
    fun communalAvailableStartsAppWidgetHost() =
        with(kosmos) {
            testScope.runTest {
                setCommunalAvailable(true)
@@ -142,6 +148,33 @@ class CommunalAppWidgetHostStartableTest : SysuiTestCase() {
            }
        }

    @Test
    @EnableFlags(FLAG_RESTRICT_COMMUNAL_APP_WIDGET_HOST_LISTENING)
    fun communalShowingStartsAppWidgetHost() =
        kosmos.runTest {
            setCommunalAvailable(true)
            communalInteractor.setEditModeOpen(false)

            verify(appWidgetHost, never()).startListening()

            underTest.start()
            runCurrent()

            verify(appWidgetHost, never()).startListening()
            verify(appWidgetHost, never()).stopListening()

            communalSceneInteractor.changeScene(CommunalScenes.Communal, "test")
            runCurrent()

            verify(appWidgetHost).startListening()
            verify(appWidgetHost, never()).stopListening()

            communalSceneInteractor.changeScene(CommunalScenes.Blank, "test")
            runCurrent()

            verify(appWidgetHost).stopListening()
        }

    @Test
    fun communalAndEditModeNotShowingNeverStartListening() =
        with(kosmos) {
+23 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
import com.android.systemui.keyguard.util.KeyguardTransitionRepositorySpySubject.Companion.assertThat
import com.android.systemui.kosmos.advanceTimeBy
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testScope
@@ -71,6 +72,7 @@ import com.android.systemui.statusbar.domain.interactor.keyguardOcclusionInterac
import com.android.systemui.testKosmos
import com.google.common.truth.Truth
import junit.framework.Assert.assertEquals
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.advanceTimeBy
import kotlinx.coroutines.test.runCurrent
@@ -464,6 +466,27 @@ class FromAodTransitionInteractorTest : SysuiTestCase() {
                .startedTransition(from = KeyguardState.AOD, to = KeyguardState.LOCKSCREEN)
        }

    @Test
    @EnableFlags(FLAG_GLANCEABLE_HUB_V2)
    fun testTransitionToOccluded_onWakeUpFromAod_whenGlanceableHubEnabled() =
        kosmos.runTest {
            setCommunalV2Available(true)
            fakeKeyguardRepository.setKeyguardOccluded(true)

            val currentScene by collectLastValue(communalSceneInteractor.currentScene)
            fakeCommunalSceneRepository.changeScene(CommunalScenes.Blank)

            // Communal is not showing
            Truth.assertThat(currentScene).isEqualTo(CommunalScenes.Blank)

            powerInteractor.setAwakeForTest()
            advanceTimeBy(100.milliseconds) // account for debouncing

            Truth.assertThat(currentScene).isEqualTo(CommunalScenes.Blank)
            assertThat(transitionRepository)
                .startedTransition(from = KeyguardState.AOD, to = KeyguardState.OCCLUDED)
        }

    /** Regression test for b/348583197. */
    @Test
    fun testTransitionToAod_ifOccludedDuringTransitingToAod_fromGone() =
+24 −0
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.util.KeyguardTransitionRepositorySpySubject.Companion.assertThat
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.advanceTimeBy
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runTest
@@ -60,6 +61,7 @@ import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.testKosmos
import com.google.common.truth.Truth
import junit.framework.Assert.assertEquals
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.advanceTimeBy
@@ -247,6 +249,28 @@ class FromDozingTransitionInteractorTest(flags: FlagsParameterization?) : SysuiT
                .startedTransition(from = KeyguardState.DOZING, to = KeyguardState.LOCKSCREEN)
        }

    @Test
    @DisableFlags(FLAG_KEYGUARD_WM_STATE_REFACTOR, FLAG_SCENE_CONTAINER)
    fun testTransitionOccluded_onWakeup_ifGlanceableHubAvailableAndOccluded() =
        kosmos.runTest {
            setCommunalAvailable(true)
            fakeKeyguardRepository.setKeyguardOccluded(true)
            if (!glanceableHubV2()) {
                whenever(dreamManager.canStartDreaming(anyBoolean())).thenReturn(true)
            }

            // Device turns on.
            powerInteractor.setAwakeForTest()
            advanceTimeBy(100.milliseconds)

            // We do not transition to the hub.
            Truth.assertThat(communalSceneRepository.currentScene.value)
                .isEqualTo(CommunalScenes.Blank)
            // No transitions are directly started by this interactor.
            assertThat(transitionRepository)
                .startedTransition(from = KeyguardState.DOZING, to = KeyguardState.OCCLUDED)
        }

    @Test
    @EnableFlags(FLAG_KEYGUARD_WM_STATE_REFACTOR)
    fun testTransitionToOccluded_onWakeup_whenOccludingActivityOnTop() =
Loading