diff options
| -rw-r--r-- | services/core/java/com/android/server/dreams/DreamManagerService.java | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java index 19305dedcb06..f10e00a1eeae 100644 --- a/services/core/java/com/android/server/dreams/DreamManagerService.java +++ b/services/core/java/com/android/server/dreams/DreamManagerService.java @@ -64,12 +64,15 @@ import android.provider.Settings; import android.service.dreams.DreamManagerInternal; import android.service.dreams.DreamService; import android.service.dreams.IDreamManager; +import android.text.TextUtils; import android.util.Slog; +import android.util.SparseArray; import android.view.Display; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.content.PackageMonitor; import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.UiEventLoggerImpl; import com.android.internal.util.DumpUtils; @@ -86,6 +89,7 @@ import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.concurrent.CopyOnWriteArrayList; @@ -155,6 +159,10 @@ public final class DreamManagerService extends SystemService { private ComponentName mDreamOverlayServiceName; private final AmbientDisplayConfiguration mDozeConfig; + + /** Stores {@link PerUserPackageMonitor} to monitor dream uninstalls. */ + private final SparseArray<PackageMonitor> mPackageMonitors = new SparseArray<>(); + private final ActivityInterceptorCallback mActivityInterceptorCallback = new ActivityInterceptorCallback() { @Nullable @@ -218,6 +226,15 @@ public final class DreamManagerService extends SystemService { } } + private final class PerUserPackageMonitor extends PackageMonitor { + @Override + public void onPackageRemoved(String packageName, int uid) { + super.onPackageRemoved(packageName, uid); + final int userId = getChangingUserId(); + updateDreamOnPackageRemoved(packageName, userId); + } + } + public DreamManagerService(Context context) { this(context, new DreamHandler(FgThread.get().getLooper())); } @@ -333,6 +350,33 @@ public final class DreamManagerService extends SystemService { }); } + @Override + public void onUserStarting(@NonNull TargetUser user) { + super.onUserStarting(user); + mHandler.post(() -> { + final int userId = user.getUserIdentifier(); + if (!mPackageMonitors.contains(userId)) { + final PackageMonitor monitor = new PerUserPackageMonitor(); + monitor.register(mContext, UserHandle.of(userId), mHandler); + mPackageMonitors.put(userId, monitor); + } else { + Slog.w(TAG, "Package monitor already registered for " + userId); + } + }); + } + + @Override + public void onUserStopping(@NonNull TargetUser user) { + super.onUserStopping(user); + mHandler.post(() -> { + final PackageMonitor monitor = mPackageMonitors.removeReturnOld( + user.getUserIdentifier()); + if (monitor != null) { + monitor.unregister(); + } + }); + } + private void dumpInternal(PrintWriter pw) { synchronized (mLock) { pw.println("DREAM MANAGER (dumpsys dreams)"); @@ -664,6 +708,22 @@ public final class DreamManagerService extends SystemService { return validComponents.toArray(new ComponentName[validComponents.size()]); } + private void updateDreamOnPackageRemoved(String packageName, int userId) { + final ComponentName[] componentNames = componentsFromString( + Settings.Secure.getStringForUser(mContext.getContentResolver(), + Settings.Secure.SCREENSAVER_COMPONENTS, + userId)); + if (componentNames != null) { + // Filter out any components in the removed package. + final ComponentName[] filteredComponents = Arrays.stream(componentNames).filter( + (componentName -> !TextUtils.equals(componentName.getPackageName(), + packageName))).toArray(ComponentName[]::new); + if (filteredComponents.length != componentNames.length) { + setDreamComponentsForUser(userId, filteredComponents); + } + } + } + private void setDreamComponentsForUser(int userId, ComponentName[] componentNames) { Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.SCREENSAVER_COMPONENTS, |