diff --git a/res/layout/homepage_dismissal_view.xml b/res/layout/homepage_dismissal_view.xml index 20c657e7039..181fa3bac91 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"> - + 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"/> - + - + + - - - - - - \ No newline at end of file diff --git a/res/layout/homepage_slice_tile.xml b/res/layout/homepage_slice_tile.xml index b996c7e4777..9e8a86ce2eb 100644 --- a/res/layout/homepage_slice_tile.xml +++ b/res/layout/homepage_slice_tile.xml @@ -27,29 +27,16 @@ - + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:importantForAccessibility="no"/> - + + - - - - - - - \ 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 0cf553c13a1..0704ed82e3d 100644 --- a/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java +++ b/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java @@ -77,8 +77,7 @@ public class ContextualCardsFragment extends InstrumentedFragment implements 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 590afd216f3..c5ed5dbcd81 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.ArraySet; 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 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, Life } if (card.isPendingDismiss()) { - flipCardToDismissalView(holder); + showDismissalView(holder); mFlippedCardSet.add(holder); } } @@ -170,12 +169,19 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, Life } 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 ddfd20ad8b8..bb58e6d077e 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 @@ class SliceFullCardRendererHelper { 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 c08cc5de932..0f78575cf81 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 @@ public class SwipeDismissalDelegate extends ItemTouchHelper.Callback { 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 @@ public class SwipeDismissalDelegate extends ItemTouchHelper.Callback { 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 @@ public class SwipeDismissalDelegate extends ItemTouchHelper.Callback { 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 @@ public class SwipeDismissalDelegate extends ItemTouchHelper.Callback { 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 1f58550d0be..fff17653f30 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.net.Uri; 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 @@ public class SliceContextualCardRendererTest { } @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 @@ public class SliceContextualCardRendererTest { } @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 class SliceContextualCardRendererTest { 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 @@ public class SliceContextualCardRendererTest { } @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 d7df141aa61..8338ae407db 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 static org.mockito.Mockito.verify; 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 @@ public class SwipeDismissalDelegateTest { 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 @@ public class SwipeDismissalDelegateTest { @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); }