Merge "Remove controls from carousel when not in manager" into sc-dev

This commit is contained in:
Beth Thibodeau
2021-07-03 15:49:15 +00:00
committed by Android (Google) Code Review
5 changed files with 56 additions and 7 deletions

View File

@@ -12,10 +12,12 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.LinearLayout import android.widget.LinearLayout
import androidx.annotation.VisibleForTesting import androidx.annotation.VisibleForTesting
import com.android.systemui.Dumpable
import com.android.systemui.R import com.android.systemui.R
import com.android.systemui.classifier.FalsingCollector import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dump.DumpManager
import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.FalsingManager
import com.android.systemui.qs.PageIndicator import com.android.systemui.qs.PageIndicator
@@ -27,6 +29,8 @@ import com.android.systemui.util.animation.UniqueObjectHostView
import com.android.systemui.util.animation.requiresRemeasuring import com.android.systemui.util.animation.requiresRemeasuring
import com.android.systemui.util.concurrency.DelayableExecutor import com.android.systemui.util.concurrency.DelayableExecutor
import com.android.systemui.util.time.SystemClock import com.android.systemui.util.time.SystemClock
import java.io.FileDescriptor
import java.io.PrintWriter
import java.util.TreeMap import java.util.TreeMap
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Provider import javax.inject.Provider
@@ -51,8 +55,9 @@ class MediaCarouselController @Inject constructor(
private val mediaManager: MediaDataManager, private val mediaManager: MediaDataManager,
configurationController: ConfigurationController, configurationController: ConfigurationController,
falsingCollector: FalsingCollector, falsingCollector: FalsingCollector,
falsingManager: FalsingManager falsingManager: FalsingManager,
) { dumpManager: DumpManager
) : Dumpable {
/** /**
* The current width of the carousel * The current width of the carousel
*/ */
@@ -166,6 +171,7 @@ class MediaCarouselController @Inject constructor(
lateinit var updateUserVisibility: () -> Unit lateinit var updateUserVisibility: () -> Unit
init { init {
dumpManager.registerDumpable(TAG, this)
mediaFrame = inflateMediaCarousel() mediaFrame = inflateMediaCarousel()
mediaCarousel = mediaFrame.requireViewById(R.id.media_carousel_scroller) mediaCarousel = mediaFrame.requireViewById(R.id.media_carousel_scroller)
pageIndicator = mediaFrame.requireViewById(R.id.media_page_indicator) pageIndicator = mediaFrame.requireViewById(R.id.media_page_indicator)
@@ -421,7 +427,7 @@ class MediaCarouselController @Inject constructor(
} }
} }
private fun removePlayer( fun removePlayer(
key: String, key: String,
dismissMediaData: Boolean = true, dismissMediaData: Boolean = true,
dismissRecommendation: Boolean = true dismissRecommendation: Boolean = true
@@ -748,6 +754,15 @@ class MediaCarouselController @Inject constructor(
} }
mediaManager.onSwipeToDismiss() mediaManager.onSwipeToDismiss()
} }
override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
pw.apply {
println("keysNeedRemoval: $keysNeedRemoval")
println("playerKeys: ${MediaPlayerData.playerKeys()}")
println("smartspaceMediaData: ${MediaPlayerData.smartspaceMediaData}")
println("shouldPrioritizeSs: ${MediaPlayerData.shouldPrioritizeSs}")
}
}
} }
@VisibleForTesting @VisibleForTesting

View File

