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:
@@ -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,
|
||||||
|
|||||||
@@ -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()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user