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

Commit 38710318 authored by Chandru's avatar Chandru Committed by Chandru S
Browse files

Update smart space views whenever the keyguard bypass state changes.

This is used for showing the media info in the smart space on the lockscreen, when face unlock lockscreen bypass is enabled.

Current behavior: if media is playing and user taps to wake up screen while not looking at the screen, the media controls (through notification) are not visible. There is no indication that there is media currently playing.

New behavior: if media is playing and user taps to wake up screen while not looking at the screen, the smart space shows the media info. (media controls are still hidden and not affected by this change).

Fixes: 230669390
Test: atest com.android.systemui.statusbar.lockscreen
Change-Id: I91e705261cb6e48107103666a29a1b2ec61beeca
parent 5f5b5b95
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -104,6 +104,11 @@ public interface BcSmartspaceDataPlugin extends Plugin {
         */
         */
        void setDozeAmount(float amount);
        void setDozeAmount(float amount);


        /**
         * Set the current keyguard bypass enabled status.
         */
        default void setKeyguardBypassEnabled(boolean enabled) {}

        /**
        /**
         * Overrides how Intents/PendingIntents gets launched. Mostly to support auth from
         * Overrides how Intents/PendingIntents gets launched. Mostly to support auth from
         * the lockscreen.
         * the lockscreen.
+20 −3
Original line number Original line Diff line number Diff line
@@ -37,6 +37,8 @@ import com.android.settingslib.Utils
import com.android.systemui.R
import com.android.systemui.R
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.BcSmartspaceDataPlugin
import com.android.systemui.plugins.BcSmartspaceDataPlugin
import com.android.systemui.plugins.BcSmartspaceDataPlugin.SmartspaceTargetListener
import com.android.systemui.plugins.BcSmartspaceDataPlugin.SmartspaceTargetListener
@@ -44,13 +46,11 @@ import com.android.systemui.plugins.BcSmartspaceDataPlugin.SmartspaceView
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.settings.UserTracker
import com.android.systemui.settings.UserTracker
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.flags.Flags
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.DeviceProvisionedController
import com.android.systemui.statusbar.policy.DeviceProvisionedController
import com.android.systemui.util.concurrency.Execution
import com.android.systemui.util.concurrency.Execution
import com.android.systemui.util.settings.SecureSettings
import com.android.systemui.util.settings.SecureSettings
import java.lang.RuntimeException
import java.util.Optional
import java.util.Optional
import java.util.concurrent.Executor
import java.util.concurrent.Executor
import javax.inject.Inject
import javax.inject.Inject
@@ -71,6 +71,7 @@ class LockscreenSmartspaceController @Inject constructor(
    private val configurationController: ConfigurationController,
    private val configurationController: ConfigurationController,
    private val statusBarStateController: StatusBarStateController,
    private val statusBarStateController: StatusBarStateController,
    private val deviceProvisionedController: DeviceProvisionedController,
    private val deviceProvisionedController: DeviceProvisionedController,
    private val bypassController: KeyguardBypassController,
    private val execution: Execution,
    private val execution: Execution,
    @Main private val uiExecutor: Executor,
    @Main private val uiExecutor: Executor,
    @Main private val handler: Handler,
    @Main private val handler: Handler,
@@ -154,6 +155,13 @@ class LockscreenSmartspaceController @Inject constructor(
            }
            }
        }
        }


    private val bypassStateChangedListener =
        object : KeyguardBypassController.OnBypassStateChangedListener {
            override fun onBypassStateChanged(isEnabled: Boolean) {
                updateBypassEnabled()
            }
        }

    init {
    init {
        deviceProvisionedController.addCallback(deviceProvisionedListener)
        deviceProvisionedController.addCallback(deviceProvisionedListener)
    }
    }
@@ -164,6 +172,11 @@ class LockscreenSmartspaceController @Inject constructor(
        return featureFlags.isEnabled(Flags.SMARTSPACE) && plugin != null
        return featureFlags.isEnabled(Flags.SMARTSPACE) && plugin != null
    }
    }


    private fun updateBypassEnabled() {
        val bypassEnabled = bypassController.bypassEnabled
        smartspaceViews.forEach { it.setKeyguardBypassEnabled(bypassEnabled) }
    }

    /**
    /**
     * Constructs the smartspace view and connects it to the smartspace service.
     * Constructs the smartspace view and connects it to the smartspace service.
     */
     */
@@ -211,6 +224,7 @@ class LockscreenSmartspaceController @Inject constructor(
            }
            }
        })
        })
        ssView.setFalsingManager(falsingManager)
        ssView.setFalsingManager(falsingManager)
        ssView.setKeyguardBypassEnabled(bypassController.bypassEnabled)
        return (ssView as View).apply { addOnAttachStateChangeListener(stateChangeListener) }
        return (ssView as View).apply { addOnAttachStateChangeListener(stateChangeListener) }
    }
    }


