Remove viewFlipper used in contextual card dismissal.

- Use view's visibility to control which view we should show.
- Slice view can be built with normal height after removing viewFlipper.

Bug: 129438972
Bug: 128689305
Test: robotests
Change-Id: If7e9bd30d5cb5bcd3b9ff9f09cc2eae36543b9e9
diff --git a/res/layout/homepage_dismissal_view.xml b/res/layout/homepage_dismissal_view.xml
index 20c657e..181fa3b 100644
--- a/res/layout/homepage_dismissal_view.xml
+++ b/res/layout/homepage_dismissal_view.xml
@@ -21,7 +21,8 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/homepage_card_dismissal_background"
-    android:orientation="vertical">
+    android:orientation="vertical"
+    android:visibility="gone">
 
     <TextView
         android:layout_width="match_parent"
diff --git a/res/layout/homepage_slice_half_tile.xml b/res/layout/homepage_slice_half_tile.xml
index 205279d..dc08585 100644
--- a/res/layout/homepage_slice_half_tile.xml
+++ b/res/layout/homepage_slice_half_tile.xml
@@ -27,43 +27,37 @@
 
         <include layout="@layout/dismissal_swipe_background"/>
 
-        <ViewFlipper
-            android:id="@+id/view_flipper"
+        <LinearLayout
+            android:id="@+id/content"
             android:layout_width="match_parent"
-            android:layout_height="match_parent">
+            android:layout_height="match_parent"
+            android:paddingEnd="@dimen/homepage_card_padding_end"
+            android:paddingTop="@dimen/homepage_half_card_padding_top"
+            android:paddingBottom="@dimen/homepage_half_card_padding_bottom"
+            android:background="@color/contextual_card_background"
+            android:orientation="vertical">
 
-            <LinearLayout
-                android:id="@+id/content"
+            <ImageView
+                android:id="@android:id/icon"
+                android:layout_width="@dimen/homepage_card_icon_size"
+                android:layout_height="@dimen/homepage_card_icon_size"
+                android:layout_marginStart="@dimen/homepage_card_icon_padding_start"/>
+
+            <TextView
+                android:id="@android:id/title"
                 android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:paddingEnd="@dimen/homepage_card_padding_end"
-                android:paddingTop="@dimen/homepage_half_card_padding_top"
-                android:paddingBottom="@dimen/homepage_half_card_padding_bottom"
-                android:background="@color/contextual_card_background"
-                android:orientation="vertical">
+                android:layout_height="wrap_content"
+                android:maxLines="2"
+                android:minLines="1"
+                android:ellipsize="end"
+                android:layout_marginStart="@dimen/homepage_card_text_padding_start"
+                android:layout_marginTop="@dimen/homepage_half_card_title_margin_top"
+                android:textAppearance="@style/TextAppearance.ConditionCardTitle"/>
 
-                <ImageView
-                    android:id="@android:id/icon"
-                    android:layout_width="@dimen/homepage_card_icon_size"
-                    android:layout_height="@dimen/homepage_card_icon_size"
-                    android:layout_marginStart="@dimen/homepage_card_icon_padding_start"/>
+        </LinearLayout>
 
-                <TextView
-                    android:id="@android:id/title"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:maxLines="2"
-                    android:minLines="1"
-                    android:ellipsize="end"
-                    android:layout_marginStart="@dimen/homepage_card_text_padding_start"
-                    android:layout_marginTop="@dimen/homepage_half_card_title_margin_top"
-                    android:textAppearance="@style/TextAppearance.ConditionCardTitle"/>
+        <!--dismissal view-->
+        <include layout="@layout/homepage_dismissal_view"/>
 
-            </LinearLayout>
-
-            <!--dismissal view-->
-            <include layout="@layout/homepage_dismissal_view"/>
-
-        </ViewFlipper>
     </FrameLayout>
 </com.google.android.material.card.MaterialCardView>
