Register package update receiver on currently foreground user

Previously the receiver was registered on user0. Usually apps are
installed/uninstalled for the current user only, so registering
on user0 won't receive package removed broadcast. To fix that, this
CL registers on currently foreground user.

This CL also removes legacy code.

Fixes: 138228396
Test: manual
Change-Id: Ic71440638e5bc3a4412ea3ed0e02b918faa3e70d
diff --git a/service/src/com/android/car/CarMediaService.java b/service/src/com/android/car/CarMediaService.java
index f0ca90d..cf5852a 100644
--- a/service/src/com/android/car/CarMediaService.java
+++ b/service/src/com/android/car/CarMediaService.java
@@ -75,7 +75,6 @@
     private static final String SOURCE_KEY = "media_source_component";
     private static final String PLAYBACK_STATE_KEY = "playback_state";
     private static final String SHARED_PREF = "com.android.car.media.car_media_service";
-    private static final String PACKAGE_NAME_SEPARATOR = ",";
     private static final String COMPONENT_NAME_SEPARATOR = ",";
 
     private final Context mContext;
@@ -105,12 +104,15 @@
     /** The package name of the last media source that was removed while being primary. */
     private String mRemovedMediaSourcePackage;
 
+    private final IntentFilter mPackageUpdateFilter;
+    private boolean mIsPackageUpdateReceiverRegistered;
+
     /**
-     * Listens to {@link Intent#ACTION_PACKAGE_REMOVED} and {@link Intent#ACTION_PACKAGE_REPLACED}
-     * so we can reset the media source to null when its application is uninstalled, and restore it
-     * when the application is reinstalled.
+     * Listens to {@link Intent#ACTION_PACKAGE_REMOVED}, {@link Intent#ACTION_PACKAGE_REPLACED} and
+     * {@link Intent#ACTION_PACKAGE_ADDED} so we can reset the media source to null when its
+     * application is uninstalled, and restore it when the application is reinstalled.
      */
-    private final BroadcastReceiver mPackageRemovedReceiver = new BroadcastReceiver() {
+    private final BroadcastReceiver mPackageUpdateReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
             if (intent.getData() == null) {
@@ -139,13 +141,12 @@
     private final BroadcastReceiver mUserSwitchReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
-            if (Log.isLoggable(CarLog.TAG_MEDIA, Log.DEBUG)) {
-                Log.d(CarLog.TAG_MEDIA, "Switched to user " + ActivityManager.getCurrentUser());
-            }
             mCurrentUser = ActivityManager.getCurrentUser();
-            // TODO(b/137037900): handle multiple users properly.
+            if (Log.isLoggable(CarLog.TAG_MEDIA, Log.DEBUG)) {
+                Log.d(CarLog.TAG_MEDIA, "Switched to user " + mCurrentUser);
+            }
             updateMediaSessionCallbackForCurrentUser();
-            if (mUserManager.isUserUnlocked(ActivityManager.getCurrentUser())) {
+            if (mUserManager.isUserUnlocked(mCurrentUser)) {
                 initUser();
             } else {
                 mPendingInit = true;
@@ -163,12 +164,11 @@
         mHandlerThread.start();
         mHandler = new Handler(mHandlerThread.getLooper());
 
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
-        filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
-        filter.addAction(Intent.ACTION_PACKAGE_ADDED);
-        filter.addDataScheme("package");
-        mContext.registerReceiver(mPackageRemovedReceiver, filter);
+        mPackageUpdateFilter = new IntentFilter();
+        mPackageUpdateFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+        mPackageUpdateFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
+        mPackageUpdateFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
+        mPackageUpdateFilter.addDataScheme("package");
 
         IntentFilter userSwitchFilter = new IntentFilter();
         userSwitchFilter.addAction(Intent.ACTION_USER_SWITCHED);
@@ -186,11 +186,18 @@
     }
 
     private void initUser() {
+        if (mIsPackageUpdateReceiverRegistered) {
+            mContext.unregisterReceiver(mPackageUpdateReceiver);
+        }
+        mContext.registerReceiverAsUser(mPackageUpdateReceiver, new UserHandle(mCurrentUser),
+                mPackageUpdateFilter, null, null);
+        mIsPackageUpdateReceiverRegistered = true;
+
         mPrimaryMediaComponent = getLastMediaSource();
         mActiveUserMediaController = null;
         String key = PLAYBACK_STATE_KEY + mCurrentUser;
-        mStartPlayback = mSharedPrefs.getInt(key, PlaybackState.STATE_NONE)
-            == PlaybackState.STATE_PLAYING;
+        mStartPlayback =
+                mSharedPrefs.getInt(key, PlaybackState.STATE_NONE) == PlaybackState.STATE_PLAYING;
         notifyListeners();
     }
 
@@ -594,11 +601,6 @@
         return new ArrayDeque(Arrays.asList(componentNames));
     }
 
-    private Deque<String> getPackageNameList(String serialized) {
-        String[] packageNames = serialized.split(PACKAGE_NAME_SEPARATOR);
-        return new ArrayDeque(Arrays.asList(packageNames));
-    }
-
     private void savePlaybackState(PlaybackState playbackState) {
         int state = playbackState != null ? playbackState.getState() : PlaybackState.STATE_NONE;
         if (state == PlaybackState.STATE_PLAYING) {