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

This commit is contained in:
Beth Thibodeau
2021-06-16 21:26:45 +00:00
committed by Android (Google) Code Review
3 changed files with 50 additions and 8 deletions

View File

@@ -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
} }

View File

@@ -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();

View File

@@ -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()