Merge "Reset media controls when user changes" into rvc-dev am: 4e86ccd2e6

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11813680

Change-Id: I8cdfc4024e4eadeb4c8f4cfe97d0b01f4a6cf681
This commit is contained in:
Beth Thibodeau
2020-06-12 01:01:01 +00:00
committed by Automerger Merge Worker
2 changed files with 47 additions and 11 deletions

View File

@@ -18,8 +18,11 @@ package com.android.systemui.media
import android.app.Notification import android.app.Notification
import android.app.PendingIntent import android.app.PendingIntent
import android.content.BroadcastReceiver
import android.content.ContentResolver import android.content.ContentResolver
import android.content.Context import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.Color import android.graphics.Color
@@ -30,11 +33,13 @@ import android.media.MediaDescription
import android.media.MediaMetadata import android.media.MediaMetadata
import android.media.session.MediaSession import android.media.session.MediaSession
import android.net.Uri import android.net.Uri
import android.os.UserHandle
import android.service.notification.StatusBarNotification import android.service.notification.StatusBarNotification
import android.text.TextUtils import android.text.TextUtils
import android.util.Log import android.util.Log
import com.android.internal.graphics.ColorUtils import com.android.internal.graphics.ColorUtils
import com.android.systemui.R import com.android.systemui.R
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.statusbar.NotificationMediaManager import com.android.systemui.statusbar.NotificationMediaManager
@@ -87,13 +92,23 @@ class MediaDataManager @Inject constructor(
private val notificationEntryManager: NotificationEntryManager, private val notificationEntryManager: NotificationEntryManager,
private val mediaResumeListener: MediaResumeListener, private val mediaResumeListener: MediaResumeListener,
@Background private val backgroundExecutor: Executor, @Background private val backgroundExecutor: Executor,
@Main private val foregroundExecutor: Executor @Main private val foregroundExecutor: Executor,
private val broadcastDispatcher: BroadcastDispatcher
) { ) {
private val listeners: MutableSet<Listener> = mutableSetOf() private val listeners: MutableSet<Listener> = mutableSetOf()
private val mediaEntries: LinkedHashMap<String, MediaData> = LinkedHashMap() private val mediaEntries: LinkedHashMap<String, MediaData> = LinkedHashMap()
private val useMediaResumption: Boolean = Utils.useMediaResumption(context) private val useMediaResumption: Boolean = Utils.useMediaResumption(context)
private val userChangeReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (Intent.ACTION_USER_SWITCHED == intent.action) {
// Remove all controls, regardless of state
clearData()
}
}
}
init { init {
mediaTimeoutListener.timeoutCallback = { token: String, timedOut: Boolean -> mediaTimeoutListener.timeoutCallback = { token: String, timedOut: Boolean ->
setTimedOut(token, timedOut) } setTimedOut(token, timedOut) }
@@ -111,6 +126,9 @@ class MediaDataManager @Inject constructor(
} }
addListener(mediaResumeListener) addListener(mediaResumeListener)
} }
val userFilter = IntentFilter(Intent.ACTION_USER_SWITCHED)
broadcastDispatcher.registerReceiver(userChangeReceiver, userFilter, null, UserHandle.ALL)
} }
fun onNotificationAdded(key: String, sbn: StatusBarNotification) { fun onNotificationAdded(key: String, sbn: StatusBarNotification) {
@@ -131,6 +149,17 @@ class MediaDataManager @Inject constructor(
} }
} }
private fun clearData() {
// Called on user change. Remove all current MediaData objects and inform listeners
val listenersCopy = listeners.toSet()
mediaEntries.forEach {
listenersCopy.forEach { listener ->
listener.onMediaDataRemoved(it.key)
}
}
mediaEntries.clear()
}
private fun addResumptionControls( private fun addResumptionControls(
desc: MediaDescription, desc: MediaDescription,
action: Runnable, action: Runnable,

View File

@@ -40,7 +40,7 @@ import javax.inject.Singleton
private const val TAG = "MediaResumeListener" private const val TAG = "MediaResumeListener"
private const val MEDIA_PREFERENCES = "media_control_prefs" private const val MEDIA_PREFERENCES = "media_control_prefs"
private const val MEDIA_PREFERENCE_KEY = "browser_components" private const val MEDIA_PREFERENCE_KEY = "browser_components_"
@Singleton @Singleton
class MediaResumeListener @Inject constructor( class MediaResumeListener @Inject constructor(
@@ -63,11 +63,16 @@ class MediaResumeListener @Inject constructor(
lateinit var resumeComponentFoundCallback: (String, Runnable?) -> Unit lateinit var resumeComponentFoundCallback: (String, Runnable?) -> Unit
private var mediaBrowser: ResumeMediaBrowser? = null private var mediaBrowser: ResumeMediaBrowser? = null
private var currentUserId: Int
private val unlockReceiver = object : BroadcastReceiver() { private val userChangeReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
if (Intent.ACTION_USER_UNLOCKED == intent.action) { if (Intent.ACTION_USER_UNLOCKED == intent.action) {
loadMediaResumptionControls() loadMediaResumptionControls()
} else if (Intent.ACTION_USER_SWITCHED == intent.action) {
currentUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1)
loadSavedComponents()
loadMediaResumptionControls()
} }
} }
} }
@@ -97,18 +102,22 @@ class MediaResumeListener @Inject constructor(
} }
init { init {
currentUserId = context.userId
if (useMediaResumption) { if (useMediaResumption) {
val unlockFilter = IntentFilter() val unlockFilter = IntentFilter()
unlockFilter.addAction(Intent.ACTION_USER_UNLOCKED) unlockFilter.addAction(Intent.ACTION_USER_UNLOCKED)
broadcastDispatcher.registerReceiver(unlockReceiver, unlockFilter, null, UserHandle.ALL) unlockFilter.addAction(Intent.ACTION_USER_SWITCHED)
broadcastDispatcher.registerReceiver(userChangeReceiver, unlockFilter, null,
UserHandle.ALL)
loadSavedComponents() loadSavedComponents()
} }
} }
private fun loadSavedComponents() { private fun loadSavedComponents() {
val userContext = context.createContextAsUser(context.getUser(), 0) // Make sure list is empty (if we switched users)
val prefs = userContext.getSharedPreferences(MEDIA_PREFERENCES, Context.MODE_PRIVATE) resumeComponents.clear()
val listString = prefs.getString(MEDIA_PREFERENCE_KEY, null) val prefs = context.getSharedPreferences(MEDIA_PREFERENCES, Context.MODE_PRIVATE)
val listString = prefs.getString(MEDIA_PREFERENCE_KEY + currentUserId, null)
val components = listString?.split(ResumeMediaBrowser.DELIMITER.toRegex()) val components = listString?.split(ResumeMediaBrowser.DELIMITER.toRegex())
?.dropLastWhile { it.isEmpty() } ?.dropLastWhile { it.isEmpty() }
components?.forEach { components?.forEach {
@@ -133,7 +142,6 @@ class MediaResumeListener @Inject constructor(
val browser = ResumeMediaBrowser(context, mediaBrowserCallback, it) val browser = ResumeMediaBrowser(context, mediaBrowserCallback, it)
browser.findRecentMedia() browser.findRecentMedia()
} }
broadcastDispatcher.unregisterReceiver(unlockReceiver) // only need to load once
} }
override fun onMediaDataLoaded(key: String, oldKey: String?, data: MediaData) { override fun onMediaDataLoaded(key: String, oldKey: String?, data: MediaData) {
@@ -212,9 +220,8 @@ class MediaResumeListener @Inject constructor(
sb.append(it.flattenToString()) sb.append(it.flattenToString())
sb.append(ResumeMediaBrowser.DELIMITER) sb.append(ResumeMediaBrowser.DELIMITER)
} }
val userContext = context.createContextAsUser(context.getUser(), 0) val prefs = context.getSharedPreferences(MEDIA_PREFERENCES, Context.MODE_PRIVATE)
val prefs = userContext.getSharedPreferences(MEDIA_PREFERENCES, Context.MODE_PRIVATE) prefs.edit().putString(MEDIA_PREFERENCE_KEY + currentUserId, sb.toString()).apply()
prefs.edit().putString(MEDIA_PREFERENCE_KEY, sb.toString()).apply()
} }
/** /**