@@ -455,8 +455,12 @@ public class MediaControlPanel {
if (mKey != null) { if (mKey != null) {
closeGuts(); closeGuts();
mMediaDataManagerLazy.get().dismissMediaData(mKey, if (!mMediaDataManagerLazy.get().dismissMediaData(mKey,
MediaViewController.GUTS_ANIMATION_DURATION + 100); MediaViewController.GUTS_ANIMATION_DURATION + 100)) {
Log.w(TAG, "Manager failed to dismiss media " + mKey);
// Remove directly from carousel to let user recover - TODO(b/190799184)
mMediaCarouselController.removePlayer(key, false, false);
}
} else { } else {
Log.w(TAG, "Dismiss media with null notification. Token uid=" Log.w(TAG, "Dismiss media with null notification. Token uid="
+ data.getToken().getUid()); + data.getToken().getUid());

View File

@@ -430,7 +430,11 @@ class MediaDataManager(
notifyMediaDataRemoved(key) notifyMediaDataRemoved(key)
} }
fun dismissMediaData(key: String, delay: Long) { /**
* Dismiss a media entry. Returns false if the key was not found.
*/
fun dismissMediaData(key: String, delay: Long): Boolean {
val existed = mediaEntries[key] != null
backgroundExecutor.execute { backgroundExecutor.execute {
mediaEntries[key]?.let { mediaData -> mediaEntries[key]?.let { mediaData ->
if (mediaData.isLocalSession) { if (mediaData.isLocalSession) {
@@ -442,6 +446,7 @@ class MediaDataManager(
} }
} }
foregroundExecutor.executeDelayed({ removeEntry(key) }, delay) foregroundExecutor.executeDelayed({ removeEntry(key) }, delay)
return existed
} }
/** /**

View File

@@ -345,4 +345,22 @@ public class MediaControlPanelTest : SysuiTestCase() {
assertThat(dismiss.isEnabled).isEqualTo(false) assertThat(dismiss.isEnabled).isEqualTo(false)
} }
@Test
fun dismissButtonClick_notInManager() {
val mediaKey = "key for dismissal"
whenever(mediaDataManager.dismissMediaData(eq(mediaKey), anyLong())).thenReturn(false)
player.attachPlayer(holder)
val state = MediaData(USER_ID, true, BG_COLOR, APP, null, ARTIST, TITLE, null, emptyList(),
emptyList(), PACKAGE, session.getSessionToken(), null, null, true, null,
notificationKey = KEY)
player.bindPlayer(state, mediaKey)
assertThat(dismiss.isEnabled).isEqualTo(true)
dismiss.callOnClick()
verify(mediaDataManager).dismissMediaData(eq(mediaKey), anyLong())
verify(mediaCarouselController).removePlayer(eq(mediaKey), eq(false), eq(false))
}
} }

View File

@@ -317,7 +317,8 @@ class MediaDataManagerTest : SysuiTestCase() {
fun testDismissMedia_listenerCalled() { fun testDismissMedia_listenerCalled() {
mediaDataManager.onNotificationAdded(KEY, mediaNotification) mediaDataManager.onNotificationAdded(KEY, mediaNotification)
mediaDataManager.onMediaDataLoaded(KEY, oldKey = null, data = mock(MediaData::class.java)) mediaDataManager.onMediaDataLoaded(KEY, oldKey = null, data = mock(MediaData::class.java))
mediaDataManager.dismissMediaData(KEY, 0L) val removed = mediaDataManager.dismissMediaData(KEY, 0L)
assertThat(removed).isTrue()
foregroundExecutor.advanceClockToLast() foregroundExecutor.advanceClockToLast()
foregroundExecutor.runAllReady() foregroundExecutor.runAllReady()
@@ -325,6 +326,12 @@ class MediaDataManagerTest : SysuiTestCase() {
verify(listener).onMediaDataRemoved(eq(KEY)) verify(listener).onMediaDataRemoved(eq(KEY))
} }
@Test
fun testDismissMedia_keyDoesNotExist_returnsFalse() {
val removed = mediaDataManager.dismissMediaData(KEY, 0L)
assertThat(removed).isFalse()
}
@Test @Test
fun testBadArtwork_doesNotUse() { fun testBadArtwork_doesNotUse() {
// WHEN notification has a too-small artwork // WHEN notification has a too-small artwork