diff --git a/src/com/android/settings/panel/InternetConnectivityPanel.java b/src/com/android/settings/panel/InternetConnectivityPanel.java
deleted file mode 100644
index ae6f2e0..0000000
--- a/src/com/android/settings/panel/InternetConnectivityPanel.java
+++ /dev/null
@@ -1,425 +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.panel;
-
-import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE;
-import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
-
-import android.app.settings.SettingsEnums;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.Uri;
-import android.net.wifi.ScanResult;
-import android.net.wifi.WifiManager;
-import android.os.Handler;
-import android.os.HandlerExecutor;
-import android.os.Looper;
-import android.provider.Settings;
-import android.telephony.ServiceState;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyCallback;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-import android.util.Log;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.lifecycle.LifecycleObserver;
-import androidx.lifecycle.OnLifecycleEvent;
-
-import com.android.settings.R;
-import com.android.settings.Utils;
-import com.android.settings.network.AirplaneModePreferenceController;
-import com.android.settings.network.InternetUpdater;
-import com.android.settings.network.ProviderModelSliceHelper;
-import com.android.settings.network.SubscriptionsChangeListener;
-import com.android.settings.network.telephony.DataConnectivityListener;
-import com.android.settings.slices.CustomSliceRegistry;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Represents the Internet Connectivity Panel.
- */
-public class InternetConnectivityPanel implements PanelContent, LifecycleObserver,
-        InternetUpdater.InternetChangeListener, DataConnectivityListener.Client,
-        SubscriptionsChangeListener.SubscriptionsChangeListenerClient {
-    private static final String TAG = "InternetConnectivityPanel";
-    private static final int SUBTITLE_TEXT_NONE = -1;
-    private static final int SUBTITLE_TEXT_WIFI_IS_OFF = R.string.wifi_is_off;
-    private static final int SUBTITLE_TEXT_TAP_A_NETWORK_TO_CONNECT =
-            R.string.tap_a_network_to_connect;
-    private static final int SUBTITLE_TEXT_SEARCHING_FOR_NETWORKS =
-            R.string.wifi_empty_list_wifi_on;
-    private static final int SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE =
-            R.string.non_carrier_network_unavailable;
-    private static final int SUBTITLE_TEXT_ALL_CARRIER_NETWORK_UNAVAILABLE =
-            R.string.all_network_unavailable;
-
-    private final Context mContext;
-    private final WifiManager mWifiManager;
-    private final IntentFilter mWifiStateFilter;
-    private final NetworkProviderTelephonyCallback mTelephonyCallback;
-    private final BroadcastReceiver mWifiStateReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            if (intent == null) {
-                return;
-            }
-
-            if (TextUtils.equals(intent.getAction(), WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
-                updateProgressBar();
-                updatePanelTitle();
-                return;
-            }
-
-            if (TextUtils.equals(intent.getAction(), WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
-                updateProgressBar();
-                updatePanelTitle();
-            }
-        }
-    };
-
-    @VisibleForTesting
-    boolean mIsProviderModelEnabled;
-    @VisibleForTesting
-    InternetUpdater mInternetUpdater;
-    @VisibleForTesting
-    ProviderModelSliceHelper mProviderModelSliceHelper;
-
-    private int mSubtitle = SUBTITLE_TEXT_NONE;
-    private PanelContentCallback mCallback;
-    private TelephonyManager mTelephonyManager;
-    private SubscriptionsChangeListener mSubscriptionsListener;
-    private DataConnectivityListener mConnectivityListener;
-    private int mDefaultDataSubid = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-
-    // Wi-Fi scanning progress bar
-    protected HandlerInjector mHandlerInjector;
-    protected boolean mIsProgressBarVisible;
-    protected boolean mIsScanningSubTitleShownOnce;
-    protected Runnable mHideProgressBarRunnable = () -> {
-        setProgressBarVisible(false);
-    };
-    protected Runnable mHideScanningSubTitleRunnable = () -> {
-        mIsScanningSubTitleShownOnce = true;
-        updatePanelTitle();
-    };
-
-    /**
-     * Wrapper for testing compatibility.
-     */
-    @VisibleForTesting
-    static class HandlerInjector {
-        protected final Handler mHandler;
-
-        HandlerInjector(Context context) {
-            mHandler = context.getMainThreadHandler();
-        }
-
-        public void postDelay(Runnable runnable) {
-            mHandler.postDelayed(runnable, 2000 /* delay millis */);
-        }
-
-        public void removeCallbacks(Runnable runnable) {
-            mHandler.removeCallbacks(runnable);
-        }
-    }
-
-    private InternetConnectivityPanel(Context context) {
-        mContext = context.getApplicationContext();
-        mHandlerInjector = new HandlerInjector(context);
-        mIsProviderModelEnabled = Utils.isProviderModelEnabled(mContext);
-        mInternetUpdater = new InternetUpdater(context, null /* Lifecycle */, this);
-
-        mSubscriptionsListener = new SubscriptionsChangeListener(context, this);
-        mConnectivityListener = new DataConnectivityListener(context, this);
-        mTelephonyCallback = new NetworkProviderTelephonyCallback();
-        mDefaultDataSubid = getDefaultDataSubscriptionId();
-        mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
-
-        mWifiManager = mContext.getSystemService(WifiManager.class);
-        mWifiStateFilter = new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION);
-        mWifiStateFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
-
-        mProviderModelSliceHelper = new ProviderModelSliceHelper(mContext, null);
-    }
-
-    /** create the panel */
-    public static InternetConnectivityPanel create(Context context) {
-        return new InternetConnectivityPanel(context);
-    }
-
-    /** @OnLifecycleEvent(ON_RESUME) */
-    @OnLifecycleEvent(ON_RESUME)
-    public void onResume() {
-        if (!mIsProviderModelEnabled) {
-            return;
-        }
-        mInternetUpdater.onResume();
-        mSubscriptionsListener.start();
-        mConnectivityListener.start();
-        mTelephonyManager.registerTelephonyCallback(
-                new HandlerExecutor(new Handler(Looper.getMainLooper())), mTelephonyCallback);
-        mContext.registerReceiver(mWifiStateReceiver, mWifiStateFilter);
-        updateProgressBar();
-        updatePanelTitle();
-    }
-
-    /** @OnLifecycleEvent(ON_PAUSE) */
-    @OnLifecycleEvent(ON_PAUSE)
-    public void onPause() {
-        if (!mIsProviderModelEnabled) {
-            return;
-        }
-        mInternetUpdater.onPause();
-        mSubscriptionsListener.stop();
-        mConnectivityListener.stop();
-        mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback);
-        mContext.unregisterReceiver(mWifiStateReceiver);
-        mHandlerInjector.removeCallbacks(mHideProgressBarRunnable);
-        mHandlerInjector.removeCallbacks(mHideScanningSubTitleRunnable);
-    }
-
-    /**
-     * @return a string for the title of the Panel.
-     */
-    @Override
-    public CharSequence getTitle() {
-        if (mIsProviderModelEnabled) {
-            return mContext.getText(mInternetUpdater.isAirplaneModeOn()
-                    ? R.string.airplane_mode : R.string.provider_internet_settings);
-        }
-        return mContext.getText(R.string.internet_connectivity_panel_title);
-    }
-
-    /**
-     * @return a string for the subtitle of the Panel.
-     */
-    @Override
-    public CharSequence getSubTitle() {
-        if (mIsProviderModelEnabled && mSubtitle != SUBTITLE_TEXT_NONE) {
-            return mContext.getText(mSubtitle);
-        }
-        return null;
-    }
-
-    @Override
-    public List<Uri> getSlices() {
-        final List<Uri> uris = new ArrayList<>();
-        if (mIsProviderModelEnabled) {
-            uris.add(CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI);
-        } else {
-            uris.add(CustomSliceRegistry.WIFI_SLICE_URI);
-            uris.add(CustomSliceRegistry.MOBILE_DATA_SLICE_URI);
-            uris.add(AirplaneModePreferenceController.SLICE_URI);
-        }
-        return uris;
-    }
-
-    @Override
-    public Intent getSeeMoreIntent() {
-        // Disable the see more button for provider model design.
-        if (mIsProviderModelEnabled) {
-            return null;
-        }
-
-        // Don't remove the see more intent for non-provider model design. This intent will be
-        // used when isCustomizedButtonUsed() returns false.
-        return new Intent(Settings.ACTION_WIRELESS_SETTINGS)
-                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-    }
-
-    @Override
-    public boolean isProgressBarVisible() {
-        return mIsProgressBarVisible;
-    }
-
-    @Override
-    public int getMetricsCategory() {
-        return SettingsEnums.PANEL_INTERNET_CONNECTIVITY;
-    }
-
-    @Override
-    public void registerCallback(PanelContentCallback callback) {
-        mCallback = callback;
-    }
-
-    /**
-     * Called when airplane mode state is changed.
-     */
-    @Override
-    public void onAirplaneModeChanged(boolean isAirplaneModeOn) {
-        log("onAirplaneModeChanged: isAirplaneModeOn:" + isAirplaneModeOn);
-        updatePanelTitle();
-    }
-
-    /**
-     * Called when Wi-Fi enabled is changed.
-     */
-    @Override
-    public void onWifiEnabledChanged(boolean enabled) {
-        log("onWifiEnabledChanged: enabled:" + enabled);
-        updatePanelTitle();
-    }
-
-    @Override
-    public void onSubscriptionsChanged() {
-        final int defaultDataSubId = getDefaultDataSubscriptionId();
-        log("onSubscriptionsChanged: defaultDataSubId:" + defaultDataSubId);
-        if (mDefaultDataSubid == defaultDataSubId) {
-            return;
-        }
-        if (SubscriptionManager.isUsableSubscriptionId(defaultDataSubId)) {
-            mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback);
-            mTelephonyManager.registerTelephonyCallback(
-                    new HandlerExecutor(new Handler(Looper.getMainLooper())), mTelephonyCallback);
-        }
-        updatePanelTitle();
-    }
-
-    @Override
-    public void onDataConnectivityChange() {
-        log("onDataConnectivityChange");
-        updatePanelTitle();
-    }
-
-    @VisibleForTesting
-    void updatePanelTitle() {
-        if (mCallback == null) {
-            return;
-        }
-        updateSubtitleText();
-        mCallback.onHeaderChanged();
-    }
-
-    @VisibleForTesting
-    int getDefaultDataSubscriptionId() {
-        return SubscriptionManager.getDefaultDataSubscriptionId();
-    }
-
-    private void updateSubtitleText() {
-        mSubtitle = SUBTITLE_TEXT_NONE;
-        if (!mInternetUpdater.isWifiEnabled()) {
-            if (!mInternetUpdater.isAirplaneModeOn()) {
-                // When the airplane mode is off and Wi-Fi is disabled.
-                //   Sub-Title: Wi-Fi is off
-                log("Airplane mode off + Wi-Fi off.");
-                mSubtitle = SUBTITLE_TEXT_WIFI_IS_OFF;
-            }
-            return;
-        }
-
-        if (mInternetUpdater.isAirplaneModeOn()) {
-            return;
-        }
-
-        final List<ScanResult> wifiList = mWifiManager.getScanResults();
-        if (wifiList != null && wifiList.size() != 0) {
-            // When the Wi-Fi scan result is not empty
-            //   Sub-Title: Tap a network to connect
-            mSubtitle = SUBTITLE_TEXT_TAP_A_NETWORK_TO_CONNECT;
-            return;
-        }
-
-        if (!mIsScanningSubTitleShownOnce && mIsProgressBarVisible) {
-            // When the Wi-Fi scan result callback is received
-            //   Sub-Title: Searching for networks...
-            mSubtitle = SUBTITLE_TEXT_SEARCHING_FOR_NETWORKS;
-            return;
-        }
-
-        // Sub-Title:
-        // show non_carrier_network_unavailable
-        //   - while Wi-Fi on + no Wi-Fi item
-        //   - while Wi-Fi on + no Wi-Fi item + mobile data off
-        // show all_network_unavailable:
-        //   - while Wi-Fi on + no Wi-Fi item + no carrier item
-        //   - while Wi-Fi on + no Wi-Fi item + service is out of service
-        //   - while Wi-Fi on + no Wi-Fi item + mobile data on + no carrier data.
-        log("No Wi-Fi item.");
-        if (!mProviderModelSliceHelper.hasCarrier()
-                || (!mProviderModelSliceHelper.isVoiceStateInService()
-                && !mProviderModelSliceHelper.isDataStateInService())) {
-            log("no carrier or service is out of service.");
-            mSubtitle = SUBTITLE_TEXT_ALL_CARRIER_NETWORK_UNAVAILABLE;
-            return;
-        }
-        if (!mProviderModelSliceHelper.isMobileDataEnabled()) {
-            log("mobile data off");
-            mSubtitle = SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE;
-            return;
-        }
-        if (!mProviderModelSliceHelper.isDataSimActive()) {
-            log("no carrier data.");
-            mSubtitle = SUBTITLE_TEXT_ALL_CARRIER_NETWORK_UNAVAILABLE;
-            return;
-        }
-        mSubtitle = SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE;
-    }
-
-    protected void updateProgressBar() {
-        if (mWifiManager == null || !mInternetUpdater.isWifiEnabled()) {
-            setProgressBarVisible(false);
-            return;
-        }
-
-        setProgressBarVisible(true);
-        List<ScanResult> wifiScanResults = mWifiManager.getScanResults();
-        if (wifiScanResults != null && wifiScanResults.size() > 0) {
-            mHandlerInjector.postDelay(mHideProgressBarRunnable);
-        } else if (!mIsScanningSubTitleShownOnce) {
-            mHandlerInjector.postDelay(mHideScanningSubTitleRunnable);
-        }
-    }
-
-    protected void setProgressBarVisible(boolean visible) {
-        if (mIsProgressBarVisible == visible) {
-            return;
-        }
-        mIsProgressBarVisible = visible;
-
-        if (mCallback == null) {
-            return;
-        }
-        mCallback.onProgressBarVisibleChanged();
-        updatePanelTitle();
-    }
-
-    private class NetworkProviderTelephonyCallback extends TelephonyCallback implements
-            TelephonyCallback.DataConnectionStateListener,
-            TelephonyCallback.ServiceStateListener {
-        @Override
-        public void onServiceStateChanged(ServiceState state) {
-            log("onServiceStateChanged voiceState=" + state.getState()
-                    + " dataState=" + state.getDataRegistrationState());
-            updatePanelTitle();
-        }
-
-        @Override
-        public void onDataConnectionStateChanged(int state, int networkType) {
-            log("onDataConnectionStateChanged: networkType=" + networkType + " state=" + state);
-            updatePanelTitle();
-        }
-    }
-
-    private static void log(String s) {
-        Log.d(TAG, s);
-    }
-}
diff --git a/src/com/android/settings/panel/PanelFeatureProviderImpl.java b/src/com/android/settings/panel/PanelFeatureProviderImpl.java
index ca30952..a73881b 100644
--- a/src/com/android/settings/panel/PanelFeatureProviderImpl.java
+++ b/src/com/android/settings/panel/PanelFeatureProviderImpl.java
@@ -17,11 +17,14 @@
 package com.android.settings.panel;
 
 import android.content.Context;