@@ -248,11 +262,13 @@ class LockscreenSmartspaceController @Inject constructor(
        )
        )
        configurationController.addCallback(configChangeListener)
        configurationController.addCallback(configChangeListener)
        statusBarStateController.addCallback(statusBarStateListener)
        statusBarStateController.addCallback(statusBarStateListener)
        bypassController.registerOnBypassStateChangedListener(bypassStateChangedListener)


        plugin.registerSmartspaceEventNotifier {
        plugin.registerSmartspaceEventNotifier {
                e -> session?.notifySmartspaceEvent(e)
                e -> session?.notifySmartspaceEvent(e)
        }
        }


        updateBypassEnabled()
        reloadSmartspace()
        reloadSmartspace()
    }
    }


@@ -276,6 +292,7 @@ class LockscreenSmartspaceController @Inject constructor(
        contentResolver.unregisterContentObserver(settingsObserver)
        contentResolver.unregisterContentObserver(settingsObserver)
        configurationController.removeCallback(configChangeListener)
        configurationController.removeCallback(configChangeListener)
        statusBarStateController.removeCallback(statusBarStateListener)
        statusBarStateController.removeCallback(statusBarStateListener)
        bypassController.unregisterOnBypassStateChangedListener(bypassStateChangedListener)
        session = null
        session = null


        plugin?.registerSmartspaceEventNotifier(null)
        plugin?.registerSmartspaceEventNotifier(null)
+63 −5
Original line number Original line Diff line number Diff line
@@ -33,6 +33,8 @@ import android.view.View
import android.widget.FrameLayout
import android.widget.FrameLayout
import androidx.test.filters.SmallTest
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.SysuiTestCase
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.BcSmartspaceDataPlugin
import com.android.systemui.plugins.BcSmartspaceDataPlugin
import com.android.systemui.plugins.BcSmartspaceDataPlugin.SmartspaceTargetListener
import com.android.systemui.plugins.BcSmartspaceDataPlugin.SmartspaceTargetListener
@@ -41,8 +43,7 @@ import com.android.systemui.plugins.FalsingManager
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener
import com.android.systemui.settings.UserTracker
import com.android.systemui.settings.UserTracker
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.flags.Flags
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener
import com.android.systemui.statusbar.policy.DeviceProvisionedController
import com.android.systemui.statusbar.policy.DeviceProvisionedController
@@ -54,20 +55,20 @@ import com.android.systemui.util.mockito.capture
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.settings.SecureSettings
import com.android.systemui.util.settings.SecureSettings
import com.android.systemui.util.time.FakeSystemClock
import com.android.systemui.util.time.FakeSystemClock
import java.util.Optional
import org.junit.Before
import org.junit.Before
import org.junit.Test
import org.junit.Test
import org.mockito.ArgumentCaptor
import org.mockito.ArgumentCaptor
import org.mockito.Captor
import org.mockito.Captor
import org.mockito.Mock
import org.mockito.Mock
import org.mockito.Mockito.`when`
import org.mockito.Mockito.anyInt
import org.mockito.Mockito.anyInt
import org.mockito.Mockito.clearInvocations
import org.mockito.Mockito.clearInvocations
import org.mockito.Mockito.mock
import org.mockito.Mockito.mock
import org.mockito.Mockito.never
import org.mockito.Mockito.never
import org.mockito.Mockito.spy
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when`
import org.mockito.MockitoAnnotations
import org.mockito.MockitoAnnotations
import java.util.Optional


@SmallTest
@SmallTest
class LockscreenSmartspaceControllerTest : SysuiTestCase() {
class LockscreenSmartspaceControllerTest : SysuiTestCase() {
@@ -81,36 +82,56 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() {
    private lateinit var activityStarter: ActivityStarter
    private lateinit var activityStarter: ActivityStarter
    @Mock
    @Mock
    private lateinit var falsingManager: FalsingManager
    private lateinit var falsingManager: FalsingManager

    @Mock
    @Mock
    private lateinit var secureSettings: SecureSettings
    private lateinit var secureSettings: SecureSettings

    @Mock
    @Mock
    private lateinit var userTracker: UserTracker
    private lateinit var userTracker: UserTracker

    @Mock
    @Mock
    private lateinit var contentResolver: ContentResolver
    private lateinit var contentResolver: ContentResolver

    @Mock
    @Mock
    private lateinit var configurationController: ConfigurationController
    private lateinit var configurationController: ConfigurationController

    @Mock
    @Mock
    private lateinit var statusBarStateController: StatusBarStateController
    private lateinit var statusBarStateController: StatusBarStateController

    @Mock
    private lateinit var keyguardBypassController: KeyguardBypassController

    @Mock
    @Mock
    private lateinit var deviceProvisionedController: DeviceProvisionedController
    private lateinit var deviceProvisionedController: DeviceProvisionedController

    @Mock
    @Mock
    private lateinit var handler: Handler
    private lateinit var handler: Handler


    @Mock
    @Mock
    private lateinit var plugin: BcSmartspaceDataPlugin
    private lateinit var plugin: BcSmartspaceDataPlugin

    @Mock
    @Mock
    private lateinit var controllerListener: SmartspaceTargetListener
    private lateinit var controllerListener: SmartspaceTargetListener


    @Captor
    @Captor
    private lateinit var sessionListenerCaptor: ArgumentCaptor<OnTargetsAvailableListener>
    private lateinit var sessionListenerCaptor: ArgumentCaptor<OnTargetsAvailableListener>

    @Captor
    @Captor
    private lateinit var userTrackerCaptor: ArgumentCaptor<UserTracker.Callback>
    private lateinit var userTrackerCaptor: ArgumentCaptor<UserTracker.Callback>

    @Captor
    @Captor
    private lateinit var settingsObserverCaptor: ArgumentCaptor<ContentObserver>
    private lateinit var settingsObserverCaptor: ArgumentCaptor<ContentObserver>

    @Captor
    @Captor
    private lateinit var configChangeListenerCaptor: ArgumentCaptor<ConfigurationListener>
    private lateinit var configChangeListenerCaptor: ArgumentCaptor<ConfigurationListener>

    @Captor
    @Captor
    private lateinit var statusBarStateListenerCaptor: ArgumentCaptor<StateListener>
    private lateinit var statusBarStateListenerCaptor: ArgumentCaptor<StateListener>

    @Captor
    private lateinit var bypassStateChangedListenerCaptor:
        ArgumentCaptor<KeyguardBypassController.OnBypassStateChangedListener>

    @Captor
    @Captor
    private lateinit var deviceProvisionedCaptor: ArgumentCaptor<DeviceProvisionedListener>
    private lateinit var deviceProvisionedCaptor: ArgumentCaptor<DeviceProvisionedListener>


@@ -119,6 +140,8 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() {
    private lateinit var settingsObserver: ContentObserver
    private lateinit var settingsObserver: ContentObserver
    private lateinit var configChangeListener: ConfigurationListener
    private lateinit var configChangeListener: ConfigurationListener
    private lateinit var statusBarStateListener: StateListener
    private lateinit var statusBarStateListener: StateListener
    private lateinit var bypassStateChangeListener:
        KeyguardBypassController.OnBypassStateChangedListener
    private lateinit var deviceProvisionedListener: DeviceProvisionedListener
    private lateinit var deviceProvisionedListener: DeviceProvisionedListener


    private lateinit var smartspaceView: SmartspaceView
    private lateinit var smartspaceView: SmartspaceView
@@ -177,6 +200,7 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() {
                configurationController,
                configurationController,
                statusBarStateController,
                statusBarStateController,
                deviceProvisionedController,
                deviceProvisionedController,
                keyguardBypassController,
                execution,
                execution,
                executor,
                executor,
                handler,
                handler,
@@ -309,6 +333,19 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() {
        verify(smartspaceView).setDozeAmount(0.7f)
        verify(smartspaceView).setDozeAmount(0.7f)
    }
    }


    @Test
    fun testKeyguardBypassEnabledUpdatesView() {
        // GIVEN a connected smartspace session
        connectSession()
        `when`(keyguardBypassController.bypassEnabled).thenReturn(true)

        // WHEN the doze amount changes
        bypassStateChangeListener.onBypassStateChanged(true)

        // We pass that along to the view
        verify(smartspaceView).setKeyguardBypassEnabled(true)
    }

    @Test
    @Test
    fun testSensitiveTargetsAreNotFilteredIfAllowed() {
    fun testSensitiveTargetsAreNotFilteredIfAllowed() {
        // GIVEN the active and managed users allow sensitive content
        // GIVEN the active and managed users allow sensitive content
@@ -457,6 +494,8 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() {
        verify(contentResolver).unregisterContentObserver(settingsObserver)
        verify(contentResolver).unregisterContentObserver(settingsObserver)
        verify(configurationController).removeCallback(configChangeListener)
        verify(configurationController).removeCallback(configChangeListener)
        verify(statusBarStateController).removeCallback(statusBarStateListener)
        verify(statusBarStateController).removeCallback(statusBarStateListener)
        verify(keyguardBypassController)
                .unregisterOnBypassStateChangedListener(bypassStateChangeListener)
    }
    }


    @Test
    @Test
@@ -477,6 +516,19 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() {
        verify(smartspaceView2).registerDataProvider(plugin)
        verify(smartspaceView2).registerDataProvider(plugin)
    }
    }


    @Test
    fun testViewGetInitializedWithBypassEnabledState() {
        // GIVEN keyguard bypass is enabled.
        `when`(keyguardBypassController.bypassEnabled).thenReturn(true)

        // WHEN the view is being built
        val view = controller.buildAndConnectView(fakeParent)
        smartspaceView = view as SmartspaceView

        // THEN the view is initialized with the keyguard bypass enabled state.
        verify(smartspaceView).setKeyguardBypassEnabled(true)
    }

    @Test
    @Test
    fun testConnectAttemptBeforeInitializationShouldNotCreateSession() {
    fun testConnectAttemptBeforeInitializationShouldNotCreateSession() {
        // GIVEN an uninitalized smartspaceView
        // GIVEN an uninitalized smartspaceView
@@ -517,6 +569,9 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() {


        verify(statusBarStateController).addCallback(statusBarStateListenerCaptor.capture())
        verify(statusBarStateController).addCallback(statusBarStateListenerCaptor.capture())
        statusBarStateListener = statusBarStateListenerCaptor.value
        statusBarStateListener = statusBarStateListenerCaptor.value
        verify(keyguardBypassController)
            .registerOnBypassStateChangedListener(capture(bypassStateChangedListenerCaptor))
        bypassStateChangeListener = bypassStateChangedListenerCaptor.value


        verify(smartspaceSession).requestSmartspaceUpdate()
        verify(smartspaceSession).requestSmartspaceUpdate()
        clearInvocations(smartspaceSession)
        clearInvocations(smartspaceSession)
@@ -585,6 +640,9 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() {
            override fun setDozeAmount(amount: Float) {
            override fun setDozeAmount(amount: Float) {
            }
            }


            override fun setKeyguardBypassEnabled(enabled: Boolean) {
            }

            override fun setIntentStarter(intentStarter: BcSmartspaceDataPlugin.IntentStarter?) {
            override fun setIntentStarter(intentStarter: BcSmartspaceDataPlugin.IntentStarter?) {
            }
            }