diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 75db3e1..c4b1400 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -131,11 +131,6 @@
             "device_identifier_access_restrictions_disabled";
 
     /**
-     * Whether to show the Permissions Hub.
-     */
-    public static final String PROPERTY_PERMISSIONS_HUB_ENABLED = "permissions_hub_enabled";
-
-    /**
      * Finds a matching activity for a preference's intent. If a matching
      * activity is not found, it will remove the preference.
      *
diff --git a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
index c835a51..2f0dafd 100644
--- a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
+++ b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
@@ -64,9 +64,7 @@
 
     @Override
     public boolean isAvailable() {
-        return Boolean.parseBoolean(
-                DeviceConfig.getProperty(DeviceConfig.NAMESPACE_PRIVACY,
-                        Utils.PROPERTY_PERMISSIONS_HUB_ENABLED));
+        return false;
     }
 
     @Override
diff --git a/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java b/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java
index 399216c..28533df 100644
--- a/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java
+++ b/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java
@@ -89,10 +89,7 @@
 
     @Override
     public int getAvailabilityStatus() {
-        return Boolean.parseBoolean(
-                DeviceConfig.getProperty(DeviceConfig.NAMESPACE_PRIVACY,
-                        com.android.settings.Utils.PROPERTY_PERMISSIONS_HUB_ENABLED)) ?
-                AVAILABLE_UNSEARCHABLE : UNSUPPORTED_ON_DEVICE;
+        return UNSUPPORTED_ON_DEVICE;
     }
 
     @Override
diff --git a/tests/robotests/src/com/android/settings/location/RecentLocationAccessPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/RecentLocationAccessPreferenceControllerTest.java
index 71a80de..aeda699 100644
--- a/tests/robotests/src/com/android/settings/location/RecentLocationAccessPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/location/RecentLocationAccessPreferenceControllerTest.java
@@ -92,75 +92,4 @@
         // We have not yet set the property to show the Permissions Hub.
         assertThat(mController.isAvailable()).isEqualTo(false);
     }
-
-    @Test
-    public void isAvailable_permissionHubEnabled_shouldReturnTrue() {
-        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_PRIVACY,
-                Utils.PROPERTY_PERMISSIONS_HUB_ENABLED, "true", true);
-
-        assertThat(mController.isAvailable()).isEqualTo(true);
-    }
-
-    /** Verifies the title text, details text are correct, and the click listener is set. */
-    @Test
-    @Ignore
-    public void updateState_whenAppListIsEmpty_shouldDisplayTitleTextAndDetailsText() {
-        doReturn(new ArrayList<>()).when(mRecentLocationApps).getAppListSorted();
-        mController.displayPreference(mScreen);
-        mController.updateState(mLayoutPreference);
-
-        final TextView title = mAppEntitiesHeaderView.findViewById(R.id.header_title);
-        assertThat(title.getText()).isEqualTo(
-                mContext.getText(R.string.location_category_recent_location_access));
-        final TextView details = mAppEntitiesHeaderView.findViewById(R.id.header_details);
-        assertThat(details.getText()).isEqualTo(
-                mContext.getText(R.string.location_recent_location_access_view_details));
-        assertThat(details.hasOnClickListeners()).isTrue();
-    }
-
-    @Test
-    public void updateState_whenAppListMoreThanThree_shouldDisplayTopThreeApps() {
-        final List<RecentLocationAccesses.Access> accesses = createMockAccesses(6);
-        doReturn(accesses).when(mRecentLocationApps).getAppListSorted();
-        mController.displayPreference(mScreen);
-        mController.updateState(mLayoutPreference);
-
-        // The widget can display the top 3 apps from the list when there're more than 3.
-        final View app1View = mAppEntitiesHeaderView.findViewById(R.id.app1_view);
-        final ImageView appIconView1 = app1View.findViewById(R.id.app_icon);
-        final TextView appTitle1 = app1View.findViewById(R.id.app_title);
-
-        assertThat(app1View.getVisibility()).isEqualTo(View.VISIBLE);
-        assertThat(appIconView1.getDrawable()).isNotNull();
-        assertThat(appTitle1.getText()).isEqualTo("appTitle0");
-
-        final View app2View = mAppEntitiesHeaderView.findViewById(R.id.app2_view);
-        final ImageView appIconView2 = app2View.findViewById(R.id.app_icon);
-        final TextView appTitle2 = app2View.findViewById(R.id.app_title);
-
-        assertThat(app2View.getVisibility()).isEqualTo(View.VISIBLE);
-        assertThat(appIconView2.getDrawable()).isNotNull();
-        assertThat(appTitle2.getText()).isEqualTo("appTitle1");
-
-        final View app3View = mAppEntitiesHeaderView.findViewById(R.id.app3_view);
-        final ImageView appIconView3 = app3View.findViewById(R.id.app_icon);
-        final TextView appTitle3 = app3View.findViewById(R.id.app_title);
-
-        assertThat(app3View.getVisibility()).isEqualTo(View.VISIBLE);
-        assertThat(appIconView3.getDrawable()).isNotNull();
-        assertThat(appTitle3.getText()).isEqualTo("appTitle2");
-    }
-
-    private List<RecentLocationAccesses.Access> createMockAccesses(int count) {
-        final List<RecentLocationAccesses.Access> accesses = new ArrayList<>();
-        for (int i = 0; i < count; i++) {
-            final Drawable icon = mock(Drawable.class);
-            // Add mock accesses
-            final RecentLocationAccesses.Access access = new RecentLocationAccesses.Access(
-                    "packageName", android.os.Process.myUserHandle(), icon,
-                    "appTitle" + i, "appSummary" + i, 1000 - i);
-            accesses.add(access);
-        }
-        return accesses;
-    }
 }