+import android.content.Intent;
 import android.os.Bundle;
 import android.provider.Settings;
 
 public class PanelFeatureProviderImpl implements PanelFeatureProvider {
 
+    private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui";
+
     @Override
     public PanelContent getPanel(Context context, Bundle bundle) {
         if (context == null) {
@@ -35,7 +38,12 @@
 
         switch (panelType) {
             case Settings.Panel.ACTION_INTERNET_CONNECTIVITY:
-                return InternetConnectivityPanel.create(context);
+                // Redirect to the internet dialog in SystemUI.
+                Intent intent = new Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY);
+                intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
+                        .setPackage(SYSTEMUI_PACKAGE_NAME);
+                context.sendBroadcast(intent);
+                return null;
             case Settings.Panel.ACTION_NFC:
                 return NfcPanel.create(context);
             case Settings.Panel.ACTION_WIFI:
diff --git a/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java b/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java
deleted file mode 100644
index 30a2729..0000000
--- a/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
- * Copyright (C) 2021 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.panel;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.clearInvocations;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.net.Uri;
-import android.net.wifi.ScanResult;
-import android.net.wifi.WifiManager;
-import android.os.Handler;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.settings.network.AirplaneModePreferenceController;
-import com.android.settings.network.InternetUpdater;
-import com.android.settings.network.ProviderModelSliceHelper;
-import com.android.settings.slices.CustomSliceRegistry;
-import com.android.settings.testutils.ResourcesUtils;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(AndroidJUnit4.class)
-public class InternetConnectivityPanelTest {
-
-    public static final String TITLE_INTERNET = ResourcesUtils.getResourcesString(
-            ApplicationProvider.getApplicationContext(), "provider_internet_settings");
-    public static final String TITLE_APM = ResourcesUtils.getResourcesString(
-            ApplicationProvider.getApplicationContext(), "airplane_mode");
-    public static final String SUBTITLE_TEXT_WIFI_IS_OFF =
-            ResourcesUtils.getResourcesString(ApplicationProvider.getApplicationContext(),
-                    "wifi_is_off");
-    public static final String SUBTITLE_TEXT_TAP_A_NETWORK_TO_CONNECT =
-            ResourcesUtils.getResourcesString(ApplicationProvider.getApplicationContext(),
-                    "tap_a_network_to_connect");
-    public static final String SUBTITLE_NON_CARRIER_NETWORK_UNAVAILABLE =
-            ResourcesUtils.getResourcesString(ApplicationProvider.getApplicationContext(),
-                    "non_carrier_network_unavailable");
-    public static final String SUBTITLE_ALL_NETWORK_UNAVAILABLE =
-            ResourcesUtils.getResourcesString(ApplicationProvider.getApplicationContext(),
-                    "all_network_unavailable");
-    public static final String BUTTON_TURN_ON_WIFI = ResourcesUtils.getResourcesString(
-            ApplicationProvider.getApplicationContext(), "turn_on_wifi");
-    public static final String BUTTON_TURN_OFF_WIFI = ResourcesUtils.getResourcesString(
-            ApplicationProvider.getApplicationContext(), "turn_off_wifi");
-
-    @Rule
-    public final MockitoRule mMocks = MockitoJUnit.rule();
-    @Mock
-    Handler mMainThreadHandler;
-    @Mock
-    PanelContentCallback mPanelContentCallback;
-    @Mock
-    InternetUpdater mInternetUpdater;
-    @Mock
-    private WifiManager mWifiManager;
-    @Mock
-    private ProviderModelSliceHelper mProviderModelSliceHelper;
-
-    private Context mContext;
-    private FakeHandlerInjector mFakeHandlerInjector;
-    private InternetConnectivityPanel mPanel;
-
-    private class FakeHandlerInjector extends InternetConnectivityPanel.HandlerInjector {
-
-        private Runnable mRunnable;
-
-        FakeHandlerInjector(Context context) {
-            super(context);
-        }
-
-        @Override
-        public void postDelay(Runnable runnable) {
-            mRunnable = runnable;
-        }
-
-        public Runnable getRunnable() {
-            return mRunnable;
-        }
-    }
-
-    @Before
-    public void setUp() {
-        mContext = spy(ApplicationProvider.getApplicationContext());
-        mFakeHandlerInjector = new FakeHandlerInjector(mContext);
-        when(mContext.getApplicationContext()).thenReturn(mContext);
-        when(mContext.getMainThreadHandler()).thenReturn(mMainThreadHandler);
-        when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
-
-        mPanel = InternetConnectivityPanel.create(mContext);
-        mPanel.registerCallback(mPanelContentCallback);
-        mPanel.mIsProviderModelEnabled = true;
-        mPanel.mInternetUpdater = mInternetUpdater;
-        mPanel.mProviderModelSliceHelper = mProviderModelSliceHelper;
-        mPanel.mHandlerInjector = mFakeHandlerInjector;
-    }
-
-    @Test
-    public void getTitle_apmOff_shouldBeInternet() {
-        doReturn(false).when(mInternetUpdater).isAirplaneModeOn();
-
-        assertThat(mPanel.getTitle()).isEqualTo(TITLE_INTERNET);
-    }
-
-    @Test
-    public void getTitle_apmOn_shouldBeApm() {
-        doReturn(true).when(mInternetUpdater).isAirplaneModeOn();
-
-        assertThat(mPanel.getTitle()).isEqualTo(TITLE_APM);
-    }
-
-    @Test
-    public void getSubTitle_apmOnWifiOff_shouldBeNull() {
-        doReturn(true).when(mInternetUpdater).isAirplaneModeOn();
-        doReturn(false).when(mInternetUpdater).isWifiEnabled();
-
-        assertThat(mPanel.getSubTitle()).isNull();
-    }
-
-    @Test
-    public void getSubTitle_apmOnWifiOn_shouldBeNull() {
-        doReturn(true).when(mInternetUpdater).isAirplaneModeOn();
-        doReturn(true).when(mInternetUpdater).isWifiEnabled();
-
-        assertThat(mPanel.getSubTitle()).isNull();
-    }
-
-    @Test
-    public void getSubTitle_apmOffWifiOff_wifiIsOn() {
-        doReturn(false).when(mInternetUpdater).isAirplaneModeOn();
-        doReturn(false).when(mInternetUpdater).isWifiEnabled();
-
-        mPanel.updatePanelTitle();
-
-        assertThat(mPanel.getSubTitle()).isEqualTo(SUBTITLE_TEXT_WIFI_IS_OFF);
-    }
-
-    @Test
-    public void getSubTitle_apmOffWifiOnNoWifiListHasCarrierData_NonCarrierNetworkUnavailable() {
-        List wifiList = new ArrayList<ScanResult>();
-        mockCondition(false, true, true, true, true, true, wifiList);
-
-        mPanel.updatePanelTitle();
-
-        assertThat(mPanel.getSubTitle()).isEqualTo(SUBTITLE_NON_CARRIER_NETWORK_UNAVAILABLE);
-    }
-
-    @Test
-    public void getSubTitle_apmOffWifiOnNoWifiListNoCarrierItem_AllNetworkUnavailable() {
-        List wifiList = new ArrayList<ScanResult>();
-        mockCondition(false, false, false, false, false, true, wifiList);
-
-        mPanel.updatePanelTitle();
-
-        assertThat(mPanel.getSubTitle()).isEqualTo(SUBTITLE_ALL_NETWORK_UNAVAILABLE);
-    }
-
-    @Test
-    public void getSubTitle_apmOffWifiOnNoWifiListNoDataSimActive_AllNetworkUnavailable() {
-        List wifiList = new ArrayList<ScanResult>();
-        mockCondition(false, true, false, true, true, true, wifiList);
-
-        mPanel.updatePanelTitle();
-
-        assertThat(mPanel.getSubTitle()).isEqualTo(SUBTITLE_ALL_NETWORK_UNAVAILABLE);
-    }
-
-    @Test
-    public void getSubTitle_apmOffWifiOnNoWifiListNoService_AllNetworkUnavailable() {
-        List wifiList = new ArrayList<ScanResult>();
-        mockCondition(false, true, false, true, false, true, wifiList);
-
-        mPanel.updatePanelTitle();
-
-        assertThat(mPanel.getSubTitle()).isEqualTo(SUBTITLE_ALL_NETWORK_UNAVAILABLE);
-    }
-
-    @Test
-    public void getSubTitle_apmOffWifiOnTwoWifiItemsNoCarrierData_tapANetworkToConnect() {
-        List wifiList = new ArrayList<ScanResult>();
-        wifiList.add(new ScanResult());
-        wifiList.add(new ScanResult());
-        mockCondition(false, true, false, true, true, true, wifiList);
-
-        mPanel.updatePanelTitle();
-
-        assertThat(mPanel.getSubTitle()).isEqualTo(SUBTITLE_TEXT_TAP_A_NETWORK_TO_CONNECT);
-    }
-
-    @Test
-    public void getSlices_providerModelDisabled_containsNecessarySlices() {
-        mPanel.mIsProviderModelEnabled = false;
-        List<Uri> uris = mPanel.getSlices();
-
-        assertThat(uris).containsExactly(
-                AirplaneModePreferenceController.SLICE_URI,
-                CustomSliceRegistry.MOBILE_DATA_SLICE_URI,
-                CustomSliceRegistry.WIFI_SLICE_URI);
-    }
-
-    @Test
-    public void getSlices_providerModelEnabled_containsNecessarySlices() {
-        List<Uri> uris = mPanel.getSlices();
-
-        assertThat(uris).containsExactly(CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI);
-    }
-
-    @Test
-    public void getSeeMoreIntent_providerModelDisabled_shouldNotNull() {
-        mPanel.mIsProviderModelEnabled = false;
-
-        assertThat(mPanel.getSeeMoreIntent()).isNotNull();
-    }
-
-    @Test
-    public void getSeeMoreIntent_providerModelEnabled_shouldBeNull() {
-        mPanel.mIsProviderModelEnabled = true;
-
-        assertThat(mPanel.getSeeMoreIntent()).isNull();
-    }
-
-    @Test
-    public void updatePanelTitle_onHeaderChanged() {
-        clearInvocations(mPanelContentCallback);
-
-        mPanel.updatePanelTitle();
-
-        verify(mPanelContentCallback).onHeaderChanged();
-    }
-
-    @Test
-    public void updateProgressBar_wifiDisabled_hideProgress() {
-        mPanel.mIsProgressBarVisible = true;
-        doReturn(false).when(mInternetUpdater).isWifiEnabled();
-        clearInvocations(mPanelContentCallback);
-
-        mPanel.updateProgressBar();
-
-        assertThat(mPanel.isProgressBarVisible()).isFalse();
-        verify(mPanelContentCallback).onProgressBarVisibleChanged();
-    }
-
-    @Test
-    public void updateProgressBar_noWifiScanResults_showProgressForever() {
-        mPanel.mIsScanningSubTitleShownOnce = false;
-        mPanel.mIsProgressBarVisible = false;
-        doReturn(true).when(mInternetUpdater).isWifiEnabled();
-        List<ScanResult> noWifiScanResults = new ArrayList<>();
-        doReturn(noWifiScanResults).when(mWifiManager).getScanResults();
-        clearInvocations(mPanelContentCallback);
-
-        mPanel.updateProgressBar();
-
-        assertThat(mPanel.mIsProgressBarVisible).isTrue();
-        verify(mPanelContentCallback).onProgressBarVisibleChanged();
-        verify(mPanelContentCallback).onHeaderChanged();
-
-        assertThat(mFakeHandlerInjector.getRunnable())
-                .isEqualTo(mPanel.mHideScanningSubTitleRunnable);
-        mFakeHandlerInjector.getRunnable().run();
-        assertThat(mPanel.mIsScanningSubTitleShownOnce).isTrue();
-        assertThat(mPanel.mIsProgressBarVisible).isTrue();
-    }
-
-    @Test
-    public void updateProgressBar_hasWifiScanResults_showProgressDelayedHide() {
-        mPanel.mIsProgressBarVisible = false;
-        doReturn(true).when(mInternetUpdater).isWifiEnabled();
-        List<ScanResult> hasWifiScanResults = mock(ArrayList.class);
-        doReturn(1).when(hasWifiScanResults).size();
-        doReturn(hasWifiScanResults).when(mWifiManager).getScanResults();
-        clearInvocations(mPanelContentCallback);
-
-        mPanel.updateProgressBar();
-
-        assertThat(mPanel.isProgressBarVisible()).isTrue();
-        verify(mPanelContentCallback).onProgressBarVisibleChanged();
-
-        assertThat(mFakeHandlerInjector.getRunnable())
-                .isEqualTo(mPanel.mHideProgressBarRunnable);
-        mFakeHandlerInjector.getRunnable().run();
-        assertThat(mPanel.mIsProgressBarVisible).isFalse();
-    }
-
-    @Test
-    public void setProgressBarVisible_onProgressBarVisibleChanged() {
-        mPanel.mIsProgressBarVisible = false;
-        doReturn(true).when(mInternetUpdater).isWifiEnabled();
-        clearInvocations(mPanelContentCallback);
-
-        mPanel.setProgressBarVisible(true);
-
-        assertThat(mPanel.mIsProgressBarVisible).isTrue();
-        verify(mPanelContentCallback).onProgressBarVisibleChanged();
-        verify(mPanelContentCallback).onHeaderChanged();
-    }
-
-    private void mockCondition(boolean airplaneMode, boolean hasCarrier,
-            boolean isDataSimActive, boolean isMobileDataEnabled, boolean isServiceInService,
-            boolean isWifiEnabled, List<ScanResult> wifiItems) {
-        doReturn(airplaneMode).when(mInternetUpdater).isAirplaneModeOn();
-        when(mProviderModelSliceHelper.hasCarrier()).thenReturn(hasCarrier);
-        when(mProviderModelSliceHelper.isDataSimActive()).thenReturn(isDataSimActive);
-        when(mProviderModelSliceHelper.isMobileDataEnabled()).thenReturn(isMobileDataEnabled);
-        when(mProviderModelSliceHelper.isDataStateInService()).thenReturn(isServiceInService);
-        when(mProviderModelSliceHelper.isVoiceStateInService()).thenReturn(isServiceInService);
-        doReturn(isWifiEnabled).when(mInternetUpdater).isWifiEnabled();
-        doReturn(wifiItems).when(mWifiManager).getScanResults();
-    }
-}
diff --git a/tests/unit/src/com/android/settings/panel/PanelFeatureProviderImplTest.java b/tests/unit/src/com/android/settings/panel/PanelFeatureProviderImplTest.java
index 3b61a73..a02c054 100644
--- a/tests/unit/src/com/android/settings/panel/PanelFeatureProviderImplTest.java
+++ b/tests/unit/src/com/android/settings/panel/PanelFeatureProviderImplTest.java
@@ -20,7 +20,12 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
 import android.content.Context;
+import android.content.Intent;
 import android.os.Bundle;
 import android.provider.Settings;
 
@@ -36,25 +41,28 @@
 
     private static final String TEST_PACKAGENAME = "com.test.packagename";
 
+    private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui";
     private Context mContext;
     private PanelFeatureProviderImpl mProvider;
     private Bundle mBundle;
 
     @Before
     public void setUp() {
-        mContext = ApplicationProvider.getApplicationContext();
+        mContext = spy(ApplicationProvider.getApplicationContext());
         mProvider = new PanelFeatureProviderImpl();
         mBundle = new Bundle();
         mBundle.putString(KEY_MEDIA_PACKAGE_NAME, TEST_PACKAGENAME);
     }
 
     @Test
-    public void getPanel_internetConnectivityKey_returnsCorrectPanel() {
+    public void getPanel_internetConnectivityKey_sendsCorrectBroadcast() {
         mBundle.putString(KEY_PANEL_TYPE_ARGUMENT, Settings.Panel.ACTION_INTERNET_CONNECTIVITY);
+        mProvider.getPanel(mContext, mBundle);
+        Intent intent = new Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY);
+        intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
+                .setPackage(SYSTEMUI_PACKAGE_NAME);
 
-        final PanelContent panel = mProvider.getPanel(mContext, mBundle);
-
-        assertThat(panel).isInstanceOf(InternetConnectivityPanel.class);
+        verify(mContext, never()).sendBroadcast(intent);
     }
 
     @Test
