diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a8101f1..fb581d6 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2591,6 +2591,12 @@
             </intent-filter>
         </activity>
 
+        <activity
+            android:name=".wifi.slice.ConnectToWifiHandler"
+            android:theme="@android:style/Theme.NoDisplay"
+            android:excludeFromRecents="true"
+            android:exported="false" />
+
         <activity android:name=".sim.SimDialogActivity"
                 android:theme="@style/Theme.AlertDialog"
                 android:label="@string/sim_settings_title"
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 3a0040c..881e3d2 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -562,24 +562,24 @@
              * Bypass dialog and connect to unsecured networks, or previously connected saved
              * networks, or Passpoint provided networks.
              */
-            WifiConfiguration config = mSelectedAccessPoint.getConfig();
-            if (mSelectedAccessPoint.isOsuProvider()) {
-                mSelectedAccessPoint.startOsuProvisioning();
-                mClickedConnect = true;
-            } else if ((mSelectedAccessPoint.getSecurity() == AccessPoint.SECURITY_NONE) ||
-                    (mSelectedAccessPoint.getSecurity() == AccessPoint.SECURITY_OWE)) {
-                mSelectedAccessPoint.generateOpenNetworkConfig();
-                connect(mSelectedAccessPoint.getConfig(), mSelectedAccessPoint.isSaved());
-            } else if (mSelectedAccessPoint.isSaved() && config != null
-                    && config.getNetworkSelectionStatus() != null
-                    && config.getNetworkSelectionStatus().getHasEverConnected()) {
-                connect(config, true /* isSavedNetwork */);
-            } else if (mSelectedAccessPoint.isPasspoint()) {
-                // Access point provided by an installed Passpoint provider, connect using
-                // the associated config.
-                connect(config, true /* isSavedNetwork */);
-            } else {
-                showDialog(mSelectedAccessPoint, WifiConfigUiBase.MODE_CONNECT);
+            switch (WifiUtils.getConnectingType(mSelectedAccessPoint)) {
+                case WifiUtils.CONNECT_TYPE_OSU_PROVISION:
+                    mSelectedAccessPoint.startOsuProvisioning();
+                    mClickedConnect = true;
+                    break;
+
+                case WifiUtils.CONNECT_TYPE_OPEN_NETWORK:
+                    mSelectedAccessPoint.generateOpenNetworkConfig();
+                    connect(mSelectedAccessPoint.getConfig(), mSelectedAccessPoint.isSaved());
+                    break;
+
+                case WifiUtils.CONNECT_TYPE_SAVED_NETWORK:
+                    connect(mSelectedAccessPoint.getConfig(), true /* isSavedNetwork */);
+                    break;
+
+                default:
+                    showDialog(mSelectedAccessPoint, WifiConfigUiBase.MODE_CONNECT);
+                    break;
             }
         } else if (preference == mAddPreference) {
             onAddNetworkPressed();
diff --git a/src/com/android/settings/wifi/WifiUtils.java b/src/com/android/settings/wifi/WifiUtils.java
index 751fc91..a22bdba 100644
--- a/src/com/android/settings/wifi/WifiUtils.java
+++ b/src/com/android/settings/wifi/WifiUtils.java
@@ -253,4 +253,33 @@
 
         return AccessPoint.SECURITY_NONE;
     }
