From 7fee1968cd4f6829f1c41b252097466d90de937f Mon Sep 17 00:00:00 2001 From: Beth Thibodeau Date: Thu, 11 Jun 2020 23:19:01 -0400 Subject: [PATCH] Remove controls when apps are stopped or removed Listen for app uninstall, suspend, and force quit, and remove all controls corresponding to that package Fixes: 157288710 Fixes: 156793169 Test: manual Change-Id: Ib9bb08e4a696a43f40bb3ebdd1ebd236727d0fc0 --- .../systemui/media/MediaDataManager.kt | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt index 6ea36ab3af2fe..5fe39958fd677 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt @@ -109,6 +109,24 @@ class MediaDataManager @Inject constructor( } } + private val appChangeReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + Intent.ACTION_PACKAGES_SUSPENDED -> { + val packages = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST) + packages?.forEach { + removeAllForPackage(it) + } + } + Intent.ACTION_PACKAGE_REMOVED, Intent.ACTION_PACKAGE_RESTARTED -> { + intent.data?.encodedSchemeSpecificPart?.let { + removeAllForPackage(it) + } + } + } + } + } + init { mediaTimeoutListener.timeoutCallback = { token: String, timedOut: Boolean -> setTimedOut(token, timedOut) } @@ -129,6 +147,17 @@ class MediaDataManager @Inject constructor( val userFilter = IntentFilter(Intent.ACTION_USER_SWITCHED) broadcastDispatcher.registerReceiver(userChangeReceiver, userFilter, null, UserHandle.ALL) + + val suspendFilter = IntentFilter(Intent.ACTION_PACKAGES_SUSPENDED) + broadcastDispatcher.registerReceiver(appChangeReceiver, suspendFilter, null, UserHandle.ALL) + + val uninstallFilter = IntentFilter().apply { + addAction(Intent.ACTION_PACKAGE_REMOVED) + addAction(Intent.ACTION_PACKAGE_RESTARTED) + addDataScheme("package") + } + // BroadcastDispatcher does not allow filters with data schemes + context.registerReceiver(appChangeReceiver, uninstallFilter) } fun onNotificationAdded(key: String, sbn: StatusBarNotification) { @@ -160,6 +189,18 @@ class MediaDataManager @Inject constructor( mediaEntries.clear() } + private fun removeAllForPackage(packageName: String) { + Assert.isMainThread() + val listenersCopy = listeners.toSet() + val toRemove = mediaEntries.filter { it.value.packageName == packageName } + toRemove.forEach { + mediaEntries.remove(it.key) + listenersCopy.forEach { listener -> + listener.onMediaDataRemoved(it.key) + } + } + } + private fun addResumptionControls( desc: MediaDescription, action: Runnable,