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

Commit 0f5a35fb authored by Song Jiayin's avatar Song Jiayin Committed by Jia Jia
Browse files

Unregister broadcast receiver when user removed



Bug: 327708654

Change-Id: I8c823776eb812d2afe8bb0726431534094108f29
Signed-off-by: default avatarJia Jia <jia.jia@zte.com.cn>
parent e7d727b2
Loading
Loading
Loading
Loading
+32 −4
Original line number Diff line number Diff line
@@ -54,8 +54,10 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.os.ext.SdkExtensions;
import android.provider.DeviceConfig;
import android.util.ArrayMap;
import android.util.Log;
import android.util.LongArrayQueue;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
@@ -173,6 +175,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub implements Rollba
    // Accessed on the handler thread only.
    private long  mRelativeBootTime = calculateRelativeBootTime();

    private final ArrayMap<Integer, Pair<Context, BroadcastReceiver>> mUserBroadcastReceivers;

    RollbackManagerServiceImpl(Context context) {
        mContext = context;
        // Note that we're calling onStart here because this object is only constructed on
@@ -210,6 +214,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub implements Rollba
            }
        });

        mUserBroadcastReceivers = new ArrayMap<>();

        UserManager userManager = mContext.getSystemService(UserManager.class);
        for (UserHandle user : userManager.getUserHandles(true)) {
            registerUserCallbacks(user);
@@ -275,7 +281,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub implements Rollba
            }
        }, enableRollbackTimedOutFilter, null, getHandler());

        IntentFilter userAddedIntentFilter = new IntentFilter(Intent.ACTION_USER_ADDED);
        IntentFilter userIntentFilter = new IntentFilter();
        userIntentFilter.addAction(Intent.ACTION_USER_ADDED);
        userIntentFilter.addAction(Intent.ACTION_USER_REMOVED);
        mContext.registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
@@ -287,9 +295,15 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub implements Rollba
                        return;
                    }
                    registerUserCallbacks(UserHandle.of(newUserId));
                } else if (Intent.ACTION_USER_REMOVED.equals(intent.getAction())) {
                    final int newUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
                    if (newUserId == -1) {
                        return;
                    }
                    unregisterUserCallbacks(UserHandle.of(newUserId));
                }
            }
        }, userAddedIntentFilter, null, getHandler());
        }, userIntentFilter, null, getHandler());

        registerTimeChangeReceiver();
    }
@@ -335,7 +349,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub implements Rollba
        filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
        filter.addAction(Intent.ACTION_PACKAGE_FULLY_REMOVED);
        filter.addDataScheme("package");
        context.registerReceiver(new BroadcastReceiver() {
        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                assertInWorkerThread();
@@ -354,7 +368,21 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub implements Rollba
                    onPackageFullyRemoved(packageName);
                }
            }
        }, filter, null, getHandler());
        };
        context.registerReceiver(receiver, filter, null, getHandler());
        mUserBroadcastReceivers.put(user.getIdentifier(), new Pair(context, receiver));
    }

    @AnyThread
    private void unregisterUserCallbacks(UserHandle user) {
        Pair<Context, BroadcastReceiver> pair = mUserBroadcastReceivers.get(user.getIdentifier());
        if (pair == null || pair.first == null || pair.second == null) {
            Slog.e(TAG, "No receiver found for the user" + user);
            return;
        }

        pair.first.unregisterReceiver(pair.second);
        mUserBroadcastReceivers.remove(user.getIdentifier());
    }

    @ExtThread