diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java index 7f29ecb836e..684e6585709 100644 --- a/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java +++ b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProvider.java @@ -24,6 +24,9 @@ public interface ContextualCardFeatureProvider { /** 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 5059d90a15e..643625bf190 100644 --- a/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java +++ b/src/com/android/settings/homepage/contextualcards/ContextualCardFeatureProviderImpl.java @@ -54,6 +54,11 @@ public class ContextualCardFeatureProviderImpl implements ContextualCardFeatureP return cursor; } + @Override + public ContextualCard getDefaultContextualCard() { + return null; + } + @Override public int markCardAsDismissed(Context context, String cardName) { final SQLiteDatabase db = CardDatabaseHelper.getInstance(mContext).getWritableDatabase(); diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java index e4a644cf780..0dfed72bae2 100644 --- a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java +++ b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java @@ -164,6 +164,16 @@ public class ContextualCardLoader extends AsyncLoaderCompat 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 c9ec5cf8733..b631102cedf 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.CardContentProvider; 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 @@ public class SliceContextualCardRenderer implements ContextualCardRenderer, Life // 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 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 ea9a7452202..4d3c60b7c4b 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.NetworkInfo.State; 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; @@ -44,6 +45,9 @@ import com.android.settingslib.wifi.AccessPoint; */ public class ContextualWifiSlice extends WifiSlice { + @VisibleForTesting + static final String CONTEXTUAL_WIFI_EXPANDABLE = "contextual_wifi_expandable"; + @VisibleForTesting static final int COLLAPSED_ROW_COUNT = 0; @@ -63,13 +67,17 @@ public class ContextualWifiSlice extends WifiSlice { @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 @@ public class ContextualWifiSlice extends WifiSlice { 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 54b7c2db358..fe1bb11b1b2 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.content.Context; 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 @@ public class ContextualWifiSliceTest { 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); } @@ -126,6 +130,18 @@ public class ContextualWifiSliceTest { assertThat(ContextualWifiSlice.getApRowCount()).isEqualTo(COLLAPSED_ROW_COUNT); } + @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();