diff options
| -rw-r--r-- | core/java/android/app/ActivityThread.java | 28 | ||||
| -rw-r--r-- | core/java/android/app/ActivityThreadInternal.java | 3 | ||||
| -rw-r--r-- | core/java/android/app/ConfigurationController.java | 2 | ||||
| -rw-r--r-- | core/java/android/app/ContextImpl.java | 20 | ||||
| -rw-r--r-- | core/java/android/window/SystemUiContext.java | 69 | ||||
| -rw-r--r-- | core/tests/coretests/Android.bp | 242 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/content/ContextTest.java | 51 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/DisplayContent.java | 47 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/DisplayPolicy.java | 1 |
9 files changed, 323 insertions, 140 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index f63170aa159d..588ca1d7fa14 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -387,7 +387,7 @@ public final class ActivityThread extends ClientTransactionHandler @UnsupportedAppUsage private ContextImpl mSystemContext; @GuardedBy("this") - private ArrayList<WeakReference<ContextImpl>> mDisplaySystemUiContexts; + private ArrayList<WeakReference<Context>> mDisplaySystemUiContexts; @UnsupportedAppUsage static volatile IPackageManager sPackageManager; @@ -3204,7 +3204,7 @@ public final class ActivityThread extends ClientTransactionHandler } @NonNull - public ContextImpl getSystemUiContext() { + public Context getSystemUiContext() { return getSystemUiContext(DEFAULT_DISPLAY); } @@ -3214,7 +3214,7 @@ public final class ActivityThread extends ClientTransactionHandler * @see ContextImpl#createSystemUiContext(ContextImpl, int) */ @NonNull - public ContextImpl getSystemUiContext(int displayId) { + public Context getSystemUiContext(int displayId) { synchronized (this) { if (mDisplaySystemUiContexts == null) { mDisplaySystemUiContexts = new ArrayList<>(); @@ -3222,7 +3222,7 @@ public final class ActivityThread extends ClientTransactionHandler mDisplaySystemUiContexts.removeIf(contextRef -> contextRef.refersTo(null)); - ContextImpl context = getSystemUiContextNoCreateLocked(displayId); + Context context = getSystemUiContextNoCreateLocked(displayId); if (context != null) { return context; } @@ -3233,9 +3233,20 @@ public final class ActivityThread extends ClientTransactionHandler } } + /** + * Creates a {@code SystemUiContext} for testing. + * <p> + * DO NOT use it in production code. + */ + @VisibleForTesting + @NonNull + public Context createSystemUiContextForTesting(int displayId) { + return ContextImpl.createSystemUiContext(getSystemContext(), displayId); + } + @Nullable @Override - public ContextImpl getSystemUiContextNoCreate() { + public Context getSystemUiContextNoCreate() { synchronized (this) { if (mDisplaySystemUiContexts == null) { return null; @@ -3246,9 +3257,9 @@ public final class ActivityThread extends ClientTransactionHandler @GuardedBy("this") @Nullable - private ContextImpl getSystemUiContextNoCreateLocked(int displayId) { + private Context getSystemUiContextNoCreateLocked(int displayId) { for (int i = 0; i < mDisplaySystemUiContexts.size(); i++) { - ContextImpl context = mDisplaySystemUiContexts.get(i).get(); + Context context = mDisplaySystemUiContexts.get(i).get(); if (context != null && context.getDisplayId() == displayId) { return context; } @@ -3267,7 +3278,8 @@ public final class ActivityThread extends ClientTransactionHandler public void installSystemApplicationInfo(ApplicationInfo info, ClassLoader classLoader) { synchronized (this) { getSystemContext().installSystemApplicationInfo(info, classLoader); - getSystemUiContext().installSystemApplicationInfo(info, classLoader); + final ContextImpl sysUiContextImpl = ContextImpl.getImpl(getSystemUiContext()); + sysUiContextImpl.installSystemApplicationInfo(info, classLoader); // give ourselves a default profiler mProfiler = new Profiler(); diff --git a/core/java/android/app/ActivityThreadInternal.java b/core/java/android/app/ActivityThreadInternal.java index 72506b9fcdbb..70876da9183f 100644 --- a/core/java/android/app/ActivityThreadInternal.java +++ b/core/java/android/app/ActivityThreadInternal.java @@ -17,6 +17,7 @@ package android.app; import android.content.ComponentCallbacks2; +import android.content.Context; import java.util.ArrayList; @@ -28,7 +29,7 @@ import java.util.ArrayList; interface ActivityThreadInternal { ContextImpl getSystemContext(); - ContextImpl getSystemUiContextNoCreate(); + Context getSystemUiContextNoCreate(); boolean isInDensityCompatMode(); diff --git a/core/java/android/app/ConfigurationController.java b/core/java/android/app/ConfigurationController.java index 62a50dbbd6f7..f491e3d274db 100644 --- a/core/java/android/app/ConfigurationController.java +++ b/core/java/android/app/ConfigurationController.java @@ -169,7 +169,7 @@ class ConfigurationController { // Get theme outside of synchronization to avoid nested lock. final Resources.Theme systemTheme = mActivityThread.getSystemContext().getTheme(); - final ContextImpl systemUiContext = mActivityThread.getSystemUiContextNoCreate(); + final Context systemUiContext = mActivityThread.getSystemUiContextNoCreate(); final Resources.Theme systemUiTheme = systemUiContext != null ? systemUiContext.getTheme() : null; synchronized (mResourcesManager) { diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index d8aa8b3df622..0519695ff7fe 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -97,6 +97,7 @@ import android.util.Slog; import android.view.Display; import android.view.DisplayAdjustments; import android.view.autofill.AutofillManager.AutofillClient; +import android.window.SystemUiContext; import android.window.WindowContext; import android.window.WindowTokenClient; import android.window.WindowTokenClientController; @@ -3477,15 +3478,28 @@ class ContextImpl extends Context { * {@link #createSystemContext(ActivityThread)}. * @param displayId The ID of the display where the UI is shown. */ - static ContextImpl createSystemUiContext(ContextImpl systemContext, int displayId) { + static Context createSystemUiContext(ContextImpl systemContext, int displayId) { + // Step 1. Create a ContextImpl associated with its own resources. final WindowTokenClient token = new WindowTokenClient(); final ContextImpl context = systemContext.createWindowContextBase(token, displayId); - token.attachContext(context); + + // Step 2. Create a SystemUiContext to wrap the ContextImpl, which enables to listen to + // its config updates. + final Context systemUiContext; + if (com.android.window.flags.Flags.trackSystemUiContextBeforeWms()) { + systemUiContext = new SystemUiContext(context); + context.setOuterContext(systemUiContext); + } else { + systemUiContext = context; + } + token.attachContext(systemUiContext); + + // Step 3. Associate the SystemUiContext with the display specified with ID. WindowTokenClientController.getInstance().attachToDisplayContent(token, displayId); context.mContextType = CONTEXT_TYPE_SYSTEM_OR_SYSTEM_UI; context.mOwnsToken = true; - return context; + return systemUiContext; } @UnsupportedAppUsage diff --git a/core/java/android/window/SystemUiContext.java b/core/java/android/window/SystemUiContext.java new file mode 100644 index 000000000000..1e9a7203c09f --- /dev/null +++ b/core/java/android/window/SystemUiContext.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2025 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 android.window; + +import android.annotation.NonNull; +import android.content.ComponentCallbacks; +import android.content.ComponentCallbacksController; +import android.content.Context; +import android.content.ContextWrapper; +import android.content.res.Configuration; + +import com.android.window.flags.Flags; + +/** + * System Context to be used for UI. This Context has resources that can be themed. + * + * @see android.app.ActivityThread#getSystemUiContext(int) + * + * @hide + */ +public class SystemUiContext extends ContextWrapper implements ConfigurationDispatcher { + + private final ComponentCallbacksController mCallbacksController = + new ComponentCallbacksController(); + + public SystemUiContext(Context base) { + super(base); + if (!Flags.trackSystemUiContextBeforeWms()) { + throw new UnsupportedOperationException("SystemUiContext can only be used after" + + " flag is enabled."); + } + } + + @Override + public void registerComponentCallbacks(@NonNull ComponentCallbacks callback) { + mCallbacksController.registerCallbacks(callback); + } + + @Override + public void unregisterComponentCallbacks(@NonNull ComponentCallbacks callback) { + mCallbacksController.unregisterCallbacks(callback); + } + + /** Dispatch {@link Configuration} to each {@link ComponentCallbacks}. */ + @Override + public void dispatchConfigurationChanged(@NonNull Configuration newConfig) { + mCallbacksController.dispatchConfigurationChanged(newConfig); + } + + @Override + public boolean shouldReportPrivateChanges() { + // We should report all config changes to update fields obtained from resources. + return true; + } +} diff --git a/core/tests/coretests/Android.bp b/core/tests/coretests/Android.bp index c06ad64cc0f5..4c49ff849d49 100644 --- a/core/tests/coretests/Android.bp +++ b/core/tests/coretests/Android.bp @@ -10,8 +10,8 @@ package { filegroup { name: "FrameworksCoreTests-aidl", srcs: [ - "src/**/I*.aidl", "aidl/**/I*.aidl", + "src/**/I*.aidl", ], visibility: ["//visibility:private"], } @@ -19,13 +19,13 @@ filegroup { filegroup { name: "FrameworksCoreTests-helpers", srcs: [ - "DisabledTestApp/src/**/*.java", - "EnabledTestApp/src/**/*.java", + "AppThatCallsBinderMethods/src/**/*.kt", + "BinderDeathRecipientHelperApp/src/**/*.java", "BinderFrozenStateChangeCallbackTestApp/src/**/*.java", "BinderProxyCountingTestApp/src/**/*.java", "BinderProxyCountingTestService/src/**/*.java", - "BinderDeathRecipientHelperApp/src/**/*.java", - "AppThatCallsBinderMethods/src/**/*.kt", + "DisabledTestApp/src/**/*.java", + "EnabledTestApp/src/**/*.java", ], visibility: ["//visibility:private"], } @@ -45,11 +45,11 @@ android_test { defaults: ["FrameworksCoreTests-resources"], srcs: [ - "src/**/*.java", - "src/**/*.kt", + ":FrameworksCoreTestDoubles-sources", ":FrameworksCoreTests-aidl", ":FrameworksCoreTests-helpers", - ":FrameworksCoreTestDoubles-sources", + "src/**/*.java", + "src/**/*.kt", ], aidl: { @@ -65,74 +65,74 @@ android_test { "-c fa", ], static_libs: [ - "collector-device-lib-platform", - "frameworks-base-testutils", - "core-test-rules", // for libcore.dalvik.system.CloseGuardSupport - "core-tests-support", - "cts-input-lib", + "TestParameterInjector", "android-common", - "frameworks-core-util-lib", - "mockwebserver", - "guava", - "guava-android-testlib", "android.app.usage.flags-aconfig-java", + "android.content.res.flags-aconfig-java", + "android.security.flags-aconfig-java", "android.view.accessibility.flags-aconfig-java", "androidx.core_core", "androidx.core_core-ktx", "androidx.test.core", "androidx.test.espresso.core", "androidx.test.ext.junit", - "androidx.test.runner", "androidx.test.rules", + "androidx.test.runner", + "androidx.test.uiautomator_uiautomator", + "collector-device-lib-platform", + "com.android.text.flags-aconfig-java", + "core-test-rules", // for libcore.dalvik.system.CloseGuardSupport + "core-tests-support", + "cts-input-lib", + "device-time-shell-utils", "flag-junit", + "flag-junit", + "flickerlib-parsers", + "flickerlib-trace_processor_shell", + "frameworks-base-testutils", + "frameworks-core-util-lib", + "guava", + "guava-android-testlib", "junit-params", "kotlin-test", + "mockito-kotlin2", + "mockito-target-extended-minus-junit4", "mockito-target-minus-junit4", - "androidx.test.uiautomator_uiautomator", + "mockwebserver", + "perfetto_trace_java_protos", + "platform-compat-test-rules", "platform-parametric-runner-lib", "platform-test-annotations", - "platform-compat-test-rules", - "truth", "print-test-util-lib", - "testng", + "ravenwood-junit", "servicestests-utils", - "device-time-shell-utils", "testables", - "com.android.text.flags-aconfig-java", - "flag-junit", - "ravenwood-junit", - "perfetto_trace_java_protos", - "flickerlib-parsers", - "flickerlib-trace_processor_shell", - "mockito-target-extended-minus-junit4", - "TestParameterInjector", - "android.content.res.flags-aconfig-java", - "android.security.flags-aconfig-java", - "mockito-kotlin2", + "testng", + "truth", ], libs: [ - "android.test.runner.stubs", - "org.apache.http.legacy.stubs", "android.test.base.stubs", "android.test.mock.stubs", - "framework", + "android.test.runner.stubs", + "android.view.flags-aconfig-java", "ext", + "framework", "framework-res", - "android.view.flags-aconfig-java", + "org.apache.http.legacy.stubs", ], jni_libs: [ + "libAppOpsTest_jni", "libpowermanagertest_jni", "libviewRootImplTest_jni", "libworksourceparceltest_jni", - "libAppOpsTest_jni", ], sdk_version: "core_platform", test_suites: [ - "device-tests", - "device-platinum-tests", "automotive-tests", + "device-platinum-tests", + "device-tests", ], certificate: "platform", @@ -141,21 +141,21 @@ android_test { java_resources: [":FrameworksCoreTests_unit_test_cert_der"], data: [ + ":AppThatCallsBinderMethods", + ":AppThatUsesAppOps", ":BinderDeathRecipientHelperApp1", ":BinderDeathRecipientHelperApp2", - ":com.android.cts.helpers.aosp", ":BinderFrozenStateChangeCallbackTestApp", ":BinderProxyCountingTestApp", ":BinderProxyCountingTestService", - ":AppThatUsesAppOps", - ":AppThatCallsBinderMethods", - ":HelloWorldSdk1", - ":HelloWorldUsingSdk1AndSdk1", - ":HelloWorldUsingSdk1And2", - ":HelloWorldUsingSdkMalformedNegativeVersion", ":CtsStaticSharedLibConsumerApp1", ":CtsStaticSharedLibConsumerApp3", ":CtsStaticSharedLibProviderApp1", + ":HelloWorldSdk1", + ":HelloWorldUsingSdk1And2", + ":HelloWorldUsingSdk1AndSdk1", + ":HelloWorldUsingSdkMalformedNegativeVersion", + ":com.android.cts.helpers.aosp", ], } @@ -170,8 +170,8 @@ android_app { // FrameworksCoreTestsRavenwood references the .aapt.srcjar use_resource_processor: false, libs: [ - "framework-res", "android.test.runner.stubs", + "framework-res", "org.apache.http.legacy.stubs", ], uses_libs: [ @@ -231,16 +231,16 @@ android_library { static_libs: [ "androidx.test.espresso.core", "androidx.test.ext.junit", - "androidx.test.runner", "androidx.test.rules", + "androidx.test.runner", "mockito-target-minus-junit4", "truth", ], libs: [ - "android.test.runner.stubs.system", "android.test.base.stubs.system", "android.test.mock.stubs.system", + "android.test.runner.stubs.system", "framework", "framework-res", ], @@ -249,43 +249,43 @@ android_library { android_ravenwood_test { name: "FrameworksCoreTestsRavenwood", libs: [ - "android.test.runner.stubs.system", "android.test.base.stubs.system", + "android.test.runner.stubs.system", ], static_libs: [ - "core-test-rules", // for libcore.dalvik.system.CloseGuardSupport + "androidx.annotation_annotation", "androidx.core_core", "androidx.core_core-ktx", - "androidx.annotation_annotation", - "androidx.test.rules", "androidx.test.ext.junit", + "androidx.test.rules", "androidx.test.uiautomator_uiautomator", "compatibility-device-util-axt-ravenwood", + "core-test-rules", // for libcore.dalvik.system.CloseGuardSupport "flag-junit", - "platform-test-annotations", - "perfetto_trace_java_protos", "flag-junit", + "perfetto_trace_java_protos", + "platform-test-annotations", "testng", ], srcs: [ "src/android/app/ActivityManagerTest.java", + "src/android/app/PropertyInvalidatedCacheTests.java", "src/android/colormodel/CamTest.java", "src/android/content/ContextTest.java", + "src/android/content/TestComponentCallbacks2.java", "src/android/content/pm/PackageManagerTest.java", "src/android/content/pm/UserInfoTest.java", - "src/android/app/PropertyInvalidatedCacheTests.java", - "src/android/database/CursorWindowTest.java", - "src/android/os/**/*.java", "src/android/content/res/*.java", "src/android/content/res/*.kt", + "src/android/database/CursorWindowTest.java", + "src/android/os/**/*.java", "src/android/telephony/PinResultTest.java", "src/android/util/**/*.java", "src/android/view/DisplayAdjustmentsTests.java", - "src/android/view/DisplayTest.java", "src/android/view/DisplayInfoTest.java", + "src/android/view/DisplayTest.java", "src/com/android/internal/logging/**/*.java", "src/com/android/internal/os/**/*.java", - "src/com/android/internal/util/**/*.java", "src/com/android/internal/power/EnergyConsumerStatsTest.java", "src/com/android/internal/ravenwood/**/*.java", @@ -293,10 +293,12 @@ android_ravenwood_test { // to avoid having a dependency to FrameworksCoreTests. // This way, when updating source files and running this test, we don't need to // rebuild the entire FrameworksCoreTests, which would be slow. - ":FrameworksCoreTests-resonly{.aapt.srcjar}", + "src/com/android/internal/util/**/*.java", + + ":FrameworksCoreTestDoubles-sources", ":FrameworksCoreTests-aidl", ":FrameworksCoreTests-helpers", - ":FrameworksCoreTestDoubles-sources", + ":FrameworksCoreTests-resonly{.aapt.srcjar}", ], exclude_srcs: [ "src/android/content/res/FontScaleConverterActivityTest.java", @@ -320,8 +322,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_annotations: ["android.platform.test.annotations.Presubmit"], } @@ -331,12 +333,12 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: [ - "com.android.internal.inputmethod", "android.view.inputmethod", + "com.android.internal.inputmethod", ], exclude_annotations: ["androidx.test.filters.FlakyTest"], } @@ -346,8 +348,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["android.content.ContextTest"], } @@ -357,8 +359,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["android.app.KeyguardManagerTest"], } @@ -368,8 +370,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["android.app.PropertyInvalidatedCacheTests"], } @@ -379,12 +381,12 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: [ - "android.content.ContextTest", "android.content.ComponentCallbacksControllerTest", + "android.content.ContextTest", "android.content.ContextWrapperTest", ], } @@ -394,8 +396,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["android.database.sqlite.SQLiteRawStatementTest"], } @@ -405,8 +407,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["android.net"], include_annotations: ["android.platform.test.annotations.Presubmit"], @@ -417,8 +419,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["com.android.internal.os.BatteryStatsTests"], exclude_annotations: ["com.android.internal.os.SkipPresubmit"], @@ -429,8 +431,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["android.os.EnvironmentTest"], } @@ -440,12 +442,12 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: [ - "com.android.internal.util.FastDataTest", "android.util.CharsetUtilsTest", + "com.android.internal.util.FastDataTest", ], } @@ -454,12 +456,12 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: [ - "android.util.XmlTest", "android.util.BinaryXmlTest", + "android.util.XmlTest", ], } @@ -468,8 +470,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["android.util.apk.SourceStampVerifierTest"], } @@ -479,8 +481,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["android.view.textclassifier"], exclude_annotations: ["androidx.test.filters.FlakyTest"], @@ -491,13 +493,13 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["com.android.internal.app."], exclude_filters: [ - "com.android.internal.app.WindowDecorActionBarTest", "com.android.internal.app.IntentForwarderActivityTest", + "com.android.internal.app.WindowDecorActionBarTest", ], } @@ -506,8 +508,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["com.android.internal.content."], } @@ -517,8 +519,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["com.android.internal.infra."], } @@ -528,8 +530,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["com.android.internal.jank"], } @@ -539,16 +541,16 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: [ - "android.os.BinderProxyTest", "android.os.BinderDeathRecipientTest", "android.os.BinderFrozenStateChangeNotificationTest", "android.os.BinderProxyCountingTest", - "android.os.BinderUncaughtExceptionHandlerTest", + "android.os.BinderProxyTest", "android.os.BinderThreadPriorityTest", + "android.os.BinderUncaughtExceptionHandlerTest", "android.os.BinderWorkSourceTest", "android.os.ParcelNullabilityTest", "android.os.ParcelTest", @@ -562,13 +564,13 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: [ - "com.android.internal.os.KernelCpuUidClusterTimeReaderTest", - "com.android.internal.os.KernelCpuUidBpfMapReaderTest", "com.android.internal.os.KernelCpuUidActiveTimeReaderTest", + "com.android.internal.os.KernelCpuUidBpfMapReaderTest", + "com.android.internal.os.KernelCpuUidClusterTimeReaderTest", "com.android.internal.os.KernelCpuUidFreqTimeReaderTest", "com.android.internal.os.KernelSingleUidTimeReaderTest", ], @@ -579,8 +581,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["com.android.server.power.stats.BstatsCpuTimesValidationTest"], } @@ -590,8 +592,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["com.android.internal.security."], include_annotations: ["android.platform.test.annotations.Presubmit"], @@ -602,8 +604,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["com.android.internal.util.LatencyTrackerTest"], } @@ -613,8 +615,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["android.content.ContentCaptureOptionsTest"], } @@ -624,8 +626,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["android.content.integrity."], } @@ -635,8 +637,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["android.content.pm."], include_annotations: ["android.platform.test.annotations.Presubmit"], @@ -647,8 +649,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["android.content.pm."], include_annotations: ["android.platform.test.annotations.Postsubmit"], @@ -659,14 +661,14 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["android.content.res."], include_annotations: ["android.platform.test.annotations.Presubmit"], exclude_annotations: [ - "androidx.test.filters.FlakyTest", "android.platform.test.annotations.Postsubmit", + "androidx.test.filters.FlakyTest", "org.junit.Ignore", ], } @@ -676,8 +678,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["android.content.res."], include_annotations: ["android.platform.test.annotations.Postsubmit"], @@ -688,17 +690,17 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: [ + "android.service.controls", + "android.service.controls.actions", + "android.service.controls.templates", "android.service.euicc", "android.service.notification", "android.service.quicksettings", "android.service.settings.suggestions", - "android.service.controls.templates", - "android.service.controls.actions", - "android.service.controls", ], exclude_annotations: ["org.junit.Ignore"], } @@ -708,8 +710,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["android.view.contentcapture"], } @@ -719,8 +721,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["android.view.contentprotection"], } @@ -730,8 +732,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["com.android.internal.content."], include_annotations: ["android.platform.test.annotations.Presubmit"], @@ -742,8 +744,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["android.graphics.drawable.IconTest"], } @@ -753,13 +755,13 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: [ - "com.android.internal.accessibility", "android.accessibilityservice", "android.view.accessibility", + "com.android.internal.accessibility", ], } @@ -768,8 +770,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["android.app.usage"], } @@ -779,8 +781,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["com.android.internal.util.FastDataTest"], } @@ -790,8 +792,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: ["android.hardware.input"], } @@ -801,12 +803,12 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: [ - "android.view.VerifiedMotionEventTest", "android.view.VerifiedKeyEventTest", + "android.view.VerifiedMotionEventTest", ], } @@ -839,8 +841,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_filters: [ "com.android.internal.jank.FrameTrackerTest", @@ -854,8 +856,8 @@ test_module_config { base: "FrameworksCoreTests", test_suites: [ "automotive-tests", - "device-tests", "device-platinum-tests", + "device-tests", ], include_annotations: ["android.platform.test.annotations.PlatinumTest"], } diff --git a/core/tests/coretests/src/android/content/ContextTest.java b/core/tests/coretests/src/android/content/ContextTest.java index a02af788d496..2505500411b5 100644 --- a/core/tests/coretests/src/android/content/ContextTest.java +++ b/core/tests/coretests/src/android/content/ContextTest.java @@ -23,6 +23,7 @@ import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; import static com.google.common.truth.Truth.assertThat; +import static com.google.common.truth.Truth.assertWithMessage; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -35,17 +36,24 @@ import android.graphics.PixelFormat; import android.hardware.display.DisplayManager; import android.hardware.display.VirtualDisplay; import android.media.ImageReader; +import android.os.Looper; import android.os.UserHandle; +import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.DisabledOnRavenwood; +import android.platform.test.annotations.EnableFlags; import android.platform.test.annotations.Presubmit; +import android.platform.test.flag.junit.SetFlagsRule; import android.platform.test.ravenwood.RavenwoodRule; import android.view.Display; +import android.window.WindowTokenClient; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import androidx.test.platform.app.InstrumentationRegistry; +import com.android.window.flags.Flags; + import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -61,6 +69,9 @@ public class ContextTest { @Rule public final RavenwoodRule mRavenwood = new RavenwoodRule.Builder().build(); + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + @Test public void testInstrumentationContext() { // Confirm that we have a valid Context @@ -280,4 +291,44 @@ public class ContextTest { return appContext.createDisplayContext(display) .createWindowContext(TYPE_APPLICATION_OVERLAY, null /* options */); } + + @Test + @DisabledOnRavenwood(blockedBy = Context.class) + @DisableFlags(Flags.FLAG_TRACK_SYSTEM_UI_CONTEXT_BEFORE_WMS) + public void testSysUiContextRegisterComponentCallbacks_disableFlag() { + Looper.prepare(); + + // Use createSystemActivityThreadForTesting to initialize + // systemUiContext#getApplicationContext. + final Context systemUiContext = ActivityThread.createSystemActivityThreadForTesting() + .getSystemUiContext(); + final TestComponentCallbacks2 callbacks = new TestComponentCallbacks2(); + systemUiContext.registerComponentCallbacks(callbacks); + + final WindowTokenClient windowTokenClient = + (WindowTokenClient) systemUiContext.getWindowContextToken(); + windowTokenClient.onConfigurationChanged(Configuration.EMPTY, DEFAULT_DISPLAY); + + assertWithMessage("ComponentCallbacks should delegate to the app Context " + + "if the flag is disabled.").that(callbacks.mConfiguration).isNull(); + } + + @Test + @DisabledOnRavenwood(blockedBy = Context.class) + @EnableFlags(Flags.FLAG_TRACK_SYSTEM_UI_CONTEXT_BEFORE_WMS) + public void testSysUiContextRegisterComponentCallbacks_enableFlag() { + final Context systemUiContext = ActivityThread.currentActivityThread() + .createSystemUiContextForTesting(DEFAULT_DISPLAY); + final TestComponentCallbacks2 callbacks = new TestComponentCallbacks2(); + final Configuration config = Configuration.EMPTY; + + systemUiContext.registerComponentCallbacks(callbacks); + + final WindowTokenClient windowTokenClient = + (WindowTokenClient) systemUiContext.getWindowContextToken(); + windowTokenClient.onConfigurationChanged(config, DEFAULT_DISPLAY); + + assertWithMessage("ComponentCallbacks should delegate to SystemUiContext " + + "if the flag is enabled.").that(callbacks.mConfiguration).isEqualTo(config); + } } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index ea6514c66e3d..e276ff24f7d6 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -162,6 +162,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityManagerInternal; +import android.content.ComponentCallbacks; import android.content.ComponentName; import android.content.Context; import android.content.pm.ActivityInfo; @@ -456,6 +457,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp private DisplayInfo mLastDisplayInfoOverride; private final DisplayMetrics mDisplayMetrics = new DisplayMetrics(); + @NonNull private final DisplayPolicy mDisplayPolicy; private final DisplayRotation mDisplayRotation; @@ -542,6 +544,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp /** Remove this display when animation on it has completed. */ private boolean mDeferredRemoval; + @NonNull final PinnedTaskController mPinnedTaskController; private final LinkedList<ActivityRecord> mTmpUpdateAllDrawn = new LinkedList(); @@ -1102,6 +1105,29 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp }; /** + * Called to update fields retrieve from {@link #getDisplayUiContext()} resources when + * there's a configuration update on {@link #getDisplayUiContext()}. + */ + @NonNull + private final ComponentCallbacks mSysUiContextConfigCallback = new ComponentCallbacks() { + + @Override + public void onConfigurationChanged(@NonNull Configuration newConfig) { + synchronized (mWmService.mGlobalLock) { + if (mDisplayReady) { + mDisplayPolicy.onConfigurationChanged(); + mMinSizeOfResizeableTaskDp = getMinimalTaskSizeDp(); + } + } + } + + @Override + public void onLowMemory() { + // Do nothing. + } + }; + + /** * Create new {@link DisplayContent} instance, add itself to the root window container and * initialize direct children. * @param display May not be null. @@ -2797,11 +2823,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp final int lastOrientation = getConfiguration().orientation; final int lastWindowingMode = getWindowingMode(); super.onConfigurationChanged(newParentConfig); - if (mDisplayPolicy != null) { - mDisplayPolicy.onConfigurationChanged(); - mPinnedTaskController.onPostDisplayConfigurationChanged(); - mMinSizeOfResizeableTaskDp = getMinimalTaskSizeDp(); + if (!Flags.trackSystemUiContextBeforeWms()) { + mSysUiContextConfigCallback.onConfigurationChanged(newParentConfig); } + mPinnedTaskController.onPostDisplayConfigurationChanged(); // Update IME parent if needed. updateImeParent(); @@ -3376,6 +3401,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp .getKeyguardController().onDisplayRemoved(mDisplayId); mWallpaperController.resetLargestDisplay(mDisplay); mWmService.mDisplayWindowSettings.onDisplayRemoved(this); + if (Flags.trackSystemUiContextBeforeWms()) { + getDisplayUiContext().unregisterComponentCallbacks(mSysUiContextConfigCallback); + } } finally { mDisplayReady = false; } @@ -5424,7 +5452,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp reconfigureDisplayLocked(); onRequestedOverrideConfigurationChanged(getRequestedOverrideConfiguration()); mWmService.mDisplayNotificationController.dispatchDisplayAdded(this); - // Attach the SystemUiContext to this DisplayContent the get latest configuration. + // Attach the SystemUiContext to this DisplayContent to get latest configuration. // Note that the SystemUiContext will be removed automatically if this DisplayContent // is detached. registerSystemUiContext(); @@ -5432,11 +5460,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } private void registerSystemUiContext() { + final Context systemUiContext = getDisplayUiContext(); final WindowProcessController wpc = mAtmService.getProcessController( - getDisplayUiContext().getIApplicationThread()); + systemUiContext.getIApplicationThread()); mWmService.mWindowContextListenerController.registerWindowContainerListener( - wpc, getDisplayUiContext().getWindowContextToken(), this, + wpc, systemUiContext.getWindowContextToken(), this, INVALID_WINDOW_TYPE, null /* options */); + if (Flags.trackSystemUiContextBeforeWms()) { + systemUiContext.registerComponentCallbacks(mSysUiContextConfigCallback); + } } @Override @@ -6615,6 +6647,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp forAllTasks((t) -> { t.getRootTask().removeChild(t, "removeAllTasks"); }); } + @NonNull Context getDisplayUiContext() { return mDisplayPolicy.getSystemUiContext(); } diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 10f591cfd379..fbe850198c50 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -1865,6 +1865,7 @@ public class DisplayPolicy { return mContext; } + @NonNull Context getSystemUiContext() { return mUiContext; } |