\ No newline at end of file
diff --git a/res/layout/homepage_slice_tile.xml b/res/layout/homepage_slice_tile.xml
index b996c7e..9e8a86c 100644
--- a/res/layout/homepage_slice_tile.xml
+++ b/res/layout/homepage_slice_tile.xml
@@ -27,29 +27,16 @@
 
         <include layout="@layout/dismissal_swipe_background"/>
 
-        <ViewFlipper
-            android:id="@+id/view_flipper"
+        <androidx.slice.widget.SliceView
+            android:id="@+id/slice_view"
+            style="@style/SliceViewStyle"
             android:layout_width="match_parent"
-            android:layout_height="wrap_content">
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_vertical"
+            android:importantForAccessibility="no"/>
 
-            <LinearLayout
-                android:id="@+id/slice_view_wrapper"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:background="@color/contextual_card_background">
+        <!--dismissal view-->
+        <include layout="@layout/homepage_dismissal_view"/>
 
-                <androidx.slice.widget.SliceView
-                    android:id="@+id/slice_view"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_gravity="center_vertical"
-                    android:importantForAccessibility="no"
-                    style="@style/SliceViewStyle"/>
-            </LinearLayout>
-
-            <!--dismissal view-->
-            <include layout="@layout/homepage_dismissal_view"/>
-
-        </ViewFlipper>
     </FrameLayout>
 </com.google.android.material.card.MaterialCardView>
\ No newline at end of file
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java b/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java
index 0cf553c..0704ed8 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java
@@ -77,8 +77,7 @@
         mCardsContainer.setAdapter(mContextualCardsAdapter);
         mContextualCardManager.setListener(mContextualCardsAdapter);
         mCardsContainer.setListener(this);
-        mItemTouchHelper = new ItemTouchHelper(
-                new SwipeDismissalDelegate(context, mContextualCardsAdapter));
+        mItemTouchHelper = new ItemTouchHelper(new SwipeDismissalDelegate(mContextualCardsAdapter));
         mItemTouchHelper.attachToRecyclerView(mCardsContainer);
 
         return rootView;
diff --git a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java
index 590afd2..c5ed5db 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java
@@ -24,7 +24,6 @@
 import android.util.Log;
 import android.view.View;
 import android.widget.Button;
-import android.widget.ViewFlipper;
 
 import androidx.annotation.LayoutRes;
 import androidx.annotation.VisibleForTesting;
@@ -142,7 +141,7 @@
         }
 
         if (card.isPendingDismiss()) {
-            flipCardToDismissalView(holder);
+            showDismissalView(holder);
             mFlippedCardSet.add(holder);
         }
     }
@@ -170,12 +169,19 @@
     }
 
     private void resetCardView(RecyclerView.ViewHolder holder) {
-        final ViewFlipper viewFlipper = holder.itemView.findViewById(R.id.view_flipper);
-        viewFlipper.setDisplayedChild(0 /* whichChild */);
+        holder.itemView.findViewById(R.id.dismissal_view).setVisibility(View.GONE);
+        getInitialView(holder).setVisibility(View.VISIBLE);
     }
 
-    private void flipCardToDismissalView(RecyclerView.ViewHolder holder) {
-        final ViewFlipper viewFlipper = holder.itemView.findViewById(R.id.view_flipper);
-        viewFlipper.showNext();
+    private void showDismissalView(RecyclerView.ViewHolder holder) {
+        holder.itemView.findViewById(R.id.dismissal_view).setVisibility(View.VISIBLE);
+        getInitialView(holder).setVisibility(View.INVISIBLE);
+    }
+
+    private View getInitialView(RecyclerView.ViewHolder viewHolder) {
+        if (viewHolder.getItemViewType() == VIEW_TYPE_HALF_WIDTH) {
+            return ((SliceHalfCardRendererHelper.HalfCardViewHolder) viewHolder).content;
+        }
+        return ((SliceFullCardRendererHelper.SliceViewHolder) viewHolder).sliceView;
     }
 }
