From 2512aa1ed63e976cf6505215b105048eac8b78c3 Mon Sep 17 00:00:00 2001 From: Joel Galenson Date: Wed, 27 Mar 2019 10:19:27 -0700 Subject: [PATCH] Add tiebreak rules for bar chart permissions. If multiple permissions have been used by the same number of apps, we apply a stable tiebreak so we can be consistent in different places. We prefer location, then microphone, then camera, and everything else is alphabetical. Test: View chart with ties. Test: atest PermissionBarChartPreferenceControllerTest Change-Id: I035ac19391788cc720e1c832bf8bd5a60d31e8ad --- .../PermissionBarChartPreferenceController.java | 28 +++++++++++++++++-- ...PermissionBarChartPreferenceControllerTest.java | 31 ++++++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java b/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java index b47ad9cc22..2920dcf271 100644 --- a/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java +++ b/src/com/android/settings/privacy/PermissionBarChartPreferenceController.java @@ -16,6 +16,10 @@ package com.android.settings.privacy; +import static android.Manifest.permission_group.CAMERA; +import static android.Manifest.permission_group.LOCATION; +import static android.Manifest.permission_group.MICROPHONE; + import static com.android.settingslib.widget.BarChartPreference.MAXIMUM_BAR_VIEWS; import static java.util.concurrent.TimeUnit.DAYS; @@ -131,8 +135,28 @@ public class PermissionBarChartPreferenceController extends BasePreferenceContro @Override public void onPermissionUsageResult(@NonNull List usageInfos) { - usageInfos.sort(Comparator.comparingInt( - RuntimePermissionUsageInfo::getAppAccessCount).reversed()); + usageInfos.sort((x, y) -> { + int usageDiff = y.getAppAccessCount() - x.getAppAccessCount(); + if (usageDiff != 0) { + return usageDiff; + } + String xName = x.getName(); + String yName = y.getName(); + if (xName.equals(LOCATION)) { + return -1; + } else if (yName.equals(LOCATION)) { + return 1; + } else if (xName.equals(MICROPHONE)) { + return -1; + } else if (yName.equals(MICROPHONE)) { + return 1; + } else if (xName.equals(CAMERA)) { + return -1; + } else if (yName.equals(CAMERA)) { + return 1; + } + return x.getName().compareTo(y.getName()); + }); // If the result is different, we need to update bar views. if (!areSamePermissionGroups(usageInfos)) { diff --git a/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java index 332156e8b9..988816897a 100644 --- a/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/privacy/PermissionBarChartPreferenceControllerTest.java @@ -16,6 +16,14 @@ package com.android.settings.privacy; +import static android.Manifest.permission_group.CALENDAR; +import static android.Manifest.permission_group.CAMERA; +import static android.Manifest.permission_group.CONTACTS; +import static android.Manifest.permission_group.LOCATION; +import static android.Manifest.permission_group.MICROPHONE; +import static android.Manifest.permission_group.PHONE; +import static android.Manifest.permission_group.SMS; + import static com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEARCHABLE; import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE; @@ -221,4 +229,27 @@ public class PermissionBarChartPreferenceControllerTest { 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); + } } -- 2.11.0