From f6eb3e6eb9b42e60b69550fcadb48b35e71cc2e7 Mon Sep 17 00:00:00 2001 From: Nicolas Prevot Date: Tue, 8 Jul 2014 15:47:17 +0100 Subject: [PATCH] Remove cross-profile intent filters when removing a user. When a user is being removed: removing cross-profile intent filters that have this user as their source. This makes sure that if the user id gets reassigned without restarting the phone, we do not have old information from the preexisting profile. Change-Id: Ie3a2aa0cbbe6c9eb9e945e650fd907e5cc012409 --- .../java/com/android/server/pm/Settings.java | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index a3fd1dfa100c0..e16894e25f48f 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -3171,25 +3171,34 @@ final class Settings { file.delete(); file = getUserPackagesStateBackupFile(userId); file.delete(); - removeCrossProfileIntentFiltersToUserLPr(userId); + removeCrossProfileIntentFiltersLPw(userId); removeCrossProfilePackagesLPw(userId); } - void removeCrossProfileIntentFiltersToUserLPr(int targetUserId) { - for (int i = 0; i < mCrossProfileIntentResolvers.size(); i++) { - int sourceUserId = mCrossProfileIntentResolvers.keyAt(i); - CrossProfileIntentResolver cpir = mCrossProfileIntentResolvers.get(sourceUserId); - boolean needsWriting = false; - HashSet cpifs = - new HashSet(cpir.filterSet()); - for (CrossProfileIntentFilter cpif : cpifs) { - if (cpif.getTargetUserId() == targetUserId) { - needsWriting = true; - cpir.removeFilter(cpif); - } + void removeCrossProfileIntentFiltersLPw(int userId) { + synchronized (mCrossProfileIntentResolvers) { + // userId is the source user + if (mCrossProfileIntentResolvers.get(userId) != null) { + mCrossProfileIntentResolvers.remove(userId); + writePackageRestrictionsLPr(userId); } - if (needsWriting) { - writePackageRestrictionsLPr(sourceUserId); + // userId is the target user + int count = mCrossProfileIntentResolvers.size(); + for (int i = 0; i < count; i++) { + int sourceUserId = mCrossProfileIntentResolvers.keyAt(i); + CrossProfileIntentResolver cpir = mCrossProfileIntentResolvers.get(sourceUserId); + boolean needsWriting = false; + HashSet cpifs = + new HashSet(cpir.filterSet()); + for (CrossProfileIntentFilter cpif : cpifs) { + if (cpif.getTargetUserId() == userId) { + needsWriting = true; + cpir.removeFilter(cpif); + } + } + if (needsWriting) { + writePackageRestrictionsLPr(sourceUserId); + } } } }