diff --git a/res/layout/preference_widget_gear_optional_background.xml b/res/layout/preference_widget_gear_optional_background.xml
new file mode 100644
index 0000000..d02f638
--- /dev/null
+++ b/res/layout/preference_widget_gear_optional_background.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+
+<!-- Settings button with optional ripple background through toggling visiblity. -->
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <ImageView
+        android:id="@+id/settings_button_no_background"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_gravity="center"
+        android:scaleType="center"
+        android:src="@drawable/ic_settings"
+        android:contentDescription="@string/settings_button" />
+    <!-- Additional overdraw background to stop parent's material ripple -->
+    <FrameLayout
+        android:id="@+id/settings_button"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:visibility="invisible"
+        android:background="?android:attr/colorBackground">
+        <ImageView
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_gravity="center"
+            android:paddingStart="?android:attr/listPreferredItemPaddingEnd"
+            android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+            android:background="?android:attr/selectableItemBackground"
+            android:scaleType="center"
+            android:src="@drawable/ic_settings"
+            android:contentDescription="@string/settings_button" />
+    </FrameLayout>
+</FrameLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9f2fe1b..d388946 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1731,6 +1731,8 @@
     <string name="wifi_band_5ghz">5 GHz</string>
     <!-- Wifi Sign in text for button [CHAR LIMIT = 40]-->
     <string name="wifi_sign_in_button_text">Sign in</string>
+    <!-- Wifi Sign in CTA for wifi settings when captive portal auth is required [CHAR LIMIT = 50] -->
+    <string name="wifi_tap_to_sign_in">Tap here to sign in to network</string>
     <!-- Link speed on Wifi Status screen -->
     <string name="link_speed">%1$d Mbps</string>
 
diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java
index 68c9731..ddda5d8 100644
--- a/src/com/android/settings/slices/SettingsSliceProvider.java
+++ b/src/com/android/settings/slices/SettingsSliceProvider.java
@@ -34,10 +34,10 @@
 import java.util.Map;
 import java.util.WeakHashMap;
 
