summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/ActivityThread.java28
-rw-r--r--core/java/android/app/ActivityThreadInternal.java3
-rw-r--r--core/java/android/app/ConfigurationController.java2
-rw-r--r--core/java/android/app/ContextImpl.java20
-rw-r--r--core/java/android/window/SystemUiContext.java69
-rw-r--r--core/tests/coretests/Android.bp242
-rw-r--r--core/tests/coretests/src/android/content/ContextTest.java51
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java47
-rw-r--r--services/core/java/com/android/server/wm/DisplayPolicy.java1
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;
}