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

Commit 58d27f8a authored by Bharat Singh's avatar Bharat Singh
Browse files

[SysUI][Floaty] Add squeeze effect composable implementation

Bug: 399263897
Flag: com.android.systemui.shared.enable_lpp_squeeze_effect
Change-Id: I718729106f4ef161f4d8a4c8bdac3b41fbe294e3
parent 697f3730
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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,
@@ -64,6 +72,8 @@ class TopLevelWindowEffectsTest : SysuiTestCase() {
                lazyViewCapture = viewCapture,
                isViewCaptureEnabled = false
            ),
            keyEventInteractor = keyEventInteractor,
            viewModelFactory = viewModelFactory,
            squeezeEffectInteractor = SqueezeEffectInteractor(
                squeezeEffectRepository = fakeSqueezeEffectRepository
            )
@@ -93,6 +103,7 @@ class TopLevelWindowEffectsTest : SysuiTestCase() {
    fun addViewToWindowWhenSqueezeEffectEnabled() =
        kosmos.runTest {
            fakeSqueezeEffectRepository.isSqueezeEffectEnabled.value = true
            fakeKeyEventRepository.setPowerButtonDown(true)

            underTest.start()

+1 −2
Original line number Diff line number Diff line
@@ -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
@@ -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
+1 −2
Original line number Diff line number Diff line
@@ -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
@@ -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
+24 −7
Original line number Diff line number Diff line
@@ -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
@@ -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() {
@@ -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())
                            }
                        }
                    }
                }
            }
        }
    }

+12 −12
Original line number Diff line number Diff line
@@ -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)
@@ -45,6 +42,9 @@ class EffectsWindowRoot : AbstractComposeView {

    @Composable
    override fun Content() {
        SqueezeEffect()
        SqueezeEffect(
            viewModelFactory = viewModelFactory,
            onEffectFinished = onEffectFinished
        )
    }
}
 No newline at end of file
Loading