OSDN Git Service

Fix EditText show wrong position when ime show
authorfelkachang <felkachang@google.com>
Wed, 4 Jul 2018 04:51:44 +0000 (12:51 +0800)
committerfelkachang <felkachang@google.com>
Thu, 12 Jul 2018 04:57:34 +0000 (12:57 +0800)
In landscape and largest density, the area that could show the heads
up notification is smaller than normal density. To handle the heads
up notification should be different with the normal notification in
both of targetScrollForView and getScrollRange because
StackScrollAlgorithm translation heads up notification as
mHeadsUpInset but neither targetScrollForView nor getScrollRange has
have the same consideration.

The solution make the StackScrollAlgorithm to considerate scroll
value to move up the heads up notification.

The getScrollRange need to consider more about the difference
between heads up showing and non-heads up showing. The top padding
and the total content height are the major considerations.

Test: manual test
Test: atest SystemUITests
Change-Id: I46bb960a81f6ab5be4d8e39738e8fb64245dd4eb
Fixes: 110388615

packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java

index 6fc4911..5dc7199 100644 (file)
@@ -1425,7 +1425,8 @@ public class NotificationStackScrollLayout extends ViewGroup
      */
     private int targetScrollForView(ExpandableView v, int positionInLinearLayout) {
         return positionInLinearLayout + v.getIntrinsicHeight() +
-                getImeInset() - getHeight() + getTopPadding();
+                getImeInset() - getHeight()
+                + ((!isExpanded() && isPinnedHeadsUp(v)) ? mHeadsUpInset : getTopPadding());
     }
 
     @Override
@@ -2056,9 +2057,15 @@ public class NotificationStackScrollLayout extends ViewGroup
     }
 
     private int getScrollRange() {
-        int scrollRange = Math.max(0, mContentHeight - mMaxLayoutHeight);
+        // In current design, it only use the top HUN to treat all of HUNs
+        // although there are more than one HUNs
+        int contentHeight = mContentHeight;
+        if (!isExpanded() && mHeadsUpManager.hasPinnedHeadsUp()) {
+            contentHeight = mHeadsUpInset + getTopHeadsUpPinnedHeight();
+        }
+        int scrollRange = Math.max(0, contentHeight - mMaxLayoutHeight);
         int imeInset = getImeInset();
-        scrollRange += Math.min(imeInset, Math.max(0, mContentHeight - (getHeight() - imeInset)));
+        scrollRange += Math.min(imeInset, Math.max(0, contentHeight - (getHeight() - imeInset)));
         return scrollRange;
     }
 
index ee006d3..886bd5e 100644 (file)
@@ -473,6 +473,15 @@ public class StackScrollAlgorithm {
                     childState.yTranslation = topState.yTranslation + topState.height
                             - childState.height;
                 }
+
+                // heads up notification show and this row is the top entry of heads up
+                // notifications. i.e. this row should be the only one row that has input field
+                // To check if the row need to do translation according to scroll Y
+                // heads up show full of row's content and any scroll y indicate that the
+                // translationY need to move up the HUN.
+                if (!mIsExpanded && isTopEntry && ambientState.getScrollY() > 0) {
+                    childState.yTranslation -= ambientState.getScrollY();
+                }
             }
             if (row.isHeadsUpAnimatingAway()) {
                 childState.hidden = false;