diff --git a/res/layout/homepage_slice_tile.xml b/res/layout/homepage_slice_tile.xml
index 28cdfb1c098..dbdb91bec8c 100644
--- a/res/layout/homepage_slice_tile.xml
+++ b/res/layout/homepage_slice_tile.xml
@@ -21,13 +21,55 @@
android:layout_height="wrap_content"
style="@style/ContextualCardStyle">
-
+ android:layout_height="wrap_content">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9e5cb2ade08..3ee8d97204d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -10286,4 +10286,10 @@
Permission, permission usage
-
+
+ Remove
+
+ Keep
+
+ Remove this suggestion?
+
\ No newline at end of file
diff --git a/res/values/styles.xml b/res/values/styles.xml
index aa3412316c9..8fa357bc75f 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -16,7 +16,8 @@
-
@@ -78,8 +79,11 @@
- outsideOverlay
-
@@ -162,7 +166,8 @@
- wrap_content
-
@@ -171,14 +176,16 @@
- #ff000000
-
-
-
+
-
-
+
+
-
-
+
-
-
@@ -345,6 +355,12 @@
- 8dp
+
+
@@ -391,7 +407,8 @@
- 1.2
-
+
+
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardController.java b/src/com/android/settings/homepage/contextualcards/ContextualCardController.java
index 95669cecd42..4d31e79605b 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardController.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardController.java
@@ -28,5 +28,7 @@ public interface ContextualCardController {
void onActionClick(ContextualCard card);
+ void onDismissed(ContextualCard card);
+
void setCardUpdateListener(ContextualCardUpdateListener listener);
}
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
index 39ceff317b6..db05abb69b3 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
@@ -146,14 +146,14 @@ public class ContextualCardManager implements ContextualCardLoader.CardContentLo
onContextualCardUpdated(cards.stream().collect(groupingBy(ContextualCard::getCardType)));
}
- void setListener(ContextualCardUpdateListener listener) {
- mListener = listener;
- }
-
public ControllerRendererPool getControllerRendererPool() {
return mControllerRendererPool;
}
+ void setListener(ContextualCardUpdateListener listener) {
+ mListener = listener;
+ }
+
static class CardContentLoaderCallbacks implements
LoaderManager.LoaderCallbacks> {
diff --git a/src/com/android/settings/homepage/contextualcards/ControllerRendererPool.java b/src/com/android/settings/homepage/contextualcards/ControllerRendererPool.java
index 7d9d5a8a4a3..723b3443734 100644
--- a/src/com/android/settings/homepage/contextualcards/ControllerRendererPool.java
+++ b/src/com/android/settings/homepage/contextualcards/ControllerRendererPool.java
@@ -126,7 +126,8 @@ public class ControllerRendererPool {
if (ConditionContextualCardRenderer.class == clz) {
return new ConditionContextualCardRenderer(context, this /* controllerRendererPool */);
} else if (SliceContextualCardRenderer.class == clz) {
- return new SliceContextualCardRenderer(context, lifecycleOwner);
+ return new SliceContextualCardRenderer(context, lifecycleOwner,
+ this /* controllerRendererPool */);
} else if (LegacySuggestionContextualCardRenderer.class == clz) {
return new LegacySuggestionContextualCardRenderer(context,
this /* controllerRendererPool */);
diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardController.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardController.java
index 10881d902ea..84ceabdab1f 100644
--- a/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardController.java
+++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardController.java
@@ -77,6 +77,11 @@ public class ConditionContextualCardController implements ContextualCardControll
@Override
public void onActionClick(ContextualCard contextualCard) {
+
+ }
+
+ @Override
+ public void onDismissed(ContextualCard contextualCard) {
final ConditionalContextualCard card = (ConditionalContextualCard) contextualCard;
mConditionManager.onActionClick(card.getConditionId());
}
diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardRenderer.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardRenderer.java
index 5e4e749c6b2..3405dd2cb25 100644
--- a/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardRenderer.java
+++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionContextualCardRenderer.java
@@ -112,8 +112,8 @@ public class ConditionContextualCardRenderer implements ContextualCardRenderer {
metricsFeatureProvider.action(
viewContext, MetricsProto.MetricsEvent.ACTION_SETTINGS_CONDITION_BUTTON,
card.getMetricsConstant());
- mControllerRendererPool.getController(mContext, card.getCardType()).onActionClick(
- card);
+ mControllerRendererPool.getController(mContext, card.getCardType())
+ .onDismissed(card);
});
} else {
button.setVisibility(View.GONE);
diff --git a/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardController.java b/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardController.java
index 550f84566d3..7fa004a3847 100644
--- a/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardController.java
+++ b/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardController.java
@@ -86,6 +86,11 @@ public class LegacySuggestionContextualCardController implements ContextualCardC
}
+ @Override
+ public void onDismissed(ContextualCard card) {
+
+ }
+
@Override
public void setCardUpdateListener(ContextualCardUpdateListener listener) {
mCardUpdateListener = listener;
diff --git a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardController.java b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardController.java
index 5711dc5d03f..6ab8f404352 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardController.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardController.java
@@ -25,6 +25,10 @@ import com.android.settings.homepage.contextualcards.ContextualCardUpdateListene
*/
public class SliceContextualCardController implements ContextualCardController {
+ private static final String TAG = "SliceCardController";
+
+ private ContextualCardUpdateListener mCardUpdateListener;
+
@Override
public int getCardType() {
return ContextualCard.CardType.SLICE;
@@ -37,11 +41,16 @@ public class SliceContextualCardController implements ContextualCardController {
@Override
public void onActionClick(ContextualCard card) {
+ //TODO(b/113783548): Implement feedback mechanism
+ }
+ @Override
+ public void onDismissed(ContextualCard card) {
+ //TODO(b/113783548): Mark this card as dismissed in db and reload loader.
}
@Override
public void setCardUpdateListener(ContextualCardUpdateListener listener) {
-
+ mCardUpdateListener = listener;
}
}
diff --git a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java
index 5fc4473dd16..74f25eb7478 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java
@@ -22,6 +22,8 @@ import android.net.Uri;
import android.util.ArrayMap;
import android.util.Log;
import android.view.View;
+import android.widget.Button;
+import android.widget.ViewFlipper;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
@@ -37,6 +39,7 @@ import androidx.slice.widget.SliceView;
import com.android.settings.R;
import com.android.settings.homepage.contextualcards.ContextualCard;
import com.android.settings.homepage.contextualcards.ContextualCardRenderer;
+import com.android.settings.homepage.contextualcards.ControllerRendererPool;
import java.util.Map;
@@ -54,11 +57,14 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer,
private final Context mContext;
private final LifecycleOwner mLifecycleOwner;
+ private final ControllerRendererPool mControllerRendererPool;
- public SliceContextualCardRenderer(Context context, LifecycleOwner lifecycleOwner) {
+ public SliceContextualCardRenderer(Context context, LifecycleOwner lifecycleOwner,
+ ControllerRendererPool controllerRendererPool) {
mContext = context;
mLifecycleOwner = lifecycleOwner;
mSliceLiveDataMap = new ArrayMap<>();
+ mControllerRendererPool = controllerRendererPool;
}
@Override
@@ -104,6 +110,27 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer,
// Set this listener so we can log the interaction users make on the slice
cardHolder.sliceView.setOnSliceActionListener(this);
+
+ initDismissalActions(cardHolder, card);
+ }
+
+ private void initDismissalActions(SliceViewHolder cardHolder, ContextualCard card) {
+ final ViewFlipper viewFlipper = cardHolder.itemView.findViewById(R.id.viewFlipper);
+ cardHolder.sliceView.setOnLongClickListener(v -> {
+ viewFlipper.showNext();
+ return true;
+ });
+
+ final Button btnKeep = cardHolder.itemView.findViewById(R.id.keep);
+ btnKeep.setOnClickListener(v -> {
+ viewFlipper.showPrevious();
+ });
+
+ final Button btnRemove = cardHolder.itemView.findViewById(R.id.remove);
+ btnRemove.setOnClickListener(v -> {
+ mControllerRendererPool.getController(mContext, card.getCardType()).onDismissed(
+ card);
+ });
}
@Override
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 7a07d35dce3..1ba329ca088 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
@@ -24,15 +24,20 @@ import android.content.Context;
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;
import com.android.settings.homepage.contextualcards.ContextualCardsFragment;
+import com.android.settings.homepage.contextualcards.ControllerRendererPool;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
@@ -47,6 +52,10 @@ public class SliceContextualCardRendererTest {
@Mock
private LiveData mSliceLiveData;
+ @Mock
+ private ControllerRendererPool mControllerRendererPool;
+ @Mock
+ private SliceContextualCardController mController;
private Context mContext;
private SliceContextualCardRenderer mRenderer;
@@ -57,7 +66,8 @@ public class SliceContextualCardRendererTest {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mLifecycleOwner = new ContextualCardsFragment();
- mRenderer = new SliceContextualCardRenderer(mContext, mLifecycleOwner);
+ mRenderer = new SliceContextualCardRenderer(mContext, mLifecycleOwner,
+ mControllerRendererPool);
}
@Test
@@ -103,7 +113,7 @@ public class SliceContextualCardRendererTest {
}
@Test
- public void bindview_sliceLiveDataShouldRemoveObservers() {
+ public void bindView_sliceLiveDataShouldRemoveObservers() {
final String sliceUri = "content://com.android.settings.slices/action/flashlight";
mRenderer.mSliceLiveDataMap.put(sliceUri, mSliceLiveData);
@@ -112,14 +122,45 @@ public class SliceContextualCardRendererTest {
verify(mSliceLiveData).removeObservers(mLifecycleOwner);
}
+ @Test
+ public void longClick_shouldFlipCard() {
+ final String sliceUri = "content://com.android.settings.slices/action/flashlight";
+ final RecyclerView.ViewHolder viewHolder = getSliceViewHolder();
+ final View card = viewHolder.itemView.findViewById(R.id.slice_view);
+ final ViewFlipper viewFlipper = viewHolder.itemView.findViewById(R.id.viewFlipper);
+ final View dismissalView = viewHolder.itemView.findViewById(R.id.dismissal_view);
+ mRenderer.bindView(viewHolder, buildContextualCard(sliceUri));
+
+ assertThat(card).isNotNull();
+ card.performLongClick();
+
+ assertThat(viewFlipper.getCurrentView()).isEqualTo(dismissalView);
+ }
+
+ @Test
+ public void viewClick_keepCard_shouldFlipBackToSlice() {
+ final String sliceUri = "content://com.android.settings.slices/action/flashlight";
+ final RecyclerView.ViewHolder viewHolder = getSliceViewHolder();
+ final View card = viewHolder.itemView.findViewById(R.id.slice_view);
+ final Button btnKeep = viewHolder.itemView.findViewById(R.id.keep);
+ final ViewFlipper viewFlipper = viewHolder.itemView.findViewById(R.id.viewFlipper);
+ mRenderer.bindView(viewHolder, buildContextualCard(sliceUri));
+
+ assertThat(card).isNotNull();
+ card.performLongClick();
+ assertThat(btnKeep).isNotNull();
+ btnKeep.performClick();
+
+ assertThat(viewFlipper.getCurrentView()).isInstanceOf(SliceView.class);
+ }
+
private RecyclerView.ViewHolder getSliceViewHolder() {
final int viewType = mRenderer.getViewType(false /* isHalfWidth */);
final RecyclerView recyclerView = new RecyclerView(mContext);
recyclerView.setLayoutManager(new LinearLayoutManager(mContext));
final View view = LayoutInflater.from(mContext).inflate(viewType, recyclerView, false);
- final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(view);
- return viewHolder;
+ return mRenderer.createViewHolder(view);
}
private ContextualCard buildContextualCard(String sliceUri) {