diff --git a/tests/robotests/src/com/android/settings/privacy/AccessibilityUsagePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/privacy/AccessibilityUsagePreferenceControllerTest.java
index 33109b0..d75bf4b 100644
--- a/tests/robotests/src/com/android/settings/privacy/AccessibilityUsagePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/privacy/AccessibilityUsagePreferenceControllerTest.java
@@ -65,8 +65,6 @@
 
     @Test
     public void getAvailabilityStatus_noEnabledServices_shouldReturnUnsupported() {
-        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_PRIVACY,
-                Utils.PROPERTY_PERMISSIONS_HUB_ENABLED, "true", true);
         mAccessibilityManager.setEnabledAccessibilityServiceList(new ArrayList<>());
         AccessibilityUsagePreferenceController controller =
                 new AccessibilityUsagePreferenceController(mContext, "test_key");
@@ -76,8 +74,6 @@
 
     @Test
     public void getAvailabilityStatus_enabledServices_shouldReturnAvailable() {
-        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_PRIVACY,
-                Utils.PROPERTY_PERMISSIONS_HUB_ENABLED, "false", true);
         mAccessibilityManager.setEnabledAccessibilityServiceList(
                 new ArrayList<>(Arrays.asList(new AccessibilityServiceInfo())));
         AccessibilityUsagePreferenceController controller =
diff --git a/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java
index dc824ed..1335db5 100644
--- a/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java
@@ -117,144 +117,4 @@
         // We have not yet set the property to show the Permissions Hub.
         assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
     }
