summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2025-01-06 04:53:15 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-01-06 04:53:15 -0800
commit66e4d6028d51367d34a2413c843de96a8b842ecf (patch)
treee091e8f62c481cf68dd397a9eb26916d23b7eecc
parent15b8e6bceb542b6ae1f7671516db5e9d7fc8ce81 (diff)
parentca35e71bfd4432fd6b3e72681c855dd3b91601c1 (diff)
Merge "Disable windowOptOutEdgeToEdgeEnforcement if the app targets SDK 36+" into main
-rw-r--r--core/java/android/view/WindowManagerGlobal.java4
-rw-r--r--core/java/com/android/internal/policy/PhoneWindow.java37
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java5
3 files changed, 38 insertions, 8 deletions
diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java
index f50ea9106a61..617e4762ebf0 100644
--- a/core/java/android/view/WindowManagerGlobal.java
+++ b/core/java/android/view/WindowManagerGlobal.java
@@ -50,6 +50,7 @@ import android.window.TrustedPresentationThresholds;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.policy.PhoneWindow;
import com.android.internal.util.FastPrintWriter;
import java.io.FileDescriptor;
@@ -375,7 +376,8 @@ public final class WindowManagerGlobal {
if (context != null && wparams.type > LAST_APPLICATION_WINDOW) {
final TypedArray styles = context.obtainStyledAttributes(R.styleable.Window);
- if (styles.getBoolean(R.styleable.Window_windowOptOutEdgeToEdgeEnforcement, false)) {
+ if (PhoneWindow.isOptingOutEdgeToEdgeEnforcement(
+ context.getApplicationInfo(), true /* local */, styles)) {
wparams.privateFlags |= PRIVATE_FLAG_OPT_OUT_EDGE_TO_EDGE;
}
styles.recycle();
diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java
index e0529b339d4a..67e358a47cce 100644
--- a/core/java/com/android/internal/policy/PhoneWindow.java
+++ b/core/java/com/android/internal/policy/PhoneWindow.java
@@ -184,6 +184,14 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
private static final long ENFORCE_EDGE_TO_EDGE = 309578419;
/**
+ * Disable opting out the edge-to-edge enforcement.
+ * {@link Build.VERSION_CODES#BAKLAVA} or above.
+ */
+ @ChangeId
+ @EnabledSince(targetSdkVersion = Build.VERSION_CODES.BAKLAVA)
+ private static final long DISABLE_OPT_OUT_EDGE_TO_EDGE = 377864165;
+
+ /**
* Override the layout in display cutout mode behavior. This will only apply if the edge to edge
* is not enforced.
*/
@@ -450,7 +458,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
*/
public static boolean isEdgeToEdgeEnforced(ApplicationInfo info, boolean local,
TypedArray windowStyle) {
- return !windowStyle.getBoolean(R.styleable.Window_windowOptOutEdgeToEdgeEnforcement, false)
+ return !isOptingOutEdgeToEdgeEnforcement(info, local, windowStyle)
&& (info.targetSdkVersion >= ENFORCE_EDGE_TO_EDGE_SDK_VERSION
|| (Flags.enforceEdgeToEdge() && (local
// Calling this doesn't require a permission.
@@ -459,6 +467,26 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
: info.isChangeEnabled(ENFORCE_EDGE_TO_EDGE))));
}
+ /**
+ * Returns whether the given application is opting out edge-to-edge enforcement.
+ *
+ * @param info The application to query.
+ * @param local Whether this is called from the process of the given application.
+ * @param windowStyle The style of the window.
+ * @return {@code true} if the edge-to-edge enforcement is opting out. Otherwise, {@code false}.
+ */
+ public static boolean isOptingOutEdgeToEdgeEnforcement(ApplicationInfo info, boolean local,
+ TypedArray windowStyle) {
+ final boolean disabled = (Flags.disableOptOutEdgeToEdge() && (local
+ // Calling this doesn't require a permission.
+ ? CompatChanges.isChangeEnabled(DISABLE_OPT_OUT_EDGE_TO_EDGE)
+ // Calling this requires permissions.
+ : info.isChangeEnabled(DISABLE_OPT_OUT_EDGE_TO_EDGE)));
+ return !disabled && windowStyle.getBoolean(
+ R.styleable.Window_windowOptOutEdgeToEdgeEnforcement, false /* default */);
+
+ }
+
@Override
public final void setContainer(Window container) {
super.setContainer(container);
@@ -2486,6 +2514,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
TypedArray a = getWindowStyle();
WindowManager.LayoutParams params = getAttributes();
+ ApplicationInfo appInfo = getContext().getApplicationInfo();
if (false) {
System.out.println("From style:");
@@ -2497,8 +2526,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
System.out.println(s);
}
- mEdgeToEdgeEnforced = isEdgeToEdgeEnforced(
- getContext().getApplicationInfo(), true /* local */, a);
+ mEdgeToEdgeEnforced = isEdgeToEdgeEnforced(appInfo, true /* local */, a);
if (mEdgeToEdgeEnforced) {
getAttributes().privateFlags |= PRIVATE_FLAG_EDGE_TO_EDGE_ENFORCED;
mDecorFitsSystemWindows = false;
@@ -2507,8 +2535,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
// mNavigationBarColor is not reset here because it might be used to draw the scrim.
}
if (CompatChanges.isChangeEnabled(OVERRIDE_LAYOUT_IN_DISPLAY_CUTOUT_MODE)
- && !a.getBoolean(R.styleable.Window_windowOptOutEdgeToEdgeEnforcement,
- false /* defValue */)) {
+ && !isOptingOutEdgeToEdgeEnforcement(appInfo, true /* local */, a)) {
getAttributes().privateFlags |= PRIVATE_FLAG_OVERRIDE_LAYOUT_IN_DISPLAY_CUTOUT_MODE;
}
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 093df8c5075c..5dbdeff672e7 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -367,6 +367,7 @@ import com.android.internal.content.ReferrerIntent;
import com.android.internal.os.TimeoutRecord;
import com.android.internal.os.TransferPipe;
import com.android.internal.policy.AttributeCache;
+import com.android.internal.policy.PhoneWindow;
import com.android.internal.protolog.ProtoLog;
import com.android.internal.util.XmlUtils;
import com.android.modules.utils.TypedXmlPullParser;
@@ -2026,8 +2027,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
|| ent.array.getBoolean(R.styleable.Window_windowShowWallpaper, false);
mStyleFillsParent = mOccludesParent;
mNoDisplay = ent.array.getBoolean(R.styleable.Window_windowNoDisplay, false);
- mOptOutEdgeToEdge = ent.array.getBoolean(
- R.styleable.Window_windowOptOutEdgeToEdgeEnforcement, false);
+ mOptOutEdgeToEdge = PhoneWindow.isOptingOutEdgeToEdgeEnforcement(
+ aInfo.applicationInfo, false /* local */, ent.array);
} else {
mStyleFillsParent = mOccludesParent = true;
mNoDisplay = false;