diff --git a/Settings/AndroidManifest.xml b/Settings/AndroidManifest.xml
index 96c3df5..095fa37 100644
--- a/Settings/AndroidManifest.xml
+++ b/Settings/AndroidManifest.xml
@@ -100,21 +100,6 @@
             </intent-filter>
             -->
         </activity>
-
-        <activity
-            android:name=".connectivity.NetworkRequestDialogActivity"
-            android:theme="@style/Transparent"
-            android:excludeFromRecents="true"
-            android:launchMode="singleTop"
-            android:taskAffinity=".connectivity.NetworkRequestDialogActivity"
-            android:exported="true"
-            android:permission="android.permission.NETWORK_SETTINGS">
-            <intent-filter>
-                <action android:name="com.android.settings.wifi.action.NETWORK_REQUEST" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-        </activity>
-
         <activity
             android:name=".connectivity.WifiConnectionActivity"
             android:clearTaskOnLaunch="true"
diff --git a/Settings/res/layout/network_request_dialog_title.xml b/Settings/res/layout/network_request_dialog_title.xml
deleted file mode 100644
index 1a44f2d..0000000
--- a/Settings/res/layout/network_request_dialog_title.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:paddingEnd="?android:attr/dialogPreferredPadding"
-    android:orientation="horizontal"
-    android:background="?android:attr/selectableItemBackground"
-    android:minHeight="?android:attr/listPreferredItemHeightSmall">
-
-  <TextView
-      android:id="@+id/network_request_title_text"
-      android:layout_width="0dp"
-      android:layout_height="wrap_content"
-      android:paddingLeft="24dp"
-      android:paddingTop="18dp"
-      android:layout_weight="1"
-      android:textSize="18sp"
-      android:gravity="center_vertical"
-      />
-
-  <ProgressBar
-      android:id="@+id/network_request_title_progress"
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      android:layout_gravity="center_vertical"
-      android:layout_marginStart="16dip"
-      android:minWidth="32dp"
-      android:text="@string/progress_scanning"/>
-</LinearLayout>
diff --git a/Settings/res/values/colors.xml b/Settings/res/values/colors.xml
index adbd47a..94742f3 100644
--- a/Settings/res/values/colors.xml
+++ b/Settings/res/values/colors.xml
@@ -159,7 +159,4 @@
     <color name="setup_primary_text_color">#FFEEEEEE</color>
 
     <color name="activity_progress_text">#FFEEEEEE</color>
-
-    <!-- Dialog background color -->
-    <color name="dialog_background">@*android:color/background_device_default_light</color>
 </resources>
diff --git a/Settings/res/values/strings.xml b/Settings/res/values/strings.xml
index 2fe5264..21ad12e 100644
--- a/Settings/res/values/strings.xml
+++ b/Settings/res/values/strings.xml
@@ -1645,19 +1645,4 @@
 
     <!-- concat two strings, e.g. "Android Keyboard, My Pass" [CHAR LIMIT=NONE] -->
     <string name="string_concat"><xliff:g id="part1">%1$s</xliff:g>, <xliff:g id="part2">%2$s</xliff:g></string>
-
-    <!-- Title for Network connection request Dialog [CHAR LIMIT=60] -->
-    <string name="network_connection_request_dialog_title">Device to use with <xliff:g id="appName" example="ThirdPartyAppName">%1$s</xliff:g></string>
-    <!-- Message for Network connection timeout Dialog [CHAR LIMIT=NONE] -->
-    <string name="network_connection_timeout_dialog_message">No devices found. Make sure devices are turned on and available to connect.</string>
-    <!-- OK button for Network connection timeout Dialog [CHAR LIMIT=30] -->
-    <string name="network_connection_timeout_dialog_ok">Try again</string>
-    <!-- Message for Network connection error state Dialog [CHAR LIMIT=NONE] -->
-    <string name="network_connection_errorstate_dialog_message">Something came up. The application has cancelled the request to choose a device.</string>
-    <!-- Toast message when connection is successful [CHAR LIMIT=30] -->
-    <string name="network_connection_connect_successful">Connection successful</string>
-    <!-- Neutral button for Network connection request Dialog [CHAR LIMIT=30] -->
-    <string name="network_connection_request_dialog_showall">Show all</string>
-    <!--Bluetooth settings screen, text that appears in heading bar when scanning for devices -->
-    <string name="progress_scanning">Searching</string>
 </resources>