-
-    @Test
-    public void getAvailabilityStatus_permissionHubEnabled_shouldReturnAvailableUnsearchable() {
-        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_PRIVACY,
-                Utils.PROPERTY_PERMISSIONS_HUB_ENABLED,
-                "true", true);
-
-        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE_UNSEARCHABLE);
-    }
-
-    @Test
-    public void displayPreference_shouldInitializeBarChart() {
-        mController.displayPreference(mScreen);
-
-        verify(mPreference).initializeBarChart(any(BarChartInfo.class));
-    }
-
-    @Test
-    public void displayPreference_usageInfosSet_shouldSetBarViewInfos() {
-        final RuntimePermissionUsageInfo info1 =
-                new RuntimePermissionUsageInfo("permission 1", 10);
-        mController.mOldUsageInfos.add(info1);
-
-        mController.displayPreference(mScreen);
-
-        verify(mPreference).setBarViewInfos(any(BarViewInfo[].class));
-        verify(mPreference).initializeBarChart(any(BarChartInfo.class));
-    }
-
-    @Test
-    public void onPermissionUsageResult_differentPermissionResultSet_shouldSetBarViewInfos() {
-        final List<RuntimePermissionUsageInfo> infos1 = new ArrayList<>();
-        final RuntimePermissionUsageInfo info1 =
-                new RuntimePermissionUsageInfo("permission 1", 10);
-        infos1.add(info1);
-        mController.displayPreference(mScreen);
-        mController.onPermissionUsageResult(infos1);
-
-        verify(mPreference).setBarViewInfos(any(BarViewInfo[].class));
-
-        final List<RuntimePermissionUsageInfo> infos2 = new ArrayList<>();
-        final RuntimePermissionUsageInfo info2 =
-                new RuntimePermissionUsageInfo("permission 2", 20);
-        infos2.add(info2);
-        mController.onPermissionUsageResult(infos2);
-
-        verify(mPreference, times(2)).setBarViewInfos(any(BarViewInfo[].class));
-    }
-
-    @Test
-    public void onPermissionUsageResult_samePermissionResultSet_shouldNotSetBarViewInfos() {
-        final List<RuntimePermissionUsageInfo> mInfos = new ArrayList<>();
-        final RuntimePermissionUsageInfo info1 =
-                new RuntimePermissionUsageInfo("permission 1", 10);
-        mInfos.add(info1);
-        mController.displayPreference(mScreen);
-        mController.onPermissionUsageResult(mInfos);
-
-        mController.onPermissionUsageResult(mInfos);
-
-        verify(mPreference, times(1)).setBarViewInfos(any(BarViewInfo[].class));
-    }
-
-    @Test
-    public void onStart_usageInfosNotSetAndPermissionHubEnabled_shouldShowProgressBar() {
-        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_PRIVACY,
-                Utils.PROPERTY_PERMISSIONS_HUB_ENABLED,
-                "true", true);
-        mController.displayPreference(mScreen);
-
-        mController.onStart();
-
-        verify(mFragment).setLoadingEnabled(true /* enabled */);
-        verify(mPreference).updateLoadingState(true /* isLoading */);
-    }
-
-    @Test
-    public void onStart_usageInfosSetAndPermissionHubEnabled_shouldNotUpdatePrefLoadingState() {
-        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_PRIVACY,
-                Utils.PROPERTY_PERMISSIONS_HUB_ENABLED,
-                "true", true);
-        final RuntimePermissionUsageInfo info1 =
-                new RuntimePermissionUsageInfo("permission 1", 10);
-        mController.mOldUsageInfos.add(info1);
-        mController.displayPreference(mScreen);
-
-        mController.onStart();
-
-        verify(mFragment).setLoadingEnabled(true /* enabled */);
-        verify(mPreference).updateLoadingState(false /* isLoading */);
-    }
-
-    @Test
-    public void onStart_permissionHubDisabled_shouldNotShowProgressBar() {
-        DeviceConfig.setProperty(DeviceConfig.NAMESPACE_PRIVACY,
-                Utils.PROPERTY_PERMISSIONS_HUB_ENABLED,
-                "false", true);
-
-        mController.onStart();
-
-        verify(mFragment, never()).setLoadingEnabled(true /* enabled */);
-        verify(mPreference, never()).updateLoadingState(true /* isLoading */);
-    }
-
-    @Test
-    public void onPermissionUsageResult_shouldHideProgressBar() {
-        final List<RuntimePermissionUsageInfo> infos1 = new ArrayList<>();
-        final RuntimePermissionUsageInfo info1 =
-                new RuntimePermissionUsageInfo("permission 1", 10);
-        infos1.add(info1);
-        mController.displayPreference(mScreen);
-
-        mController.onPermissionUsageResult(infos1);
-
-        verify(mFragment).setLoadingEnabled(false /* enabled */);
-        verify(mPreference).updateLoadingState(false /* isLoading */);
-    }
-
-    @Test
-    public void onPermissionUsageResult_shouldBeSorted() {
-        final List<RuntimePermissionUsageInfo> infos = new ArrayList<>();
-        infos.add(new RuntimePermissionUsageInfo(PHONE, 10));
-        infos.add(new RuntimePermissionUsageInfo(LOCATION, 10));
-        infos.add(new RuntimePermissionUsageInfo(CAMERA, 10));
-        infos.add(new RuntimePermissionUsageInfo(SMS, 1));
-        infos.add(new RuntimePermissionUsageInfo(MICROPHONE, 10));
-        infos.add(new RuntimePermissionUsageInfo(CONTACTS, 42));
-        infos.add(new RuntimePermissionUsageInfo(CALENDAR, 10));
-        mController.displayPreference(mScreen);
-
-        mController.onPermissionUsageResult(infos);
-
-        assertThat(infos.get(0).getName()).isEqualTo(CONTACTS);
-        assertThat(infos.get(1).getName()).isEqualTo(LOCATION);
-        assertThat(infos.get(2).getName()).isEqualTo(MICROPHONE);
-        assertThat(infos.get(3).getName()).isEqualTo(CAMERA);
-        assertThat(infos.get(4).getName()).isEqualTo(CALENDAR);
-        assertThat(infos.get(5).getName()).isEqualTo(PHONE);
-        assertThat(infos.get(6).getName()).isEqualTo(SMS);
-    }
 }