+
+
+    public static final int CONNECT_TYPE_OTHERS = 0;
+    public static final int CONNECT_TYPE_OPEN_NETWORK = 1;
+    public static final int CONNECT_TYPE_SAVED_NETWORK = 2;
+    public static final int CONNECT_TYPE_OSU_PROVISION = 3;
+
+    /**
+     * Gets the connecting type of {@link AccessPoint}.
+     */
+    public static int getConnectingType(AccessPoint accessPoint) {
+        final WifiConfiguration config = accessPoint.getConfig();
+        if (accessPoint.isOsuProvider()) {
+            return CONNECT_TYPE_OSU_PROVISION;
+        } else if ((accessPoint.getSecurity() == AccessPoint.SECURITY_NONE) ||
+                (accessPoint.getSecurity() == AccessPoint.SECURITY_OWE)) {
+            return CONNECT_TYPE_OPEN_NETWORK;
+        } else if (accessPoint.isSaved() && config != null
+                && config.getNetworkSelectionStatus() != null
+                && config.getNetworkSelectionStatus().getHasEverConnected()) {
+            return CONNECT_TYPE_SAVED_NETWORK;
+        } else if (accessPoint.isPasspoint()) {
+            // Access point provided by an installed Passpoint provider, connect using
+            // the associated config.
+            return CONNECT_TYPE_SAVED_NETWORK;
+        } else {
+            return CONNECT_TYPE_OTHERS;
+        }
+    }
 }
diff --git a/src/com/android/settings/wifi/slice/ConnectToWifiHandler.java b/src/com/android/settings/wifi/slice/ConnectToWifiHandler.java
new file mode 100644
index 0000000..7b21b65
--- /dev/null
+++ b/src/com/android/settings/wifi/slice/ConnectToWifiHandler.java
@@ -0,0 +1,63 @@
+/*
+ * 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.wifi.slice;
+
+import android.app.Activity;
+import android.net.wifi.WifiManager;
+import android.os.Bundle;
+
+import androidx.annotation.VisibleForTesting;
+
+import com.android.settings.wifi.WifiDialogActivity;
+import com.android.settings.wifi.WifiUtils;
+import com.android.settingslib.wifi.AccessPoint;
+
+/**
+ * This activity helps connect to the Wi-Fi network which is open or saved
+ */
+public class ConnectToWifiHandler extends Activity {
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        final Bundle accessPointState = getIntent().getBundleExtra(
+                WifiDialogActivity.KEY_ACCESS_POINT_STATE);
+
+        if (accessPointState != null) {
+            connect(new AccessPoint(this, accessPointState));
+        }
+        finish();
+    }
+
+    @VisibleForTesting
+    void connect(AccessPoint accessPoint) {
+        switch (WifiUtils.getConnectingType(accessPoint)) {
+            case WifiUtils.CONNECT_TYPE_OSU_PROVISION:
+                accessPoint.startOsuProvisioning();
+                break;
+
+            case WifiUtils.CONNECT_TYPE_OPEN_NETWORK:
+                accessPoint.generateOpenNetworkConfig();
+
+            case WifiUtils.CONNECT_TYPE_SAVED_NETWORK:
+                final WifiManager wifiManager = getSystemService(WifiManager.class);
+                wifiManager.connect(accessPoint.getConfig(), null /* listener */);
+                break;
+        }
+    }
+}
diff --git a/src/com/android/settings/wifi/slice/WifiSlice.java b/src/com/android/settings/wifi/slice/WifiSlice.java
index 88fa8b2..1a0ed0c 100644
--- a/src/com/android/settings/wifi/slice/WifiSlice.java
+++ b/src/com/android/settings/wifi/slice/WifiSlice.java
@@ -48,6 +48,7 @@
 import com.android.settings.slices.SliceBuilderUtils;
 import com.android.settings.wifi.WifiDialogActivity;
 import com.android.settings.wifi.WifiSettings;
+import com.android.settings.wifi.WifiUtils;
 import com.android.settings.wifi.details.WifiNetworkDetailsFragment;
 import com.android.settingslib.wifi.AccessPoint;
 import com.android.settingslib.wifi.WifiTracker;
@@ -176,6 +177,9 @@
                     .setArguments(extras)
                     .setSourceMetricsCategory(SettingsEnums.WIFI)
                     .toIntent();
