diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java index e5244296b1f47..31203c73c76ad 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java @@ -63,6 +63,7 @@ import com.android.server.appsearch.external.localstorage.stats.CallStats; import com.android.server.appsearch.stats.LoggerInstanceManager; import com.android.server.appsearch.stats.PlatformLogger; import com.android.server.appsearch.util.PackageUtil; +import com.android.server.appsearch.visibilitystore.VisibilityStore; import com.android.server.usage.StorageStatsManagerLocal; import com.android.server.usage.StorageStatsManagerLocal.StorageStatsAugmenter; @@ -218,11 +219,12 @@ public class AppSearchManagerService extends SystemService { UserHandle userHandle = UserHandle.getUserHandleForUid(uid); try { if (isUserLocked(userHandle)) { - //TODO(b/186151459) clear the uninstalled package data when user is unlocked. + // We cannot access a locked user's directry and remove package data from it. + // We should remove those uninstalled package data when the user is unlocking. return; } + // Only clear the package's data if AppSearch exists for this user. if (ImplInstanceManager.getAppSearchDir(userHandle).exists()) { - // Only clear the package's data if AppSearch exists for this user. PlatformLogger logger = mLoggerInstanceManager.getOrCreatePlatformLogger(mContext, userHandle, AppSearchConfig.getInstance(EXECUTOR)); AppSearchImpl impl = mImplInstanceManager.getOrCreateAppSearchImpl(mContext, @@ -239,9 +241,34 @@ public class AppSearchManagerService extends SystemService { @Override public void onUserUnlocking(@NonNull TargetUser user) { Objects.requireNonNull(user); + UserHandle userHandle = user.getUserHandle(); synchronized (mUnlockedUsersLocked) { - mUnlockedUsersLocked.add(user.getUserHandle()); + mUnlockedUsersLocked.add(userHandle); } + EXECUTOR.execute(() -> { + try { + // Only clear the package's data if AppSearch exists for this user. + if (ImplInstanceManager.getAppSearchDir(userHandle).exists()) { + PlatformLogger logger = mLoggerInstanceManager.getOrCreatePlatformLogger( + mContext, userHandle, AppSearchConfig.getInstance(EXECUTOR)); + AppSearchImpl impl = mImplInstanceManager.getOrCreateAppSearchImpl(mContext, + userHandle, logger); + List installedPackageInfos = mContext + .createContextAsUser(userHandle, /*flags=*/0) + .getPackageManager() + .getInstalledPackages(/*flags=*/0); + Set packagesToKeep = new ArraySet<>(installedPackageInfos.size()); + for (int i = 0; i < installedPackageInfos.size(); i++) { + packagesToKeep.add(installedPackageInfos.get(i).packageName); + } + packagesToKeep.add(VisibilityStore.PACKAGE_NAME); + //TODO(b/145759910) clear visibility setting for package. + impl.prunePackageData(packagesToKeep); + } + } catch (Throwable t) { + Log.e(TAG, "Unable to prune packages for " + user, t); + } + }); } @Override @@ -1255,9 +1282,6 @@ public class AppSearchManagerService extends SystemService { * @param callingUid The actual uid of the caller as determined by Binder. * @return the user handle that the call should run as. Will always be a concrete user. */ - // TODO(b/173553485) verifying that the caller has permission to access target user's data - // TODO(b/173553485) Handle ACTION_USER_REMOVED broadcast - // TODO(b/173553485) Implement SystemService.onUserStopping() @NonNull private UserHandle handleIncomingUser(@NonNull UserHandle requestedUser, int callingUid) { int callingPid = Binder.getCallingPid(); diff --git a/apex/appsearch/service/java/com/android/server/appsearch/visibilitystore/VisibilityStore.java b/apex/appsearch/service/java/com/android/server/appsearch/visibilitystore/VisibilityStore.java index af09210b2c18c..a9f6adb20225b 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/visibilitystore/VisibilityStore.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/visibilitystore/VisibilityStore.java @@ -76,7 +76,7 @@ public class VisibilityStore { * These cannot have any of the special characters used by AppSearchImpl (e.g. {@code * AppSearchImpl#PACKAGE_DELIMITER} or {@code AppSearchImpl#DATABASE_DELIMITER}. */ - @VisibleForTesting public static final String PACKAGE_NAME = "VS#Pkg"; + public static final String PACKAGE_NAME = "VS#Pkg"; @VisibleForTesting public static final String DATABASE_NAME = "VS#Db";