Loading packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt +17 −5 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import android.media.session.MediaSession import android.net.Uri import android.os.Parcelable import android.os.UserHandle import android.provider.Settings import android.service.notification.StatusBarNotification import android.text.TextUtils import android.util.Log Loading @@ -54,6 +55,7 @@ import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.BcSmartspaceDataPlugin import com.android.systemui.statusbar.NotificationMediaManager.isPlayingState 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.Utils import com.android.systemui.util.concurrency.DelayableExecutor Loading Loading @@ -114,7 +116,8 @@ class MediaDataManager( private val smartspaceMediaDataProvider: SmartspaceMediaDataProvider, private var useMediaResumption: Boolean, private val useQsMediaPlayer: Boolean, private val systemClock: SystemClock private val systemClock: SystemClock, private val tunerService: TunerService ) : Dumpable, BcSmartspaceDataPlugin.SmartspaceTargetListener { companion object { Loading Loading @@ -147,6 +150,7 @@ class MediaDataManager( // There should ONLY be at most one Smartspace media recommendation. private var smartspaceMediaData: SmartspaceMediaData = EMPTY_SMARTSPACE_MEDIA_DATA private var smartspaceSession: SmartspaceSession? = null private var allowMediaRecommendations = Utils.allowMediaRecommendations(context) @Inject constructor( Loading @@ -164,12 +168,13 @@ class MediaDataManager( mediaDataFilter: MediaDataFilter, activityStarter: ActivityStarter, smartspaceMediaDataProvider: SmartspaceMediaDataProvider, clock: SystemClock clock: SystemClock, tunerService: TunerService ) : this(context, backgroundExecutor, foregroundExecutor, mediaControllerFactory, broadcastDispatcher, dumpManager, mediaTimeoutListener, mediaResumeListener, mediaSessionBasedFilter, mediaDeviceManager, mediaDataCombineLatest, mediaDataFilter, activityStarter, smartspaceMediaDataProvider, Utils.useMediaResumption(context), Utils.useQsMediaPlayer(context), clock) Utils.useQsMediaPlayer(context), clock, tunerService) private val appChangeReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { Loading Loading @@ -243,6 +248,14 @@ class MediaDataManager( }) } 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() { Loading Loading @@ -695,8 +708,7 @@ class MediaDataManager( } override fun onSmartspaceTargetsUpdated(targets: List<Parcelable>) { if (!Utils.allowMediaRecommendations(context)) { Log.d(TAG, "Smartspace recommendation is disabled in Settings.") if (!allowMediaRecommendations) { return } Loading packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java +2 −1 Original line number Diff line number Diff line Loading @@ -68,7 +68,8 @@ public class TunerServiceImpl extends TunerService { private static final String[] RESET_EXCEPTION_LIST = new String[] { QSTileHost.TILES_SETTING, 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(); Loading packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt +31 −2 Original line number Diff line number Diff line Loading @@ -9,8 +9,8 @@ import android.media.MediaDescription import android.media.MediaMetadata import android.media.session.MediaController import android.media.session.MediaSession import android.provider.Settings import android.os.Bundle import android.provider.Settings import android.service.notification.StatusBarNotification import android.testing.AndroidTestingRunner import android.testing.TestableLooper.RunWithLooper Loading @@ -20,6 +20,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.ActivityStarter import com.android.systemui.statusbar.SbnBuilder import com.android.systemui.tuner.TunerService import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.eq Loading Loading @@ -86,6 +87,8 @@ class MediaDataManagerTest : SysuiTestCase() { lateinit var mediaNotification: StatusBarNotification @Captor lateinit var mediaDataCaptor: ArgumentCaptor<MediaData> 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, Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION, 1) Loading Loading @@ -114,8 +117,11 @@ class MediaDataManagerTest : SysuiTestCase() { smartspaceMediaDataProvider = smartspaceMediaDataProvider, useMediaResumption = true, useQsMediaPlayer = true, systemClock = clock systemClock = clock, tunerService = tunerService ) verify(tunerService).addTunable(capture(tunableCaptor), eq(Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION)) session = MediaSession(context, "MediaDataManagerTestSession") mediaNotification = SbnBuilder().run { setPkg(PACKAGE_NAME) Loading Loading @@ -364,6 +370,9 @@ class MediaDataManagerTest : SysuiTestCase() { fun testOnSmartspaceMediaDataLoaded_hasNoneMediaTarget_callsRemoveListener() { smartspaceMediaDataProvider.onTargetsAvailable(listOf(mediaSmartspaceTarget)) smartspaceMediaDataProvider.onTargetsAvailable(listOf()) foregroundExecutor.advanceClockToLast() foregroundExecutor.runAllReady() verify(listener).onSmartspaceMediaDataRemoved(eq(KEY_MEDIA_SMARTSPACE), eq(false)) } Loading @@ -372,6 +381,8 @@ class MediaDataManagerTest : SysuiTestCase() { // WHEN media recommendation setting is off Settings.Secure.putInt(context.contentResolver, Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION, 0) tunableCaptor.value.onTuningChanged(Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION, "0") smartspaceMediaDataProvider.onTargetsAvailable(listOf(mediaSmartspaceTarget)) // THEN smartspace signal is ignored Loading @@ -379,6 +390,24 @@ class MediaDataManagerTest : SysuiTestCase() { .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 fun testOnMediaDataChanged_updatesLastActiveTime() { val currentTime = clock.elapsedRealtime() Loading Loading
packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt +17 −5 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import android.media.session.MediaSession import android.net.Uri import android.os.Parcelable import android.os.UserHandle import android.provider.Settings import android.service.notification.StatusBarNotification import android.text.TextUtils import android.util.Log Loading @@ -54,6 +55,7 @@ import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.BcSmartspaceDataPlugin import com.android.systemui.statusbar.NotificationMediaManager.isPlayingState 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.Utils import com.android.systemui.util.concurrency.DelayableExecutor Loading Loading @@ -114,7 +116,8 @@ class MediaDataManager( private val smartspaceMediaDataProvider: SmartspaceMediaDataProvider, private var useMediaResumption: Boolean, private val useQsMediaPlayer: Boolean, private val systemClock: SystemClock private val systemClock: SystemClock, private val tunerService: TunerService ) : Dumpable, BcSmartspaceDataPlugin.SmartspaceTargetListener { companion object { Loading Loading @@ -147,6 +150,7 @@ class MediaDataManager( // There should ONLY be at most one Smartspace media recommendation. private var smartspaceMediaData: SmartspaceMediaData = EMPTY_SMARTSPACE_MEDIA_DATA private var smartspaceSession: SmartspaceSession? = null private var allowMediaRecommendations = Utils.allowMediaRecommendations(context) @Inject constructor( Loading @@ -164,12 +168,13 @@ class MediaDataManager( mediaDataFilter: MediaDataFilter, activityStarter: ActivityStarter, smartspaceMediaDataProvider: SmartspaceMediaDataProvider, clock: SystemClock clock: SystemClock, tunerService: TunerService ) : this(context, backgroundExecutor, foregroundExecutor, mediaControllerFactory, broadcastDispatcher, dumpManager, mediaTimeoutListener, mediaResumeListener, mediaSessionBasedFilter, mediaDeviceManager, mediaDataCombineLatest, mediaDataFilter, activityStarter, smartspaceMediaDataProvider, Utils.useMediaResumption(context), Utils.useQsMediaPlayer(context), clock) Utils.useQsMediaPlayer(context), clock, tunerService) private val appChangeReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { Loading Loading @@ -243,6 +248,14 @@ class MediaDataManager( }) } 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() { Loading Loading @@ -695,8 +708,7 @@ class MediaDataManager( } override fun onSmartspaceTargetsUpdated(targets: List<Parcelable>) { if (!Utils.allowMediaRecommendations(context)) { Log.d(TAG, "Smartspace recommendation is disabled in Settings.") if (!allowMediaRecommendations) { return } Loading
packages/SystemUI/src/com/android/systemui/tuner/TunerServiceImpl.java +2 −1 Original line number Diff line number Diff line Loading @@ -68,7 +68,8 @@ public class TunerServiceImpl extends TunerService { private static final String[] RESET_EXCEPTION_LIST = new String[] { QSTileHost.TILES_SETTING, 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(); Loading
packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt +31 −2 Original line number Diff line number Diff line Loading @@ -9,8 +9,8 @@ import android.media.MediaDescription import android.media.MediaMetadata import android.media.session.MediaController import android.media.session.MediaSession import android.provider.Settings import android.os.Bundle import android.provider.Settings import android.service.notification.StatusBarNotification import android.testing.AndroidTestingRunner import android.testing.TestableLooper.RunWithLooper Loading @@ -20,6 +20,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.ActivityStarter import com.android.systemui.statusbar.SbnBuilder import com.android.systemui.tuner.TunerService import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.eq Loading Loading @@ -86,6 +87,8 @@ class MediaDataManagerTest : SysuiTestCase() { lateinit var mediaNotification: StatusBarNotification @Captor lateinit var mediaDataCaptor: ArgumentCaptor<MediaData> 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, Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION, 1) Loading Loading @@ -114,8 +117,11 @@ class MediaDataManagerTest : SysuiTestCase() { smartspaceMediaDataProvider = smartspaceMediaDataProvider, useMediaResumption = true, useQsMediaPlayer = true, systemClock = clock systemClock = clock, tunerService = tunerService ) verify(tunerService).addTunable(capture(tunableCaptor), eq(Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION)) session = MediaSession(context, "MediaDataManagerTestSession") mediaNotification = SbnBuilder().run { setPkg(PACKAGE_NAME) Loading Loading @@ -364,6 +370,9 @@ class MediaDataManagerTest : SysuiTestCase() { fun testOnSmartspaceMediaDataLoaded_hasNoneMediaTarget_callsRemoveListener() { smartspaceMediaDataProvider.onTargetsAvailable(listOf(mediaSmartspaceTarget)) smartspaceMediaDataProvider.onTargetsAvailable(listOf()) foregroundExecutor.advanceClockToLast() foregroundExecutor.runAllReady() verify(listener).onSmartspaceMediaDataRemoved(eq(KEY_MEDIA_SMARTSPACE), eq(false)) } Loading @@ -372,6 +381,8 @@ class MediaDataManagerTest : SysuiTestCase() { // WHEN media recommendation setting is off Settings.Secure.putInt(context.contentResolver, Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION, 0) tunableCaptor.value.onTuningChanged(Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION, "0") smartspaceMediaDataProvider.onTargetsAvailable(listOf(mediaSmartspaceTarget)) // THEN smartspace signal is ignored Loading @@ -379,6 +390,24 @@ class MediaDataManagerTest : SysuiTestCase() { .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 fun testOnMediaDataChanged_updatesLastActiveTime() { val currentTime = clock.elapsedRealtime() Loading