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

Commit 0bc3b285 authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[CS] 3/4: Move back gesture callback registration to back interactor.

Bug: 296050180
Test: open QS customization -> do back gesture -> verify customization
is closed (verified with flag on and off)
Test: open full QS -> do back gesture -> verify shade updates to be QQS
(verified with flag on and off)
Test: atest BackActionInteractorTest CentralSurfacesImplTest

Change-Id: I0c393b96d9dbed5e6d8de7583f9f03799f1e2ed5
parent 3c102221
Loading
Loading
Loading
Loading
+80 −2
Original line number Diff line number Diff line
@@ -16,24 +16,69 @@

package com.android.systemui.back.domain.interactor

import android.window.BackEvent
import android.window.OnBackAnimationCallback
import android.window.OnBackInvokedCallback
import android.window.OnBackInvokedDispatcher
import android.window.WindowOnBackInvokedDispatcher
import com.android.systemui.CoreStartable
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.scene.domain.interactor.WindowRootViewVisibilityInteractor
import com.android.systemui.shade.QuickSettingsController
import com.android.systemui.shade.ShadeController
import com.android.systemui.shade.ShadeViewController
import com.android.systemui.statusbar.NotificationShadeWindowController
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch

/** Handles requests to go back either from a button or gesture. */
@SysUISingleton
class BackActionInteractor
@Inject
constructor(
    @Application private val scope: CoroutineScope,
    private val statusBarStateController: StatusBarStateController,
    private val statusBarKeyguardViewManager: StatusBarKeyguardViewManager,
    private val shadeController: ShadeController
) {
    private val shadeController: ShadeController,
    private val notificationShadeWindowController: NotificationShadeWindowController,
    private val windowRootViewVisibilityInteractor: WindowRootViewVisibilityInteractor,
    featureFlags: FeatureFlags,
) : CoreStartable {

    private var isCallbackRegistered = false

    private val callback =
        if (featureFlags.isEnabled(Flags.WM_SHADE_ANIMATE_BACK_GESTURE)) {
            /**
             * New callback that handles back gesture invoked, cancel, progress and provides
             * feedback via Shade animation.
             */
            object : OnBackAnimationCallback {
                override fun onBackInvoked() {
                    onBackRequested()
                }

                override fun onBackProgressed(backEvent: BackEvent) {
                    if (shouldBackBeHandled() && shadeViewController.canBeCollapsed()) {
                        shadeViewController.onBackProgressed(backEvent.progress)
                    }
                }
            }
        } else {
            OnBackInvokedCallback { onBackRequested() }
        }

    private val onBackInvokedDispatcher: WindowOnBackInvokedDispatcher?
        get() =
            notificationShadeWindowController.windowRootView?.viewRootImpl?.onBackInvokedDispatcher

    private lateinit var shadeViewController: ShadeViewController
    private lateinit var qsController: QuickSettingsController

@@ -42,6 +87,19 @@ constructor(
        this.shadeViewController = svController
    }

    override fun start() {
        scope.launch {
            windowRootViewVisibilityInteractor.isLockscreenOrShadeVisibleAndInteractive.collect {
                visible ->
                if (visible) {
                    registerBackCallback()
                } else {
                    unregisterBackCallback()
                }
            }
        }
    }

    fun shouldBackBeHandled(): Boolean {
        return statusBarStateController.state != StatusBarState.KEYGUARD &&
            statusBarStateController.state != StatusBarState.SHADE_LOCKED &&
@@ -74,4 +132,24 @@ constructor(
        }
        return false
    }

    private fun registerBackCallback() {
        if (isCallbackRegistered) {
            return
        }
        onBackInvokedDispatcher?.let {
            it.registerOnBackInvokedCallback(OnBackInvokedDispatcher.PRIORITY_DEFAULT, callback)
            isCallbackRegistered = true
        }
    }

    private fun unregisterBackCallback() {
        if (!isCallbackRegistered) {
            return
        }
        onBackInvokedDispatcher?.let {
            it.unregisterOnBackInvokedCallback(callback)
            isCallbackRegistered = false
        }
    }
}
+6 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import com.android.systemui.ScreenDecorations
import com.android.systemui.SliceBroadcastRelayHandler
import com.android.systemui.accessibility.SystemActions
import com.android.systemui.accessibility.WindowMagnification
import com.android.systemui.back.domain.interactor.BackActionInteractor
import com.android.systemui.biometrics.AuthController
import com.android.systemui.biometrics.BiometricNotificationService
import com.android.systemui.clipboardoverlay.ClipboardListener
@@ -346,4 +347,9 @@ abstract class SystemUICoreStartableModule {
    abstract fun bindStatusBarHeadsUpChangeListener(
        impl: StatusBarHeadsUpChangeListener
    ): CoreStartable

    @Binds
    @IntoMap
    @ClassKey(BackActionInteractor::class)
    abstract fun bindBackActionInteractor(impl: BackActionInteractor): CoreStartable
}
+0 −3
Original line number Diff line number Diff line
@@ -99,9 +99,6 @@ interface ShadeSurface : ShadeViewController {
    /** Sets the view's alpha to max. */
    fun resetAlpha()

    /** Sets progress of the predictive back animation. */
    fun onBackProgressed(progressFraction: Float)

    /** @see com.android.systemui.keyguard.ScreenLifecycle.Observer.onScreenTurningOn */
    fun onScreenTurningOn()

+3 −0
Original line number Diff line number Diff line
@@ -155,6 +155,9 @@ interface ShadeViewController {
    /** Called when Back gesture has been committed (i.e. a back event has definitely occurred) */
    fun onBackPressed()

    /** Sets progress of the predictive back animation. */
    fun onBackProgressed(progressFraction: Float)

    /** Sets whether the status bar launch animation is currently running. */
    fun setIsLaunchAnimationRunning(running: Boolean)

+1 −0
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ class ShadeViewControllerEmptyImpl @Inject constructor() : ShadeViewController {
        return false
    }
    override fun onBackPressed() {}
    override fun onBackProgressed(progressFraction: Float) {}
    override fun setIsLaunchAnimationRunning(running: Boolean) {}
    override fun setAlpha(alpha: Int, animate: Boolean) {}
    override fun setAlphaChangeAnimationEndAction(r: Runnable) {}
Loading