diff --git a/src/com/android/settings/homepage/contextualcards/slices/SliceFullCardRendererHelper.java b/src/com/android/settings/homepage/contextualcards/slices/SliceFullCardRendererHelper.java
index ddfd20a..bb58e6d 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/SliceFullCardRendererHelper.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/SliceFullCardRendererHelper.java
@@ -71,12 +71,10 @@
 
     static class SliceViewHolder extends RecyclerView.ViewHolder {
         public final SliceView sliceView;
-        public final LinearLayout sliceViewWrapper;
 
         public SliceViewHolder(View view) {
             super(view);
             sliceView = view.findViewById(R.id.slice_view);
-            sliceViewWrapper = view.findViewById(R.id.slice_view_wrapper);
         }
     }
 }
diff --git a/src/com/android/settings/homepage/contextualcards/slices/SwipeDismissalDelegate.java b/src/com/android/settings/homepage/contextualcards/slices/SwipeDismissalDelegate.java
index c08cc5d..0f78575 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/SwipeDismissalDelegate.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/SwipeDismissalDelegate.java
@@ -16,10 +16,8 @@
 
 package com.android.settings.homepage.contextualcards.slices;
 
-import android.content.Context;
 import android.graphics.Canvas;
 import android.view.View;
-import android.widget.ViewFlipper;
 
 import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.ItemTouchHelper;
@@ -36,11 +34,9 @@
         void onSwiped(int position);
     }
 
-    private final Context mContext;
     private final SwipeDismissalDelegate.Listener mListener;
 
