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

Commit 2db99600 authored by Beth Thibodeau's avatar Beth Thibodeau Committed by Automerger Merge Worker
Browse files

Merge "Remove recommendations when setting is disabled" into sc-dev am: c1d7a61b

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14850802

Change-Id: I62e91ac412a65433b53288f960c6d19424445e31
parents 915745d1 c1d7a61b
Loading
Loading
Loading
Loading
+17 −5
Original line number Original line Diff line number Diff line
@@ -39,6 +39,7 @@ import android.media.session.MediaSession
import android.net.Uri
import android.net.Uri
import android.os.Parcelable
import android.os.Parcelable
import android.os.UserHandle
import android.os.UserHandle
import android.provider.Settings
import android.service.notification.StatusBarNotification
import android.service.notification.StatusBarNotification
import android.text.TextUtils
import android.text.TextUtils
import android.util.Log
import android.util.Log
@@ -54,6 +55,7 @@ import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.BcSmartspaceDataPlugin
import com.android.systemui.plugins.BcSmartspaceDataPlugin
import com.android.systemui.statusbar.NotificationMediaManager.isPlayingState
import com.android.systemui.statusbar.NotificationMediaManager.isPlayingState
import com.android.systemui.statusbar.notification.row.HybridGroupManager
import com.android.systemui.statusbar.notification.row.HybridGroupManager
import com.android.systemui.tuner.TunerService
import com.android.systemui.util.Assert
import com.android.systemui.util.Assert
import com.android.systemui.util.Utils
import com.android.systemui.util.Utils
import com.android.systemui.util.concurrency.DelayableExecutor
import com.android.systemui.util.concurrency.DelayableExecutor
@@ -114,7 +116,8 @@ class MediaDataManager(
    private val smartspaceMediaDataProvider: SmartspaceMediaDataProvider,
    private val smartspaceMediaDataProvider: SmartspaceMediaDataProvider,
    private var useMediaResumption: Boolean,
    private var useMediaResumption: Boolean,
    private val useQsMediaPlayer: Boolean,
    private val useQsMediaPlayer: Boolean,
    private val systemClock: SystemClock
    private val systemClock: SystemClock,
    private val tunerService: TunerService
) : Dumpable, BcSmartspaceDataPlugin.SmartspaceTargetListener {
) : Dumpable, BcSmartspaceDataPlugin.SmartspaceTargetListener {


    companion object {
    companion object {
@@ -147,6 +150,7 @@ class MediaDataManager(
    // There should ONLY be at most one Smartspace media recommendation.
    // There should ONLY be at most one Smartspace media recommendation.
    private var smartspaceMediaData: SmartspaceMediaData = EMPTY_SMARTSPACE_MEDIA_DATA
    private var smartspaceMediaData: SmartspaceMediaData = EMPTY_SMARTSPACE_MEDIA_DATA
    private var smartspaceSession: SmartspaceSession? = null
    private var smartspaceSession: SmartspaceSession? = null
    private var allowMediaRecommendations = Utils.allowMediaRecommendations(context)


    @Inject
    @Inject
    constructor(
    constructor(
@@ -164,12 +168,13 @@ class MediaDataManager(
        mediaDataFilter: MediaDataFilter,
        mediaDataFilter: MediaDataFilter,
        activityStarter: ActivityStarter,
        activityStarter: ActivityStarter,
        smartspaceMediaDataProvider: SmartspaceMediaDataProvider,
        smartspaceMediaDataProvider: SmartspaceMediaDataProvider,
        clock: SystemClock
        clock: SystemClock,
        tunerService: TunerService
    ) : this(context, backgroundExecutor, foregroundExecutor, mediaControllerFactory,
    ) : this(context, backgroundExecutor, foregroundExecutor, mediaControllerFactory,
            broadcastDispatcher, dumpManager, mediaTimeoutListener, mediaResumeListener,
            broadcastDispatcher, dumpManager, mediaTimeoutListener, mediaResumeListener,
            mediaSessionBasedFilter, mediaDeviceManager, mediaDataCombineLatest, mediaDataFilter,
            mediaSessionBasedFilter, mediaDeviceManager, mediaDataCombineLatest, mediaDataFilter,
            activityStarter, smartspaceMediaDataProvider, Utils.useMediaResumption(context),
            activityStarter, smartspaceMediaDataProvider, Utils.useMediaResumption(context),
            Utils.useQsMediaPlayer(context), clock)
            Utils.useQsMediaPlayer(context), clock, tunerService)


    private val appChangeReceiver = object : BroadcastReceiver() {
    private val appChangeReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
        override fun onReceive(context: Context, intent: Intent) {
@@ -243,6 +248,14 @@ class MediaDataManager(
                })
                })
        }
        }
        smartspaceSession?.let { it.requestSmartspaceUpdate() }
        smartspaceSession?.let { it.requestSmartspaceUpdate() }
        tunerService.addTunable(object : TunerService.Tunable {
            override fun onTuningChanged(key: String?, newValue: String?) {
                allowMediaRecommendations = Utils.allowMediaRecommendations(context)
                if (!allowMediaRecommendations) {
                    dismissSmartspaceRecommendation(key = smartspaceMediaData.targetId, delay = 0L)
                }
            }
        }, Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION)
    }
    }


    fun destroy() {
    fun destroy() {
@@ -695,8 +708,7 @@ class MediaDataManager(
    }
    }


    override fun onSmartspaceTargetsUpdated(targets: List<Parcelable>) {
    override fun onSmartspaceTargetsUpdated(targets: List<Parcelable>) {
        if (!Utils.allowMediaRecommendations(context)) {
        if (!allowMediaRecommendations) {
            Log.d(TAG, "Smartspace recommendation is disabled in Settings.")
            return
            return
        }
        }


+2 −1
Original line number Original line Diff line number Diff line
@@ -68,7 +68,8 @@ public class TunerServiceImpl extends TunerService {
    private static final String[] RESET_EXCEPTION_LIST = new String[] {
    private static final String[] RESET_EXCEPTION_LIST = new String[] {
            QSTileHost.TILES_SETTING,
            QSTileHost.TILES_SETTING,
            Settings.Secure.DOZE_ALWAYS_ON,
            Settings.Secure.DOZE_ALWAYS_ON,
            Settings.Secure.MEDIA_CONTROLS_RESUME
            Settings.Secure.MEDIA_CONTROLS_RESUME,
            Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION
    };
    };


    private final Observer mObserver = new Observer();
    private final Observer mObserver = new Observer();
+31 −2
Original line number Original line Diff line number Diff line
@@ -9,8 +9,8 @@ import android.media.MediaDescription
import android.media.MediaMetadata
import android.media.MediaMetadata
import android.media.session.MediaController
import android.media.session.MediaController
import android.media.session.MediaSession
import android.media.session.MediaSession
import android.provider.Settings
import android.os.Bundle
import android.os.Bundle
import android.provider.Settings
import android.service.notification.StatusBarNotification
import android.service.notification.StatusBarNotification
import android.testing.AndroidTestingRunner
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper.RunWithLooper
import android.testing.TestableLooper.RunWithLooper
@@ -20,6 +20,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.dump.DumpManager
import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.statusbar.SbnBuilder
import com.android.systemui.statusbar.SbnBuilder
import com.android.systemui.tuner.TunerService
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.capture
import com.android.systemui.util.mockito.capture
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.eq
@@ -86,6 +87,8 @@ class MediaDataManagerTest : SysuiTestCase() {
    lateinit var mediaNotification: StatusBarNotification
    lateinit var mediaNotification: StatusBarNotification
    @Captor lateinit var mediaDataCaptor: ArgumentCaptor<MediaData>
    @Captor lateinit var mediaDataCaptor: ArgumentCaptor<MediaData>
    private val clock = FakeSystemClock()
    private val clock = FakeSystemClock()
    @Mock private lateinit var tunerService: TunerService
    @Captor lateinit var tunableCaptor: ArgumentCaptor<TunerService.Tunable>


    private val originalSmartspaceSetting = Settings.Secure.getInt(context.contentResolver,
    private val originalSmartspaceSetting = Settings.Secure.getInt(context.contentResolver,
            Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION, 1)
            Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION, 1)
@@ -114,8 +117,11 @@ class MediaDataManagerTest : SysuiTestCase() {
            smartspaceMediaDataProvider = smartspaceMediaDataProvider,
            smartspaceMediaDataProvider = smartspaceMediaDataProvider,
            useMediaResumption = true,
            useMediaResumption = true,
            useQsMediaPlayer = true,
            useQsMediaPlayer = true,
            systemClock = clock
            systemClock = clock,
            tunerService = tunerService
        )
        )
        verify(tunerService).addTunable(capture(tunableCaptor),
                eq(Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION))
        session = MediaSession(context, "MediaDataManagerTestSession")
        session = MediaSession(context, "MediaDataManagerTestSession")
        mediaNotification = SbnBuilder().run {
        mediaNotification = SbnBuilder().run {
            setPkg(PACKAGE_NAME)
            setPkg(PACKAGE_NAME)
@@ -364,6 +370,9 @@ class MediaDataManagerTest : SysuiTestCase() {
    fun testOnSmartspaceMediaDataLoaded_hasNoneMediaTarget_callsRemoveListener() {
    fun testOnSmartspaceMediaDataLoaded_hasNoneMediaTarget_callsRemoveListener() {
        smartspaceMediaDataProvider.onTargetsAvailable(listOf(mediaSmartspaceTarget))
        smartspaceMediaDataProvider.onTargetsAvailable(listOf(mediaSmartspaceTarget))
        smartspaceMediaDataProvider.onTargetsAvailable(listOf())
        smartspaceMediaDataProvider.onTargetsAvailable(listOf())
        foregroundExecutor.advanceClockToLast()
        foregroundExecutor.runAllReady()

        verify(listener).onSmartspaceMediaDataRemoved(eq(KEY_MEDIA_SMARTSPACE), eq(false))
        verify(listener).onSmartspaceMediaDataRemoved(eq(KEY_MEDIA_SMARTSPACE), eq(false))
    }
    }


@@ -372,6 +381,8 @@ class MediaDataManagerTest : SysuiTestCase() {
        // WHEN media recommendation setting is off
        // WHEN media recommendation setting is off
        Settings.Secure.putInt(context.contentResolver,
        Settings.Secure.putInt(context.contentResolver,
                Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION, 0)
                Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION, 0)
        tunableCaptor.value.onTuningChanged(Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION, "0")

        smartspaceMediaDataProvider.onTargetsAvailable(listOf(mediaSmartspaceTarget))
        smartspaceMediaDataProvider.onTargetsAvailable(listOf(mediaSmartspaceTarget))


        // THEN smartspace signal is ignored
        // THEN smartspace signal is ignored
@@ -379,6 +390,24 @@ class MediaDataManagerTest : SysuiTestCase() {
                .onSmartspaceMediaDataLoaded(anyObject(), anyObject(), anyBoolean())
                .onSmartspaceMediaDataLoaded(anyObject(), anyObject(), anyBoolean())
    }
    }


    @Test
    fun testMediaRecommendationDisabled_removesSmartspaceData() {
        // GIVEN a media recommendation card is present
        smartspaceMediaDataProvider.onTargetsAvailable(listOf(mediaSmartspaceTarget))
        verify(listener).onSmartspaceMediaDataLoaded(eq(KEY_MEDIA_SMARTSPACE), anyObject(),
                anyBoolean())

        // WHEN the media recommendation setting is turned off
        Settings.Secure.putInt(context.contentResolver,
                Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION, 0)
        tunableCaptor.value.onTuningChanged(Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION, "0")

        // THEN listeners are notified
        foregroundExecutor.advanceClockToLast()
        foregroundExecutor.runAllReady()
        verify(listener).onSmartspaceMediaDataRemoved(eq(KEY_MEDIA_SMARTSPACE), eq(true))
    }

    @Test
    @Test
    fun testOnMediaDataChanged_updatesLastActiveTime() {
    fun testOnMediaDataChanged_updatesLastActiveTime() {
        val currentTime = clock.elapsedRealtime()
        val currentTime = clock.elapsedRealtime()