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

Commit a2655ec2 authored by cecilia's avatar cecilia Committed by Cecilia Hong
Browse files

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
parent a2bbcf95
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -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<SmartspaceAction> = data.getIconGrid()
        return mediaRecommendationList == null || mediaRecommendationList.isEmpty()
    }
}
+30 −2
Original line number Diff line number Diff line
@@ -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