diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index d34dfeb..8077ee3 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -639,12 +639,7 @@
                 showDev, isAdmin)
                 || somethingChanged;
 
-        // For profiles, we want them to be included in the profile select dialog even if
-        // backup is not activated.
-        // For other users, enable/disable backup settings depending on whether backup is activated
-        // for the user.
-        boolean enableBackupTile = um.isManagedProfile()
-                || new BackupSettingsHelper(this).isBackupServiceActive();
+        boolean enableBackupTile = new BackupSettingsHelper(this).showBackupSettingsForUser();
         somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
                 UserBackupSettingsActivity.class.getName()), enableBackupTile, isAdmin)
                 || somethingChanged;
diff --git a/src/com/android/settings/backup/BackupInactivePreferenceController.java b/src/com/android/settings/backup/BackupInactivePreferenceController.java
index 83a0318..92a9487 100644
--- a/src/com/android/settings/backup/BackupInactivePreferenceController.java
+++ b/src/com/android/settings/backup/BackupInactivePreferenceController.java
@@ -28,6 +28,9 @@
 
     @Override
     public int getAvailabilityStatus() {
+        if (!new BackupSettingsHelper(mContext).showBackupSettingsForUser()) {
+            return AVAILABLE_UNSEARCHABLE;
+        }
         if (PrivacySettingsUtils.isInvisibleKey(mContext, PrivacySettingsUtils.BACKUP_INACTIVE)) {
             return UNSUPPORTED_ON_DEVICE;
         }
diff --git a/src/com/android/settings/backup/BackupSettingsHelper.java b/src/com/android/settings/backup/BackupSettingsHelper.java
index 1d3455b..ff4b0b5 100644
--- a/src/com/android/settings/backup/BackupSettingsHelper.java
+++ b/src/com/android/settings/backup/BackupSettingsHelper.java
@@ -50,6 +50,14 @@
         mContext = context;
     }
 
+    public boolean showBackupSettingsForUser() {
+        // For profiles, we want them to be included in the profile select dialog even if
+        // backup is not activated.
+        // For other users, enable/disable backup settings depending on whether backup is activated
+        // for the user.
+        return UserManager.get(mContext).isManagedProfile() || isBackupServiceActive();
+    }
+
     /**
      * If there is only one profile, show whether the backup is on or off.
      * Otherwise, show nothing.
diff --git a/src/com/android/settings/backup/UserBackupSettingsActivity.java b/src/com/android/settings/backup/UserBackupSettingsActivity.java
index 9baa9a3..dbbb135 100644
--- a/src/com/android/settings/backup/UserBackupSettingsActivity.java
+++ b/src/com/android/settings/backup/UserBackupSettingsActivity.java
@@ -98,7 +98,7 @@
      */
     public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
-                private static final String BACKUP_SEARCH_INDEX_KEY = "backup";
+                private static final String BACKUP_SEARCH_INDEX_KEY = "Backup";
 
                 @Override
                 public List<SearchIndexableRaw> getRawDataToIndex(Context context,
@@ -119,6 +119,15 @@
 
                     return result;
                 }
+
+                @Override
+                public List<String> getNonIndexableKeys(Context context) {
+                    final List<String> keys = super.getNonIndexableKeys(context);
+                    if (!new BackupSettingsHelper(context).showBackupSettingsForUser()) {
+                        keys.add(BACKUP_SEARCH_INDEX_KEY);
+                    }
+                    return keys;
+                }
             };
 
     @VisibleForTesting
