diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java index 0ba77d8552d35..4149980c7d453 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java @@ -596,10 +596,17 @@ public abstract class ActivityTaskManagerInternal { public abstract boolean isBaseOfLockedTask(String packageName); /** - * Create an interface to update configuration for an application. + * Creates an interface to update configuration for the calling application. */ public abstract PackageConfigurationUpdater createPackageConfigurationUpdater(); + /** + * Creates an interface to update configuration for an arbitrary application specified by it's + * packageName and userId. + */ + public abstract PackageConfigurationUpdater createPackageConfigurationUpdater( + String packageName, int userId); + /** * An interface to update configuration for an application, and will persist override * configuration for this package. diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 6e5ba31b3ff69..f278e3e229824 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -6556,6 +6556,13 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { ActivityTaskManagerService.this); } + @Override + public PackageConfigurationUpdater createPackageConfigurationUpdater( + String packageName , int userId) { + return new PackageConfigurationUpdaterImpl(packageName, userId, + ActivityTaskManagerService.this); + } + @Override public boolean hasSystemAlertWindowPermission(int callingUid, int callingPid, String callingPackage) { diff --git a/services/core/java/com/android/server/wm/PackageConfigurationUpdaterImpl.java b/services/core/java/com/android/server/wm/PackageConfigurationUpdaterImpl.java index 9602505442993..8bbcf1f9c029c 100644 --- a/services/core/java/com/android/server/wm/PackageConfigurationUpdaterImpl.java +++ b/services/core/java/com/android/server/wm/PackageConfigurationUpdaterImpl.java @@ -16,26 +16,40 @@ package com.android.server.wm; +import android.content.pm.PackageManager; import android.os.Binder; import android.os.LocaleList; +import android.util.ArraySet; import android.util.Slog; +import java.util.Optional; + /** * An implementation of {@link ActivityTaskManagerInternal.PackageConfigurationUpdater}. */ final class PackageConfigurationUpdaterImpl implements ActivityTaskManagerInternal.PackageConfigurationUpdater { private static final String TAG = "PackageConfigurationUpdaterImpl"; - private final int mPid; + private final Optional mPid; private Integer mNightMode; private LocaleList mLocales; + private String mPackageName; + private int mUserId; private ActivityTaskManagerService mAtm; PackageConfigurationUpdaterImpl(int pid, ActivityTaskManagerService atm) { - mPid = pid; + mPid = Optional.of(pid); mAtm = atm; } + PackageConfigurationUpdaterImpl(String packageName, int userId, + ActivityTaskManagerService atm) { + mPackageName = packageName; + mUserId = userId; + mAtm = atm; + mPid = Optional.empty(); + } + @Override public ActivityTaskManagerInternal.PackageConfigurationUpdater setNightMode(int nightMode) { synchronized (this) { @@ -59,16 +73,29 @@ final class PackageConfigurationUpdaterImpl implements synchronized (mAtm.mGlobalLock) { final long ident = Binder.clearCallingIdentity(); try { - final WindowProcessController wpc = mAtm.mProcessMap.getProcess(mPid); - if (wpc == null) { - Slog.w(TAG, "Override application configuration: cannot find pid " + mPid); - return; + final int uid; + if (mPid.isPresent()) { + WindowProcessController wpc = mAtm.mProcessMap.getProcess(mPid.get()); + if (wpc == null) { + Slog.w(TAG, "commit: Override application configuration failed: " + + "cannot find pid " + mPid); + return; + } + uid = wpc.mUid; + mUserId = wpc.mUserId; + mPackageName = wpc.mInfo.packageName; + } else { + uid = mAtm.getPackageManagerInternalLocked().getPackageUid(mPackageName, + /* flags = */ PackageManager.MATCH_ALL, mUserId); + if (uid < 0) { + Slog.w(TAG, "commit: update of application configuration failed: " + + "userId or packageName not valid " + mUserId); + return; + } } - LocaleList localesOverride = LocaleOverlayHelper.combineLocalesIfOverlayExists( - mLocales, mAtm.getGlobalConfiguration().getLocales()); - wpc.applyAppSpecificConfig(mNightMode, localesOverride); - wpc.updateAppSpecificSettingsForAllActivities(mNightMode, localesOverride); - mAtm.mPackageConfigPersister.updateFromImpl(wpc.mName, wpc.mUserId, this); + updateConfig(uid, mPackageName); + mAtm.mPackageConfigPersister.updateFromImpl(mPackageName, mUserId, this); + } finally { Binder.restoreCallingIdentity(ident); } @@ -76,6 +103,19 @@ final class PackageConfigurationUpdaterImpl implements } } + private void updateConfig(int uid, String packageName) { + final ArraySet processes = mAtm.mProcessMap.getProcesses(uid); + if (processes == null) return; + for (int i = processes.size() - 1; i >= 0; i--) { + final WindowProcessController wpc = processes.valueAt(i); + if (!wpc.mInfo.packageName.equals(packageName)) continue; + LocaleList localesOverride = LocaleOverlayHelper.combineLocalesIfOverlayExists( + mLocales, mAtm.getGlobalConfiguration().getLocales()); + wpc.applyAppSpecificConfig(mNightMode, localesOverride); + wpc.updateAppSpecificSettingsForAllActivities(mNightMode, localesOverride); + } + } + Integer getNightMode() { return mNightMode; } diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index 6eb2e8a2fd542..719d52c892097 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -264,7 +264,7 @@ public class WindowProcessController extends ConfigurationContainer