summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mady Mellor <madym@google.com> 2019-09-19 23:11:16 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2019-09-19 23:11:16 +0000
commit7943c7b5abae3b87e56f2c2027f01c44f98574b6 (patch)
tree9333efa15bbd40b208e92e8e67e605e0c9c5692a
parent4cb4e0a189ea85ce3aef57ae46e1609afe78b7d6 (diff)
parent9be3bedc5b2ab364062cdb22a1371ff717975640 (diff)
Merge changes from topic "landscape-jeeze" into qt-qpr1-dev
* changes: Restrict height of expanded view in landscape & fix left / right padding Restrict the space bubbles are centered in while in landscape
-rw-r--r--packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java47
-rw-r--r--packages/SystemUI/src/com/android/systemui/bubbles/animation/ExpandedAnimationController.java76
3 files changed, 110 insertions, 24 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java
index be10dc565159..521ebde7d2f0 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java
@@ -105,6 +105,7 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList
private Drawable mAppIcon;
private BubbleController mBubbleController = Dependency.get(BubbleController.class);
+ private WindowManager mWindowManager;
private BubbleStackView mStackView;
@@ -202,9 +203,9 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList
super(context, attrs, defStyleAttr, defStyleRes);
mPm = context.getPackageManager();
mDisplaySize = new Point();
- WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
+ mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
// Get the real size -- this includes screen decorations (notches, statusbar, navbar).
- wm.getDefaultDisplay().getRealSize(mDisplaySize);
+ mWindowManager.getDefaultDisplay().getRealSize(mDisplaySize);
Resources res = getResources();
mMinHeight = res.getDimensionPixelSize(R.dimen.bubble_expanded_default_height);
mPointerMargin = res.getDimensionPixelSize(R.dimen.bubble_pointer_margin);
@@ -326,7 +327,10 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList
if (usingActivityView()) {
int[] screenLoc = mActivityView.getLocationOnScreen();
final int activityViewBottom = screenLoc[1] + mActivityView.getHeight();
- final int keyboardTop = mDisplaySize.y - insets.getSystemWindowInsetBottom();
+ final int keyboardTop = mDisplaySize.y - Math.max(insets.getSystemWindowInsetBottom(),
+ insets.getDisplayCutout() != null
+ ? insets.getDisplayCutout().getSafeInsetBottom()
+ : 0);
final int insetsBottom = Math.max(activityViewBottom - keyboardTop, 0);
mActivityView.setForwardedInsets(Insets.of(0, 0, 0, insetsBottom));
}
@@ -444,6 +448,7 @@ public class BubbleExpandedView extends LinearLayout implements View.OnClickList
}
private int getMaxExpandedHeight() {
+ mWindowManager.getDefaultDisplay().getRealSize(mDisplaySize);
int[] windowLocation = mActivityView.getLocationOnScreen();
int bottomInset = getRootWindowInsets() != null
? getRootWindowInsets().getStableInsetBottom()
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
index 13d6470a351f..b68b7627fe8c 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java
@@ -45,6 +45,7 @@ import android.service.notification.StatusBarNotification;
import android.util.Log;
import android.util.StatsLog;
import android.view.Choreographer;
+import android.view.DisplayCutout;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -340,7 +341,8 @@ public class BubbleStackView extends FrameLayout {
mDisplaySize = new Point();
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
- wm.getDefaultDisplay().getSize(mDisplaySize);
+ // We use the real size & subtract screen decorations / window insets ourselves when needed
+ wm.getDefaultDisplay().getRealSize(mDisplaySize);
mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
@@ -417,7 +419,35 @@ public class BubbleStackView extends FrameLayout {
mOrientationChangedListener =
(v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
- mExpandedAnimationController.updateOrientation(mOrientation);
+ mExpandedAnimationController.updateOrientation(mOrientation, mDisplaySize);
+ mStackAnimationController.updateOrientation(mOrientation);
+
+ // Reposition & adjust the height for new orientation
+ if (mIsExpanded) {
+ mExpandedViewContainer.setTranslationY(getExpandedViewY());
+ mExpandedBubble.getExpandedView().updateView();
+ }
+
+ // Need to update the padding around the view
+ WindowInsets insets = getRootWindowInsets();
+ int leftPadding = mExpandedViewPadding;
+ int rightPadding = mExpandedViewPadding;
+ if (insets != null) {
+ // Can't have the expanded view overlaying notches
+ int cutoutLeft = 0;
+ int cutoutRight = 0;
+ DisplayCutout cutout = insets.getDisplayCutout();
+ if (cutout != null) {
+ cutoutLeft = cutout.getSafeInsetLeft();
+ cutoutRight = cutout.getSafeInsetRight();
+ }
+ // Or overlaying nav or status bar
+ leftPadding += Math.max(cutoutLeft, insets.getStableInsetLeft());
+ rightPadding += Math.max(cutoutRight, insets.getStableInsetRight());
+ }
+ mExpandedViewContainer.setPadding(leftPadding, mExpandedViewPadding,
+ rightPadding, mExpandedViewPadding);
+
if (mIsExpanded) {
// Re-draw bubble row and pointer for new orientation.
mExpandedAnimationController.expandFromStack(() -> {
@@ -488,6 +518,11 @@ public class BubbleStackView extends FrameLayout {
public void onOrientationChanged(int orientation) {
mOrientation = orientation;
+ // Display size is based on the rotation device was in when requested, we should update it
+ // We use the real size & subtract screen decorations / window insets ourselves when needed
+ WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
+ wm.getDefaultDisplay().getRealSize(mDisplaySize);
+
// Some resources change depending on orientation
Resources res = getContext().getResources();
mStatusBarHeight = res.getDimensionPixelSize(
@@ -1589,11 +1624,9 @@ public class BubbleStackView extends FrameLayout {
int index = getBubbleIndex(expandedBubble);
float bubbleLeftFromScreenLeft = mExpandedAnimationController.getBubbleLeft(index);
float halfBubble = mBubbleSize / 2f;
-
- // Bubbles live in expanded view container (x includes expanded view padding).
- // Pointer lives in expanded view, which has padding (x does not include padding).
- // Remove padding when deriving pointer location from bubbles.
- float bubbleCenter = bubbleLeftFromScreenLeft + halfBubble - mExpandedViewPadding;
+ float bubbleCenter = bubbleLeftFromScreenLeft + halfBubble;
+ // Padding might be adjusted for insets, so get it directly from the view
+ bubbleCenter -= mExpandedViewContainer.getPaddingLeft();
expandedBubble.getExpandedView().setPointerPosition(bubbleCenter);
}
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/animation/ExpandedAnimationController.java b/packages/SystemUI/src/com/android/systemui/bubbles/animation/ExpandedAnimationController.java
index c332d15a9b47..59d68bca93c3 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/animation/ExpandedAnimationController.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/animation/ExpandedAnimationController.java
@@ -21,6 +21,7 @@ import android.content.res.Resources;
import android.graphics.Path;
import android.graphics.Point;
import android.graphics.PointF;
+import android.view.DisplayCutout;
import android.view.View;
import android.view.WindowInsets;
@@ -57,6 +58,9 @@ public class ExpandedAnimationController
/** Stiffness for the expand/collapse path-following animation. */
private static final int EXPAND_COLLAPSE_ANIM_STIFFNESS = 1000;
+ /** What percentage of the screen to use when centering the bubbles in landscape. */
+ private static final float CENTER_BUBBLES_LANDSCAPE_PERCENT = 0.66f;
+
/** Horizontal offset between bubbles, which we need to know to re-stack them. */
private float mStackOffsetPx;
/** Space between status bar and bubbles in the expanded state. */
@@ -69,8 +73,8 @@ public class ExpandedAnimationController
private Point mDisplaySize;
/** Max number of bubbles shown in row above expanded view.*/
private int mBubblesMaxRendered;
- /** Width of current screen orientation. */
- private float mScreenWidth;
+ /** What the current screen orientation is. */
+ private int mScreenOrientation;
/** Whether the dragged-out bubble is in the dismiss target. */
private boolean mIndividualBubbleWithinDismissTarget = false;
@@ -97,8 +101,7 @@ public class ExpandedAnimationController
public ExpandedAnimationController(Point displaySize, int expandedViewPadding,
int orientation) {
- mDisplaySize = displaySize;
- updateOrientation(orientation);
+ updateOrientation(orientation, displaySize);
mExpandedViewPadding = expandedViewPadding;
mLauncherGridDiff = 30f;
}
@@ -136,18 +139,16 @@ public class ExpandedAnimationController
/**
* Update effective screen width based on current orientation.
* @param orientation Landscape or portrait.
+ * @param displaySize Updated display size.
*/
- public void updateOrientation(int orientation) {
- if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
- mScreenWidth = mDisplaySize.y;
- } else {
- mScreenWidth = mDisplaySize.x;
- }
+ public void updateOrientation(int orientation, Point displaySize) {
+ mScreenOrientation = orientation;
+ mDisplaySize = displaySize;
if (mLayout != null) {
Resources res = mLayout.getContext().getResources();
+ mBubblePaddingTop = res.getDimensionPixelSize(R.dimen.bubble_padding_top);
mStatusBarHeight = res.getDimensionPixelSize(
com.android.internal.R.dimen.status_bar_height);
- mBubblePaddingTop = res.getDimensionPixelSize(R.dimen.bubble_padding_top);
}
}
@@ -499,6 +500,50 @@ public class ExpandedAnimationController
return getRowLeft() + bubbleFromRowLeft;
}
+ /**
+ * When expanded, the bubbles are centered in the screen. In portrait, all available space is
+ * used. In landscape we have too much space so the value is restricted. This method accounts
+ * for window decorations (nav bar, cutouts).
+ *
+ * @return the desired width to display the expanded bubbles in.
+ */
+ private float getWidthForDisplayingBubbles() {
+ final float availableWidth = getAvailableScreenWidth(true /* includeStableInsets */);
+ if (mScreenOrientation == Configuration.ORIENTATION_LANDSCAPE) {
+ // display size y in landscape will be the smaller dimension of the screen
+ return Math.max(mDisplaySize.y, availableWidth * CENTER_BUBBLES_LANDSCAPE_PERCENT);
+ } else {
+ return availableWidth;
+ }
+ }
+
+ /**
+ * Determines the available screen width without the cutout.
+ *
+ * @param subtractStableInsets Whether or not stable insets should also be removed from the
+ * returned width.
+ * @return the total screen width available accounting for cutouts and insets,
+ * iff {@param includeStableInsets} is true.
+ */
+ private float getAvailableScreenWidth(boolean subtractStableInsets) {
+ float availableSize = mDisplaySize.x;
+ WindowInsets insets = mLayout != null ? mLayout.getRootWindowInsets() : null;
+ if (insets != null) {
+ int cutoutLeft = 0;
+ int cutoutRight = 0;
+ DisplayCutout cutout = insets.getDisplayCutout();
+ if (cutout != null) {
+ cutoutLeft = cutout.getSafeInsetLeft();
+ cutoutRight = cutout.getSafeInsetRight();
+ }
+ final int stableLeft = subtractStableInsets ? insets.getStableInsetLeft() : 0;
+ final int stableRight = subtractStableInsets ? insets.getStableInsetRight() : 0;
+ availableSize -= Math.max(stableLeft, cutoutLeft);
+ availableSize -= Math.max(stableRight, cutoutRight);
+ }
+ return availableSize;
+ }
+
private float getRowLeft() {
if (mLayout == null) {
return 0;
@@ -510,9 +555,12 @@ public class ExpandedAnimationController
final float totalGapWidth = (bubbleCount - 1) * getSpaceBetweenBubbles();
final float rowWidth = totalGapWidth + totalBubbleWidth;
- final float centerScreen = mScreenWidth / 2f;
+ // This display size we're using includes the size of the insets, we want the true
+ // center of the display minus the notch here, which means we should include the
+ // stable insets (e.g. status bar, nav bar) in this calculation.
+ final float trueCenter = getAvailableScreenWidth(false /* subtractStableInsets */) / 2f;
final float halfRow = rowWidth / 2f;
- final float rowLeft = centerScreen - halfRow;
+ final float rowLeft = trueCenter - halfRow;
return rowLeft;
}
@@ -530,7 +578,7 @@ public class ExpandedAnimationController
* Launcher's app icon grid edge that we must match
*/
final float rowMargins = (mExpandedViewPadding + mLauncherGridDiff) * 2;
- final float maxRowWidth = mScreenWidth - rowMargins;
+ final float maxRowWidth = getWidthForDisplayingBubbles() - rowMargins;
final float totalBubbleWidth = mBubblesMaxRendered * mBubbleSizePx;
final float totalGapWidth = maxRowWidth - totalBubbleWidth;