-import androidx.app.slice.Slice;
-import androidx.app.slice.SliceProvider;
-import androidx.app.slice.builders.SliceAction;
-import androidx.app.slice.builders.ListBuilder;
+import androidx.slice.Slice;
+import androidx.slice.SliceProvider;
+import androidx.slice.builders.SliceAction;
+import androidx.slice.builders.ListBuilder;
 
 /**
  * A {@link SliceProvider} for Settings to enabled inline results in system apps.
diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java
index e90ea8e..a1f27d1 100644
--- a/src/com/android/settings/slices/SliceBuilderUtils.java
+++ b/src/com/android/settings/slices/SliceBuilderUtils.java
@@ -35,10 +35,10 @@
 import com.android.settings.search.DatabaseIndexingUtils;
 import com.android.settingslib.core.AbstractPreferenceController;
 
-import androidx.app.slice.Slice;
-import androidx.app.slice.builders.SliceAction;
-import androidx.app.slice.builders.ListBuilder;
-import androidx.app.slice.builders.ListBuilder.RowBuilder;
+import androidx.slice.Slice;
+import androidx.slice.builders.SliceAction;
+import androidx.slice.builders.ListBuilder;
+import androidx.slice.builders.ListBuilder.RowBuilder;
 
 /**
  * Utility class to build Slices objects and Preference Controllers based on the Database managed
diff --git a/src/com/android/settings/slices/SlicesDatabaseAccessor.java b/src/com/android/settings/slices/SlicesDatabaseAccessor.java
index 4fca63a..acd296b 100644
--- a/src/com/android/settings/slices/SlicesDatabaseAccessor.java
+++ b/src/com/android/settings/slices/SlicesDatabaseAccessor.java
@@ -28,7 +28,7 @@
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.slices.SlicesDatabaseHelper.IndexColumns;
 
-import androidx.app.slice.Slice;
+import androidx.slice.Slice;
 
 /**
  * Class used to map a {@link Uri} from {@link SettingsSliceProvider} to a Slice.
diff --git a/src/com/android/settings/wifi/ConnectedAccessPointPreference.java b/src/com/android/settings/wifi/ConnectedAccessPointPreference.java
index 514525c..e9e1560 100644
--- a/src/com/android/settings/wifi/ConnectedAccessPointPreference.java
+++ b/src/com/android/settings/wifi/ConnectedAccessPointPreference.java
@@ -31,12 +31,31 @@
 public class ConnectedAccessPointPreference extends AccessPointPreference implements
         View.OnClickListener {
 
+    private final CaptivePortalStatus mCaptivePortalStatus;
     private OnGearClickListener mOnGearClickListener;
+    private boolean mCaptivePortalNetwork;
 
     public ConnectedAccessPointPreference(AccessPoint accessPoint, Context context,
-            UserBadgeCache cache, @DrawableRes int iconResId, boolean forSavedNetworks) {
+            UserBadgeCache cache, @DrawableRes int iconResId, boolean forSavedNetworks,
+            CaptivePortalStatus captivePortalStatus) {
         super(accessPoint, context, cache, iconResId, forSavedNetworks);
-        setWidgetLayoutResource(R.layout.preference_widget_gear_no_bg);
+        mCaptivePortalStatus = captivePortalStatus;
+    }
+
+    @Override
+    protected int getWidgetLayoutResourceId() {
+        return R.layout.preference_widget_gear_optional_background;
+    }
+
+    @Override
+    public void refresh() {
+        super.refresh();
+
+        mCaptivePortalNetwork = mCaptivePortalStatus.isCaptivePortalNetwork();
+        setShowDivider(mCaptivePortalNetwork);
+        if (mCaptivePortalNetwork) {
+            setSummary(R.string.wifi_tap_to_sign_in);
+        }
     }
 
     public void setOnGearClickListener(OnGearClickListener l) {
@@ -45,6 +64,18 @@
     }
 
     @Override
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+
+        final View gear = holder.findViewById(R.id.settings_button);
+        gear.setOnClickListener(this);
+
+        final View gearNoBg = holder.findViewById(R.id.settings_button_no_background);
+        gearNoBg.setVisibility(mCaptivePortalNetwork ? View.INVISIBLE : View.VISIBLE);
+        gear.setVisibility(mCaptivePortalNetwork ? View.VISIBLE : View.INVISIBLE);
+    }
+
+    @Override
     public void onClick(View v) {
         if (v.getId() == R.id.settings_button) {
             if (mOnGearClickListener != null) {
@@ -56,4 +87,8 @@
     public interface OnGearClickListener {
         void onGearClick(ConnectedAccessPointPreference p);
     }
+
+    public interface CaptivePortalStatus {
+        boolean isCaptivePortalNetwork();
+    }
 }
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 3972b85..4f67012 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -26,6 +26,8 @@
 import android.content.Intent;
 import android.content.res.Resources;
 import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
 import android.net.NetworkInfo;
 import android.net.NetworkInfo.State;
 import android.net.wifi.WifiConfiguration;
@@ -60,6 +62,7 @@
 import com.android.settings.widget.SummaryUpdater.OnSummaryChangeListener;
 import com.android.settings.widget.SwitchBarController;
 import com.android.settings.wifi.details.WifiNetworkDetailsFragment;
+import com.android.settings.wrapper.ConnectivityManagerWrapper;
 import com.android.settings.wrapper.WifiManagerWrapper;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.wifi.AccessPoint;
@@ -117,6 +120,7 @@
     };
 
     protected WifiManager mWifiManager;
+    private ConnectivityManager mConnectivityManager;
     private WifiManager.ActionListener mConnectListener;
     private WifiManager.ActionListener mSaveListener;
     private WifiManager.ActionListener mForgetListener;
@@ -238,6 +242,11 @@
                 getActivity(), this, getLifecycle(), true, true);
         mWifiManager = mWifiTracker.getManager();
 
+        final Activity activity = getActivity();
+        if (activity != null) {
+            mConnectivityManager = getActivity().getSystemService(ConnectivityManager.class);
+        }
+
         mConnectListener = new WifiManager.ActionListener() {
                                    @Override
                                    public void onSuccess() {
@@ -777,9 +786,11 @@
 
     @NonNull
     private ConnectedAccessPointPreference createConnectedAccessPointPreference(
-            AccessPoint accessPoint) {
+            AccessPoint accessPoint,
+            ConnectedAccessPointPreference.CaptivePortalStatus captivePortalStatus) {
         return new ConnectedAccessPointPreference(accessPoint, getPrefContext(), mUserBadgeCache,
-                R.drawable.ic_wifi_signal_0, false /* forSavedNetworks */);
+                R.drawable.ic_wifi_signal_0, false /* forSavedNetworks */,
+                captivePortalStatus);
     }
 
     /**
@@ -828,21 +839,30 @@
      * {@link #mConnectedAccessPointPreferenceCategory}.
      */
     private void addConnectedAccessPointPreference(AccessPoint connectedAp) {
-        final ConnectedAccessPointPreference pref = createConnectedAccessPointPreference(
-                connectedAp);
+        final ConnectedAccessPointPreference pref =
+                createConnectedAccessPointPreference(
+                        connectedAp, this::isConnectedToCaptivePortalNetwork);
 
-        // Launch details page on click.
-        pref.setOnPreferenceClickListener(preference -> {
-            pref.getAccessPoint().saveWifiState(pref.getExtras());
+        // Launch details page or captive portal on click.
+        pref.setOnPreferenceClickListener(
+                preference -> {
+                    pref.getAccessPoint().saveWifiState(pref.getExtras());
+                    Network network = getConnectedWifiNetwork();
+                    if (isConnectedToCaptivePortalNetwork(network)) {
+                        ConnectivityManagerWrapper connectivityManagerWrapper =
+                                new ConnectivityManagerWrapper(mConnectivityManager);
+                        connectivityManagerWrapper.startCaptivePortalApp(network);
+                    } else {
+                        launchNetworkDetailsFragment(pref);
+                    }
+                    return true;
+                });
 
-            new SubSettingLauncher(getContext())
-                    .setTitle(pref.getTitle())
-                    .setDestination(WifiNetworkDetailsFragment.class.getName())
-                    .setArguments(pref.getExtras())
-                    .setSourceMetricsCategory(getMetricsCategory())
-                    .launch();
-            return true;
-        });
+        pref.setOnGearClickListener(
+                preference -> {
+                    pref.getAccessPoint().saveWifiState(pref.getExtras());
+                    launchNetworkDetailsFragment(pref);
+                });
 
         pref.refresh();
 
@@ -854,6 +874,43 @@
         }
     }
 
