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

Commit a74c0923 authored by Beth Thibodeau's avatar Beth Thibodeau Committed by Automerger Merge Worker
Browse files

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

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

Change-Id: I1fd6ff7292ae24eb4f7cedc0f21e6329ad2a68a8
parents 0efeed6c a940158c
Loading
Loading
Loading
Loading
+30 −1
Original line number Original line Diff line number Diff line
@@ -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,
+17 −10
Original line number Original line Diff line number Diff line
@@ -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()
    }
    }


    /**
    /**