diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java index 9e46a84e75..631333b2d9 100644 --- a/src/com/android/launcher3/InvariantDeviceProfile.java +++ b/src/com/android/launcher3/InvariantDeviceProfile.java @@ -17,6 +17,7 @@ package com.android.launcher3; import android.annotation.TargetApi; +import android.app.ActivityManager; import android.content.Context; import android.graphics.Point; import android.os.Build; @@ -84,6 +85,9 @@ public class InvariantDeviceProfile { DeviceProfile landscapeProfile; DeviceProfile portraitProfile; + // On Marshmallow the status bar is no longer opaque, when drawn on the right. + public boolean isRightInsetOpaque; + InvariantDeviceProfile() { } @@ -116,7 +120,7 @@ public class InvariantDeviceProfile { defaultLayoutId = dlId; } - @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) + @TargetApi(Build.VERSION_CODES.M) InvariantDeviceProfile(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); @@ -167,6 +171,9 @@ public class InvariantDeviceProfile { largeSide, smallSide, true /* isLandscape */); portraitProfile = new DeviceProfile(context, this, smallestSize, largestSize, smallSide, largeSide, false /* isLandscape */); + + isRightInsetOpaque = !Utilities.ATLEAST_MARSHMALLOW || + context.getSystemService(ActivityManager.class).isLowRamDevice(); } ArrayList getPredefinedDeviceProfiles() { diff --git a/src/com/android/launcher3/LauncherRootView.java b/src/com/android/launcher3/LauncherRootView.java index e8c11c48bd..1c6ca87134 100644 --- a/src/com/android/launcher3/LauncherRootView.java +++ b/src/com/android/launcher3/LauncherRootView.java @@ -1,17 +1,42 @@ package com.android.launcher3; import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; public class LauncherRootView extends InsettableFrameLayout { + + private final Paint mOpaquePaint; + private boolean mDrawRightInsetBar; + 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); } @Override protected boolean fitSystemWindows(Rect insets) { setInsets(insets); + mDrawRightInsetBar = mInsets.right > 0 && LauncherAppState + .getInstance().getInvariantDeviceProfile().isRightInsetOpaque; + return true; // I'll take it from here } + + @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 (mDrawRightInsetBar) { + int width = getWidth(); + canvas.drawRect(width - mInsets.right, 0, width, getHeight(), mOpaquePaint); + } + } } \ No newline at end of file diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index e4d644884e..e90ec14760 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -187,6 +187,9 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc protected final Rect mInsets = new Rect(); protected final boolean mIsRtl; + // When set to true, full screen content and overscroll effect is shited inside by right inset. + protected boolean mIgnoreRightInset; + // Edge effect private final LauncherEdgeEffect mEdgeGlowLeft = new LauncherEdgeEffect(); private final LauncherEdgeEffect mEdgeGlowRight = new LauncherEdgeEffect(); @@ -798,7 +801,8 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc childWidthMode = MeasureSpec.EXACTLY; childHeightMode = MeasureSpec.EXACTLY; - childWidth = getViewportWidth() - mInsets.left - mInsets.right; + childWidth = getViewportWidth() - mInsets.left + - (mIgnoreRightInset ? mInsets.right : 0); childHeight = getViewportHeight(); } if (referenceChildWidth == 0) { @@ -1152,8 +1156,10 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc canvas.rotate(90); getEdgeVerticalPostion(sTmpIntPoint); - canvas.translate(sTmpIntPoint[0] - display.top, -display.width()); - mEdgeGlowRight.setSize(sTmpIntPoint[1] - sTmpIntPoint[0], display.width()); + + int width = mIgnoreRightInset ? (display.width() - mInsets.right) : display.width(); + canvas.translate(sTmpIntPoint[0] - display.top, -width); + mEdgeGlowRight.setSize(sTmpIntPoint[1] - sTmpIntPoint[0], width); if (mEdgeGlowRight.draw(canvas)) { postInvalidateOnAnimation(); } diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index d409cf6433..2bedb9f31d 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -436,6 +436,7 @@ public class Workspace extends PagedView setWallpaperDimension(); setEdgeGlowColor(getResources().getColor(R.color.workspace_edge_effect_color)); + mIgnoreRightInset = app.getInvariantDeviceProfile().isRightInsetOpaque; } private int getDefaultPage() {