diff --git a/Settings/res/values/styles.xml b/Settings/res/values/styles.xml
index cea6f93..cc4c0ac 100644
--- a/Settings/res/values/styles.xml
+++ b/Settings/res/values/styles.xml
@@ -287,9 +287,4 @@
     <style name="Setup.GuidedActionItemIcon" parent="@style/Widget.Leanback.GuidedActionItemIconStyle">
         <item name="android:layout_marginEnd">16dp</item>
     </style>
-
-    <style name="TextAppearance.DialogMessage"
-           parent="@*android:style/TextAppearance.DeviceDefault.Body1">
-        <item name="android:textSize">16sp</item>
-    </style>
 </resources>
diff --git a/Settings/res/values/themes.xml b/Settings/res/values/themes.xml
index 929e470..98ae810 100644
--- a/Settings/res/values/themes.xml
+++ b/Settings/res/values/themes.xml
@@ -15,33 +15,6 @@
 -->
 
 <resources>
-    <style name="Transparent">
-        <item name="alertDialogTheme">@style/Theme.AlertDialog</item>
-        <item name="android:windowBackground">@android:color/transparent</item>
-        <item name="android:windowNoTitle">true</item>
-        <item name="android:windowIsFloating">true</item>
-    </style>
-
-    <style name="Theme.AlertDialog.Base" parent="@style/Theme.AppCompat.DayNight.Dialog.Alert">
-        <item name="colorAccent">@*android:color/accent_device_default_light</item>
-        <item name="android:colorBackground">@color/dialog_background</item>
-    </style>
-
-    <style name="Theme.AlertDialog" parent="Theme.AlertDialog.Base">
-        <item name="android:windowSoftInputMode">adjustResize</item>
-        <item name="android:clipToPadding">true</item>
-        <item name="android:clipChildren">true</item>
-
-        <!-- Redefine the ActionBar style for contentInsetStart -->
-        <!-- <item name="android:actionBarStyle">@style/Widget.ActionBar</item> -->
-
-        <!-- copied from Theme.DeviceDefault.Dialog.Alert -->
-        <item name="dialogCornerRadius">@*android:dimen/config_dialogCornerRadius</item>
-        <item name="android:windowTitleStyle">@*android:style/DialogWindowTitle.DeviceDefault</item>
-        <item name="android:textAppearanceMedium">@style/TextAppearance.DialogMessage</item>
-        <item name="buttonBarButtonStyle">@*android:style/Widget.DeviceDefault.Button.ButtonBar.AlertDialog</item>
-    </style>
-
     <style name="FallbackHome" parent="@android:style/Theme.Material.Wallpaper.NoTitleBar">
         <item name="android:windowTranslucentStatus">true</item>
         <item name="android:windowTranslucentNavigation">true</item>
