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;
     }
 }