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
This commit is contained in:
@@ -16,6 +16,10 @@
|
|||||||
|
|
||||||
package com.android.settings.privacy;
|
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 com.android.settingslib.widget.BarChartPreference.MAXIMUM_BAR_VIEWS;
|
||||||
|
|
||||||
import static java.util.concurrent.TimeUnit.DAYS;
|
import static java.util.concurrent.TimeUnit.DAYS;
|
||||||
@@ -131,8 +135,28 @@ public class PermissionBarChartPreferenceController extends BasePreferenceContro
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPermissionUsageResult(@NonNull List<RuntimePermissionUsageInfo> usageInfos) {
|
public void onPermissionUsageResult(@NonNull List<RuntimePermissionUsageInfo> usageInfos) {
|
||||||
usageInfos.sort(Comparator.comparingInt(
|
usageInfos.sort((x, y) -> {
|
||||||
RuntimePermissionUsageInfo::getAppAccessCount).reversed());
|
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 the result is different, we need to update bar views.
|
||||||
if (!areSamePermissionGroups(usageInfos)) {
|
if (!areSamePermissionGroups(usageInfos)) {
|
||||||
|
@@ -16,6 +16,14 @@
|
|||||||
|
|
||||||
package com.android.settings.privacy;
|
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.AVAILABLE_UNSEARCHABLE;
|
||||||
import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
|
import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
|
||||||
|
|
||||||
@@ -221,4 +229,27 @@ public class PermissionBarChartPreferenceControllerTest {
|
|||||||
verify(mFragment).setLoadingEnabled(false /* enabled */);
|
verify(mFragment).setLoadingEnabled(false /* enabled */);
|
||||||
verify(mPreference).updateLoadingState(false /* isLoading */);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user