[DO NOT MERGE] Update contextual cards display mechanism
1. Make Wi-Fi card default to collapse.
2. Support showing a default card when there's no displayable card.
3. Solve the problem of icon not showing for cached slices in card
renderer
Bug: 163288869
Fixes: 159092915
Test: manual, robotest
Change-Id: Ie8b61ad58410337334e29b7a794353b0c6a6ba8c
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java
index 7f29ecb..684e658 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java
@@ -24,6 +24,9 @@
/** Get contextual cards from the card provider */
Cursor getContextualCards();
+ /** Get the default contextual card to display */
+ ContextualCard getDefaultContextualCard();
+
/**
* Mark a specific {@link ContextualCard} as dismissed with dismissal signal in the database
* to indicate that the card has been dismissed.
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java
index 5059d90..643625b 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java
@@ -55,6 +55,11 @@
}
@Override
+ public ContextualCard getDefaultContextualCard() {
+ return null;
+ }
+
+ @Override
public int markCardAsDismissed(Context context, String cardName) {
final SQLiteDatabase db = CardDatabaseHelper.getInstance(mContext).getWritableDatabase();
final ContentValues values = new ContentValues();
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
index e4a644c..0dfed72 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
@@ -164,6 +164,16 @@
SettingsEnums.ACTION_CONTEXTUAL_CARD_NOT_SHOW,
ContextualCardLogUtils.buildCardListLog(hiddenCards));
}
+
+ // Add a default card if no other visible cards
+ if (visibleCards.isEmpty() && maxCardCount == 1) {
+ final ContextualCard defaultCard = FeatureFactory.getFactory(mContext)
+ .getContextualCardFeatureProvider(mContext).getDefaultContextualCard();
+ if (defaultCard != null) {
+ Log.i(TAG, "Default card: " + defaultCard.getSliceUri());
+ visibleCards.add(defaultCard);
+ }
+ }
return visibleCards;
}
diff --git a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java
index c9ec5cf..b631102 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/SliceContextualCardRenderer.java
@@ -47,7 +47,6 @@
import com.android.settings.homepage.contextualcards.ContextualCard;
import com.android.settings.homepage.contextualcards.ContextualCardRenderer;
import com.android.settings.homepage.contextualcards.ControllerRendererPool;
-import com.android.settings.homepage.contextualcards.slices.SliceFullCardRendererHelper.SliceViewHolder;
import com.android.settingslib.utils.ThreadUtils;
import java.util.Map;
@@ -105,7 +104,7 @@
// Show cached slice first before slice binding completed to avoid jank.
if (holder.getItemViewType() != VIEW_TYPE_HALF_WIDTH) {
- ((SliceViewHolder) holder).sliceView.setSlice(card.getSlice());
+ mFullCardHelper.bindView(holder, card, card.getSlice());
}
LiveData<Slice> sliceLiveData = mSliceLiveDataMap.get(uri);
diff --git a/src/com/android/settings/wifi/slice/ContextualWifiSlice.java b/src/com/android/settings/wifi/slice/ContextualWifiSlice.java
index ea9a745..4d3c60b 100644
--- a/src/com/android/settings/wifi/slice/ContextualWifiSlice.java
+++ b/src/com/android/settings/wifi/slice/ContextualWifiSlice.java
@@ -25,6 +25,7 @@
import android.net.Uri;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
+import android.provider.Settings;
import android.text.TextUtils;
import androidx.annotation.VisibleForTesting;
@@ -45,6 +46,9 @@
public class ContextualWifiSlice extends WifiSlice {
@VisibleForTesting
+ static final String CONTEXTUAL_WIFI_EXPANDABLE = "contextual_wifi_expandable";
+
+ @VisibleForTesting
static final int COLLAPSED_ROW_COUNT = 0;
@VisibleForTesting
@@ -63,13 +67,17 @@
@Override
public Slice getSlice() {
- final long currentUiSession = FeatureFactory.getFactory(mContext)
- .getSlicesFeatureProvider().getUiSessionToken();
- if (currentUiSession != sActiveUiSession) {
- sActiveUiSession = currentUiSession;
- sApRowCollapsed = hasWorkingNetwork();
- } else if (!mWifiManager.isWifiEnabled()) {
- sApRowCollapsed = false;
+ if (isExpandable()) {
+ final long currentUiSession = FeatureFactory.getFactory(mContext)
+ .getSlicesFeatureProvider().getUiSessionToken();
+ if (currentUiSession != sActiveUiSession) {
+ sActiveUiSession = currentUiSession;
+ sApRowCollapsed = hasWorkingNetwork();
+ } else if (!mWifiManager.isWifiEnabled()) {
+ sApRowCollapsed = false;
+ }
+ } else {
+ sApRowCollapsed = true;
}
return super.getSlice();
}
@@ -87,12 +95,18 @@
protected ListBuilder.RowBuilder getHeaderRow(boolean isWifiEnabled, AccessPoint accessPoint) {
final ListBuilder.RowBuilder builder = super.getHeaderRow(isWifiEnabled, accessPoint);
builder.setTitleItem(getHeaderIcon(isWifiEnabled, accessPoint), ListBuilder.ICON_IMAGE);
- if (sApRowCollapsed) {
+ if (sApRowCollapsed && isWifiEnabled) {
builder.setSubtitle(getSubtitle(accessPoint));
}
return builder;
}
+ private boolean isExpandable() {
+ // Return whether this slice can be expandable.
+ return Settings.Global.getInt(mContext.getContentResolver(), CONTEXTUAL_WIFI_EXPANDABLE, 0)
+ != 0;
+ }
+
private IconCompat getHeaderIcon(boolean isWifiEnabled, AccessPoint accessPoint) {
final Drawable drawable;
final int tint;
diff --git a/tests/robotests/src/com/android/settings/wifi/slice/ContextualWifiSliceTest.java b/tests/robotests/src/com/android/settings/wifi/slice/ContextualWifiSliceTest.java
index 54b7c2d..fe1bb11 100644
--- a/tests/robotests/src/com/android/settings/wifi/slice/ContextualWifiSliceTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/slice/ContextualWifiSliceTest.java
@@ -30,6 +30,7 @@
import android.net.NetworkCapabilities;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
+import android.provider.Settings;
import androidx.core.graphics.drawable.IconCompat;
import androidx.slice.Slice;
@@ -77,6 +78,9 @@
SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
mWifiManager.setWifiEnabled(true);
+ // Set WifiSlice expandable
+ Settings.Global.putInt(mContext.getContentResolver(),
+ ContextualWifiSlice.CONTEXTUAL_WIFI_EXPANDABLE, 1);
mWifiSlice = new ContextualWifiSlice(mContext);
}
@@ -127,6 +131,18 @@
}
@Test
+ public void getWifiSlice_notExpandable_shouldCollapseSlice() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ ContextualWifiSlice.CONTEXTUAL_WIFI_EXPANDABLE, 0);
+ mWifiSlice.sApRowCollapsed = false;
+
+ final Slice wifiSlice = mWifiSlice.getSlice();
+
+ assertWifiHeader(wifiSlice);
+ assertThat(ContextualWifiSlice.getApRowCount()).isEqualTo(COLLAPSED_ROW_COUNT);
+ }
+
+ @Test
public void getWifiSlice_contextualWifiSlice_shouldReturnContextualWifiSliceUri() {
mWifiSlice.sActiveUiSession = mFeatureFactory.slicesFeatureProvider.getUiSessionToken();