-    public SwipeDismissalDelegate(Context context, SwipeDismissalDelegate.Listener listener) {
-        mContext = context;
+    public SwipeDismissalDelegate(SwipeDismissalDelegate.Listener listener) {
         mListener = listener;
     }
 
@@ -59,14 +55,10 @@
         switch (viewHolder.getItemViewType()) {
             case SliceContextualCardRenderer.VIEW_TYPE_FULL_WIDTH:
             case SliceContextualCardRenderer.VIEW_TYPE_HALF_WIDTH:
-                //TODO(b/129438972): Convert this to a regular view.
-                final ViewFlipper viewFlipper = viewHolder.itemView.findViewById(R.id.view_flipper);
-
-                // As we are using ViewFlipper to switch between the initial view and
-                // dismissal view, here we are making sure the current displayed view is the
-                // initial view of either slice full card or half card, and only allow swipe on
-                // these two types.
-                if (viewFlipper.getCurrentView().getId() != getInitialViewId(viewHolder)) {
+                // Here we are making sure the current displayed view is the initial view of
+                // either slice full card or half card, and only allow swipe on these two types.
+                if (viewHolder.itemView.findViewById(R.id.dismissal_view).getVisibility()
+                        == View.VISIBLE) {
                     // Disable swiping when we are in the dismissal view
                     return 0;
                 }
@@ -114,13 +106,6 @@
         getDefaultUIUtil().onDraw(c, recyclerView, view, dX, dY, actionState, isCurrentlyActive);
     }
 
-    private int getInitialViewId(RecyclerView.ViewHolder viewHolder) {
-        if (viewHolder.getItemViewType() == SliceContextualCardRenderer.VIEW_TYPE_HALF_WIDTH) {
-            return R.id.content;
-        }
-        return R.id.slice_view_wrapper;
-    }
-
     /**
      * Get the foreground view from the {@link android.widget.FrameLayout} as we only swipe
      * the foreground out in {@link SwipeDismissalDelegate#onChildDraw} and gets the view
@@ -132,6 +117,6 @@
         if (viewHolder.getItemViewType() == SliceContextualCardRenderer.VIEW_TYPE_HALF_WIDTH) {
             return ((SliceHalfCardRendererHelper.HalfCardViewHolder) viewHolder).content;
         }
-        return ((SliceFullCardRendererHelper.SliceViewHolder) viewHolder).sliceViewWrapper;
+        return ((SliceFullCardRendererHelper.SliceViewHolder) viewHolder).sliceView;
     }
 }
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRendererTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRendererTest.java
index 1f58550..fff1765 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRendererTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRendererTest.java
@@ -28,14 +28,12 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.Button;
-import android.widget.ViewFlipper;
 
 import androidx.lifecycle.LifecycleOwner;
 import androidx.lifecycle.LiveData;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.slice.Slice;
-import androidx.slice.widget.SliceView;
 
 import com.android.settings.R;
 import com.android.settings.homepage.contextualcards.ContextualCard;
@@ -116,16 +114,15 @@
     }
 
     @Test
-    public void bindView_isPendingDismiss_shouldFlipToDismissalView() {
+    public void bindView_isPendingDismiss_shouldShowDismissalView() {
         final RecyclerView.ViewHolder viewHolder = getSliceViewHolder();
-        final ViewFlipper viewFlipper = viewHolder.itemView.findViewById(R.id.view_flipper);
         final View dismissalView = viewHolder.itemView.findViewById(R.id.dismissal_view);
         final ContextualCard card = buildContextualCard(
                 TEST_SLICE_URI).mutate().setIsPendingDismiss(true).build();
 
         mRenderer.bindView(viewHolder, card);
 
-        assertThat(viewFlipper.getCurrentView()).isEqualTo(dismissalView);
+        assertThat(dismissalView.getVisibility()).isEqualTo(View.VISIBLE);
     }
 
     @Test
@@ -140,24 +137,29 @@
     }
 
     @Test
-    public void viewClick_keepCard_shouldFlipBackToSlice() {
+    public void viewClick_keepCard_shouldShowSlice() {
         final RecyclerView.ViewHolder viewHolder = getSliceViewHolder();
+        final View sliceView = viewHolder.itemView.findViewById(R.id.slice_view);
+        final View dismissalView = viewHolder.itemView.findViewById(R.id.dismissal_view);
         final Button btnKeep = viewHolder.itemView.findViewById(R.id.keep);
-        final ViewFlipper viewFlipper = viewHolder.itemView.findViewById(R.id.view_flipper);
-        mRenderer.bindView(viewHolder, buildContextualCard(TEST_SLICE_URI));
-        viewFlipper.setDisplayedChild(1);
+        final ContextualCard card = buildContextualCard(
+                TEST_SLICE_URI).mutate().setIsPendingDismiss(true).build();
+        mRenderer.bindView(viewHolder, card);
 
         btnKeep.performClick();
 
-        assertThat(viewFlipper.getCurrentView().getId()).isEqualTo(R.id.slice_view_wrapper);
+        assertThat(dismissalView.getVisibility()).isEqualTo(View.GONE);
+        assertThat(sliceView.getVisibility()).isEqualTo(View.VISIBLE);
     }
 
     @Test
     public void viewClick_keepCard_shouldRemoveViewHolderFromSet() {
         final RecyclerView.ViewHolder viewHolder = getSliceViewHolder();
         final Button btnKeep = viewHolder.itemView.findViewById(R.id.keep);
-        mRenderer.bindView(viewHolder, buildContextualCard(TEST_SLICE_URI));
-        mRenderer.mFlippedCardSet.add(viewHolder);
+        final ContextualCard card = buildContextualCard(
+                TEST_SLICE_URI).mutate().setIsPendingDismiss(true).build();
+        mRenderer.bindView(viewHolder, card);
+        assertThat(mRenderer.mFlippedCardSet).contains(viewHolder);
 
         btnKeep.performClick();
 
@@ -168,11 +170,12 @@
     public void viewClick_removeCard_shouldRemoveViewHolderFromSet() {
         final RecyclerView.ViewHolder viewHolder = getSliceViewHolder();
         final Button btnRemove = viewHolder.itemView.findViewById(R.id.remove);
-        final ContextualCard contextualCard = buildContextualCard(TEST_SLICE_URI);
-        mRenderer.bindView(viewHolder, contextualCard);
+        final ContextualCard card = buildContextualCard(
+                TEST_SLICE_URI).mutate().setIsPendingDismiss(true).build();
+        mRenderer.bindView(viewHolder, card);
+        assertThat(mRenderer.mFlippedCardSet).contains(viewHolder);
         doReturn(mController).when(mControllerRendererPool).getController(mActivity,
                 ContextualCard.CardType.SLICE);
-        mRenderer.mFlippedCardSet.add(viewHolder);
 
         btnRemove.performClick();
 
@@ -195,16 +198,19 @@
     }
 
     @Test
-    public void onStop_cardIsFlipped_shouldFlipBack() {
+    public void onStop_cardIsInDismissalView_shouldResetToSliceView() {
         final RecyclerView.ViewHolder viewHolder = getSliceViewHolder();
-        final ViewFlipper viewFlipper = viewHolder.itemView.findViewById(R.id.view_flipper);
-        mRenderer.bindView(viewHolder, buildContextualCard(TEST_SLICE_URI));
-        viewFlipper.setDisplayedChild(1);
-        mRenderer.mFlippedCardSet.add(viewHolder);
+        final View sliceView = viewHolder.itemView.findViewById(R.id.slice_view);
+        final View dismissalView = viewHolder.itemView.findViewById(R.id.dismissal_view);
+        final ContextualCard card = buildContextualCard(
+                TEST_SLICE_URI).mutate().setIsPendingDismiss(true).build();
+        mRenderer.bindView(viewHolder, card);
+        assertThat(mRenderer.mFlippedCardSet).contains(viewHolder);
 
         mRenderer.onStop();
 
-        assertThat(viewFlipper.getCurrentView().getId()).isEqualTo(R.id.slice_view_wrapper);
+        assertThat(sliceView.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(dismissalView.getVisibility()).isEqualTo(View.GONE);
     }
 
     private RecyclerView.ViewHolder getSliceViewHolder() {
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SwipeDismissalDelegateTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SwipeDismissalDelegateTest.java
index d7df141..8338ae4 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SwipeDismissalDelegateTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/SwipeDismissalDelegateTest.java
@@ -28,7 +28,6 @@
 import android.app.Activity;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.widget.ViewFlipper;
 
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
@@ -68,7 +67,7 @@
         activityController.create();
         mRecyclerView = new RecyclerView(mActivity);
         mRecyclerView.setLayoutManager(new LinearLayoutManager(mActivity));
-        mDismissalDelegate = new SwipeDismissalDelegate(mActivity, mDismissalDelegateListener);
+        mDismissalDelegate = new SwipeDismissalDelegate(mDismissalDelegateListener);
     }
 
     @Test
@@ -86,22 +85,16 @@
     @Test
     public void getMovementFlags_dismissalView_shouldDisableSwipe() {
         final RecyclerView.ViewHolder holder = getSliceViewHolder();
-        final ViewFlipper viewFlipper = holder.itemView.findViewById(R.id.view_flipper);
-        viewFlipper.showNext();
-        final View dismissalView = holder.itemView.findViewById(R.id.dismissal_view);
+        holder.itemView.findViewById(R.id.dismissal_view).setVisibility(View.VISIBLE);
 
-        assertThat(viewFlipper.getCurrentView()).isEqualTo(dismissalView);
         assertThat(mDismissalDelegate.getMovementFlags(mRecyclerView, holder)).isEqualTo(0);
     }
 
     @Test
     public void getMovementFlags_SliceViewHolder_shouldEnableSwipe() {
         final RecyclerView.ViewHolder holder = getSliceViewHolder();
-        final ViewFlipper viewFlipper = holder.itemView.findViewById(R.id.view_flipper);
-        viewFlipper.setDisplayedChild(0);
-        final View sliceViewWrapper = holder.itemView.findViewById(R.id.slice_view_wrapper);
+        holder.itemView.findViewById(R.id.dismissal_view).setVisibility(View.GONE);
 
-        assertThat(viewFlipper.getCurrentView()).isEqualTo(sliceViewWrapper);
         assertThat(mDismissalDelegate.getMovementFlags(mRecyclerView, getSliceViewHolder()))
                 .isNotEqualTo(0);
     }