Merge "Disable avatar and contextual cards on low ram devices."
diff --git a/res/values/strings.xml b/res/values/strings.xml
index bd67b1c..2f33878 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -10737,8 +10737,8 @@
 
     <!-- Summary for the accessibility usage preference in the Privacy page.  [CHAR LIMIT=NONE] -->
     <plurals name="accessibility_usage_summary">
-        <item quantity="one">1 service has full access to your device</item>
-        <item quantity="other"><xliff:g id="service_count">%1$d</xliff:g> services have full access to your device</item>
+        <item quantity="one">1 app has full access to your device</item>
+        <item quantity="other"><xliff:g id="service_count">%1$d</xliff:g> apps have full access to your device</item>
     </plurals>
 
     <!-- Title for notification channel slice. [CHAR LIMIT=NONE] -->
@@ -10759,7 +10759,7 @@
     <string name="media_output_panel_summary_of_playing_device">Currently playing on <xliff:g id="device_name" example="Bose headphone">%1$s</xliff:g></string>
 
     <!-- Message for forget passpoint dialog [CHAR LIMIT=none] -->
-    <string name="forget_passpoint_dialog_message">Your subscription with this provider may be cancelled. Recurring subscriptions will not be cancelled. For more information, check with your provider.</string>
+    <string name="forget_passpoint_dialog_message">You may lose access to any remaining time or data. Check with your provider before removing.</string>
 
     <!-- Keywords for Content Capture feature [CHAR_LIMIT=32] -->
     <string name="keywords_content_capture">content capture</string>
@@ -10767,5 +10767,4 @@
     <string name="content_capture">Content Capture</string>
     <!-- Description of the 'Content Capture' feature toggle in the Settings -> Privacy screen [CHAR LIMIT=NONE]-->
     <string name="content_capture_summary">Allow Android to save information seen on your screen or heard in video or audio content. Android makes helpful suggestions based on your device activity.</string>
-
 </resources>
diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml
index 83bf5c4..bc498d2 100644
--- a/res/xml/my_device_info.xml
+++ b/res/xml/my_device_info.xml
@@ -115,6 +115,7 @@
         android:title="@string/status_imei"
         settings:keywords="@string/keywords_imei_info"
         android:summary="@string/summary_placeholder"
+        settings:allowDynamicSummaryInSlice="true"
         settings:controller="com.android.settings.deviceinfo.imei.ImeiInfoPreferenceController"/>
 
     <!-- Android version -->
diff --git a/res/xml/wifi_network_details_fragment.xml b/res/xml/wifi_network_details_fragment.xml
index 7c542d8..8979efc 100644
--- a/res/xml/wifi_network_details_fragment.xml
+++ b/res/xml/wifi_network_details_fragment.xml
@@ -26,6 +26,11 @@
         android:order="-10000"
         settings:allowDividerBelow="true"/>
 
+    <com.android.settings.datausage.DataUsageSummaryPreference
+        android:key="status_header"
+        android:selectable="false"
+        settings:isPreferenceVisible="false"/>
+
     <!-- Buttons -->
     <com.android.settingslib.widget.ActionButtonsPreference
         android:key="buttons"
diff --git a/src/com/android/settings/core/FeatureFlags.java b/src/com/android/settings/core/FeatureFlags.java
index 6c2da07..fbb2ae3 100644
--- a/src/com/android/settings/core/FeatureFlags.java
+++ b/src/com/android/settings/core/FeatureFlags.java
@@ -26,4 +26,7 @@
     public static final String NETWORK_INTERNET_V2 = "settings_network_and_internet_v2";
     public static final String SLICE_INJECTION = "settings_slice_injection";
     public static final String MAINLINE_MODULE = "settings_mainline_module";
+    public static final String WIFI_DETAILS_SAVED_SCREEN = "settings_wifi_details_saved_screen";
+    public static final String WIFI_DETAILS_DATAUSAGE_HEADER =
+            "settings_wifi_details_datausage_header";
 }
diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreference.java b/src/com/android/settings/datausage/DataUsageSummaryPreference.java
index 481538d..93df2f1 100644
--- a/src/com/android/settings/datausage/DataUsageSummaryPreference.java
+++ b/src/com/android/settings/datausage/DataUsageSummaryPreference.java
@@ -69,6 +69,8 @@
     private boolean mDefaultTextColorSet;
     private int mDefaultTextColor;
     private int mNumPlans;
+    /** The specified un-initialized value for cycle time */
+    private final long CYCLE_TIME_UNINITIAL_VALUE = 0;
     /** The ending time of the billing cycle in milliseconds since epoch. */
     private long mCycleEndTimeMs;
     /** The time of the last update in standard milliseconds since the epoch */
@@ -94,6 +96,7 @@
     /** WiFi only mode */
     private boolean mWifiMode;
     private String mUsagePeriod;
+    private boolean mSingleWifi;    // Shows only one specified WiFi network usage
 
     public DataUsageSummaryPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -142,9 +145,10 @@
         notifyChanged();
     }
 
