diff --git a/res/values/strings.xml b/res/values/strings.xml
index 1170a27..13d9874 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -7368,8 +7368,6 @@
     <string name="keywords_android_version">android security patch level, baseband version, kernel version</string>
     <!-- Search keywords for dark mode settings [CHAR LIMIT=NONE] -->
     <string name="keywords_dark_ui_mode">theme, light, dark, mode</string>
-    <!-- Search keywords for financial apps sms access settings [CHAR LIMIT=NONE] -->
-    <string name="keywords_financial_apps_sms_access">financial app, sms, permission</string>
 
     <!-- Search keyword for Device Theme Settings [CHAR LIMIT=NONE] -->
     <string name="keywords_systemui_theme">dark theme</string>
@@ -9426,10 +9424,6 @@
     <!-- Summary of number of apps currently can write system settings [CHAR LIMIT=60] -->
     <string name="write_settings_summary"><xliff:g id="count" example="10">%1$d</xliff:g> of <xliff:g id="count" example="10">%2$d</xliff:g> apps allowed to modify system settings</string>
 
-    <!-- Settings title in main settings screen for financial apps sms access [CHAR LIMIT=60] -->
-    <string name="financial_apps_sms_access_title">Financial Apps Sms Access</string>
-    <!-- Preference key for financial apps sms access screen -->
-    <string name="financial_sms_root_screen_key" translatable="false">financial_sms_root_screen_key</string>
     <!-- Label for showing apps that can install other apps [CHAR LIMIT=45] -->
     <string name="filter_install_sources_apps">Can install other apps</string>
     <!-- Label for showing apps that can write system settings [CHAR LIMIT=45] -->
diff --git a/res/xml/financial_app_sms_access.xml b/res/xml/financial_app_sms_access.xml
deleted file mode 100644
index 6f7ba50..0000000
--- a/res/xml/financial_app_sms_access.xml
+++ /dev/null
@@ -1,22 +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.
--->
-<PreferenceScreen
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:settings="http://schemas.android.com/apk/res-auto"
-    android:key="@string/financial_sms_root_screen_key"
-    android:title="@string/financial_apps_sms_access_title"
-    settings:controller="com.android.settings.applications.specialaccess.financialapps.FinancialAppsController" />
diff --git a/res/xml/special_access.xml b/res/xml/special_access.xml
index e8265b2..f846298 100644
--- a/res/xml/special_access.xml
+++ b/res/xml/special_access.xml
@@ -146,12 +146,6 @@
     </Preference>
 
     <Preference
-        android:key="financial_apps_sms_access"
-        android:title="@string/financial_apps_sms_access_title"
-        android:fragment="com.android.settings.applications.specialaccess.financialapps.FinancialAppsSmsAccess"
-        settings:keywords="@string/keywords_financial_apps_sms_access" />
-
-    <Preference
         android:key="special_access_more"
         android:title="@string/special_access_more"
         settings:controller="com.android.settings.applications.specialaccess.MoreSpecialAccessPreferenceController" />