diff --git a/tests/robotests/src/com/android/settings/backup/BackupInactivePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/backup/BackupInactivePreferenceControllerTest.java
index 1d8d028..669aabb 100644
--- a/tests/robotests/src/com/android/settings/backup/BackupInactivePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/backup/BackupInactivePreferenceControllerTest.java
@@ -31,8 +31,10 @@
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
+import static com.android.settings.backup.UserBackupSettingsActivityTest.ShadowBackupSettingsHelper;
+
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowPrivacySettingsUtils.class})
+@Config(shadows = {ShadowPrivacySettingsUtils.class, ShadowBackupSettingsHelper.class})
 public class BackupInactivePreferenceControllerTest {
     private Context mContext;
     private BackupInactivePreferenceController mController;
@@ -48,18 +50,32 @@
     @After
     public void tearDown() {
         ShadowPrivacySettingsUtils.reset();
+        ShadowBackupSettingsHelper.reset();
     }
 
     @Test
-    public void getAvailabilityStatus_isnotInvisibleKey_shouldBeAvailable() {
+    public void getAvailabilityStatus_isnotInvisibleKey_showBackup_shouldBeAvailable() {
         ShadowPrivacySettingsUtils.setIsInvisibleKey(false);
+        ShadowBackupSettingsHelper.showBackupSettingsForUser = true;
+
         assertThat(mController.getAvailabilityStatus())
                 .isEqualTo(BasePreferenceController.AVAILABLE);
     }
 
     @Test
+    public void getAvailabilityStatus_isnotInvisibleKey_dontShowBackup_shouldBeUnsearchable() {
+        ShadowPrivacySettingsUtils.setIsInvisibleKey(false);
+        ShadowBackupSettingsHelper.showBackupSettingsForUser = false;
+
+        assertThat(mController.getAvailabilityStatus())
+                .isEqualTo(BasePreferenceController.AVAILABLE_UNSEARCHABLE);
+    }
+
+    @Test
     public void getAvailabilityStatus_isInvisibleKey_shouldBeDisabledUnsupported() {
         ShadowPrivacySettingsUtils.setIsInvisibleKey(true);
+        ShadowBackupSettingsHelper.showBackupSettingsForUser = true;
+
         assertThat(mController.getAvailabilityStatus())
                 .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE);
     }
diff --git a/tests/robotests/src/com/android/settings/backup/UserBackupSettingsActivityTest.java b/tests/robotests/src/com/android/settings/backup/UserBackupSettingsActivityTest.java
index 19a6051..9c5a11a 100644
--- a/tests/robotests/src/com/android/settings/backup/UserBackupSettingsActivityTest.java
+++ b/tests/robotests/src/com/android/settings/backup/UserBackupSettingsActivityTest.java
@@ -29,7 +29,6 @@
 import android.content.ComponentName;
 import android.content.Intent;
 import android.content.pm.PackageManager;
-import android.os.UserHandle;
 
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
@@ -53,8 +52,7 @@
 import org.robolectric.shadows.ShadowPackageManager;
 
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = {UserBackupSettingsActivityTest.ShadowBackupSettingsHelper.class,
-                UserBackupSettingsActivityTest.ShadowUserHandle.class})
+@Config(shadows = {UserBackupSettingsActivityTest.ShadowBackupSettingsHelper.class})
 public class UserBackupSettingsActivityTest {
     private ActivityController<UserBackupSettingsActivity> mActivityController;
     private UserBackupSettingsActivity mActivity;
@@ -85,7 +83,7 @@
 
     @After
     public void resetShadows() {
-        ShadowUserHandle.reset();
+        ShadowBackupSettingsHelper.reset();
     }
 
     @Test
@@ -125,7 +123,9 @@
     }
 
     @Test
-    public void getNonIndexableKeys_SystemUser() {
+    public void getNonIndexableKeys_whenShowBackupSettings() {
+        ShadowBackupSettingsHelper.showBackupSettingsForUser = true;
+
         assertThat(UserBackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(
                 mApplication, true)).isNotEmpty();
         assertThat(UserBackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
@@ -133,17 +133,24 @@
     }
 
     @Test
-    public void getNonIndexableKeys_NonSystemUser() {
-        ShadowUserHandle.setUid(1); // Non-SYSTEM user.
+    public void getNonIndexableKeys_whenDontShowBackupSettings() {
+        ShadowBackupSettingsHelper.showBackupSettingsForUser = false;
 
         assertThat(UserBackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getRawDataToIndex(
             mApplication, true)).isNotEmpty();
         assertThat(UserBackupSettingsActivity.SEARCH_INDEX_DATA_PROVIDER.getNonIndexableKeys(
-            mApplication)).isEmpty();
+            mApplication)).contains("Backup");
     }
 
     @Implements(BackupSettingsHelper.class)
     public static class ShadowBackupSettingsHelper {
+        static boolean showBackupSettingsForUser = true;
+
+        @Implementation
+        public boolean showBackupSettingsForUser() {
+            return showBackupSettingsForUser;
+        }
+
         @Implementation
         protected Intent getIntentForBackupSettings() {
             return mIntent;
@@ -153,24 +160,10 @@
         protected boolean isBackupProvidedByManufacturer() {
             return mIsBackupProvidedByOEM;
         }
-    }
-
-    @Implements(UserHandle.class)
-    public static class ShadowUserHandle {
-        private static int sUid = 0; // SYSTEM by default
-
-        public static void setUid(int uid) {
-            sUid = uid;
-        }
-
-        @Implementation
-        protected static int myUserId() {
-            return sUid;
-        }
 
         @Resetter
         public static void reset() {
-            sUid = 0;
+            showBackupSettingsForUser = true;
         }
     }
 }