-    void setWifiMode(boolean isWifiMode, String usagePeriod) {
+    void setWifiMode(boolean isWifiMode, String usagePeriod, boolean isSingleWifi) {
         mWifiMode = isWifiMode;
         mUsagePeriod = usagePeriod;
+        mSingleWifi = isSingleWifi;
         notifyChanged();
     }
 
@@ -171,7 +175,16 @@
         Button launchButton = (Button) holder.findViewById(R.id.launch_mdp_app_button);
         TextView limitInfo = (TextView) holder.findViewById(R.id.data_limits);
 
-        if (mWifiMode) {
+        if (mWifiMode && mSingleWifi) {
+            updateCycleTimeText(holder);
+
+            usageTitle.setVisibility(View.GONE);
+            launchButton.setVisibility(View.GONE);
+            carrierInfo.setVisibility(View.GONE);
+
+            limitInfo.setVisibility(TextUtils.isEmpty(mLimitInfoText) ? View.GONE : View.VISIBLE);
+            limitInfo.setText(mLimitInfoText);
+        } else if (mWifiMode) {
             usageTitle.setText(R.string.data_usage_wifi_title);
             usageTitle.setVisibility(View.VISIBLE);
             TextView cycleTime = (TextView) holder.findViewById(R.id.cycle_left_time);
@@ -265,6 +278,13 @@
     private void updateCycleTimeText(PreferenceViewHolder holder) {
         TextView cycleTime = (TextView) holder.findViewById(R.id.cycle_left_time);
 
+        // Takes zero as a special case which value is never set.
+        if (mCycleEndTimeMs == CYCLE_TIME_UNINITIAL_VALUE) {
+            cycleTime.setVisibility(View.GONE);
+            return;
+        }
+
+        cycleTime.setVisibility(View.VISIBLE);
         long millisLeft = mCycleEndTimeMs - System.currentTimeMillis();
         if (millisLeft <= 0) {
             cycleTime.setText(getContext().getString(R.string.billing_cycle_none_left));
diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java
index 353c5ee..a06bb77 100644
--- a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java
+++ b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java
@@ -65,10 +65,10 @@
     private final EntityHeaderController mEntityHeaderController;
     private final Lifecycle mLifecycle;
     private final PreferenceFragmentCompat mFragment;
-    private final DataUsageController mDataUsageController;
-    private final DataUsageInfoController mDataInfoController;
+    protected final DataUsageController mDataUsageController;
+    protected final DataUsageInfoController mDataInfoController;
     private final NetworkTemplate mDefaultTemplate;
-    private final NetworkPolicyEditor mPolicyEditor;
+    protected final NetworkPolicyEditor mPolicyEditor;
     private final int mDataUsageTemplate;
     private final boolean mHasMobileData;
     private final SubscriptionManager mSubscriptionManager;
@@ -200,11 +200,13 @@
         if (DataUsageUtils.hasSim(mActivity)) {
             info = mDataUsageController.getDataUsageInfo(mDefaultTemplate);
             mDataInfoController.updateDataLimit(info, mPolicyEditor.getPolicy(mDefaultTemplate));
-            summaryPreference.setWifiMode(/* isWifiMode */ false, /* usagePeriod */ null);
+            summaryPreference.setWifiMode(/* isWifiMode */ false,
+                    /* usagePeriod */ null, /* isSingleWifi */ false);
         } else {
             info = mDataUsageController.getDataUsageInfo(
                     NetworkTemplate.buildTemplateWifiWildcard());
-            summaryPreference.setWifiMode(/* isWifiMode */ true, /* usagePeriod */ info.period);
+            summaryPreference.setWifiMode(/* isWifiMode */ true, /* usagePeriod */
+                    info.period, /* isSingleWifi */ false);
             summaryPreference.setLimitInfo(null);
             summaryPreference.setUsageNumbers(info.usageLevel,
                     /* dataPlanSize */ -1L,
diff --git a/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceController.java b/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceController.java
new file mode 100644
index 0000000..8b6d10a
--- /dev/null
+++ b/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceController.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.datausage;
+
+import android.app.Activity;
+import android.net.NetworkTemplate;
+import android.telephony.SubscriptionManager;
+import android.text.format.Formatter;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
+
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.net.DataUsageController;
+
+/**
+ *  The controller displays a data usage chart for the specified Wi-Fi network.
+ */
+public class WifiDataUsageSummaryPreferenceController extends DataUsageSummaryPreferenceController {
+    final String mNetworkId;
+
+    public WifiDataUsageSummaryPreferenceController(Activity activity,
+            Lifecycle lifecycle, PreferenceFragmentCompat fragment, CharSequence networkId) {
+        super(activity, lifecycle, fragment, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+
+        if (networkId == null) {
+            mNetworkId = null;
+        } else {
+            mNetworkId = String.valueOf(networkId);
+        }
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        if (preference == null) {
+            return;
+        }
+
+        final DataUsageSummaryPreference mPreference = (DataUsageSummaryPreference) preference;
+        // TODO(b/126299427): Currently gets data usage of whole Wi-Fi networks, but should get
+        //  specified one.
+        final NetworkTemplate template = NetworkTemplate.buildTemplateWifi(mNetworkId);
+        final DataUsageController.DataUsageInfo info = mDataUsageController.getDataUsageInfo(
+                template);
+        mDataInfoController.updateDataLimit(info, mPolicyEditor.getPolicy(template));
+
+        mPreference.setWifiMode(/* isWifiMode */ true, /* usagePeriod */
+                info.period, /* isSingleWifi */ true);
+        mPreference.setChartEnabled(true);
+        // Treats Wi-Fi network as unlimited network, which has same usage level and limited level.
+        mPreference.setUsageNumbers(info.usageLevel, info.usageLevel, /* hasMobileData */ false);
+
+        // TODO(b/126142293): Passpoint Wi-Fi should have limit of data usage and time remaining
+        mPreference.setProgress(100);
+        mPreference.setLabels(Formatter.formatFileSize(mContext, /* sizeBytes */ 0),
+                DataUsageUtils.formatDataUsage(mContext, info.usageLevel));
+    }
+}
diff --git a/src/com/android/settings/homepage/contextualcards/deviceinfo/BatteryInfoSlice.java b/src/com/android/settings/homepage/contextualcards/deviceinfo/BatteryInfoSlice.java
deleted file mode 100644
index 6c7f930..0000000
--- a/src/com/android/settings/homepage/contextualcards/deviceinfo/BatteryInfoSlice.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.homepage.contextualcards.deviceinfo;
-
-import android.app.PendingIntent;
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.Uri;
-import android.os.PowerManager;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.core.graphics.drawable.IconCompat;
-import androidx.slice.Slice;
-import androidx.slice.builders.ListBuilder;
-import androidx.slice.builders.SliceAction;
-
-import com.android.settings.R;
-import com.android.settings.SubSettings;
-import com.android.settings.Utils;
-import com.android.settings.fuelgauge.BatteryInfo;
-import com.android.settings.fuelgauge.PowerUsageSummary;
-import com.android.settings.slices.CustomSliceRegistry;
-import com.android.settings.slices.CustomSliceable;
-import com.android.settings.slices.SliceBuilderUtils;
-
-/**
- * Utility class to build a Battery Slice, and handle all associated actions.
- */
-public class BatteryInfoSlice implements CustomSliceable {
-    private static final String TAG = "BatteryInfoSlice";
-
-    private final Context mContext;
-
-    private BatteryInfo mBatteryInfo;
-    private boolean mIsBatteryInfoLoading;
-
-    public BatteryInfoSlice(Context context) {
-        mContext = context;
-    }
-
-    @Override
-    public Slice getSlice() {
-        if (mBatteryInfo == null) {
-            mIsBatteryInfoLoading = true;
-            loadBatteryInfo();
-        }
-        final IconCompat icon = IconCompat.createWithResource(mContext,
-                R.drawable.ic_settings_battery);
-        final CharSequence title = mContext.getText(R.string.power_usage_summary_title);
-        final SliceAction primarySliceAction = SliceAction.createDeeplink(getPrimaryAction(), icon,
-                ListBuilder.ICON_IMAGE, title);
-        final Slice slice = new ListBuilder(mContext, CustomSliceRegistry.BATTERY_INFO_SLICE_URI,
-                ListBuilder.INFINITY)
-                .setAccentColor(Utils.getColorAccentDefaultColor(mContext))
-                .setHeader(new ListBuilder.HeaderBuilder().setTitle(title))
-                .addRow(new ListBuilder.RowBuilder()
-                        .setTitle(getBatteryPercentString(), mIsBatteryInfoLoading)
-                        .setSubtitle(getSummary(), mIsBatteryInfoLoading)
-                        .setPrimaryAction(primarySliceAction))
-                .build();
-        mBatteryInfo = null;
-        mIsBatteryInfoLoading = false;
-        return slice;
-    }
-
-    @Override
-    public Uri getUri() {
-        return CustomSliceRegistry.BATTERY_INFO_SLICE_URI;
-    }
-
-    @Override
-    public void onNotifyChange(Intent intent) {
-
-    }
-
-    @Override
-    public Intent getIntent() {
-        final String screenTitle = mContext.getText(R.string.power_usage_summary_title).toString();
-        return SliceBuilderUtils.buildSearchResultPageIntent(mContext,
-                PowerUsageSummary.class.getName(), "" /* key */, screenTitle,
-                SettingsEnums.SLICE)
-                .setClassName(mContext.getPackageName(), SubSettings.class.getName())
-                .setData(CustomSliceRegistry.BATTERY_INFO_SLICE_URI);
-    }
-
-    @Override
-    public IntentFilter getIntentFilter() {
-        final IntentFilter intentFilter = new IntentFilter();
-        intentFilter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
-        intentFilter.addAction(Intent.ACTION_POWER_CONNECTED);
-        intentFilter.addAction(Intent.ACTION_POWER_DISCONNECTED);
-        intentFilter.addAction(Intent.ACTION_BATTERY_LEVEL_CHANGED);
-        return intentFilter;
-    }
-
-    @VisibleForTesting
-    void loadBatteryInfo() {
-        BatteryInfo.getBatteryInfo(mContext, info -> {
-            mBatteryInfo = info;
-            mContext.getContentResolver().notifyChange(getUri(), null);
-        }, true);
-    }
-
-    @VisibleForTesting
-    CharSequence getBatteryPercentString() {
-        return mBatteryInfo == null ? null : mBatteryInfo.batteryPercentString;
-    }
-
-    @VisibleForTesting
-    CharSequence getSummary() {
-        if (mBatteryInfo == null) {
-            return null;
-        }
-        return mBatteryInfo.remainingLabel == null ? mBatteryInfo.statusLabel
-                : mBatteryInfo.remainingLabel;
-    }
-
-    private PendingIntent getPrimaryAction() {
-        final Intent intent = getIntent();
-        return PendingIntent.getActivity(mContext, 0 /* requestCode */,
-                intent, 0 /* flags */);
-    }
-}
\ No newline at end of file
diff --git a/src/com/android/settings/slices/CustomSliceManager.java b/src/com/android/settings/slices/CustomSliceManager.java
index c9e473a..91f55ae 100644
--- a/src/com/android/settings/slices/CustomSliceManager.java
+++ b/src/com/android/settings/slices/CustomSliceManager.java
@@ -18,25 +18,6 @@
 
 import android.content.Context;
 import android.net.Uri;
-import android.util.ArrayMap;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.settings.flashlight.FlashlightSlice;
-import com.android.settings.homepage.contextualcards.deviceinfo.BatteryInfoSlice;
-import com.android.settings.homepage.contextualcards.deviceinfo.DataUsageSlice;
-import com.android.settings.homepage.contextualcards.deviceinfo.DeviceInfoSlice;
-import com.android.settings.homepage.contextualcards.deviceinfo.EmergencyInfoSlice;
-import com.android.settings.homepage.contextualcards.deviceinfo.StorageSlice;
-import com.android.settings.homepage.contextualcards.slices.BatteryFixSlice;
-import com.android.settings.homepage.contextualcards.slices.BluetoothDevicesSlice;
-import com.android.settings.homepage.contextualcards.slices.LowStorageSlice;
-import com.android.settings.homepage.contextualcards.slices.NotificationChannelSlice;
-import com.android.settings.location.LocationSlice;
-import com.android.settings.media.MediaOutputSlice;
-import com.android.settings.network.telephony.MobileDataSlice;
-import com.android.settings.wifi.slice.ContextualWifiSlice;
-import com.android.settings.wifi.slice.WifiSlice;
 
 import java.util.Map;
 import java.util.WeakHashMap;
@@ -47,17 +28,12 @@
  */
 public class CustomSliceManager {
 
-    @VisibleForTesting
-    final Map<Uri, Class<? extends CustomSliceable>> mUriMap;
-
     private final Context mContext;
     private final Map<Uri, CustomSliceable> mSliceableCache;
 
     public CustomSliceManager(Context context) {
         mContext = context.getApplicationContext();
-        mUriMap = new ArrayMap<>();
         mSliceableCache = new WeakHashMap<>();
-        addSlices();
     }
 
     /**
@@ -67,12 +43,12 @@
      * the only thing that should be needed to create the object.
      */
     public CustomSliceable getSliceableFromUri(Uri uri) {
-        final Uri newUri = removeParameterFromUri(uri);
+        final Uri newUri = CustomSliceRegistry.removeParameterFromUri(uri);
         if (mSliceableCache.containsKey(newUri)) {
             return mSliceableCache.get(newUri);
         }
 
-        final Class clazz = mUriMap.get(newUri);
+        final Class clazz = CustomSliceRegistry.getSliceClassByUri(newUri);
         if (clazz == null) {
             throw new IllegalArgumentException("No Slice found for uri: " + uri);
         }
@@ -82,9 +58,6 @@
         return sliceable;
     }
 
-    private Uri removeParameterFromUri(Uri uri) {
-        return uri != null ? uri.buildUpon().clearQuery().build() : null;
-    }
 
     /**
      * Return a {@link CustomSliceable} associated to the Action.
@@ -95,39 +68,4 @@
     public CustomSliceable getSliceableFromIntentAction(String action) {
         return getSliceableFromUri(Uri.parse(action));
     }
-
-    /**
-     * Returns {@code true} if {@param uri} is a valid Slice Uri handled by
-     * {@link CustomSliceManager}.
-     */
-    public boolean isValidUri(Uri uri) {
-        return mUriMap.containsKey(removeParameterFromUri(uri));
-    }
-
-    /**
-     * Returns {@code true} if {@param action} is a valid intent action handled by
-     * {@link CustomSliceManager}.
-     */
-    public boolean isValidAction(String action) {
-        return isValidUri(Uri.parse(action));
-    }
-
-    private void addSlices() {
-        mUriMap.put(CustomSliceRegistry.BATTERY_FIX_SLICE_URI, BatteryFixSlice.class);
-        mUriMap.put(CustomSliceRegistry.BATTERY_INFO_SLICE_URI, BatteryInfoSlice.class);
-        mUriMap.put(CustomSliceRegistry.BLUETOOTH_DEVICES_SLICE_URI, BluetoothDevicesSlice.class);
-        mUriMap.put(CustomSliceRegistry.CONTEXTUAL_WIFI_SLICE_URI, ContextualWifiSlice.class);
-        mUriMap.put(CustomSliceRegistry.DATA_USAGE_SLICE_URI, DataUsageSlice.class);
-        mUriMap.put(CustomSliceRegistry.DEVICE_INFO_SLICE_URI, DeviceInfoSlice.class);
-        mUriMap.put(CustomSliceRegistry.EMERGENCY_INFO_SLICE_URI, EmergencyInfoSlice.class);
-        mUriMap.put(CustomSliceRegistry.FLASHLIGHT_SLICE_URI, FlashlightSlice.class);
-        mUriMap.put(CustomSliceRegistry.LOCATION_SLICE_URI, LocationSlice.class);
-        mUriMap.put(CustomSliceRegistry.LOW_STORAGE_SLICE_URI, LowStorageSlice.class);
-        mUriMap.put(CustomSliceRegistry.MOBILE_DATA_SLICE_URI, MobileDataSlice.class);
-        mUriMap.put(CustomSliceRegistry.NOTIFICATION_CHANNEL_SLICE_URI,
-                NotificationChannelSlice.class);
-        mUriMap.put(CustomSliceRegistry.STORAGE_SLICE_URI, StorageSlice.class);
-        mUriMap.put(CustomSliceRegistry.WIFI_SLICE_URI, WifiSlice.class);
-        mUriMap.put(CustomSliceRegistry.MEDIA_OUTPUT_SLICE_URI, MediaOutputSlice.class);
-    }
 }
diff --git a/src/com/android/settings/slices/CustomSliceRegistry.java b/src/com/android/settings/slices/CustomSliceRegistry.java
index 3a1db69..12e7b48 100644
--- a/src/com/android/settings/slices/CustomSliceRegistry.java
+++ b/src/com/android/settings/slices/CustomSliceRegistry.java
@@ -24,11 +24,30 @@
 import android.content.ContentResolver;
 import android.net.Uri;
 import android.provider.SettingsSlicesContract;
+import android.util.ArrayMap;
 
+import androidx.annotation.VisibleForTesting;
+
+import com.android.settings.flashlight.FlashlightSlice;
 import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController;
+import com.android.settings.homepage.contextualcards.deviceinfo.DataUsageSlice;
+import com.android.settings.homepage.contextualcards.deviceinfo.DeviceInfoSlice;
+import com.android.settings.homepage.contextualcards.deviceinfo.EmergencyInfoSlice;
+import com.android.settings.homepage.contextualcards.deviceinfo.StorageSlice;
+import com.android.settings.homepage.contextualcards.slices.BatteryFixSlice;
+import com.android.settings.homepage.contextualcards.slices.BluetoothDevicesSlice;
+import com.android.settings.homepage.contextualcards.slices.LowStorageSlice;
+import com.android.settings.homepage.contextualcards.slices.NotificationChannelSlice;
+import com.android.settings.location.LocationSlice;
+import com.android.settings.media.MediaOutputSlice;
+import com.android.settings.network.telephony.MobileDataSlice;
 import com.android.settings.wifi.calling.WifiCallingSliceHelper;
+import com.android.settings.wifi.slice.ContextualWifiSlice;
+import com.android.settings.wifi.slice.WifiSlice;
 import com.android.settingslib.media.MediaOutputSliceConstants;
 
+import java.util.Map;
+
 /**
  * A registry of custom slice Uris.
  */
@@ -53,15 +72,7 @@
             .appendEncodedPath(SettingsSlicesContract.PATH_SETTING_INTENT)
             .appendPath(BatteryTipPreferenceController.PREF_NAME)
             .build();
-    /**
-     * Backing Uri for the Battery info Slice.
-     */
-    public static final Uri BATTERY_INFO_SLICE_URI = new Uri.Builder()
-            .scheme(ContentResolver.SCHEME_CONTENT)
-            .authority(SettingsSliceProvider.SLICE_AUTHORITY)
-            .appendEncodedPath(SettingsSlicesContract.PATH_SETTING_INTENT)
-            .appendPath("battery_card")
-            .build();
+
     /**
      * Backing Uri for the Bluetooth Slice.
      */
@@ -287,4 +298,51 @@
             .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
             .appendPath(MediaOutputSliceConstants.KEY_MEDIA_OUTPUT)
             .build();
+
+    @VisibleForTesting
+    static final Map<Uri, Class<? extends CustomSliceable>> sUriToSlice;
+
+    static {
+        sUriToSlice = new ArrayMap<>();
+
+        sUriToSlice.put(BATTERY_FIX_SLICE_URI, BatteryFixSlice.class);
+        sUriToSlice.put(BLUETOOTH_DEVICES_SLICE_URI, BluetoothDevicesSlice.class);
+        sUriToSlice.put(CONTEXTUAL_WIFI_SLICE_URI, ContextualWifiSlice.class);
+        sUriToSlice.put(DATA_USAGE_SLICE_URI, DataUsageSlice.class);
+        sUriToSlice.put(DEVICE_INFO_SLICE_URI, DeviceInfoSlice.class);
+        sUriToSlice.put(EMERGENCY_INFO_SLICE_URI, EmergencyInfoSlice.class);
+        sUriToSlice.put(FLASHLIGHT_SLICE_URI, FlashlightSlice.class);
+        sUriToSlice.put(LOCATION_SLICE_URI, LocationSlice.class);
+        sUriToSlice.put(LOW_STORAGE_SLICE_URI, LowStorageSlice.class);
+        sUriToSlice.put(MOBILE_DATA_SLICE_URI, MobileDataSlice.class);
+        sUriToSlice.put(NOTIFICATION_CHANNEL_SLICE_URI, NotificationChannelSlice.class);
+        sUriToSlice.put(STORAGE_SLICE_URI, StorageSlice.class);
+        sUriToSlice.put(WIFI_SLICE_URI, WifiSlice.class);
+        sUriToSlice.put(MEDIA_OUTPUT_SLICE_URI, MediaOutputSlice.class);
+    }
+
+    public static Class<? extends CustomSliceable> getSliceClassByUri(Uri uri) {
+        return sUriToSlice.get(uri);
+    }
+
+    public static Uri removeParameterFromUri(Uri uri) {
+        return uri != null ? uri.buildUpon().clearQuery().build() : null;
+    }
+
+    /**
+     * Returns {@code true} if {@param uri} is a valid Slice Uri handled by
+     * {@link CustomSliceManager}.
+     */
+    public static boolean isValidUri(Uri uri) {
+        return sUriToSlice.containsKey(removeParameterFromUri(uri));
+    }
+
+    /**
+     * Returns {@code true} if {@param action} is a valid intent action handled by
+     * {@link CustomSliceManager}.
+     */
+    public static boolean isValidAction(String action) {
+        return isValidUri(Uri.parse(action));
+    }
+
 }
diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java
index 397b2fc..d019368 100644
--- a/src/com/android/settings/slices/SettingsSliceProvider.java
+++ b/src/com/android/settings/slices/SettingsSliceProvider.java
@@ -147,7 +147,7 @@
 
     @Override
     public void onSlicePinned(Uri sliceUri) {
-        if (mCustomSliceManager.isValidUri(sliceUri)) {
+        if (CustomSliceRegistry.isValidUri(sliceUri)) {
             final CustomSliceable sliceable = mCustomSliceManager.getSliceableFromUri(sliceUri);
             final IntentFilter filter = sliceable.getIntentFilter();
             if (filter != null) {
@@ -194,7 +194,7 @@
 
             // Before adding a slice to {@link CustomSliceManager}, please get approval
             // from the Settings team.
-            if (mCustomSliceManager.isValidUri(sliceUri)) {
+            if (CustomSliceRegistry.isValidUri(sliceUri)) {
                 final CustomSliceable sliceable = mCustomSliceManager.getSliceableFromUri(
                         sliceUri);
                 return sliceable.getSlice();
diff --git a/src/com/android/settings/slices/SliceBroadcastReceiver.java b/src/com/android/settings/slices/SliceBroadcastReceiver.java
index b2ea583..8b6fc98 100644
--- a/src/com/android/settings/slices/SliceBroadcastReceiver.java
+++ b/src/com/android/settings/slices/SliceBroadcastReceiver.java
@@ -63,7 +63,7 @@
 
         final CustomSliceManager mCustomSliceManager = FeatureFactory.getFactory(
                 context).getSlicesFeatureProvider().getCustomSliceManager(context);
-        if (mCustomSliceManager.isValidAction(action)) {
+        if (CustomSliceRegistry.isValidAction(action)) {
             final CustomSliceable sliceable =
                     mCustomSliceManager.getSliceableFromIntentAction(action);
             sliceable.onNotifyChange(intent);
diff --git a/src/com/android/settings/slices/SliceDeepLinkSpringBoard.java b/src/com/android/settings/slices/SliceDeepLinkSpringBoard.java
index f4afa16..d2179d2 100644
--- a/src/com/android/settings/slices/SliceDeepLinkSpringBoard.java
+++ b/src/com/android/settings/slices/SliceDeepLinkSpringBoard.java
@@ -47,7 +47,7 @@
             // TODO (b/80263568) Avoid duplicating this list of Slice Uris.
             final CustomSliceManager customSliceManager = FeatureFactory.getFactory(this)
                     .getSlicesFeatureProvider().getCustomSliceManager(this);
-            if (customSliceManager.isValidUri(sliceUri)) {
+            if (CustomSliceRegistry.isValidUri(sliceUri)) {
                 final CustomSliceable sliceable =
                         customSliceManager.getSliceableFromUri(sliceUri);
                 launchIntent = sliceable.getIntent();
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 9e5bfc8..a8fc34d 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -67,6 +67,7 @@
 import com.android.settings.widget.SwitchBarController;
 import com.android.settings.wifi.details.WifiNetworkDetailsFragment;
 import com.android.settings.wifi.dpp.WifiDppUtils;
+import com.android.settings.wifi.savedaccesspoints.SavedAccessPointsWifiSettings;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedLockUtilsInternal;
 import com.android.settingslib.search.SearchIndexable;
@@ -968,8 +969,13 @@
     }
 
     private void launchNetworkDetailsFragment(ConnectedAccessPointPreference pref) {
+        final AccessPoint accessPoint = pref.getAccessPoint();
+        final Context context = getContext();
+        final CharSequence title = SavedAccessPointsWifiSettings.usingDetailsFragment(context) ?
+                accessPoint.getTitle() : context.getText(R.string.pref_title_network_details);
+
         new SubSettingLauncher(getContext())
-                .setTitleRes(R.string.pref_title_network_details)
+                .setTitleText(title)
                 .setDestination(WifiNetworkDetailsFragment.class.getName())
                 .setArguments(pref.getExtras())
                 .setSourceMetricsCategory(getMetricsCategory())
diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
index 4255f3c..625de38 100644
--- a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
+++ b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
@@ -40,7 +40,6 @@
 import android.widget.TextView;
 
 import androidx.appcompat.app.AlertDialog;
-import androidx.preference.ListPreference;
 import androidx.preference.Preference;
 import androidx.preference.Preference.OnPreferenceClickListener;
 import androidx.preference.PreferenceScreen;
@@ -141,20 +140,17 @@
         }
     };
 
+    /*
+     * Launch carrier emergency address managemnent activity
+     */
     private final OnPreferenceClickListener mUpdateAddressListener =
-            new OnPreferenceClickListener() {
-                /*
-                 * Launch carrier emergency address managemnent activity
-                 */
-                @Override
-                public boolean onPreferenceClick(Preference preference) {
-                    Intent carrierAppIntent = getCarrierActivityIntent();
-                    if (carrierAppIntent != null) {
-                        carrierAppIntent.putExtra(EXTRA_LAUNCH_CARRIER_APP, LAUCH_APP_UPDATE);
-                        startActivity(carrierAppIntent);
-                    }
-                    return true;
+            preference -> {
+                Intent carrierAppIntent = getCarrierActivityIntent();
+                if (carrierAppIntent != null) {
+                    carrierAppIntent.putExtra(EXTRA_LAUNCH_CARRIER_APP, LAUCH_APP_UPDATE);
+                    startActivity(carrierAppIntent);
                 }
+                return true;
             };
 
     private final ProvisioningManager.Callback mProvisioningCallback =
@@ -174,8 +170,6 @@
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
 
-        final SettingsActivity activity = (SettingsActivity) getActivity();
-
         mEmptyView = getView().findViewById(android.R.id.empty);
         setEmptyView(mEmptyView);
         final Resources res = SubscriptionManager.getResourcesForSubId(getContext(), mSubId);
@@ -265,14 +259,13 @@
         mTelephonyManager = ((TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE))
                 .createForSubscriptionId(mSubId);
 
-        mButtonWfcMode = (ListWithEntrySummaryPreference) findPreference(BUTTON_WFC_MODE);
+        mButtonWfcMode = findPreference(BUTTON_WFC_MODE);
         mButtonWfcMode.setOnPreferenceChangeListener(this);
 
-        mButtonWfcRoamingMode = (ListWithEntrySummaryPreference) findPreference(
-                BUTTON_WFC_ROAMING_MODE);
+        mButtonWfcRoamingMode =  findPreference(BUTTON_WFC_ROAMING_MODE);
         mButtonWfcRoamingMode.setOnPreferenceChangeListener(this);
 
-        mUpdateAddress = (Preference) findPreference(PREFERENCE_EMERGENCY_ADDRESS);
+        mUpdateAddress = findPreference(PREFERENCE_EMERGENCY_ADDRESS);
         mUpdateAddress.setOnPreferenceClickListener(mUpdateAddressListener);
 
         mIntentFilter = new IntentFilter();
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index c2daa94..89565df 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -42,6 +42,7 @@
 import android.net.wifi.WifiManager;
 import android.os.Handler;
 import android.text.TextUtils;
+import android.util.FeatureFlagUtils;
 import android.util.Log;
 import android.widget.ImageView;
 import android.widget.Toast;
@@ -51,12 +52,14 @@
 import androidx.fragment.app.Fragment;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceFragmentCompat;
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settings.core.FeatureFlags;
 import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.datausage.WifiDataUsageSummaryPreferenceController;
 import com.android.settings.development.featureflags.FeatureFlagPersistent;
 import com.android.settings.widget.EntityHeaderController;
 import com.android.settings.wifi.WifiDialog;
@@ -150,6 +153,9 @@
     private Preference mDnsPref;
     private PreferenceCategory mIpv6Category;
     private Preference mIpv6AddressPref;
+    private Lifecycle mLifecycle;
+    Preference mDataUsageSummaryPref;
+    WifiDataUsageSummaryPreferenceController mSummaryHeaderController;
 
     private final IconInjector mIconInjector;
     private final IntentFilter mFilter;
@@ -262,6 +268,7 @@
         mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
         mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
 
+        mLifecycle = lifecycle;
         lifecycle.addObserver(this);
     }
 
@@ -313,6 +320,17 @@
 
     private void setupEntityHeader(PreferenceScreen screen) {
         LayoutPreference headerPref = screen.findPreference(KEY_HEADER);
+
+        if (usingDataUsageHeader(mContext)) {
+            headerPref.setVisible(false);
+            mDataUsageSummaryPref = screen.findPreference("status_header");
+            mDataUsageSummaryPref.setVisible(true);
+            mSummaryHeaderController =
+                new WifiDataUsageSummaryPreferenceController(mFragment.getActivity(),
+                        mLifecycle, (PreferenceFragmentCompat) mFragment, mAccessPoint.getSsid());
+            return;
+        }
+
         mEntityHeaderController =
                 EntityHeaderController.newInstance(
                         mFragment.getActivity(), mFragment,
@@ -326,6 +344,15 @@
         mEntityHeaderController.setLabel(mAccessPoint.getTitle());
     }
 
+    private void refreshEntityHeader() {
+        if (usingDataUsageHeader(mContext)) {
+            mSummaryHeaderController.updateState(mDataUsageSummaryPref);
+        } else {
+            mEntityHeaderController.setSummary(mAccessPoint.getSettingsSummary())
+                    .done(mFragment.getActivity(), true /* rebind */);
+        }
+    }
+
     @Override
     public void onResume() {
         // Ensure mNetwork is set before any callbacks above are delivered, since our
@@ -360,9 +387,7 @@
         // MAC Address Pref
         mMacAddressPref.setSummary(mWifiConfig.getRandomizedMacAddress().toString());
 
-        // TODO(b/124700353): Change header to data usage chart
-        mEntityHeaderController.setSummary(mAccessPoint.getSettingsSummary())
-                .done(mFragment.getActivity(), true /* rebind */);
+        refreshEntityHeader();
 
         updateIpLayerInfo();
 
@@ -429,8 +454,7 @@
 
     private void refreshNetworkState() {
         mAccessPoint.update(mWifiConfig, mWifiInfo, mNetworkInfo);
-        mEntityHeaderController.setSummary(mAccessPoint.getSettingsSummary())
-                .done(mFragment.getActivity(), true /* rebind */);
+        refreshEntityHeader();
     }
 
     private void refreshRssiViews() {
@@ -443,7 +467,10 @@
         Drawable wifiIcon = mIconInjector.getIcon(mRssiSignalLevel);
 
         wifiIcon.setTintList(Utils.getColorAccent(mContext));
-        mEntityHeaderController.setIcon(wifiIcon).done(mFragment.getActivity(), true /* rebind */);
+        if (mEntityHeaderController != null) {
+            mEntityHeaderController.setIcon(wifiIcon).done(mFragment.getActivity(),
+                    true /* rebind */);
+        }
 
         Drawable wifiIconDark = wifiIcon.getConstantState().newDrawable().mutate();
         wifiIconDark.setTintList(Utils.getColorAttr(mContext, android.R.attr.colorControlNormal));
@@ -670,4 +697,8 @@
             return mContext.getDrawable(Utils.getWifiIconResource(level)).mutate();
         }
     }
+
+    private boolean usingDataUsageHeader(Context context) {
+        return FeatureFlagUtils.isEnabled(context, FeatureFlags.WIFI_DETAILS_DATAUSAGE_HEADER);
+    }
 }
diff --git a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
index fd2e14a..7edd227 100644
--- a/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
+++ b/src/com/android/settings/wifi/details/WifiNetworkDetailsFragment.java
@@ -153,11 +153,11 @@
 
         controllers.add(mWifiDetailPreferenceController);
         controllers.add(new WifiMeteredPreferenceController(context, mAccessPoint.getConfig()));
-        WifiPrivacyPreferenceController preferenceController = new WifiPrivacyPreferenceController(
+        WifiPrivacyPreferenceController privacyController = new WifiPrivacyPreferenceController(
                 context);
-        preferenceController.setWifiConfiguration(mAccessPoint.getConfig());
-        preferenceController.setIsEphemeral(mAccessPoint.isEphemeral());
-        controllers.add(preferenceController);
+        privacyController.setWifiConfiguration(mAccessPoint.getConfig());
+        privacyController.setIsEphemeral(mAccessPoint.isEphemeral());
+        controllers.add(privacyController);
 
         return controllers;
     }
diff --git a/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettings.java b/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettings.java
index 867c2f8..ea858f3 100644
--- a/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettings.java
+++ b/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsWifiSettings.java
@@ -199,11 +199,7 @@
      * Checks if showing WifiNetworkDetailsFragment when clicking saved network item.
      */
     public static boolean usingDetailsFragment(Context context) {
-        if (FeatureFlagUtils.isEnabled(context, FeatureFlags.MOBILE_NETWORK_V2)
-                && FeatureFlagPersistent.isEnabled(context, FeatureFlags.NETWORK_INTERNET_V2)) {
-            return false;    // TODO(b/124695272): mark true when UI is ready.
-        }
-        return false;
+        return FeatureFlagUtils.isEnabled(context, FeatureFlags.WIFI_DETAILS_SAVED_SCREEN);
     }
 
     boolean isSubscriptionsFeatureEnabled() {
diff --git a/tests/robotests/assets/grandfather_invalid_base_preference_controller_constructor b/tests/robotests/assets/grandfather_invalid_base_preference_controller_constructor
index ce03d95..675108d 100644
--- a/tests/robotests/assets/grandfather_invalid_base_preference_controller_constructor
+++ b/tests/robotests/assets/grandfather_invalid_base_preference_controller_constructor
@@ -6,6 +6,7 @@
 com.android.settings.bluetooth.BluetoothDeviceNamePreferenceController
 com.android.settings.bluetooth.BluetoothDeviceRenamePreferenceController
 com.android.settings.datausage.DataUsageSummaryPreferenceController
+com.android.settings.datausage.WifiDataUsageSummaryPreferenceController
 com.android.settings.fuelgauge.RestrictAppPreferenceController
 com.android.settings.fuelgauge.batterysaver.BatterySaverButtonPreferenceController
 com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceControllerTest.java
index 4347637..eab3dde 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceControllerTest.java
@@ -164,7 +164,8 @@
         verify(mSummaryPreference).setUsageInfo(info.cycleEnd, now - UPDATE_BACKOFF_MS,
                 CARRIER_NAME, 1 /* numPlans */, intent);
         verify(mSummaryPreference).setChartEnabled(true);
-        verify(mSummaryPreference).setWifiMode(false, null);
+        verify(mSummaryPreference).setWifiMode(false /* isWifiMode */, null /* usagePeriod */,
+                false /* isSingleWifi */);
     }
 
     @Test
@@ -188,7 +189,8 @@
         verify(mSummaryPreference).setUsageInfo(info.cycleEnd, now - UPDATE_BACKOFF_MS,
                 CARRIER_NAME, 0 /* numPlans */, intent);
         verify(mSummaryPreference).setChartEnabled(true);
-        verify(mSummaryPreference).setWifiMode(false, null);
+        verify(mSummaryPreference).setWifiMode(false /* isWifiMode */, null /* usagePeriod */,
+                false /* isSingleWifi */);
     }
 
     @Test
@@ -214,7 +216,8 @@
                 0 /* numPlans */,
                 null /* launchIntent */);
         verify(mSummaryPreference).setChartEnabled(true);
-        verify(mSummaryPreference).setWifiMode(false, null);
+        verify(mSummaryPreference).setWifiMode(false /* isWifiMode */, null /* usagePeriod */,
+                false /* isSingleWifi */);
     }
 
     @Test
@@ -240,7 +243,8 @@
                 0 /* numPlans */,
                 null /* launchIntent */);
         verify(mSummaryPreference).setChartEnabled(false);
-        verify(mSummaryPreference).setWifiMode(false, null);
+        verify(mSummaryPreference).setWifiMode(false /* isWifiMode */, null /* usagePeriod */,
+                false /* isSingleWifi */);
     }
 
     @Test
@@ -321,7 +325,8 @@
         verify(mSummaryPreference).setLimitInfo(captor.capture());
         CharSequence value = captor.getValue();
         assertThat(value.toString()).isEqualTo("1.00 MB data warning / 1.00 MB data limit");
-        verify(mSummaryPreference).setWifiMode(false, null);
+        verify(mSummaryPreference).setWifiMode(false /* isWifiMode */, null /* usagePeriod */,
+                false /* isSingleWifi */);
     }
 
     @Test
@@ -340,7 +345,8 @@
         when(mTelephonyManager.getSimState()).thenReturn(TelephonyManager.SIM_STATE_ABSENT);
         mController.updateState(mSummaryPreference);
 
-        verify(mSummaryPreference).setWifiMode(true, info.period);
+        verify(mSummaryPreference).setWifiMode(true /* isWifiMode */, info.period /* usagePeriod */,
+                false /* isSingleWifi */);
         verify(mSummaryPreference).setLimitInfo(null);
         verify(mSummaryPreference).setUsageNumbers(info.usageLevel, -1L, true);
         verify(mSummaryPreference).setChartEnabled(false);
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
index 525b82e..35e6b1d 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryPreferenceTest.java
@@ -488,7 +488,7 @@
                 new Intent());
         mSummaryPreference.setUsageNumbers(1000000L, -1L, true);
         final String cycleText = "The quick fox";
-        mSummaryPreference.setWifiMode(true, cycleText);
+        mSummaryPreference.setWifiMode(true /* isWifiMode */, cycleText, false /* isSingleWifi */);
         doReturn(200L).when(mSummaryPreference).getHistoricalUsageLevel();
 
         bindViewHolder();
@@ -524,7 +524,8 @@
     @Test
     public void testSetWifiMode_noUsageInfo_shouldDisableLaunchButton() {
         mSummaryPreference = spy(mSummaryPreference);
-        mSummaryPreference.setWifiMode(true, "Test cycle text");
+        mSummaryPreference.setWifiMode(true /* isWifiMode */, "Test cycle text",
+                false /* isSingleWifi */);
         doReturn(0L).when(mSummaryPreference).getHistoricalUsageLevel();
 
         bindViewHolder();
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
index e66774e..40e6939 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
@@ -229,11 +229,6 @@
                 .setSliceUri(Uri.parse(
                         "content://com.android.settings.test.slices/action/gesture_pick_up"))
                 .build());
-        cards.add(new ContextualCard.Builder()
-                .setName("test_battery")
-                .setCardType(ContextualCard.CardType.SLICE)
-                .setSliceUri(CustomSliceRegistry.BATTERY_INFO_SLICE_URI)
-                .build());
         return cards;
     }
 
@@ -262,11 +257,6 @@
                 .setSliceUri(Uri.parse(
                         "content://com.android.settings.test.slices/action/gesture_pick_up"))
                 .build());
-        cards.add(new ContextualCard.Builder()
-                .setName("test_battery")
-                .setCardType(ContextualCard.CardType.SLICE)
-                .setSliceUri(CustomSliceRegistry.BATTERY_INFO_SLICE_URI)
-                .build());
         return cards;
     }
 }
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java
index eb9a461..8087716 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java
@@ -460,7 +460,7 @@
         cards.add(new ContextualCard.Builder()
                 .setName("test_battery")
                 .setCardType(ContextualCard.CardType.SLICE)
-                .setSliceUri(CustomSliceRegistry.BATTERY_INFO_SLICE_URI)
+                .setSliceUri(CustomSliceRegistry.BATTERY_FIX_SLICE_URI)
                 .setViewType(VIEW_TYPE_FULL_WIDTH)
                 .build());
         return cards;
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/deviceinfo/BatteryInfoSliceTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/deviceinfo/BatteryInfoSliceTest.java
deleted file mode 100644
index ff276d6..0000000
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/deviceinfo/BatteryInfoSliceTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.homepage.contextualcards.deviceinfo;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-
-import android.content.Context;
-
-import androidx.core.graphics.drawable.IconCompat;
-import androidx.slice.Slice;
-import androidx.slice.SliceMetadata;
-import androidx.slice.SliceProvider;
-import androidx.slice.core.SliceAction;
-import androidx.slice.widget.SliceLiveData;
-
-import com.android.settings.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class BatteryInfoSliceTest {
-
-    private Context mContext;
-    private BatteryInfoSlice mBatteryInfoSlice;
-
-    @Before
-    public void setUp() {
-        mContext = RuntimeEnvironment.application;
-
-        // Set-up specs for SliceMetadata.
-        SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
-
-        mBatteryInfoSlice = spy(new BatteryInfoSlice(mContext));
-    }
-
-    @Test
-    public void getSlice_shouldBeCorrectSliceContent() {
-        doNothing().when(mBatteryInfoSlice).loadBatteryInfo();
-        doReturn("10%").when(mBatteryInfoSlice).getBatteryPercentString();
-        doReturn("test").when(mBatteryInfoSlice).getSummary();
-
-        final Slice slice = mBatteryInfoSlice.getSlice();
-
-        final SliceMetadata metadata = SliceMetadata.from(mContext, slice);
-        assertThat(metadata.getTitle()).isEqualTo(
-                mContext.getString(R.string.power_usage_summary_title));
-
-        final SliceAction primaryAction = metadata.getPrimaryAction();
-        final IconCompat expectedIcon = IconCompat.createWithResource(mContext,
-                R.drawable.ic_settings_battery);
-        assertThat(primaryAction.getIcon().toString()).isEqualTo(expectedIcon.toString());
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java b/tests/robotests/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
index 82726df..5392284 100644
--- a/tests/robotests/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
@@ -47,8 +47,8 @@
     public void setUp() {
         mContext = RuntimeEnvironment.application;
         mCustomSliceManager = spy(new CustomSliceManager(mContext));
-        mCustomSliceManager.mUriMap.clear();
-        mCustomSliceManager.mUriMap.put(FakeSliceable.URI, FakeSliceable.class);
+        CustomSliceRegistry.sUriToSlice.clear();
+        CustomSliceRegistry.sUriToSlice.put(FakeSliceable.URI, FakeSliceable.class);
     }
 
     @Test
@@ -69,14 +69,14 @@
 
     @Test
     public void isValidUri_validUri_returnsTrue() {
-        final boolean isValidUri = mCustomSliceManager.isValidUri(FakeSliceable.URI);
+        final boolean isValidUri = CustomSliceRegistry.isValidUri(FakeSliceable.URI);
 
         assertThat(isValidUri).isTrue();
     }
 
     @Test
     public void isValidUri_invalidUri_returnsFalse() {
-        final boolean isValidUri = mCustomSliceManager.isValidUri(null);
+        final boolean isValidUri = CustomSliceRegistry.isValidUri(null);
 
         assertThat(isValidUri).isFalse();
     }
@@ -84,14 +84,14 @@
     @Test
     public void isValidAction_validActions_returnsTrue() {
         final boolean isValidAction =
-                mCustomSliceManager.isValidAction(FakeSliceable.URI.toString());
+                CustomSliceRegistry.isValidAction(FakeSliceable.URI.toString());
 
         assertThat(isValidAction).isTrue();
     }
 
     @Test
     public void isValidAction_invalidAction_returnsFalse() {
-        final boolean isValidAction = mCustomSliceManager.isValidAction("action");
+        final boolean isValidAction = CustomSliceRegistry.isValidAction("action");
 
         assertThat(isValidAction).isFalse();
     }
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreferenceTest.java b/tests/robotests/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreferenceTest.java
index cc2622f..307c0ac 100644
--- a/tests/robotests/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreferenceTest.java
@@ -33,8 +33,6 @@
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 
-import java.io.IOException;
-
 @RunWith(RobolectricTestRunner.class)
 public class ListWithEntrySummaryPreferenceTest {
 
@@ -54,6 +52,7 @@
     @Before
     public void setUp() {
         mContext = RuntimeEnvironment.application;
+        mContext.setTheme(R.style.Theme_Settings_Home);
         mPreference = new ListWithEntrySummaryPreference(mContext, null);
         mPreference.setEntries(mDefaultEntries);
         mPreference.setEntryValues(mDefaultEntryValues);
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java
index 39de254..70f1916 100644
--- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java
@@ -41,11 +41,9 @@
 import android.view.View;
 import android.widget.TextView;
 
-import androidx.preference.ListPreference;
 import androidx.preference.PreferenceScreen;
 
 import com.android.ims.ImsConfig;
-import com.android.ims.ImsException;
 import com.android.ims.ImsManager;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
@@ -80,11 +78,11 @@
     @Mock private ToggleSwitch mToggleSwitch;
     @Mock private View mView;
     @Mock private ImsConfig mImsConfig;
-    @Mock private ListPreference mButtonWfcMode;
-    @Mock private ListPreference mButtonWfcRoamingMode;
+    @Mock private ListWithEntrySummaryPreference mButtonWfcMode;
+    @Mock private ListWithEntrySummaryPreference mButtonWfcRoamingMode;
 
     @Before
-    public void setUp() throws NoSuchFieldException, ImsException {
+    public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
 
         mContext = RuntimeEnvironment.application;
@@ -100,7 +98,7 @@
         final Bundle bundle = new Bundle();
         when(mFragment.getArguments()).thenReturn(bundle);
         doNothing().when(mFragment).addPreferencesFromResource(anyInt());
-        doReturn(mock(ListPreference.class)).when(mFragment).findPreference(any());
+        doReturn(mock(ListWithEntrySummaryPreference.class)).when(mFragment).findPreference(any());
         doReturn(mButtonWfcMode).when(mFragment).findPreference(BUTTON_WFC_MODE);
         doReturn(mButtonWfcRoamingMode).when(mFragment).findPreference(BUTTON_WFC_ROAMING_MODE);
         doNothing().when(mFragment).finish();
@@ -141,7 +139,7 @@
     }
 
     @Test
-    public void onResume_provisioningAllowed_shouldNotFinish() throws ImsException {
+    public void onResume_provisioningAllowed_shouldNotFinish() {
         // Call onResume while provisioning is allowed.
         mFragment.onResume();
 
@@ -160,7 +158,7 @@
     }
 
     @Test
-    public void onResumeOnPause_provisioningCallbackRegistration() throws ImsException {
+    public void onResumeOnPause_provisioningCallbackRegistration() throws Exception {
         // Verify that provisioning callback is registered after call to onResume().
         mFragment.onResume();
         verify(mImsConfig).addConfigCallback(any(ProvisioningManager.Callback.class));
diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
index 204a0e2..db76722 100644
--- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
@@ -778,9 +778,9 @@
 
         mockWifiConfig.networkId = 5;
         when(mockWifiConfig.isPasspoint()).thenReturn(true);
+        spyController.displayPreference(mockScreen);
         FeatureFlagPersistent.setEnabled(mContext, FeatureFlags.NETWORK_INTERNET_V2, true);
 
-        spyController.displayPreference(mockScreen);
         mForgetClickListener.getValue().onClick(null);
 
         verify(mockWifiManager, times(0)).removePasspointConfiguration(mockWifiConfig.FQDN);