Add prepainting background while swiping to dismiss.

When users swipe the card, they will see a pre-painted background.
The dismissal view will appear in only after the swipe.

Bug: 126214056
Test: visual
Change-Id: I0eb308700cda2e6d72c718f3057775d3620267cd
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 4a65bc9..034e4a3 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -346,6 +346,7 @@
     <dimen name="homepage_card_icon_padding_start">14dp</dimen>
     <dimen name="homepage_card_text_padding_start">16dp</dimen>
     <dimen name="homepage_card_padding_end">16dp</dimen>
+    <dimen name="homepage_card_corner_radius">@*android:dimen/config_dialogCornerRadius</dimen>
     <dimen name="homepage_full_card_padding_end">12dp</dimen>
     <dimen name="homepage_half_card_padding_top">12dp</dimen>
     <dimen name="homepage_half_card_padding_bottom">16dp</dimen>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 02db995..8cd22fe 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -418,7 +418,7 @@
         <item name="android:layout_marginStart">@dimen/homepage_card_side_margin</item>
         <item name="android:layout_marginEnd">@dimen/homepage_card_side_margin</item>
         <item name="cardBackgroundColor">@color/contextual_card_background</item>
-        <item name="cardCornerRadius">@*android:dimen/config_dialogCornerRadius</item>
+        <item name="cardCornerRadius">@dimen/homepage_card_corner_radius</item>
         <item name="cardElevation">0dp</item>
         <item name="strokeColor">@color/homepage_card_stroke_color</item>
         <item name="strokeWidth">1dp</item>
diff --git a/src/com/android/settings/homepage/contextualcards/slices/SwipeDismissalDelegate.java b/src/com/android/settings/homepage/contextualcards/slices/SwipeDismissalDelegate.java
index 121d4aa..3564189 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/SwipeDismissalDelegate.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/SwipeDismissalDelegate.java
@@ -18,6 +18,10 @@
 
 import android.content.Context;
 import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.graphics.drawable.Drawable;
+import android.view.View;
 import android.widget.ViewFlipper;
 
 import androidx.annotation.NonNull;
@@ -29,7 +33,7 @@
 
 public class SwipeDismissalDelegate extends ItemTouchHelper.Callback {
 
-    private static final String TAG = "DismissItemTouchHelper";
+    private static final String TAG = "SwipeDismissalDelegate";
 
     public interface Listener {
         void onSwiped(int position);
@@ -37,10 +41,18 @@
 
     private final Context mContext;
     private final SwipeDismissalDelegate.Listener mListener;
+    private final Drawable mIconDelete;
+    private final Paint mBgPaint;
+    private final int mBgCornerRadius;
 
     public SwipeDismissalDelegate(Context context, SwipeDismissalDelegate.Listener listener) {
         mContext = context;
         mListener = listener;
+        mIconDelete = mContext.getDrawable(R.drawable.ic_delete);
+        mBgPaint = new Paint();
+        mBgPaint.setColor(mContext.getColor(R.color.homepage_card_dismissal_background));
+        mBgCornerRadius = mContext.getResources()
+                .getDimensionPixelSize(R.dimen.homepage_card_corner_radius);
     }
 
     /**
@@ -93,6 +105,30 @@
             @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
             boolean isCurrentlyActive) {
         super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
+
+        final View itemView = viewHolder.itemView;
+        final int iconMargin = mContext.getResources()
+                .getDimensionPixelSize(R.dimen.homepage_card_dismissal_side_margin);
+        final int iconTop =
+                itemView.getTop() + (itemView.getHeight() - mIconDelete.getIntrinsicHeight()) / 2;
+        final int iconBottom = iconTop + mIconDelete.getIntrinsicHeight();
+
+        if (dX > 0) { //swipe to the right
+            final int iconLeft = itemView.getLeft() + iconMargin;
+            final int iconRight = iconLeft + mIconDelete.getIntrinsicWidth();
+            final RectF rect = new RectF(itemView.getLeft(), itemView.getTop(),
+                    itemView.getLeft() + ((int) dX) + mBgCornerRadius, itemView.getBottom());
+            mIconDelete.setBounds(iconLeft, iconTop, iconRight, iconBottom);
+            c.drawRoundRect(rect, mBgCornerRadius, mBgCornerRadius, mBgPaint);
+        } else if (dX < 0) {
+            final int iconRight = itemView.getRight() - iconMargin;
+            final int iconLeft = iconRight - mIconDelete.getIntrinsicWidth();
+            final RectF rect = new RectF(itemView.getRight() + ((int) dX), itemView.getTop(),
+                    itemView.getRight(), itemView.getBottom());
+            mIconDelete.setBounds(iconLeft, iconTop, iconRight, iconBottom);
+            c.drawRoundRect(rect, mBgCornerRadius, mBgCornerRadius, mBgPaint);
+        }
+        mIconDelete.draw(c);
     }
 
     private int getInitialViewId(RecyclerView.ViewHolder viewHolder) {