From 786940ae936e2dbe90a385acb1e643b17e913694 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 2 Jun 2020 02:31:31 -0700 Subject: [PATCH] Allowing Launcher to draw behind cutouts > Launcher uses realSize, availableSize and insets to calculate various layout values. Without drawing behind cutouts, these values are not consistent (insets + availableSize != realSize) leading to jumps in layouts. > Removing fake black bars in low-ram devices to avoid inconsistent insets. > Fixing various layouts not taking lert/right insets into account. Bug: 156268804 Change-Id: I8441db8a468b08a65b57b932050b5b4b37313966 --- res/values-v30/styles.xml | 34 ++++++++ src/com/android/launcher3/DeviceProfile.java | 7 +- src/com/android/launcher3/Hotseat.java | 1 - .../android/launcher3/LauncherRootView.java | 78 +------------------ .../allapps/AllAppsContainerView.java | 8 +- .../android/launcher3/popup/ArrowPopup.java | 10 ++- .../launcher3/util/SystemUiController.java | 6 +- .../launcher3/widget/WidgetsFullSheet.java | 7 +- 8 files changed, 53 insertions(+), 98 deletions(-) create mode 100644 res/values-v30/styles.xml diff --git a/res/values-v30/styles.xml b/res/values-v30/styles.xml new file mode 100644 index 0000000000..71740a92c5 --- /dev/null +++ b/res/values-v30/styles.xml @@ -0,0 +1,34 @@ + + + + + + + diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index 72831f4d09..e3cd0bd181 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -538,7 +538,6 @@ public class DeviceProfile { mInsets.right + hotseatBarSidePaddingStartPx, mInsets.bottom); } } else { - // We want the edges of the hotseat to line up with the edges of the workspace, but the // icons in the hotseat are a different size, and so don't line up perfectly. To account // for this, we pad the left and right of the hotseat with half of the difference of a @@ -547,9 +546,11 @@ public class DeviceProfile { float hotseatCellWidth = (float) widthPx / inv.numHotseatIcons; int hotseatAdjustment = Math.round((workspaceCellWidth - hotseatCellWidth) / 2); mHotseatPadding.set( - hotseatAdjustment + workspacePadding.left + cellLayoutPaddingLeftRightPx, + hotseatAdjustment + workspacePadding.left + cellLayoutPaddingLeftRightPx + + mInsets.left, hotseatBarTopPaddingPx, - hotseatAdjustment + workspacePadding.right + cellLayoutPaddingLeftRightPx, + hotseatAdjustment + workspacePadding.right + cellLayoutPaddingLeftRightPx + + mInsets.right, hotseatBarBottomPaddingPx + mInsets.bottom + cellLayoutBottomPaddingPx); } return mHotseatPadding; diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java index 1c157c26d2..51f3819460 100644 --- a/src/com/android/launcher3/Hotseat.java +++ b/src/com/android/launcher3/Hotseat.java @@ -91,7 +91,6 @@ public class Hotseat extends CellLayout implements LogContainerProvider, Insetta public void setInsets(Rect insets) { FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams(); DeviceProfile grid = mActivity.getDeviceProfile(); - insets = grid.getInsets(); if (grid.isVerticalBarLayout()) { lp.height = ViewGroup.LayoutParams.MATCH_PARENT; diff --git a/src/com/android/launcher3/LauncherRootView.java b/src/com/android/launcher3/LauncherRootView.java index 9ac370f830..6951ff2804 100644 --- a/src/com/android/launcher3/LauncherRootView.java +++ b/src/com/android/launcher3/LauncherRootView.java @@ -1,19 +1,12 @@ package com.android.launcher3; import static com.android.launcher3.config.FeatureFlags.SEPARATE_RECENTS_ACTIVITY; -import static com.android.launcher3.util.SystemUiController.FLAG_DARK_NAV; -import static com.android.launcher3.util.SystemUiController.UI_STATE_ROOT_VIEW; import android.annotation.TargetApi; -import android.app.ActivityManager; import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; import android.graphics.Rect; import android.os.Build; import android.util.AttributeSet; -import android.view.View; import android.view.ViewDebug; import android.view.WindowInsets; @@ -26,16 +19,10 @@ public class LauncherRootView extends InsettableFrameLayout { private final Launcher mLauncher; - private final Paint mOpaquePaint; - - @ViewDebug.ExportedProperty(category = "launcher") - private final Rect mConsumedInsets = new Rect(); - @ViewDebug.ExportedProperty(category = "launcher") private static final List SYSTEM_GESTURE_EXCLUSION_RECT = Collections.singletonList(new Rect()); - private View mAlignedView; private WindowStateListener mWindowStateListener; @ViewDebug.ExportedProperty(category = "launcher") private boolean mDisallowBackGesture; @@ -44,55 +31,15 @@ public class LauncherRootView extends InsettableFrameLayout { public LauncherRootView(Context context, AttributeSet attrs) { super(context, attrs); - - mOpaquePaint = new Paint(Paint.ANTI_ALIAS_FLAG); - mOpaquePaint.setColor(Color.BLACK); - mOpaquePaint.setStyle(Paint.Style.FILL); - mLauncher = Launcher.getLauncher(context); } - @Override - protected void onFinishInflate() { - if (getChildCount() > 0) { - // LauncherRootView contains only one child, which should be aligned - // based on the horizontal insets. - mAlignedView = getChildAt(0); - } - super.onFinishInflate(); - } - private void handleSystemWindowInsets(Rect insets) { - mConsumedInsets.setEmpty(); - boolean drawInsetBar = false; - if ((insets.right > 0 || insets.left > 0) - && getContext().getSystemService(ActivityManager.class).isLowRamDevice()) { - mConsumedInsets.left = insets.left; - mConsumedInsets.right = insets.right; - insets.set(0, insets.top, 0, insets.bottom); - drawInsetBar = true; - } - - mLauncher.getSystemUiController().updateUiState( - UI_STATE_ROOT_VIEW, drawInsetBar ? FLAG_DARK_NAV : 0); - // Update device profile before notifying th children. mLauncher.getDeviceProfile().updateInsets(insets); boolean resetState = !insets.equals(mInsets); setInsets(insets); - if (mAlignedView != null) { - // Apply margins on aligned view to handle consumed insets. - MarginLayoutParams lp = (MarginLayoutParams) mAlignedView.getLayoutParams(); - if (lp.leftMargin != mConsumedInsets.left || lp.rightMargin != mConsumedInsets.right || - lp.bottomMargin != mConsumedInsets.bottom) { - lp.leftMargin = mConsumedInsets.left; - lp.rightMargin = mConsumedInsets.right; - lp.topMargin = mConsumedInsets.top; - lp.bottomMargin = mConsumedInsets.bottom; - mAlignedView.setLayoutParams(lp); - } - } if (resetState) { mLauncher.getStateManager().reapplyState(true /* cancelCurrentAnimation */); } @@ -103,12 +50,7 @@ public class LauncherRootView extends InsettableFrameLayout { mTempRect.set(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(), insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom()); handleSystemWindowInsets(mTempRect); - if (Utilities.ATLEAST_Q) { - return insets.inset(mConsumedInsets.left, mConsumedInsets.top, - mConsumedInsets.right, mConsumedInsets.bottom); - } else { - return insets.replaceSystemWindowInsets(mTempRect); - } + return insets; } @Override @@ -125,24 +67,6 @@ public class LauncherRootView extends InsettableFrameLayout { super.setInsets(mInsets); } - @Override - protected void dispatchDraw(Canvas canvas) { - super.dispatchDraw(canvas); - - // If the right inset is opaque, draw a black rectangle to ensure that is stays opaque. - if (mConsumedInsets.right > 0) { - int width = getWidth(); - canvas.drawRect(width - mConsumedInsets.right, 0, width, getHeight(), mOpaquePaint); - } - if (mConsumedInsets.left > 0) { - canvas.drawRect(0, 0, mConsumedInsets.left, getHeight(), mOpaquePaint); - } - if (mConsumedInsets.bottom > 0) { - int height = getHeight(); - canvas.drawRect(0, height - mConsumedInsets.bottom, getWidth(), height, mOpaquePaint); - } - } - public void setWindowStateListener(WindowStateListener listener) { mWindowStateListener = listener; } diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index a45c96c44b..0e57f539a1 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -349,15 +349,15 @@ public class AllAppsContainerView extends SpringRelativeLayout implements DragSo } ViewGroup.MarginLayoutParams mlp = (MarginLayoutParams) getLayoutParams(); + mlp.leftMargin = insets.left; + mlp.rightMargin = insets.right; + setLayoutParams(mlp); + if (grid.isVerticalBarLayout()) { - mlp.leftMargin = insets.left; - mlp.rightMargin = insets.right; setPadding(grid.workspacePadding.left, 0, grid.workspacePadding.right, 0); } else { - mlp.leftMargin = mlp.rightMargin = 0; setPadding(0, 0, 0, 0); } - setLayoutParams(mlp); InsettableFrameLayout.dispatchInsets(this, insets); } diff --git a/src/com/android/launcher3/popup/ArrowPopup.java b/src/com/android/launcher3/popup/ArrowPopup.java index 18bc55a5ab..5b0c388332 100644 --- a/src/com/android/launcher3/popup/ArrowPopup.java +++ b/src/com/android/launcher3/popup/ArrowPopup.java @@ -293,8 +293,8 @@ public abstract class ArrowPopup extends Abstrac // gravity to CENTER_HORIZONTAL, but continue below to update y. } else { boolean canBeLeftAligned = x + width + insets.left - < dragLayer.getRight() - insets.right; - boolean canBeRightAligned = x > dragLayer.getLeft() + insets.left; + < dragLayer.getWidth() - insets.right; + boolean canBeRightAligned = x > insets.left; boolean alignmentStillValid = mIsLeftAligned && canBeLeftAligned || !mIsLeftAligned && canBeRightAligned; if (!alignmentStillValid) { @@ -367,8 +367,10 @@ public abstract class ArrowPopup extends Abstrac super.onLayout(changed, l, t, r, b); // enforce contained is within screen - ViewGroup dragLayer = getPopupContainer(); - if (getTranslationX() + l < 0 || getTranslationX() + r > dragLayer.getWidth()) { + BaseDragLayer dragLayer = getPopupContainer(); + Rect insets = dragLayer.getInsets(); + if (getTranslationX() + l < insets.left + || getTranslationX() + r > dragLayer.getWidth() - insets.right) { // If we are still off screen, center horizontally too. mGravity |= Gravity.CENTER_HORIZONTAL; } diff --git a/src/com/android/launcher3/util/SystemUiController.java b/src/com/android/launcher3/util/SystemUiController.java index 86995b70f9..53cc157682 100644 --- a/src/com/android/launcher3/util/SystemUiController.java +++ b/src/com/android/launcher3/util/SystemUiController.java @@ -16,7 +16,6 @@ package com.android.launcher3.util; -import android.text.TextUtils; import android.view.View; import android.view.Window; @@ -33,8 +32,7 @@ public class SystemUiController { public static final int UI_STATE_BASE_WINDOW = 0; public static final int UI_STATE_ALL_APPS = 1; public static final int UI_STATE_WIDGET_BOTTOM_SHEET = 2; - public static final int UI_STATE_ROOT_VIEW = 3; - public static final int UI_STATE_OVERVIEW = 4; + public static final int UI_STATE_OVERVIEW = 3; public static final int FLAG_LIGHT_NAV = 1 << 0; public static final int FLAG_DARK_NAV = 1 << 1; @@ -42,7 +40,7 @@ public class SystemUiController { public static final int FLAG_DARK_STATUS = 1 << 3; private final Window mWindow; - private final int[] mStates = new int[5]; + private final int[] mStates = new int[4]; public SystemUiController(Window window) { mWindow = window; diff --git a/src/com/android/launcher3/widget/WidgetsFullSheet.java b/src/com/android/launcher3/widget/WidgetsFullSheet.java index 536b766e50..68a3ec51ee 100644 --- a/src/com/android/launcher3/widget/WidgetsFullSheet.java +++ b/src/com/android/launcher3/widget/WidgetsFullSheet.java @@ -24,7 +24,6 @@ import android.animation.PropertyValuesHolder; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; -import android.util.Log; import android.util.Pair; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -39,10 +38,8 @@ import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppWidgetHost.ProviderChangedListener; import com.android.launcher3.R; -import com.android.launcher3.Utilities; import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.compat.AccessibilityManagerCompat; -import com.android.launcher3.testing.TestProtocol; import com.android.launcher3.views.RecyclerViewFastScroller; import com.android.launcher3.views.TopRoundedCornerView; @@ -135,7 +132,7 @@ public class WidgetsFullSheet extends BaseWidgetSheet protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthUsed; if (mInsets.bottom > 0) { - widthUsed = 0; + widthUsed = mInsets.left + mInsets.right; } else { Rect padding = mLauncher.getDeviceProfile().workspacePadding; widthUsed = Math.max(padding.left + padding.right, @@ -156,7 +153,7 @@ public class WidgetsFullSheet extends BaseWidgetSheet // Content is laid out as center bottom aligned int contentWidth = mContent.getMeasuredWidth(); - int contentLeft = (width - contentWidth) / 2; + int contentLeft = (width - contentWidth - mInsets.left - mInsets.right) / 2 + mInsets.left; mContent.layout(contentLeft, height - mContent.getMeasuredHeight(), contentLeft + contentWidth, height);