Merge "[DO NOT MERGE] Update contextual cards display mechanism" into rvc-d1-dev
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();