+        } else if (WifiUtils.getConnectingType(accessPoint) != WifiUtils.CONNECT_TYPE_OTHERS) {
+            intent = new Intent(mContext, ConnectToWifiHandler.class);
+            intent.putExtra(WifiDialogActivity.KEY_ACCESS_POINT_STATE, extras);
         } else {
             intent = new Intent(mContext, WifiDialogActivity.class);
             intent.putExtra(WifiDialogActivity.KEY_ACCESS_POINT_STATE, extras);
diff --git a/tests/robotests/src/com/android/settings/wifi/slice/ConnectToWifiHandlerTest.java b/tests/robotests/src/com/android/settings/wifi/slice/ConnectToWifiHandlerTest.java
new file mode 100644
index 0000000..a7cf327
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/wifi/slice/ConnectToWifiHandlerTest.java
@@ -0,0 +1,117 @@
+/*
+ * 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.wifi.slice;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiConfiguration.NetworkSelectionStatus;
+
+import com.android.settings.testutils.shadow.ShadowConnectivityManager;
+import com.android.settings.testutils.shadow.ShadowWifiManager;
+import com.android.settingslib.wifi.AccessPoint;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {
+        ShadowConnectivityManager.class,
+        ShadowWifiManager.class,
+})
+public class ConnectToWifiHandlerTest {
+
+    private static final String AP1_SSID = "\"ap1\"";
+    private ConnectToWifiHandler mHandler;
+    private WifiConfiguration mWifiConfig;
+    @Mock
+    private AccessPoint mAccessPoint;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mHandler = Robolectric.setupActivity(ConnectToWifiHandler.class);
+        mWifiConfig = new WifiConfiguration();
+        mWifiConfig.SSID = AP1_SSID;
+        doReturn(mWifiConfig).when(mAccessPoint).getConfig();
+    }
+
+    @Test
+    public void connect_shouldConnectToUnsavedOpenNetwork() {
+        when(mAccessPoint.isSaved()).thenReturn(false);
+        when(mAccessPoint.getSecurity()).thenReturn(AccessPoint.SECURITY_NONE);
+
+        mHandler.connect(mAccessPoint);
+
+        assertThat(ShadowWifiManager.get().savedWifiConfig.SSID).isEqualTo(AP1_SSID);
+    }
+
+    @Test
+    public void connect_shouldStartOsuProvisioning() {
+        when(mAccessPoint.isSaved()).thenReturn(false);
+        when(mAccessPoint.isOsuProvider()).thenReturn(true);
+
+        mHandler.connect(mAccessPoint);
+
+        verify(mAccessPoint).startOsuProvisioning();
+    }
+
+
+    @Test
+    public void connect_shouldConnectWithPasspointProvider() {
+        when(mAccessPoint.isSaved()).thenReturn(false);
+        when(mAccessPoint.isPasspoint()).thenReturn(true);
+
+        mHandler.connect(mAccessPoint);
+
+        assertThat(ShadowWifiManager.get().savedWifiConfig.SSID).isEqualTo(AP1_SSID);
+    }
+
+    @Test
+    public void connect_shouldConnectToSavedSecuredNetwork() {
+        when(mAccessPoint.isSaved()).thenReturn(true);
+        when(mAccessPoint.getSecurity()).thenReturn(AccessPoint.SECURITY_PSK);
+        final NetworkSelectionStatus status = new NetworkSelectionStatus();
+        status.setHasEverConnected(true);
+        mWifiConfig.setNetworkSelectionStatus(status);
+
+        mHandler.connect(mAccessPoint);
+
+        assertThat(ShadowWifiManager.get().savedWifiConfig.SSID).isEqualTo(AP1_SSID);
+    }
+
+    @Test
+    public void connect_shouldNotConnectToUnsavedSecuredNetwork() {
+        when(mAccessPoint.isSaved()).thenReturn(false);
+        when(mAccessPoint.getSecurity()).thenReturn(AccessPoint.SECURITY_PSK);
+
+        mHandler.connect(mAccessPoint);
+
+        assertThat(ShadowWifiManager.get().savedWifiConfig).isNull();
+    }
+}