diff --git a/Settings/src/com/android/tv/settings/connectivity/NetworkRequestDialogActivity.java b/Settings/src/com/android/tv/settings/connectivity/NetworkRequestDialogActivity.java
deleted file mode 100644
index 63a123d..0000000
--- a/Settings/src/com/android/tv/settings/connectivity/NetworkRequestDialogActivity.java
+++ /dev/null
@@ -1,38 +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.tv.settings.connectivity;
-
-import android.os.Bundle;
-
-import androidx.annotation.Nullable;
-import androidx.fragment.app.FragmentActivity;
-
-/**
- * When other applications request to have a wifi connection, framework will bring up this activity
- * to let user select which wifi ap wanna to connect. This activity is just a door for framework
- * call, and main functional process is at {@code NetworkRequestDialogFragment}.
- */
-public class NetworkRequestDialogActivity extends FragmentActivity {
-
-    @Override
-    protected void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        final NetworkRequestDialogFragment fragment = NetworkRequestDialogFragment.newInstance();
-        fragment.show(getSupportFragmentManager(), "NetworkRequestDialogFragment");
-    }
-}
diff --git a/Settings/src/com/android/tv/settings/connectivity/NetworkRequestDialogFragment.java b/Settings/src/com/android/tv/settings/connectivity/NetworkRequestDialogFragment.java
deleted file mode 100644
index 752abbc..0000000
--- a/Settings/src/com/android/tv/settings/connectivity/NetworkRequestDialogFragment.java
+++ /dev/null
@@ -1,569 +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.tv.settings.connectivity;
-
-import android.app.Activity;
-import android.app.Dialog;
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.graphics.drawable.Drawable;
-import android.net.wifi.ScanResult;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiManager;
-import android.net.wifi.WifiManager.NetworkRequestMatchCallback;
-import android.net.wifi.WifiManager.NetworkRequestUserSelectionCallback;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.text.TextUtils;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.BaseAdapter;
-import android.widget.Button;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-import android.widget.Toast;
-import android.widget.ImageView;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.VisibleForTesting;
-import androidx.appcompat.app.AlertDialog;
-import androidx.preference.internal.PreferenceImageView;
-
-import com.android.tv.settings.R;
-import com.android.tv.settings.connectivity.NetworkRequestErrorDialogFragment.ERROR_DIALOG_TYPE;
-import com.android.tv.settings.SettingsPreferenceFragment;
-import com.android.settingslib.core.lifecycle.ObservableDialogFragment;
-import com.android.settingslib.Utils;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.wifi.AccessPoint;
-import com.android.settingslib.wifi.WifiTracker;
-import com.android.settingslib.wifi.WifiTrackerFactory;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * The Fragment sets up callback {@link NetworkRequestMatchCallback} with framework. To handle most
- * behaviors of the callback when requesting wifi network, except for error message. When error
- * happens, {@link NetworkRequestErrorDialogFragment} will be called to display error message.
- */
-public class NetworkRequestDialogFragment extends ObservableDialogFragment implements
-        DialogInterface.OnClickListener, NetworkRequestMatchCallback {
-
-    /** Message sent to us to stop scanning wifi and pop up timeout dialog. */
-    private static final int MESSAGE_STOP_SCAN_WIFI_LIST = 0;
-
-    /**
-     * Spec defines there should be 5 wifi ap on the list at most or just show all if {@code
-     * mShowLimitedItem} is false.
-     */
-    private static final int MAX_NUMBER_LIST_ITEM = 5;
-    private boolean mShowLimitedItem = true;
-
-    /** Delayed time to stop scanning wifi. */
-    private static final int DELAY_TIME_STOP_SCAN_MS = 30 * 1000;
-
-    @VisibleForTesting
-    final static String EXTRA_APP_NAME = "com.android.settings.wifi.extra.APP_NAME";
-    final static String EXTRA_IS_SPECIFIED_SSID =
-            "com.android.settings.wifi.extra.REQUEST_IS_FOR_SINGLE_NETWORK";
-
-    private List<AccessPoint> mAccessPointList;
-    private FilterWifiTracker mFilterWifiTracker;
-    private AccessPointAdapter mDialogAdapter;
-    private NetworkRequestUserSelectionCallback mUserSelectionCallback;
-    private boolean mIsSpecifiedSsid;
-    private boolean mWaitingConnectCallback;
-
-    public static NetworkRequestDialogFragment newInstance() {
-        NetworkRequestDialogFragment dialogFragment = new NetworkRequestDialogFragment();
-        return dialogFragment;
-    }
-
-    @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        final Context context = getContext();
-
-        // Prepares title.
-        final LayoutInflater inflater = LayoutInflater.from(context);
-        final View customTitle = inflater.inflate(R.layout.network_request_dialog_title, null);
-
-        final TextView title = customTitle.findViewById(R.id.network_request_title_text);
-        title.setText(getTitle());
-
-        final Intent intent = getActivity().getIntent();
-        if (intent != null) {
-            mIsSpecifiedSsid = intent.getBooleanExtra(EXTRA_IS_SPECIFIED_SSID, false);
-        }
-
-        // Prepares adapter.
-        mDialogAdapter = new AccessPointAdapter(context,
-                R.layout.preference_access_point, getAccessPointList());
-
-        final AlertDialog.Builder builder = new AlertDialog.Builder(context)
-                .setCustomTitle(customTitle)
-                .setAdapter(mDialogAdapter, this)
-                .setNegativeButton(R.string.cancel, (dialog, which) -> onCancel(dialog))
-                // Do nothings, will replace the onClickListener to avoid auto closing dialog.
-                .setNeutralButton(R.string.network_connection_request_dialog_showall,
-                        null /* OnClickListener */);
-        if (mIsSpecifiedSsid) {
-            builder.setPositiveButton(R.string.wifi_connect, null /* OnClickListener */);
-        }
-
-        // Clicking list item is to connect wifi ap.
-        final AlertDialog dialog = builder.create();
-        dialog.getListView()
-                .setOnItemClickListener(
-                        (parent, view, position, id) -> this.onClick(dialog, position));
-
-        // Don't dismiss dialog when touching outside. User reports it is easy to touch outside.
-        // This causes dialog to close.
-        setCancelable(false);
-
-        dialog.setOnShowListener((dialogInterface) -> {
-            // Replace NeutralButton onClickListener to avoid closing dialog
-            final Button neutralBtn = dialog.getButton(AlertDialog.BUTTON_NEUTRAL);
-            neutralBtn.setVisibility(View.GONE);
-            neutralBtn.setOnClickListener(v -> {
-                mShowLimitedItem = false;
-                renewAccessPointList(null /* List<ScanResult> */);
-                notifyAdapterRefresh();
-                neutralBtn.setVisibility(View.GONE);
-            });
-
-            // Replace Positive onClickListener to avoid closing dialog
-            if (mIsSpecifiedSsid) {
-                final Button positiveBtn = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
-                positiveBtn.setOnClickListener(v -> {
-                    // When clicking connect button, should connect to the first and the only one
-                    // list item.
-                    this.onClick(dialog, 0 /* position */);
-                });
-                // Disable button in first, and enable it after there are some accesspoints in list.
-                positiveBtn.setEnabled(false);
-            }
-        });
-        return dialog;
-    }
-
-    private String getTitle() {
-        final Intent intent = getActivity().getIntent();
-        String appName = "";
-        if (intent != null) {
-            appName = intent.getStringExtra(EXTRA_APP_NAME);
-        }
-
-        return getString(R.string.network_connection_request_dialog_title, appName);
-    }
-
-    @NonNull
-    List<AccessPoint> getAccessPointList() {
-        // Initials list for adapter, in case of display crashing.
-        if (mAccessPointList == null) {
-            mAccessPointList = new ArrayList<>();
-        }
-        return mAccessPointList;
-    }
-
-    private BaseAdapter getDialogAdapter() {
-        return mDialogAdapter;
-    }
-
-    @Override
-    public void onClick(DialogInterface dialog, int which) {
-        final List<AccessPoint> accessPointList = getAccessPointList();
-        if (accessPointList.size() == 0) {
-            return;  // Invalid values.
-        }
-        if (mUserSelectionCallback == null) {
-            return; // Callback is missing or not ready.
-        }
-
-        if (which < accessPointList.size()) {
-            final AccessPoint selectedAccessPoint = accessPointList.get(which);
-            WifiConfiguration wifiConfig = selectedAccessPoint.getConfig();
-            if (wifiConfig == null) {
-                wifiConfig = WifiUtils.getWifiConfig(selectedAccessPoint, /* scanResult */
-                        null, /* password */ null);
-            }
-
-            if (wifiConfig != null) {
-                mUserSelectionCallback.select(wifiConfig);
-
-                mWaitingConnectCallback = true;
-                updateConnectButton(false);
-            }
-        }
-    }
-
-    @Override
-    public void onCancel(@NonNull DialogInterface dialog) {
-        super.onCancel(dialog);
-        // Finishes the activity when user clicks back key or outside of the dialog.
-        if (getActivity() != null) {
-            getActivity().finish();
-        }
-        if (mUserSelectionCallback != null) {
-            mUserSelectionCallback.reject();
-        }
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-
-        mHandler.removeMessages(MESSAGE_STOP_SCAN_WIFI_LIST);
-        final WifiManager wifiManager = getContext().getApplicationContext()
-                .getSystemService(WifiManager.class);
-        if (wifiManager != null) {
-            wifiManager.unregisterNetworkRequestMatchCallback(this);
-        }
-
-        if (mFilterWifiTracker != null) {
-            mFilterWifiTracker.onPause();
-        }
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-
-        if (mFilterWifiTracker != null) {
-            mFilterWifiTracker.onDestroy();
-            mFilterWifiTracker = null;
-        }
-    }
-
-    private void showAllButton() {
-        final AlertDialog alertDialog = (AlertDialog) getDialog();
-        if (alertDialog == null) {
-            return;
-        }
-
-        final Button neutralBtn = alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL);
-        if (neutralBtn != null) {
-            neutralBtn.setVisibility(View.VISIBLE);
-        }
-    }
-
-    private void updateConnectButton(boolean enabled) {
-        // The button is only showed in single SSID mode.
-        if (!mIsSpecifiedSsid) {
-            return;
-        }
-
-        final AlertDialog alertDialog = (AlertDialog) getDialog();
-        if (alertDialog == null) {
-            return;
-        }
-
-        final Button positiveBtn = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
-        if (positiveBtn != null) {
-            positiveBtn.setEnabled(enabled);
-        }
-    }
-
-    private void hideProgressIcon() {
-        final AlertDialog alertDialog = (AlertDialog) getDialog();
-        if (alertDialog == null) {
-            return;
-        }
-
-        final View progress = alertDialog.findViewById(R.id.network_request_title_progress);
-        if (progress != null) {
-            progress.setVisibility(View.GONE);
-        }
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-
-        final WifiManager wifiManager = getContext().getApplicationContext()
-                .getSystemService(WifiManager.class);
-        if (wifiManager != null) {
-            wifiManager.registerNetworkRequestMatchCallback(this, mHandler);
-        }
-        // Sets time-out to stop scanning.
-        mHandler.sendEmptyMessageDelayed(MESSAGE_STOP_SCAN_WIFI_LIST, DELAY_TIME_STOP_SCAN_MS);
-
-        if (mFilterWifiTracker == null) {
-            mFilterWifiTracker = new FilterWifiTracker(getActivity(), getSettingsLifecycle());
-        }
-        mFilterWifiTracker.onResume();
-    }
-
-    private final Handler mHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MESSAGE_STOP_SCAN_WIFI_LIST:
-                    removeMessages(MESSAGE_STOP_SCAN_WIFI_LIST);
-                    stopScanningAndPopErrorDialog(ERROR_DIALOG_TYPE.TIME_OUT);
-                    break;
-                default:
-                    // Do nothing.
-                    break;
-            }
-        }
-    };
-
-    protected void stopScanningAndPopErrorDialog(ERROR_DIALOG_TYPE type) {
-        // Dismisses current dialog.
-        final Dialog dialog =  getDialog();
-        if (dialog != null && dialog.isShowing()) {
-            dismiss();
-        }
-
-        // Throws error dialog.
-        final NetworkRequestErrorDialogFragment fragment = NetworkRequestErrorDialogFragment
-                .newInstance();
-        final Bundle bundle = new Bundle();
-        bundle.putSerializable(NetworkRequestErrorDialogFragment.DIALOG_TYPE, type);
-        fragment.setArguments(bundle);
-        fragment.show(getActivity().getSupportFragmentManager(),
-                NetworkRequestDialogFragment.class.getSimpleName());
-    }
-
-    private class AccessPointAdapter extends ArrayAdapter<AccessPoint> {
-
-        private final int mResourceId;
-        private final LayoutInflater mInflater;
-
-        public AccessPointAdapter(Context context, int resourceId, List<AccessPoint> objects) {
-            super(context, resourceId, objects);
-            mResourceId = resourceId;
-            mInflater = LayoutInflater.from(context);
-        }
-
-        @Override
-        public View getView(int position, View view, ViewGroup parent) {
-            if (view == null) {
-                view = mInflater.inflate(mResourceId, parent, false);
-
-                final View divider = view.findViewById(
-                        com.android.settingslib.R.id.two_target_divider);
-                divider.setVisibility(View.GONE);
-            }
-
-            final AccessPoint accessPoint = getItem(position);
-
-            final TextView titleView = view.findViewById(android.R.id.title);
-            if (titleView != null) {
-                // Shows whole SSID for better UX.
-                titleView.setSingleLine(false);
-                titleView.setText(accessPoint.getTitle());
-            }
-
-            final TextView summary = view.findViewById(android.R.id.summary);
-            if (summary != null) {
-                final String summaryString = accessPoint.getSettingsSummary();
-                if (TextUtils.isEmpty(summaryString)) {
-                    summary.setVisibility(View.GONE);
-                } else {
-                    summary.setVisibility(View.VISIBLE);
-                    summary.setText(summaryString);
-                }
-            }
-
-            final ImageView imageView = view.findViewById(android.R.id.icon);
-            final int level = accessPoint.getLevel();
-            if (imageView != null) {
-                final Drawable drawable = getContext().getDrawable(
-                        Utils.getWifiIconResource(level));
-                drawable.setTintList(
-                        Utils.getColorAttr(getContext(), android.R.attr.colorControlNormal));
-                imageView.setImageDrawable(drawable);
-            }
-
-            return view;
-        }
-    }
-
-    @Override
-    public void onAbort() {
-        stopScanningAndPopErrorDialog(ERROR_DIALOG_TYPE.ABORT);
-    }
-
-    @Override
-    public void onUserSelectionCallbackRegistration(
-            NetworkRequestUserSelectionCallback userSelectionCallback) {
-        mUserSelectionCallback = userSelectionCallback;
-    }
-
-    @Override
-    public void onMatch(List<ScanResult> scanResults) {
-        // Shouldn't need to renew cached list, since input result is empty.
-        if (scanResults != null && scanResults.size() > 0) {
-            mHandler.removeMessages(MESSAGE_STOP_SCAN_WIFI_LIST);
-            renewAccessPointList(scanResults);
-
-            notifyAdapterRefresh();
-        }
-    }
-
-    // Updates internal AccessPoint list from WifiTracker. scanResults are used to update key list
-    // of AccessPoint, and could be null if there is no necessary to update key list.
-    private void renewAccessPointList(List<ScanResult> scanResults) {
-        if (mFilterWifiTracker == null) {
-            return;
-        }
-
-        // TODO(b/119846365): Checks if we could escalate the converting effort.
-        // Updates keys of scanResults into FilterWifiTracker for updating matched AccessPoints.
-        if (scanResults != null) {
-            mFilterWifiTracker.updateKeys(scanResults);
-        }
-
-        // Re-gets matched AccessPoints from WifiTracker.
-        final List<AccessPoint> list = getAccessPointList();
-        list.clear();
-        list.addAll(mFilterWifiTracker.getAccessPoints());
-    }
-
-    @VisibleForTesting
-    void notifyAdapterRefresh() {
-        if (getDialogAdapter() != null) {
-            getDialogAdapter().notifyDataSetChanged();
-        }
-    }
-
-    @Override
-    public void onUserSelectionConnectSuccess(WifiConfiguration wificonfiguration) {
-        final Activity activity = getActivity();
-        if (activity != null) {
-            Toast.makeText(activity, R.string.network_connection_connect_successful,
-                    Toast.LENGTH_SHORT).show();
-            activity.finish();
-        }
-    }
-
-    @Override
-    public void onUserSelectionConnectFailure(WifiConfiguration wificonfiguration) {
-        // Do nothing when selection is failed, let user could try again easily.
-        mWaitingConnectCallback = false;
-        updateConnectButton(true);
-    }
-
-    private final class FilterWifiTracker {
-        private final List<String> mAccessPointKeys;
-        private final WifiTracker mWifiTracker;
-
-        public FilterWifiTracker(Context context, Lifecycle lifecycle) {
-            mWifiTracker = WifiTrackerFactory.create(context, mWifiListener,
-                    lifecycle, /* includeSaved */ true, /* includeScans */ true);
-            mAccessPointKeys = new ArrayList<>();
-        }
-
-        /**
-         * Updates key list from input. {@code onMatch()} may be called in multi-times according
-         * wifi scanning result, so needs patchwork here.
-         */
-        public void updateKeys(List<ScanResult> scanResults) {
-            for (ScanResult scanResult : scanResults) {
-                final String key = AccessPoint.getKey(scanResult);
-                if (!mAccessPointKeys.contains(key)) {
-                    mAccessPointKeys.add(key);
-                }
-            }
-        }
-
-        /**
-         * Returns only AccessPoints whose key is in {@code mAccessPointKeys}.
-         *
-         * @return List of matched AccessPoints.
-         */
-        public List<AccessPoint> getAccessPoints() {
-            final List<AccessPoint> allAccessPoints = mWifiTracker.getAccessPoints();
-            final List<AccessPoint> result = new ArrayList<>();
-
-            // The order should be kept, because order means wifi score (sorting in WifiTracker).
-            int count = 0;
-            for (AccessPoint accessPoint : allAccessPoints) {
-                final String key = accessPoint.getKey();
-                if (mAccessPointKeys.contains(key)) {
-                    result.add(accessPoint);
-
-                    count++;
-                    // Limits how many count of items could show.
-                    if (mShowLimitedItem && count >= MAX_NUMBER_LIST_ITEM) {
-                        break;
-                    }
-                }
-            }
-
-            // Update related UI buttons
-            if (mShowLimitedItem && (count >= MAX_NUMBER_LIST_ITEM)) {
-                showAllButton();
-            }
-            if (count > 0) {
-                hideProgressIcon();
-            }
-            // Enable connect button if there is Accesspoint item, except for the situation that
-            // user click but connected status doesn't come back yet.
-            if (count < 0) {
-                updateConnectButton(false);
-            } else if (!mWaitingConnectCallback) {
-                updateConnectButton(true);
-            }
-
-            return result;
-        }
-
-        private WifiTracker.WifiListener mWifiListener = new WifiTracker.WifiListener() {
-
-            @Override
-            public void onWifiStateChanged(int state) {
-                notifyAdapterRefresh();
-            }
-
-            @Override
-            public void onConnectedChanged() {
-                notifyAdapterRefresh();
-            }
-
-            @Override
-            public void onAccessPointsChanged() {
-                notifyAdapterRefresh();
-            }
-        };
-
-        public void onDestroy() {
-            if (mWifiTracker != null) {
-                mWifiTracker.onDestroy();
-            }
-        }
-
-        public void onResume() {
-            if (mWifiTracker != null) {
-                mWifiTracker.onStart();
-            }
-        }
-
-        public void onPause() {
-            if (mWifiTracker != null) {
-                mWifiTracker.onStop();
-            }
-        }
-    }
-}
diff --git a/Settings/src/com/android/tv/settings/connectivity/NetworkRequestErrorDialogFragment.java b/Settings/src/com/android/tv/settings/connectivity/NetworkRequestErrorDialogFragment.java
deleted file mode 100644
index 401e91d..0000000
--- a/Settings/src/com/android/tv/settings/connectivity/NetworkRequestErrorDialogFragment.java
+++ /dev/null
@@ -1,82 +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.tv.settings.connectivity;
-
-import android.app.Dialog;
-import android.app.settings.SettingsEnums;
-import android.content.DialogInterface;
-import android.os.Bundle;
-
-import androidx.annotation.NonNull;
-import androidx.appcompat.app.AlertDialog;
-
-import com.android.settingslib.core.lifecycle.ObservableDialogFragment;
-import com.android.tv.settings.R;
-import com.android.tv.settings.SettingsPreferenceFragment;
-
-/**
- * The dialog shows an error message when requesting network {@link NetworkRequestDialogFragment}.
- * Contains multi-error types in {@code ERROR_DIALOG_TYPE}.
- */
-public class NetworkRequestErrorDialogFragment extends ObservableDialogFragment {
-
-    public static final String DIALOG_TYPE = "DIALOG_ERROR_TYPE";
-
-    public enum ERROR_DIALOG_TYPE {TIME_OUT, ABORT}
-
-    public static NetworkRequestErrorDialogFragment newInstance() {
-        return new NetworkRequestErrorDialogFragment();
-    }
-
-    private NetworkRequestErrorDialogFragment() {
-        super();
-    }
-
-    @Override
-    public void onCancel(@NonNull DialogInterface dialog) {
-        super.onCancel(dialog);
-        // Wants to finish the activity when user clicks back key or outside of the dialog.
-        getActivity().finish();
-    }
-
-    @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        // Gets error type to construct dialog. Default is TIME_OUT dialog.
-        ERROR_DIALOG_TYPE msgType = ERROR_DIALOG_TYPE.TIME_OUT;
-        if (getArguments() != null) {
-            msgType = (ERROR_DIALOG_TYPE) getArguments().getSerializable(DIALOG_TYPE);
-        }
-
-        final AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
-        if (msgType == ERROR_DIALOG_TYPE.TIME_OUT) {
-            builder.setMessage(R.string.network_connection_timeout_dialog_message)
-                    .setPositiveButton(R.string.network_connection_timeout_dialog_ok,
-                            (dialog, which) -> startScanningDialog())
-                    .setNegativeButton(R.string.cancel, (dialog, which) -> getActivity().finish());
-        } else {
-            builder.setMessage(R.string.network_connection_errorstate_dialog_message)
-                    .setPositiveButton(R.string.okay, (dialog, which) -> getActivity().finish());
-        }
-        return builder.create();
-    }
-
-    protected void startScanningDialog() {
-        final NetworkRequestDialogFragment fragment = NetworkRequestDialogFragment.newInstance();
-        fragment.show(getActivity().getSupportFragmentManager(),
-                NetworkRequestErrorDialogFragment.class.getSimpleName());
-    }
-}
diff --git a/Settings/src/com/android/tv/settings/connectivity/WifiUtils.java b/Settings/src/com/android/tv/settings/connectivity/WifiUtils.java
deleted file mode 100644
index 6632c8b..0000000
--- a/Settings/src/com/android/tv/settings/connectivity/WifiUtils.java
+++ /dev/null
@@ -1,153 +0,0 @@
-package com.android.tv.settings.connectivity;
-
-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.ScanResult;
-import android.net.wifi.WifiConfiguration;
-import android.provider.Settings;
-import android.text.TextUtils;
-
-import com.android.settingslib.wifi.AccessPoint;
-
-public class WifiUtils {
-    /**
-     * Gets security value from ScanResult.
-     *
-     * Duplicated method from {@link AccessPoint#getSecurity(ScanResult)}.
-     * TODO(b/120827021): Should be removed if the there is have a common one in shared place (e.g.
-     * SettingsLib).
-     *
-     * @param result ScanResult
-     * @return Related security value based on {@link AccessPoint}.
-     */
-    public static int getAccessPointSecurity(ScanResult result) {
-        if (result.capabilities.contains("WEP")) {
-            return AccessPoint.SECURITY_WEP;
-        } else if (result.capabilities.contains("SAE")) {
-            return AccessPoint.SECURITY_SAE;
-        } else if (result.capabilities.contains("PSK")) {
-            return AccessPoint.SECURITY_PSK;
-        } else if (result.capabilities.contains("EAP_SUITE_B_192")) {
-            return AccessPoint.SECURITY_EAP_SUITE_B;
-        } else if (result.capabilities.contains("EAP")) {
-            return AccessPoint.SECURITY_EAP;
-        } else if (result.capabilities.contains("OWE")) {
-            return AccessPoint.SECURITY_OWE;
-        }
-
-        return AccessPoint.SECURITY_NONE;
-    }
-
-    /**
-     * Provides a simple way to generate a new {@link WifiConfiguration} obj from
-     * {@link ScanResult} or {@link AccessPoint}. Either {@code accessPoint} or {@code scanResult
-     * } input should be not null for retrieving information, otherwise will throw
-     * IllegalArgumentException.
-     * This method prefers to take {@link AccessPoint} input in priority. Therefore this method
-     * will take {@link AccessPoint} input as preferred data extraction source when you input
-     * both {@link AccessPoint} and {@link ScanResult}, and ignore {@link ScanResult} input.
-     *
-     * Duplicated and simplified method from {@link WifiConfigController#getConfig()}.
-     * TODO(b/120827021): Should be removed if the there is have a common one in shared place (e.g.
-     * SettingsLib).
-     *
-     * @param accessPoint Input data for retrieving WifiConfiguration.
-     * @param scanResult  Input data for retrieving WifiConfiguration.
-     * @return WifiConfiguration obj based on input.
-     */
-    public static WifiConfiguration getWifiConfig(AccessPoint accessPoint, ScanResult scanResult,
-            String password) {
-        if (accessPoint == null && scanResult == null) {
-            throw new IllegalArgumentException(
-                    "At least one of AccessPoint and ScanResult input is required.");
-        }
-
-        final WifiConfiguration config = new WifiConfiguration();
-        final int security;
-
-        if (accessPoint == null) {
-            config.SSID = AccessPoint.convertToQuotedString(scanResult.SSID);
-            security = getAccessPointSecurity(scanResult);
-        } else {
-            if (!accessPoint.isSaved()) {
-                config.SSID = AccessPoint.convertToQuotedString(
-                        accessPoint.getSsidStr());
-            } else {
-                config.networkId = accessPoint.getConfig().networkId;
-                config.hiddenSSID = accessPoint.getConfig().hiddenSSID;
-            }
-            security = accessPoint.getSecurity();
-        }
-
-        switch (security) {
-            case AccessPoint.SECURITY_NONE:
-                config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OPEN);
-                break;
-
-            case AccessPoint.SECURITY_WEP:
-                config.setSecurityParams(WifiConfiguration.SECURITY_TYPE_WEP);
-                if (!TextUtils.isEmpty(password)) {
-                    int length = password.length();
-                    // WEP-40, WEP-104, and 256-bit WEP (WEP-232?)
-                    if ((length == 10 || length == 26 || length == 58)
-                            && password.matches("[0-9A-Fa-f]*")) {
-                        config.wepKeys[0] = password;
-                    } else {
-                        config.wepKeys[0] = '"' + password + '"';
-                    }
-                }
-                break;
-
-            case AccessPoint.SECURITY_PSK:
-                config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
-                if (!TextUtils.isEmpty(password)) {
-                    if (password.matches("[0-9A-Fa-f]{64}")) {
-                        config.preSharedKey = password;
-                    } else {
-                        config.preSharedKey = '"' + password + '"';
-                    }
-                }
-                break;
-
-            case AccessPoint.SECURITY_EAP:
-            case AccessPoint.SECURITY_EAP_SUITE_B:
-                config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
-                config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
-                if (security == AccessPoint.SECURITY_EAP_SUITE_B) {
-                    config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.SUITE_B_192);
-                    config.requirePMF = true;
-                    config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.GCMP_256);
-                    config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.GCMP_256);
-                    config.allowedGroupManagementCiphers.set(WifiConfiguration.GroupMgmtCipher
-                            .BIP_GMAC_256);
-                    // allowedSuiteBCiphers will be set according to certificate type
-                }
-
-                if (!TextUtils.isEmpty(password)) {
-                    config.enterpriseConfig.setPassword(password);
-                }
-                break;
-            case AccessPoint.SECURITY_SAE:
-                config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.SAE);
-                config.requirePMF = true;
-                if (!TextUtils.isEmpty(password)) {
-                    config.preSharedKey = '"' + password + '"';
-                }
-                break;
-
-            case AccessPoint.SECURITY_OWE:
-                config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.OWE);
-                config.requirePMF = true;
-                break;
-
-            default:
-                break;
-        }
-
-        return config;
-    }
-}
\ No newline at end of file
