diff options
author | 2024-08-27 14:18:24 -0700 | |
---|---|---|
committer | 2024-08-27 22:23:55 +0000 | |
commit | 73c754ae3575586f9548c4409b17a9c2485cd854 (patch) | |
tree | a2149fdbf4d67fa34db037fda1f18e90b6fd558b | |
parent | dce105ffc1f9d1f47df74f1930a07d9883b54a28 (diff) |
Refresh UI on user action even when permission usage data is same
UiState should have user action, so that the observed value
is different even when the permission usage data is same.
This allows livedata to notify observers and refresh ui.
also, removing unnecessary code for help icon.
Test: atest PermissionUsageViewModelTest PermissionUsageDetailsViewModelTest
Fix: 362567668
Flag: EXEMPT bug fix
Relnote: bug fix
Change-Id: I3950a4e51b01e323cc122f63b1137d04a85d3015
7 files changed, 92 insertions, 20 deletions
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageDetailsFragment.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageDetailsFragment.java index 8482545df..61693836a 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageDetailsFragment.java +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageDetailsFragment.java @@ -262,10 +262,9 @@ public class PermissionUsageDetailsFragment extends SettingsWithLargeHeader { setPreferenceScreen(screen); } screen.removeAll(); - boolean show7Days = mViewModel.getShow7Days(); Preference subtitlePreference = new Preference(context); - updateShow7DaysToggle(show7Days); - int usageSubtitle = show7Days + updateShow7DaysToggle(uiData.getShow7Days()); + int usageSubtitle = uiData.getShow7Days() ? R.string.permission_group_usage_subtitle_7d : R.string.permission_group_usage_subtitle_24h; @@ -282,7 +281,7 @@ public class PermissionUsageDetailsFragment extends SettingsWithLargeHeader { if (mHasSystemApps != containsSystemAppAccesses) { mHasSystemApps = containsSystemAppAccesses; } - updateShowSystemToggle(mViewModel.getShowSystem()); + updateShowSystemToggle(uiData.getShowSystem()); // Make these variables effectively final so that // we can use these captured variables in the below lambda expression diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageFragment.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageFragment.java index 633f18f5d..d99d531a0 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageFragment.java +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageFragment.java @@ -47,7 +47,6 @@ import com.android.permissioncontroller.permission.ui.viewmodel.v31.PermissionUs import com.android.permissioncontroller.permission.ui.viewmodel.v31.PermissionUsageViewModelFactory; import com.android.permissioncontroller.permission.ui.viewmodel.v31.PermissionUsagesUiState; import com.android.permissioncontroller.permission.utils.KotlinUtils; -import com.android.settingslib.HelpUtils; import java.util.ArrayList; import java.util.Comparator; @@ -217,8 +216,6 @@ public class PermissionUsageFragment extends SettingsWithLargeHeader { } mMenuItemsCreated = true; updateShowSystemToggle(mViewModel.getShowSystemApps()); - HelpUtils.prepareHelpMenuItem( - getActivity(), menu, R.string.help_permission_usage, getClass().getName()); } @Override @@ -318,7 +315,6 @@ public class PermissionUsageFragment extends SettingsWithLargeHeader { mSessionId, PERMISSION_USAGE_FRAGMENT_INTERACTION__ACTION__SEE_OTHER_PERMISSIONS_CLICKED); }); - boolean containsSystemAppUsages = permissionUsagesUiData.getContainsSystemAppUsage(); Map<String, Integer> permissionGroupWithUsageCounts = permissionUsagesUiData.getPermissionGroupUsageCount(); List<Map.Entry<String, Integer>> permissionGroupWithUsageCountsEntries = @@ -332,13 +328,14 @@ public class PermissionUsageFragment extends SettingsWithLargeHeader { mViewModel.getPermissionGroupLabel( context, permissionGroupWithUsageCount.getKey()))); + boolean containsSystemAppUsages = permissionUsagesUiData.getContainsSystemAppUsage(); if (mHasSystemApps != containsSystemAppUsages) { mHasSystemApps = containsSystemAppUsages; } - - boolean show7Days = mViewModel.getShow7DaysData(); + boolean show7Days = permissionUsagesUiData.getShow7Days(); + boolean showSystem = permissionUsagesUiData.getShowSystem(); updateShow7DaysToggle(show7Days); - updateShowSystemToggle(mViewModel.getShowSystemApps()); + updateShowSystemToggle(showSystem); mGraphic = new PermissionUsageGraphicPreference(context, show7Days); screen.addPreference(mGraphic); @@ -351,7 +348,8 @@ public class PermissionUsageFragment extends SettingsWithLargeHeader { getAdvancedInfoSummaryString(context, permissionGroupWithUsageCountsEntries); screen.setSummary(advancedInfoSummary); - addUIContent(context, permissionGroupWithUsageCountsEntries, category); + addUIContent(context, permissionGroupWithUsageCountsEntries, category, + showSystem, show7Days); } private CharSequence getAdvancedInfoSummaryString( @@ -404,10 +402,10 @@ public class PermissionUsageFragment extends SettingsWithLargeHeader { private void addUIContent( Context context, List<Map.Entry<String, Integer>> permissionGroupWithUsageCounts, - PreferenceCategory category) { - boolean showSystem = mViewModel.getShowSystemApps(); - boolean show7Days = mViewModel.getShow7DaysData(); - + PreferenceCategory category, + boolean showSystem, + boolean show7Days + ) { for (int i = 0; i < permissionGroupWithUsageCounts.size(); i++) { Map.Entry<String, Integer> permissionGroupWithUsageCount = permissionGroupWithUsageCounts.get(i); diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt index b2f50be0e..849ce3c8c 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt @@ -125,7 +125,9 @@ class PermissionUsageDetailsViewModel( startTime, showSystem ), - containsSystemAppUsages(allLightHistoricalPackageOpsLiveData, startTime) + containsSystemAppUsages(allLightHistoricalPackageOpsLiveData, startTime), + showSystem, + show7Days ) } @@ -571,6 +573,8 @@ class PermissionUsageDetailsViewModel( data class Success( val appPermissionAccessUiInfoList: List<AppPermissionAccessUiInfo>, val containsSystemAppUsage: Boolean, + val showSystem: Boolean, + val show7Days: Boolean, ) : PermissionUsageDetailsUiState() } diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModelV2.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModelV2.kt index 6808cf263..15ed88683 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModelV2.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModelV2.kt @@ -157,7 +157,12 @@ class PermissionUsageDetailsViewModelV2( ) } .sortedBy { -1 * it.accessStartTime } - return PermissionUsageDetailsUiState.Success(result, containsSystemUsages) + return PermissionUsageDetailsUiState.Success( + result, + containsSystemUsages, + showSystem, + show7Days + ) } private val emergencyLocationAttributionLabel: String by lazy { diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/viewmodel/v31/PermissionUsageViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/viewmodel/v31/PermissionUsageViewModel.kt index e1be94866..c1929dd42 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/viewmodel/v31/PermissionUsageViewModel.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/viewmodel/v31/PermissionUsageViewModel.kt @@ -132,7 +132,9 @@ class PermissionUsageViewModel( } return PermissionUsagesUiState.Success( permGroupOps.any { !it.isUserSensitive }, - permissionUsageCountMap + permissionUsageCountMap, + showSystemApps, + show7DaysData ) } @@ -181,7 +183,9 @@ sealed class PermissionUsagesUiState { data class Success( val containsSystemAppUsage: Boolean, - val permissionGroupUsageCount: Map<String, Int> + val permissionGroupUsageCount: Map<String, Int>, + val showSystem: Boolean, + val show7Days: Boolean, ) : PermissionUsagesUiState() } diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/ui/model/PermissionUsageDetailsViewModelTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/ui/model/PermissionUsageDetailsViewModelTest.kt index 25ae74e40..c387a0b9b 100644 --- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/ui/model/PermissionUsageDetailsViewModelTest.kt +++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/ui/model/PermissionUsageDetailsViewModelTest.kt @@ -450,6 +450,40 @@ class PermissionUsageDetailsViewModelTest { assertThat(uiState.appPermissionAccessUiInfoList.size).isEqualTo(1) } + @Test + fun verifyObserverIsNotifiedOnUserActionWhenDataIsSame() = runTest { + val accessTimeMillis = (getCurrentTime() - TimeUnit.HOURS.toMillis(2)) + val appOpEvents = + listOf( + DiscreteOpModel( + AppOpsManager.OPSTR_COARSE_LOCATION, + accessTimeMillis, + TimeUnit.MINUTES.toMillis(1) + ), + ) + + val discretePackageOps = flow { + emit( + listOf( + DiscretePackageOpsModel(testPackageName, currentUser.identifier, appOpEvents), + ) + ) + } + val underTest = + getViewModel( + LOCATION_PERMISSION_GROUP, + discretePackageOps, + ) + + val uiState = getPermissionUsageDetailsUiState(underTest) + assertThat(uiState.show7Days).isFalse() + + // perform user action + underTest.updateShow7DaysToggle(true) + val uiState2 = getPermissionUsageDetailsUiState(underTest) + assertThat(uiState2.show7Days).isTrue() + } + private fun getPermissionGroupUsageDetailsUseCase( permissionGroup: String, discreteUsageFlow: Flow<List<DiscretePackageOpsModel>>, diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/ui/model/PermissionUsageViewModelTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/ui/model/PermissionUsageViewModelTest.kt index 1356da2a6..fdd6534f5 100644 --- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/ui/model/PermissionUsageViewModelTest.kt +++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/ui/model/PermissionUsageViewModelTest.kt @@ -216,6 +216,34 @@ class PermissionUsageViewModelTest { assertThat(permissionGroupsCount[MICROPHONE_PERMISSION_GROUP]).isEqualTo(1) } + @Test + fun verifyObserverIsNotifiedOnUserActionWhenDataIsSame() = runTest { + val timestamp = System.currentTimeMillis() - TimeUnit.HOURS.toMillis(2) + val appOpsUsage = + listOf( + AppOpUsageModel(AppOpsManager.OPSTR_CAMERA, timestamp), + AppOpUsageModel(AppOpsManager.OPSTR_PHONE_CALL_MICROPHONE, timestamp), + ) + val appOpsUsageModels = + listOf( + PackageAppOpUsageModel(testPackageName, appOpsUsage, currentUser.identifier), + ) + val permissionUsageUseCase = getPermissionGroupUsageUseCase(appOpsUsageModels) + val permissionUsageViewModel = + getViewModel( + useCase = permissionUsageUseCase, + savedStateHandle = SavedStateHandle(mapOf("show7Days" to false)) + ) + + val uiState = getPermissionUsageUiState(permissionUsageViewModel) + assertThat(uiState.show7Days).isFalse() + + // perform user action + permissionUsageViewModel.updateShow7Days(true) + val uiState2 = getPermissionUsageUiState(permissionUsageViewModel) + assertThat(uiState2.show7Days).isTrue() + } + private fun TestScope.getViewModel( useCase: GetPermissionGroupUsageUseCase = getPermissionGroupUsageUseCase(), is7DayToggleEnabled: Boolean = false, |