+    private void launchNetworkDetailsFragment(ConnectedAccessPointPreference pref) {
+        new SubSettingLauncher(getContext())
+                .setTitle(pref.getTitle())
+                .setDestination(WifiNetworkDetailsFragment.class.getName())
+                .setArguments(pref.getExtras())
+                .setSourceMetricsCategory(getMetricsCategory())
+                .launch();
+    }
+
+    private boolean isConnectedToCaptivePortalNetwork() {
+        return isConnectedToCaptivePortalNetwork(getConnectedWifiNetwork());
+    }
+
+    private boolean isConnectedToCaptivePortalNetwork(Network network) {
+        if (mConnectivityManager == null || network == null) {
+            return false;
+        }
+        return WifiUtils.canSignIntoNetwork(mConnectivityManager.getNetworkCapabilities(network));
+    }
+
+    private Network getConnectedWifiNetwork() {
+        if (mConnectivityManager != null) {
+            Network networks[] = mConnectivityManager.getAllNetworks();
+            if (networks != null) {
+                for (Network network : networks) {
+                    NetworkCapabilities capabilities =
+                            mConnectivityManager.getNetworkCapabilities(network);
+                    if (capabilities != null
+                            && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
+                        return network;
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
     /** Removes all preferences and hide the {@link #mConnectedAccessPointPreferenceCategory}. */
     private void removeConnectedAccessPointPreference() {
         mConnectedAccessPointPreferenceCategory.removeAll();
diff --git a/src/com/android/settings/wifi/WifiUtils.java b/src/com/android/settings/wifi/WifiUtils.java
index 34c86d1..5ef66c0 100644
--- a/src/com/android/settings/wifi/WifiUtils.java
+++ b/src/com/android/settings/wifi/WifiUtils.java
@@ -16,11 +16,11 @@
 
 package com.android.settings.wifi;
 
-import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.net.NetworkCapabilities;
 import android.net.wifi.WifiConfiguration;
 import android.provider.Settings;
 import android.text.TextUtils;
@@ -101,4 +101,10 @@
                 Settings.Global.WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN, 0) != 0;
         return isLockdownFeatureEnabled;
     }
+
+    /** Returns true if the provided NetworkCapabilities indicate a captive portal network. */
+    public static boolean canSignIntoNetwork(NetworkCapabilities capabilities) {
+        return (capabilities != null
+                && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL));
+    }
 }
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index 4d9ad27..e7f0fdd 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -511,8 +511,7 @@
      * Returns whether the user can sign into the network represented by this preference.
      */
     private boolean canSignIntoNetwork() {
-        return mNetworkCapabilities != null && mNetworkCapabilities.hasCapability(
-                NET_CAPABILITY_CAPTIVE_PORTAL);
+        return WifiUtils.canSignIntoNetwork(mNetworkCapabilities);
     }
 
     /**
diff --git a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
index 9edae7e..8ddd48a 100644
--- a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
@@ -39,7 +39,7 @@
 import org.junit.runner.RunWith;
 import org.robolectric.RuntimeEnvironment;
 
-import androidx.app.slice.Slice;
+import androidx.slice.Slice;
 
 import java.util.HashMap;
 
diff --git a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
index 0fcce5f..39b381d 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
@@ -35,7 +35,7 @@
 import org.junit.runner.RunWith;
 import org.robolectric.RuntimeEnvironment;
 
-import androidx.app.slice.Slice;
+import androidx.slice.Slice;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 public class SliceBuilderUtilsTest {
diff --git a/tests/robotests/src/com/android/settings/wifi/ConnectedAccessPointPreferenceTest.java b/tests/robotests/src/com/android/settings/wifi/ConnectedAccessPointPreferenceTest.java
index 8d1b8ac..b9b29d2 100644
--- a/tests/robotests/src/com/android/settings/wifi/ConnectedAccessPointPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/ConnectedAccessPointPreferenceTest.java
@@ -32,6 +32,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
+import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
 
@@ -44,6 +45,8 @@
     private View mView;
     @Mock
     private ConnectedAccessPointPreference.OnGearClickListener mOnGearClickListener;
+    @Mock
+    private ConnectedAccessPointPreference.CaptivePortalStatus mCaptivePortalStatus;
     private Context mContext;
     private ConnectedAccessPointPreference mConnectedAccessPointPreference;
 
@@ -53,7 +56,7 @@
 
         mContext = RuntimeEnvironment.application;
         mConnectedAccessPointPreference = new ConnectedAccessPointPreference(mAccessPoint, mContext,
-                null, 0 /* iconResId */, false /* forSavedNetworks */);
+                null, 0 /* iconResId */, false /* forSavedNetworks */, mCaptivePortalStatus);
         mConnectedAccessPointPreference.setOnGearClickListener(mOnGearClickListener);
     }
 
@@ -74,8 +77,22 @@
     }
 
     @Test
+    public void testCaptivePortalStatus_isCaptivePortal_dividerDrawn() {
+        Mockito.when(mCaptivePortalStatus.isCaptivePortalNetwork()).thenReturn(true);
+        mConnectedAccessPointPreference.refresh();
+        assertThat(mConnectedAccessPointPreference.shouldShowDivider()).isTrue();
+    }
+
+    @Test
+    public void testCaptivePortalStatus_isNotCaptivePortal_dividerNotDrawn() {
+        Mockito.when(mCaptivePortalStatus.isCaptivePortalNetwork()).thenReturn(false);
+        mConnectedAccessPointPreference.refresh();
+        assertThat(mConnectedAccessPointPreference.shouldShowDivider()).isFalse();
+    }
+
+    @Test
     public void testWidgetLayoutPreference() {
         assertThat(mConnectedAccessPointPreference.getWidgetLayoutResource())
-            .isEqualTo(R.layout.preference_widget_gear_no_bg);
+            .isEqualTo(R.layout.preference_widget_gear_optional_background);
     }
 }
