From b73b8e0f44c15c905687452023ada282d2057669 Mon Sep 17 00:00:00 2001
From: Tiger <tigerhuang@google.com>
Date: Fri, 7 Jun 2024 16:48:34 +0800
Subject: [PATCH] Don't clear padding of content view from
 ActionBarOverlayLayout

The previous commit, 7d409b07ed3f603f45e9c1d290f7b15382490db7, would
accidentally clear the padding set to the content view (id/content).
This CL prevents that to make the behavior compatible.

Fix: 345480675
Bug: 343131420
Bug: 309578419
Flag: com.android.window.flags.enforce_edge_to_edge
Test: atest ActionBarOverlayLayoutTest
Change-Id: I63b0ea99e951f80da60ede1d4ab5b42cf057eb0e
---
 .../widget/ActionBarOverlayLayout.java        | 59 +++++++++----------
 1 file changed, 29 insertions(+), 30 deletions(-)

diff --git a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java
index 707f1094a8bc..68328252abaf 100644
--- a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java
+++ b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java
@@ -52,6 +52,7 @@ import com.android.internal.view.menu.MenuPresenter;
  */
 public class ActionBarOverlayLayout extends ViewGroup implements DecorContentParent {
     private static final String TAG = "ActionBarOverlayLayout";
+    private static final Rect EMPTY_RECT = new Rect();
 
     private int mActionBarHeight;
     //private WindowDecorActionBar mActionBar;
@@ -294,55 +295,53 @@ public class ActionBarOverlayLayout extends ViewGroup implements DecorContentPar
     }
 
     private boolean applyInsets(View view, Rect insets, boolean toPadding,
-            boolean left, boolean top, boolean bottom, boolean right) {
+            boolean left, boolean top, boolean right, boolean bottom) {
         boolean changed;
         if (toPadding) {
-            changed = setMargin(view, left, top, bottom, right, 0, 0, 0, 0);
-            changed |= setPadding(view, left, top, bottom, right,
-                    insets.left, insets.top, insets.right, insets.bottom);
+            changed = setMargin(view, EMPTY_RECT, left, top, right, bottom);
+            changed |= setPadding(view, insets, left, top, right, bottom);
         } else {
-            changed = setPadding(view, left, top, bottom, right, 0, 0, 0, 0);
-            changed |= setMargin(view, left, top, bottom, right,
-                    insets.left, insets.top, insets.right, insets.bottom);
+            changed = setPadding(view, EMPTY_RECT, left, top, right, bottom);
+            changed |= setMargin(view, insets, left, top, right, bottom);
         }
         return changed;
     }
 
-    private boolean setPadding(View view, boolean left, boolean top, boolean bottom, boolean right,
-            int l, int t, int r, int b) {
-        if ((left && view.getPaddingLeft() != l)
-                || (top && view.getPaddingTop() != t)
-                || (right && view.getPaddingRight() != r)
-                || (bottom && view.getPaddingBottom() != b)) {
+    private boolean setPadding(View view, Rect insets,
+            boolean left, boolean top, boolean right, boolean bottom) {
+        if ((left && view.getPaddingLeft() != insets.left)
+                || (top && view.getPaddingTop() != insets.top)
+                || (right && view.getPaddingRight() != insets.right)
+                || (bottom && view.getPaddingBottom() != insets.bottom)) {
             view.setPadding(
-                    left ? l : view.getPaddingLeft(),
-                    top ? t : view.getPaddingTop(),
-                    right ? r : view.getPaddingRight(),
-                    bottom ? b : view.getPaddingBottom());
+                    left ? insets.left : view.getPaddingLeft(),
+                    top ? insets.top : view.getPaddingTop(),
+                    right ? insets.right : view.getPaddingRight(),
+                    bottom ? insets.bottom : view.getPaddingBottom());
             return true;
         }
         return false;
     }
 
-    private boolean setMargin(View view, boolean left, boolean top, boolean bottom, boolean right,
-            int l, int t, int r, int b) {
-        LayoutParams lp = (LayoutParams) view.getLayoutParams();
+    private boolean setMargin(View view,  Rect insets,
+            boolean left, boolean top, boolean right, boolean bottom) {
+        final LayoutParams lp = (LayoutParams) view.getLayoutParams();
         boolean changed = false;
-        if (left && lp.leftMargin != l) {
+        if (left && lp.leftMargin != insets.left) {
             changed = true;
-            lp.leftMargin = l;
+            lp.leftMargin = insets.left;
         }
-        if (top && lp.topMargin != t) {
+        if (top && lp.topMargin != insets.top) {
             changed = true;
-            lp.topMargin = t;
+            lp.topMargin = insets.top;
         }
-        if (right && lp.rightMargin != r) {
+        if (right && lp.rightMargin != insets.right) {
             changed = true;
-            lp.rightMargin = r;
+            lp.rightMargin = insets.right;
         }
-        if (bottom && lp.bottomMargin != b) {
+        if (bottom && lp.bottomMargin != insets.bottom) {
             changed = true;
-            lp.bottomMargin = b;
+            lp.bottomMargin = insets.bottom;
         }
         return changed;
     }
@@ -370,7 +369,7 @@ public class ActionBarOverlayLayout extends ViewGroup implements DecorContentPar
 
         // The top and bottom action bars are always within the content area.
         boolean changed = applyInsets(mActionBarTop, mSystemInsets,
-                mActionBarExtendsIntoSystemInsets, true, true, false, true);
+                mActionBarExtendsIntoSystemInsets, true, true, true, false);
         if (mActionBarBottom != null) {
             changed |= applyInsets(mActionBarBottom, mSystemInsets,
                     mActionBarExtendsIntoSystemInsets, true, false, true, true);
@@ -522,7 +521,7 @@ public class ActionBarOverlayLayout extends ViewGroup implements DecorContentPar
                 );
             }
         }
-        applyInsets(mContent, mContentInsets, false /* toPadding */, true, true, true, true);
+        setMargin(mContent, mContentInsets, true, true, true, true);
 
         if (!mLastInnerInsets.equals(mInnerInsets)) {
             // If the inner insets have changed, we need to dispatch this down to
-- 
GitLab