diff options
3 files changed, 89 insertions, 55 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 1c8f6f1f851d..681ff9022e4b 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -6554,7 +6554,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public PackageConfigurationUpdater createPackageConfigurationUpdater() { - return new PackageConfigurationUpdaterImpl(Binder.getCallingPid()); + return new PackageConfigurationUpdaterImpl(Binder.getCallingPid(), + ActivityTaskManagerService.this); } @Override @@ -6571,57 +6572,4 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { null /* trigger */, mRootWindowContainer.getDefaultDisplay()); } } - - final class PackageConfigurationUpdaterImpl implements - ActivityTaskManagerInternal.PackageConfigurationUpdater { - private final int mPid; - private Integer mNightMode; - private LocaleList mLocales; - - PackageConfigurationUpdaterImpl(int pid) { - mPid = pid; - } - - @Override - public ActivityTaskManagerInternal.PackageConfigurationUpdater setNightMode(int nightMode) { - mNightMode = nightMode; - return this; - } - - @Override - public ActivityTaskManagerInternal.PackageConfigurationUpdater - setLocales(LocaleList locales) { - mLocales = locales; - return this; - } - - @Override - public void commit() { - synchronized (mGlobalLock) { - final long ident = Binder.clearCallingIdentity(); - try { - final WindowProcessController wpc = mProcessMap.getProcess(mPid); - if (wpc == null) { - Slog.w(TAG, "Override application configuration: cannot find pid " + mPid); - return; - } - LocaleList localesOverride = LocaleOverlayHelper.combineLocalesIfOverlayExists( - mLocales, getGlobalConfiguration().getLocales()); - wpc.applyAppSpecificConfig(mNightMode, localesOverride); - wpc.updateAppSpecificSettingsForAllActivities(mNightMode, localesOverride); - mPackageConfigPersister.updateFromImpl(wpc.mName, wpc.mUserId, this); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - } - - Integer getNightMode() { - return mNightMode; - } - - LocaleList getLocales() { - return mLocales; - } - } } diff --git a/services/core/java/com/android/server/wm/PackageConfigPersister.java b/services/core/java/com/android/server/wm/PackageConfigPersister.java index 505c4beb8fdc..52eea4d3d6e1 100644 --- a/services/core/java/com/android/server/wm/PackageConfigPersister.java +++ b/services/core/java/com/android/server/wm/PackageConfigPersister.java @@ -173,7 +173,7 @@ public class PackageConfigPersister { @GuardedBy("mLock") void updateFromImpl(String packageName, int userId, - ActivityTaskManagerService.PackageConfigurationUpdaterImpl impl) { + PackageConfigurationUpdaterImpl impl) { synchronized (mLock) { PackageConfigRecord record = findRecordOrCreate(mModified, packageName, userId); if (impl.getNightMode() != null) { diff --git a/services/core/java/com/android/server/wm/PackageConfigurationUpdaterImpl.java b/services/core/java/com/android/server/wm/PackageConfigurationUpdaterImpl.java new file mode 100644 index 000000000000..960250544299 --- /dev/null +++ b/services/core/java/com/android/server/wm/PackageConfigurationUpdaterImpl.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.wm; + +import android.os.Binder; +import android.os.LocaleList; +import android.util.Slog; + +/** + * An implementation of {@link ActivityTaskManagerInternal.PackageConfigurationUpdater}. + */ +final class PackageConfigurationUpdaterImpl implements + ActivityTaskManagerInternal.PackageConfigurationUpdater { + private static final String TAG = "PackageConfigurationUpdaterImpl"; + private final int mPid; + private Integer mNightMode; + private LocaleList mLocales; + private ActivityTaskManagerService mAtm; + + PackageConfigurationUpdaterImpl(int pid, ActivityTaskManagerService atm) { + mPid = pid; + mAtm = atm; + } + + @Override + public ActivityTaskManagerInternal.PackageConfigurationUpdater setNightMode(int nightMode) { + synchronized (this) { + mNightMode = nightMode; + } + return this; + } + + @Override + public ActivityTaskManagerInternal.PackageConfigurationUpdater + setLocales(LocaleList locales) { + synchronized (this) { + mLocales = locales; + } + return this; + } + + @Override + public void commit() { + synchronized (this) { + 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; + } + LocaleList localesOverride = LocaleOverlayHelper.combineLocalesIfOverlayExists( + mLocales, mAtm.getGlobalConfiguration().getLocales()); + wpc.applyAppSpecificConfig(mNightMode, localesOverride); + wpc.updateAppSpecificSettingsForAllActivities(mNightMode, localesOverride); + mAtm.mPackageConfigPersister.updateFromImpl(wpc.mName, wpc.mUserId, this); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + } + } + + Integer getNightMode() { + return mNightMode; + } + + LocaleList getLocales() { + return mLocales; + } +} |