Loading packages/SystemUI/multivalentTests/src/com/android/systemui/topwindoweffects/TopLevelWindowEffectsTest.kt +11 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,10 @@ import androidx.test.filters.SmallTest import com.android.app.viewcapture.ViewCapture import com.android.app.viewcapture.ViewCaptureAwareWindowManager import com.android.systemui.SysuiTestCase import com.android.systemui.keyevent.data.repository.fakeKeyEventRepository import com.android.systemui.keyevent.data.repository.keyEventRepository import com.android.systemui.keyevent.domain.interactor.KeyEventInteractor import com.android.systemui.keyevent.domain.interactor.keyEventInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.runTest import com.android.systemui.kosmos.testScope Loading @@ -31,6 +35,7 @@ import com.android.systemui.testKosmos import com.android.systemui.topwindoweffects.data.repository.fakeSqueezeEffectRepository import com.android.systemui.topwindoweffects.domain.interactor.SqueezeEffectInteractor import com.android.systemui.topwindoweffects.ui.compose.EffectsWindowRoot import com.android.systemui.topwindoweffects.ui.viewmodel.SqueezeEffectViewModel import org.junit.Before import org.junit.Test import org.junit.runner.RunWith Loading @@ -55,6 +60,9 @@ class TopLevelWindowEffectsTest : SysuiTestCase() { @Mock private lateinit var viewCapture: Lazy<ViewCapture> @Mock private lateinit var viewModelFactory: SqueezeEffectViewModel.Factory private val Kosmos.underTest by Kosmos.Fixture { TopLevelWindowEffects( context = mContext, Loading @@ -64,6 +72,8 @@ class TopLevelWindowEffectsTest : SysuiTestCase() { lazyViewCapture = viewCapture, isViewCaptureEnabled = false ), keyEventInteractor = keyEventInteractor, viewModelFactory = viewModelFactory, squeezeEffectInteractor = SqueezeEffectInteractor( squeezeEffectRepository = fakeSqueezeEffectRepository ) Loading Loading @@ -93,6 +103,7 @@ class TopLevelWindowEffectsTest : SysuiTestCase() { fun addViewToWindowWhenSqueezeEffectEnabled() = kosmos.runTest { fakeSqueezeEffectRepository.isSqueezeEffectEnabled.value = true fakeKeyEventRepository.setPowerButtonDown(true) underTest.start() Loading packages/SystemUI/multivalentTests/src/com/android/systemui/topwindoweffects/SqueezeEffectRepositoryTest.kt→packages/SystemUI/multivalentTests/src/com/android/systemui/topwindoweffects/data/repository/SqueezeEffectRepositoryTest.kt +1 −2 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ * limitations under the License. */ package com.android.systemui.topwindoweffects package com.android.systemui.topwindoweffects.data.repository import android.os.Handler import android.platform.test.annotations.DisableFlags Loading @@ -30,7 +30,6 @@ import com.android.systemui.kosmos.testScope import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.shared.Flags import com.android.systemui.testKosmos import com.android.systemui.topwindoweffects.data.repository.SqueezeEffectRepositoryImpl import com.android.systemui.util.settings.FakeGlobalSettings import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.test.StandardTestDispatcher Loading packages/SystemUI/multivalentTests/src/com/android/systemui/topwindoweffects/SqueezeEffectInteractorTest.kt→packages/SystemUI/multivalentTests/src/com/android/systemui/topwindoweffects/domain/interactor/SqueezeEffectInteractorTest.kt +1 −2 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ * limitations under the License. */ package com.android.systemui.topwindoweffects package com.android.systemui.topwindoweffects.domain.interactor import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest Loading @@ -25,7 +25,6 @@ import com.android.systemui.kosmos.runTest import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.testKosmos import com.android.systemui.topwindoweffects.data.repository.fakeSqueezeEffectRepository import com.android.systemui.topwindoweffects.domain.interactor.SqueezeEffectInteractor import com.google.common.truth.Truth.assertThat import org.junit.Test import org.junit.runner.RunWith Loading packages/SystemUI/src/com/android/systemui/topwindoweffects/TopLevelWindowEffects.kt +24 −7 Original line number Diff line number Diff line Loading @@ -25,8 +25,10 @@ import com.android.app.viewcapture.ViewCaptureAwareWindowManager import com.android.systemui.CoreStartable import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyevent.domain.interactor.KeyEventInteractor import com.android.systemui.topwindoweffects.domain.interactor.SqueezeEffectInteractor import com.android.systemui.topwindoweffects.ui.compose.EffectsWindowRoot import com.android.systemui.topwindoweffects.ui.viewmodel.SqueezeEffectViewModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch Loading @@ -37,7 +39,9 @@ class TopLevelWindowEffects @Inject constructor( @Application private val context: Context, @Application private val applicationScope: CoroutineScope, private val windowManager: ViewCaptureAwareWindowManager, private val squeezeEffectInteractor: SqueezeEffectInteractor private val squeezeEffectInteractor: SqueezeEffectInteractor, private val keyEventInteractor: KeyEventInteractor, private val viewModelFactory: SqueezeEffectViewModel.Factory ) : CoreStartable { override fun start() { Loading @@ -45,14 +49,27 @@ class TopLevelWindowEffects @Inject constructor( var root: EffectsWindowRoot? = null squeezeEffectInteractor.isSqueezeEffectEnabled.collectLatest { enabled -> // TODO: move window ops to a separate UI thread if (enabled && root == null) { root = EffectsWindowRoot(context) root?.let { windowManager.addView(it, getWindowManagerLayoutParams()) } } else if (root?.isAttachedToWindow == true) { if (enabled) { keyEventInteractor.isPowerButtonDown.collectLatest { down -> // TODO: ignore new window creation when ignoring short power press duration if (down && root == null) { root = EffectsWindowRoot( context = context, viewModelFactory = viewModelFactory, onEffectFinished = { if (root?.isAttachedToWindow == true) { windowManager.removeView(root) root = null } } ) root?.let { windowManager.addView(it, getWindowManagerLayoutParams()) } } } } } } } Loading packages/SystemUI/src/com/android/systemui/topwindoweffects/ui/compose/EffectsWindowRoot.kt +12 −12 Original line number Diff line number Diff line Loading @@ -16,22 +16,19 @@ package com.android.systemui.topwindoweffects.ui.compose import android.annotation.SuppressLint import android.content.Context import android.util.AttributeSet import androidx.compose.runtime.Composable import androidx.compose.ui.platform.AbstractComposeView import com.android.systemui.compose.ComposeInitializer import com.android.systemui.topwindoweffects.ui.viewmodel.SqueezeEffectViewModel class EffectsWindowRoot : AbstractComposeView { constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet) : super(context, attrs) constructor( @SuppressLint("ViewConstructor") class EffectsWindowRoot( context: Context, attrs: AttributeSet, defStyleAttr: Int, ) : super(context, attrs, defStyleAttr) private val onEffectFinished: () -> Unit, private val viewModelFactory: SqueezeEffectViewModel.Factory ) : AbstractComposeView(context) { override fun onAttachedToWindow() { ComposeInitializer.onAttachedToWindow(this) Loading @@ -45,6 +42,9 @@ class EffectsWindowRoot : AbstractComposeView { @Composable override fun Content() { SqueezeEffect() SqueezeEffect( viewModelFactory = viewModelFactory, onEffectFinished = onEffectFinished ) } } No newline at end of file Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/topwindoweffects/TopLevelWindowEffectsTest.kt +11 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,10 @@ import androidx.test.filters.SmallTest import com.android.app.viewcapture.ViewCapture import com.android.app.viewcapture.ViewCaptureAwareWindowManager import com.android.systemui.SysuiTestCase import com.android.systemui.keyevent.data.repository.fakeKeyEventRepository import com.android.systemui.keyevent.data.repository.keyEventRepository import com.android.systemui.keyevent.domain.interactor.KeyEventInteractor import com.android.systemui.keyevent.domain.interactor.keyEventInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.runTest import com.android.systemui.kosmos.testScope Loading @@ -31,6 +35,7 @@ import com.android.systemui.testKosmos import com.android.systemui.topwindoweffects.data.repository.fakeSqueezeEffectRepository import com.android.systemui.topwindoweffects.domain.interactor.SqueezeEffectInteractor import com.android.systemui.topwindoweffects.ui.compose.EffectsWindowRoot import com.android.systemui.topwindoweffects.ui.viewmodel.SqueezeEffectViewModel import org.junit.Before import org.junit.Test import org.junit.runner.RunWith Loading @@ -55,6 +60,9 @@ class TopLevelWindowEffectsTest : SysuiTestCase() { @Mock private lateinit var viewCapture: Lazy<ViewCapture> @Mock private lateinit var viewModelFactory: SqueezeEffectViewModel.Factory private val Kosmos.underTest by Kosmos.Fixture { TopLevelWindowEffects( context = mContext, Loading @@ -64,6 +72,8 @@ class TopLevelWindowEffectsTest : SysuiTestCase() { lazyViewCapture = viewCapture, isViewCaptureEnabled = false ), keyEventInteractor = keyEventInteractor, viewModelFactory = viewModelFactory, squeezeEffectInteractor = SqueezeEffectInteractor( squeezeEffectRepository = fakeSqueezeEffectRepository ) Loading Loading @@ -93,6 +103,7 @@ class TopLevelWindowEffectsTest : SysuiTestCase() { fun addViewToWindowWhenSqueezeEffectEnabled() = kosmos.runTest { fakeSqueezeEffectRepository.isSqueezeEffectEnabled.value = true fakeKeyEventRepository.setPowerButtonDown(true) underTest.start() Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/topwindoweffects/SqueezeEffectRepositoryTest.kt→packages/SystemUI/multivalentTests/src/com/android/systemui/topwindoweffects/data/repository/SqueezeEffectRepositoryTest.kt +1 −2 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ * limitations under the License. */ package com.android.systemui.topwindoweffects package com.android.systemui.topwindoweffects.data.repository import android.os.Handler import android.platform.test.annotations.DisableFlags Loading @@ -30,7 +30,6 @@ import com.android.systemui.kosmos.testScope import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.shared.Flags import com.android.systemui.testKosmos import com.android.systemui.topwindoweffects.data.repository.SqueezeEffectRepositoryImpl import com.android.systemui.util.settings.FakeGlobalSettings import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.test.StandardTestDispatcher Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/topwindoweffects/SqueezeEffectInteractorTest.kt→packages/SystemUI/multivalentTests/src/com/android/systemui/topwindoweffects/domain/interactor/SqueezeEffectInteractorTest.kt +1 −2 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ * limitations under the License. */ package com.android.systemui.topwindoweffects package com.android.systemui.topwindoweffects.domain.interactor import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest Loading @@ -25,7 +25,6 @@ import com.android.systemui.kosmos.runTest import com.android.systemui.kosmos.useUnconfinedTestDispatcher import com.android.systemui.testKosmos import com.android.systemui.topwindoweffects.data.repository.fakeSqueezeEffectRepository import com.android.systemui.topwindoweffects.domain.interactor.SqueezeEffectInteractor import com.google.common.truth.Truth.assertThat import org.junit.Test import org.junit.runner.RunWith Loading
packages/SystemUI/src/com/android/systemui/topwindoweffects/TopLevelWindowEffects.kt +24 −7 Original line number Diff line number Diff line Loading @@ -25,8 +25,10 @@ import com.android.app.viewcapture.ViewCaptureAwareWindowManager import com.android.systemui.CoreStartable import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyevent.domain.interactor.KeyEventInteractor import com.android.systemui.topwindoweffects.domain.interactor.SqueezeEffectInteractor import com.android.systemui.topwindoweffects.ui.compose.EffectsWindowRoot import com.android.systemui.topwindoweffects.ui.viewmodel.SqueezeEffectViewModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch Loading @@ -37,7 +39,9 @@ class TopLevelWindowEffects @Inject constructor( @Application private val context: Context, @Application private val applicationScope: CoroutineScope, private val windowManager: ViewCaptureAwareWindowManager, private val squeezeEffectInteractor: SqueezeEffectInteractor private val squeezeEffectInteractor: SqueezeEffectInteractor, private val keyEventInteractor: KeyEventInteractor, private val viewModelFactory: SqueezeEffectViewModel.Factory ) : CoreStartable { override fun start() { Loading @@ -45,14 +49,27 @@ class TopLevelWindowEffects @Inject constructor( var root: EffectsWindowRoot? = null squeezeEffectInteractor.isSqueezeEffectEnabled.collectLatest { enabled -> // TODO: move window ops to a separate UI thread if (enabled && root == null) { root = EffectsWindowRoot(context) root?.let { windowManager.addView(it, getWindowManagerLayoutParams()) } } else if (root?.isAttachedToWindow == true) { if (enabled) { keyEventInteractor.isPowerButtonDown.collectLatest { down -> // TODO: ignore new window creation when ignoring short power press duration if (down && root == null) { root = EffectsWindowRoot( context = context, viewModelFactory = viewModelFactory, onEffectFinished = { if (root?.isAttachedToWindow == true) { windowManager.removeView(root) root = null } } ) root?.let { windowManager.addView(it, getWindowManagerLayoutParams()) } } } } } } } Loading
packages/SystemUI/src/com/android/systemui/topwindoweffects/ui/compose/EffectsWindowRoot.kt +12 −12 Original line number Diff line number Diff line Loading @@ -16,22 +16,19 @@ package com.android.systemui.topwindoweffects.ui.compose import android.annotation.SuppressLint import android.content.Context import android.util.AttributeSet import androidx.compose.runtime.Composable import androidx.compose.ui.platform.AbstractComposeView import com.android.systemui.compose.ComposeInitializer import com.android.systemui.topwindoweffects.ui.viewmodel.SqueezeEffectViewModel class EffectsWindowRoot : AbstractComposeView { constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet) : super(context, attrs) constructor( @SuppressLint("ViewConstructor") class EffectsWindowRoot( context: Context, attrs: AttributeSet, defStyleAttr: Int, ) : super(context, attrs, defStyleAttr) private val onEffectFinished: () -> Unit, private val viewModelFactory: SqueezeEffectViewModel.Factory ) : AbstractComposeView(context) { override fun onAttachedToWindow() { ComposeInitializer.onAttachedToWindow(this) Loading @@ -45,6 +42,9 @@ class EffectsWindowRoot : AbstractComposeView { @Composable override fun Content() { SqueezeEffect() SqueezeEffect( viewModelFactory = viewModelFactory, onEffectFinished = onEffectFinished ) } } No newline at end of file