From 2118f8a63faee85a08675b4a028d0b5746b33417 Mon Sep 17 00:00:00 2001 From: Joel Galenson Date: Fri, 31 May 2019 07:54:20 -0700 Subject: [PATCH] Revert "Remove Permissions Hub." This reverts commit 1e7c172ad5704754266bee50a9bc59b3205e8b70. Bug: 132292477 Test: None. Change-Id: Icae2cd4edbb22e2f3ea72e20f0ebd818f1ac6629 --- src/com/android/settings/Utils.java | 5 + ...entLocationAccessPreferenceController.java | 4 +- ...ermissionBarChartPreferenceController.java | 5 +- ...ocationAccessPreferenceControllerTest.java | 71 +++++++++ ...sibilityUsagePreferenceControllerTest.java | 4 + ...ssionBarChartPreferenceControllerTest.java | 140 ++++++++++++++++++ 6 files changed, 227 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index c4b1400f5c6..75db3e18188 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -130,6 +130,11 @@ public final class Utils extends com.android.settingslib.Utils { public static final String PROPERTY_DEVICE_IDENTIFIER_ACCESS_RESTRICTIONS_DISABLED = "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 2f0dafdf6c3..c835a514b1a 100644 --- a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java +++ b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java @@ -64,7 +64,9 @@ public class RecentLocationAccessPreferenceController extends AbstractPreference @Override public boolean isAvailable() { - return false; + return Boolean.parseBoolean( + DeviceConfig.getProperty(DeviceConfig.NAMESPACE_PRIVACY, + Utils.PROPERTY_PERMISSIONS_HUB_ENABLED)); } @Override diff --git a/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java b/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java index 28533df03a4..399216c3466 100644 --- a/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java +++ b/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java @@ -89,7 +89,10 @@ public class PermissionBarChartPreferenceController extends BasePreferenceContro @Override public int getAvailabilityStatus() { - return UNSUPPORTED_ON_DEVICE; + return Boolean.parseBoolean( + DeviceConfig.getProperty(DeviceConfig.NAMESPACE_PRIVACY, + com.android.settings.Utils.PROPERTY_PERMISSIONS_HUB_ENABLED)) ? + AVAILABLE_UNSEARCHABLE : 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 aeda699fe29..71a80de0689 100644 --- a/tests/robotests/src/com/android/settings/location/RecentLocationAccessPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/location/RecentLocationAccessPreferenceControllerTest.java @@ -92,4 +92,75 @@ public class RecentLocationAccessPreferenceControllerTest { // 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 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 createMockAccesses(int count) { + final List 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 d75bf4bf955..33109b0638d 100644 --- a/tests/robotests/src/com/android/settings/privacy/AccessibilityUsagePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/privacy/AccessibilityUsagePreferenceControllerTest.java @@ -65,6 +65,8 @@ public class AccessibilityUsagePreferenceControllerTest { @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"); @@ -74,6 +76,8 @@ public class AccessibilityUsagePreferenceControllerTest { @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 1335db5c5ed..dc824ed04f7 100644 --- a/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java @@ -117,4 +117,144 @@ public class PermissionBarChartPreferenceControllerTest { // 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 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 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 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 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 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); + } }