diff --git a/src/com/android/settings/applications/specialaccess/financialapps/FinancialAppsController.java b/src/com/android/settings/applications/specialaccess/financialapps/FinancialAppsController.java
deleted file mode 100644
index c0517df..0000000
--- a/src/com/android/settings/applications/specialaccess/financialapps/FinancialAppsController.java
+++ /dev/null
@@ -1,156 +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.applications.specialaccess.financialapps;
-
-import static android.Manifest.permission.READ_SMS;
-import static android.Manifest.permission.SMS_FINANCIAL_TRANSACTIONS;
-
-import android.app.AppOpsManager;
-import android.content.Context;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.os.Build;
-import android.util.Log;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-import androidx.preference.SwitchPreference;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.ArrayUtils;
-import com.android.settings.core.BasePreferenceController;
-import com.android.settingslib.applications.ApplicationsState;
-import com.android.settingslib.applications.ApplicationsState.AppEntry;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class FinancialAppsController extends BasePreferenceController
-        implements ApplicationsState.Callbacks {
-    private final static String TAG = FinancialAppsController.class.getSimpleName();
-
-    @VisibleForTesting
-    PreferenceScreen mRoot;
-
-    public FinancialAppsController(Context context, String key) {
-        super(context, key);
-    }
-
-    @AvailabilityStatus
-    public int getAvailabilityStatus() {
-        return AVAILABLE;
-    }
-
-    @Override
-    public void displayPreference(PreferenceScreen screen) {
-        super.displayPreference(screen);
-        mRoot = screen;
-    }
-
-    @Override
-    public void updateState(Preference preference) {
-        updateList();
-    }
-
-    private void updateList() {
-        mRoot.removeAll();
-
-        final PackageManager packageManager = mContext.getPackageManager();
-        final AppOpsManager appOpsManager = mContext.getSystemService(AppOpsManager.class);
-
-        final List<PackageInfo> installedPackages =
-                packageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS);
-        final int numPackages = installedPackages.size();
-        for (int i = 0; i < numPackages; i++) {
-            final PackageInfo installedPackage = installedPackages.get(i);
-
-            if (installedPackage.requestedPermissions == null) {
-                continue;
-            }
-            final int targetSdk = installedPackage.applicationInfo.targetSdkVersion;
-            final String pkgName = installedPackage.packageName;
-
-            if ((targetSdk >= Build.VERSION_CODES.Q
-                    && ArrayUtils.contains(installedPackage.requestedPermissions,
-                            SMS_FINANCIAL_TRANSACTIONS))
-                    || (targetSdk < Build.VERSION_CODES.Q
-                    && ArrayUtils.contains(installedPackage.requestedPermissions,
-                            READ_SMS))) {
-                final SwitchPreference pref = new SwitchPreference(mRoot.getContext());
-                pref.setTitle(installedPackage.applicationInfo.loadLabel(packageManager));
-                pref.setKey(pkgName);
-
-                pref.setChecked(
-                        appOpsManager.checkOp(
-                                targetSdk >= Build.VERSION_CODES.Q
-                                        ? AppOpsManager.OP_SMS_FINANCIAL_TRANSACTIONS
-                                        : AppOpsManager.OP_READ_SMS,
-                                installedPackage.applicationInfo.uid,
-                                pkgName) == AppOpsManager.MODE_ALLOWED);
-
-                pref.setOnPreferenceChangeListener((preference, newValue) -> {
-                    final int uid;
-                    try {
-                        uid = packageManager.getPackageInfo(preference.getKey(), 0)
-                                .applicationInfo.uid;
-                    } catch (NameNotFoundException e) {
-                        Log.e(TAG, "onPreferenceChange: Failed to get uid for "
-                                + preference.getKey());
-                        return false;
-                    }
-
-                    appOpsManager.setMode(
-                            targetSdk >= Build.VERSION_CODES.Q
-                                    ? AppOpsManager.OP_SMS_FINANCIAL_TRANSACTIONS
-                                    : AppOpsManager.OP_READ_SMS,
-                            uid,
-                            pkgName,
-                            (Boolean) newValue ? AppOpsManager.MODE_ALLOWED
-                                    : AppOpsManager.MODE_IGNORED);
-                    return true;
-                });
-                mRoot.addPreference(pref);
-            }
-        }
-    }
-
-    @Override
-    public void onRunningStateChanged(boolean running) {}
-
-    @Override
-    public void onPackageListChanged() {
-        updateList();
-    }
-
-    @Override
-    public void onRebuildComplete(ArrayList<AppEntry> apps) {}
-
-    @Override
-    public void onPackageIconChanged() {}
-
-    @Override
-    public void onPackageSizeChanged(String packageName) {}
-
-    @Override
-    public void onAllSizesComputed() {}
-
-    @Override
-    public void onLauncherInfoChanged() {}
-
-    @Override
-    public void onLoadEntriesCompleted() {}
-}
diff --git a/src/com/android/settings/applications/specialaccess/financialapps/FinancialAppsSmsAccess.java b/src/com/android/settings/applications/specialaccess/financialapps/FinancialAppsSmsAccess.java
deleted file mode 100644
index 92f4e28..0000000
--- a/src/com/android/settings/applications/specialaccess/financialapps/FinancialAppsSmsAccess.java
+++ /dev/null
@@ -1,64 +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.applications.specialaccess.financialapps;
-
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.provider.SearchIndexableResource;
-
-import com.android.settings.R;
-import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settings.search.Indexable;
-import com.android.settingslib.search.SearchIndexable;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@SearchIndexable
-public class FinancialAppsSmsAccess extends DashboardFragment {
-    private final static String TAG = FinancialAppsSmsAccess.class.getSimpleName();
-
-    @Override
-    protected String getLogTag() {
-        return TAG;
-    }
-
-    @Override
-    protected int getPreferenceScreenResId() {
-        return R.xml.financial_app_sms_access;
-    }
-
-    @Override
-    public int getMetricsCategory() {
-      return SettingsEnums.SETTINGS_FINANCIAL_APPS_SMS_ACCESS;
-    }
-
-    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new BaseSearchIndexProvider() {
-                @Override
-                public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
-                        boolean enabled) {
-                    final ArrayList<SearchIndexableResource> result = new ArrayList<>();
-
-                    final SearchIndexableResource sir = new SearchIndexableResource(context);
-                    sir.xmlResId = R.xml.financial_app_sms_access;
-                    result.add(sir);
-                    return result;
-                }
-            };
-}
diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/financialapps/FinancialAppsControllerTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/financialapps/FinancialAppsControllerTest.java
deleted file mode 100644
index 39a05cb..0000000
--- a/tests/robotests/src/com/android/settings/applications/specialaccess/financialapps/FinancialAppsControllerTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package com.android.settings.applications.specialaccess.financialapps;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import static android.Manifest.permission.SMS_FINANCIAL_TRANSACTIONS;
-import static android.Manifest.permission.READ_SMS;
-
-import android.app.AppOpsManager;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.os.Build;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-import androidx.preference.SwitchPreference;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.shadow.api.Shadow;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-
-@RunWith(RobolectricTestRunner.class)
-public class FinancialAppsControllerTest {
-    @Mock
-    private PackageManager mPackageManager;
-    @Mock
-    private AppOpsManager mAppOpsManager;
-    @Mock
-    private PreferenceScreen mRoot;
-    @Mock
-    private Preference mPreference;
-
-    private Context mContext;
-    private PackageInfo mPackageInfoNoPermissionRequested;
-    private PackageInfo mPackageInfoPermissionRequestedQPlus;
-    private PackageInfo mPackageInfoPermissionRequestedPreQ;
-    private FinancialAppsController mController;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mContext = spy(RuntimeEnvironment.application);
-        when(mContext.getPackageManager()).thenReturn(mPackageManager);
-        when(mContext.getSystemService(AppOpsManager.class)).thenReturn(mAppOpsManager);
-
-        initializePackageInfos();
-
-        mController = new FinancialAppsController(mContext, "key");
-        mController.displayPreference(mRoot);
-    }
-
-    private void initializePackageInfos() {
-      mPackageInfoNoPermissionRequested = new PackageInfo();
-      mPackageInfoNoPermissionRequested.applicationInfo = new ApplicationInfo();
-
-      mPackageInfoPermissionRequestedQPlus = new PackageInfo();
-      mPackageInfoPermissionRequestedQPlus.applicationInfo = new ApplicationInfo();
-      // TODO(b/121161546): update after robolectric test support Q
-      //mPackageInfoPermissionRequestedQPlus.applicationInfo.targetSdkVersion =
-      //        Build.VERSION_CODES.Q;
-      mPackageInfoPermissionRequestedQPlus.applicationInfo.uid = 2001;
-      mPackageInfoPermissionRequestedQPlus.applicationInfo.nonLocalizedLabel = "QPLUS Package";
-      mPackageInfoPermissionRequestedQPlus.packageName = "QPLUS";
-      mPackageInfoPermissionRequestedQPlus.requestedPermissions =
-              new String[] {SMS_FINANCIAL_TRANSACTIONS};
-
-      mPackageInfoPermissionRequestedPreQ = new PackageInfo();
-      mPackageInfoPermissionRequestedPreQ.applicationInfo = new ApplicationInfo();
-      mPackageInfoPermissionRequestedPreQ.applicationInfo.targetSdkVersion = Build.VERSION_CODES.M;
-      mPackageInfoPermissionRequestedPreQ.applicationInfo.uid = 2002;
-      mPackageInfoPermissionRequestedPreQ.applicationInfo.nonLocalizedLabel = "PREQ Package";
-      mPackageInfoPermissionRequestedPreQ.packageName = "PREQ";
-      mPackageInfoPermissionRequestedPreQ.requestedPermissions = new String[] {READ_SMS};
-    }
-
-    @Test
-    public void isAvailable_true() {
-        assertThat(mController.isAvailable()).isTrue();
-    }
-
-    @Test
-    public void noPreferenceAddedWhenNoPackageRequestPermission() {
-        when(mPackageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS))
-            .thenReturn(new ArrayList<PackageInfo>(
-                    Arrays.asList(mPackageInfoNoPermissionRequested)));
-        mController.updateState(null);
-        assertThat(mController.mRoot.getPreferenceCount()).isEqualTo(0);
-    }
-
-    //TODO(b/121161546): Add these tests after robolectric test support Q
-    /*
-    @Test
-    public void preferenceAddedWhenPreQPackageRequestPermission() {
-        when(mPackageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS))
-            .thenReturn(new ArrayList<PackageInfo>(
-                    Arrays.asList(mPackageInfoPermissionRequestedPreQ)));
-        mController.updateState(null);
-        assertThat(mController.mRoot.getPreferenceCount()).isEqualTo(1);
-        SwitchPreference pref = (SwitchPreference) mController.mRoot.getPreference(0);
-        assertThat(pref).isNotNull();
-    }
-
-    @Test
-    public void preferenceAddedWhenQPlusPackageRequestPermission() {
-        when(mPackageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS))
-            .thenReturn(new ArrayList<PackageInfo>(
-                    Arrays.asList(mPackageInfoPermissionRequestedQPlus)));
-        mController.updateState(null);
-        assertThat(mController.mRoot.getPreferenceCount()).isEqualTo(1);
-        SwitchPreference pref = (SwitchPreference) mController.mRoot.getPreference(0);
-        assertThat(pref).isNotNull();
-        }*/
-}
