From a2655ec281812f3e318ef341cb52740729550a83 Mon Sep 17 00:00:00 2001 From: cecilia Date: Tue, 27 Apr 2021 21:19:27 -0400 Subject: [PATCH] Skip showing the Smartspace recommendation card if it's an empty update. Smartspace always sends out an update on headphones connection for a reliable triggering: - A valid recommendation list with >= 3 items; - Otherwise, an empty list only for triggering. If it's the latter case, the recommendation should not be shown. Fixes: 186585554 Test: Studio builds Change-Id: I441454809f7c6b10e21d18f46c10e01efc892db0 --- .../android/systemui/media/MediaDataFilter.kt | 13 ++++++++ .../systemui/media/MediaDataFilterTest.kt | 32 +++++++++++++++++-- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt index 2bd7729f58d4d..9163044c2d739 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt @@ -16,6 +16,7 @@ package com.android.systemui.media +import android.app.smartspace.SmartspaceAction import android.app.smartspace.SmartspaceTarget import android.os.SystemProperties import android.util.Log @@ -121,6 +122,12 @@ class MediaDataFilter @Inject constructor( } // If no recent media, continue with smartspace update + if (isMediaRecommendationEmpty(data)) { + Log.d(TAG, "Empty media recommendations. Skip showing the card") + return + } + + // Proceed only if the Smartspace recommendation is not empty. listeners.forEach { it.onSmartspaceMediaDataLoaded(key, data) } } @@ -214,4 +221,10 @@ class MediaDataFilter @Inject constructor( * Remove a listener that was registered with addListener */ fun removeListener(listener: MediaDataManager.Listener) = _listeners.remove(listener) + + /** Check if the Smartspace sends an empty update. */ + private fun isMediaRecommendationEmpty(data: SmartspaceTarget): Boolean { + val mediaRecommendationList: List = data.getIconGrid() + return mediaRecommendationList == null || mediaRecommendationList.isEmpty() + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataFilterTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataFilterTest.kt index a9d256bf37cc5..ac24cdeb74bc2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataFilterTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataFilterTest.kt @@ -16,6 +16,7 @@ package com.android.systemui.media +import android.app.smartspace.SmartspaceAction import android.app.smartspace.SmartspaceTarget import android.graphics.Color import androidx.test.filters.SmallTest @@ -72,6 +73,8 @@ class MediaDataFilterTest : SysuiTestCase() { private lateinit var executor: Executor @Mock private lateinit var smartspaceData: SmartspaceTarget + @Mock + private lateinit var smartspaceMediaRecommendationItem: SmartspaceAction private lateinit var mediaDataFilter: MediaDataFilter private lateinit var dataMain: MediaData @@ -97,6 +100,7 @@ class MediaDataFilterTest : SysuiTestCase() { emptyList(), emptyList(), PACKAGE, null, null, device, true, null) `when`(smartspaceData.smartspaceTargetId).thenReturn(SMARTSPACE_KEY) + `when`(smartspaceData.iconGrid).thenReturn(listOf(smartspaceMediaRecommendationItem)) } private fun setUser(id: Int) { @@ -222,7 +226,7 @@ class MediaDataFilterTest : SysuiTestCase() { } @Test - fun testOnSmartspaceMediaDataLoaded_noMedia_usesSmartspace() { + fun testOnSmartspaceMediaDataLoaded_noMedia_nonEmptyRecommendation_usesSmartspace() { mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) verify(listener).onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData)) @@ -230,7 +234,18 @@ class MediaDataFilterTest : SysuiTestCase() { } @Test - fun testOnSmartspaceMediaDataLoaded_noRecentMedia_usesSmartspace() { + fun testOnSmartspaceMediaDataLoaded_noMedia_emptyRecommendation_showsNothing() { + `when`(smartspaceData.iconGrid).thenReturn(listOf()) + + mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) + + verify(listener, never()) + .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData)) + assertThat(mediaDataFilter.hasActiveMedia()).isTrue() + } + + @Test + fun testOnSmartspaceMediaDataLoaded_noRecentMedia_nonEmptyRecommendation_usesSmartspace() { val dataOld = dataMain.copy(active = false, lastActive = 0L) mediaDataFilter.onMediaDataLoaded(KEY, null, dataOld) mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) @@ -239,6 +254,19 @@ class MediaDataFilterTest : SysuiTestCase() { assertThat(mediaDataFilter.hasActiveMedia()).isTrue() } + @Test + fun testOnSmartspaceMediaDataLoaded_noRecentMedia_emptyRecommendation_showsNothing() { + `when`(smartspaceData.iconGrid).thenReturn(listOf()) + + val dataOld = dataMain.copy(active = false, lastActive = 0L) + mediaDataFilter.onMediaDataLoaded(KEY, null, dataOld) + mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) + + verify(listener, never()) + .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData)) + assertThat(mediaDataFilter.hasActiveMedia()).isTrue() + } + @Test fun testOnSmartspaceMediaDataLoaded_hasRecentMedia_usesMedia() { // WHEN we have media that was recently played, but not currently active