Enforce parent outline for widgets
This bounds the widget view inside BaseLauncherAppWidgetHostView
to reduce the overlap
Bug: 322919716
Flag: N/A
Test: Manual
Change-Id: I270d94e3fff96724e95f9a38ab41f83beebd1271
diff --git a/src/com/android/launcher3/widget/BaseLauncherAppWidgetHostView.java b/src/com/android/launcher3/widget/BaseLauncherAppWidgetHostView.java
index 580b4f1..104209e 100644
--- a/src/com/android/launcher3/widget/BaseLauncherAppWidgetHostView.java
+++ b/src/com/android/launcher3/widget/BaseLauncherAppWidgetHostView.java
@@ -34,6 +34,17 @@
*/
public abstract class BaseLauncherAppWidgetHostView extends NavigableAppWidgetHostView {
+ private static final ViewOutlineProvider VIEW_OUTLINE_PROVIDER = new ViewOutlineProvider() {
+ @Override
+ public void getOutline(View view, Outline outline) {
+ // Since ShortcutAndWidgetContainer sets clipChildren to false, we should restrict the
+ // outline to be the view bounds, otherwise widgets might draw themselves outside of
+ // the launcher view. Setting alpha to 0 to match the previous behavior.
+ outline.setRect(0, 0, view.getWidth(), view.getHeight());
+ outline.setAlpha(.0f);
+ }
+ };
+
protected final LayoutInflater mInflater;
private final Rect mEnforcedRectangle = new Rect();
@@ -49,10 +60,13 @@
}
};
+ private boolean mIsCornerRadiusEnforced;
+
public BaseLauncherAppWidgetHostView(Context context) {
super(context);
setExecutor(Executors.THREAD_POOL_EXECUTOR);
+ setClipToOutline(true);
mInflater = LayoutInflater.from(context);
mEnforcedCornerRadius = RoundedCornerEnforcement.computeEnforcedRadius(getContext());
@@ -84,8 +98,8 @@
@UiThread
private void resetRoundedCorners() {
- setOutlineProvider(ViewOutlineProvider.BACKGROUND);
- setClipToOutline(false);
+ setOutlineProvider(VIEW_OUTLINE_PROVIDER);
+ mIsCornerRadiusEnforced = false;
}
@UiThread
@@ -104,7 +118,7 @@
background,
mEnforcedRectangle);
setOutlineProvider(mCornerRadiusEnforcementOutline);
- setClipToOutline(true);
+ mIsCornerRadiusEnforced = true;
invalidateOutline();
}
@@ -115,6 +129,6 @@
/** Returns true if the corner radius are enforced for this App Widget. */
public boolean hasEnforcedCornerRadius() {
- return getClipToOutline();
+ return mIsCornerRadiusEnforced;
}
}