diff options
author | 2024-08-14 16:27:05 +0000 | |
---|---|---|
committer | 2024-08-16 21:35:22 +0000 | |
commit | add8c80a67434d2d8da8a5cbd23b666bd77ce595 (patch) | |
tree | c7e370421269a2826f2b2aa68e5ae03b2e4c247b /service/java/com | |
parent | c34781ec8df432130b4857d8e5409c00857d2501 (diff) |
Make issue-only source affect the status light of group.
Requested by UX for ODAD integration.
Bug: 356910111
Test: atest SafetyCenterFunctionalTestCases
Relnote: N/A
Flag: com.android.permission.flags.safety_center_issue_only_affects_group_status
Change-Id: I20baa3bcf185220834173c940423ca9591494c1f
LOW_COVERAGE_REASON=b/356910111
Diffstat (limited to 'service/java/com')
-rw-r--r-- | service/java/com/android/safetycenter/SafetyCenterDataFactory.java | 112 |
1 files changed, 92 insertions, 20 deletions
diff --git a/service/java/com/android/safetycenter/SafetyCenterDataFactory.java b/service/java/com/android/safetycenter/SafetyCenterDataFactory.java index 7c7ade3f1..7f4e2e166 100644 --- a/service/java/com/android/safetycenter/SafetyCenterDataFactory.java +++ b/service/java/com/android/safetycenter/SafetyCenterDataFactory.java @@ -17,7 +17,6 @@ package com.android.safetycenter; import static android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE; -import static android.os.Build.VERSION_CODES.VANILLA_ICE_CREAM; import static com.android.safetycenter.UserProfileGroup.PROFILE_TYPE_MANAGED; import static com.android.safetycenter.UserProfileGroup.PROFILE_TYPE_PRIMARY; @@ -388,6 +387,8 @@ public final class SafetyCenterDataFactory { SafetySourcesGroup safetySourcesGroup, String defaultPackageName, UserProfileGroup userProfileGroup) { + HighestSeverityIssueOnlyIssue highestSeverityIssueOnlyIssue = + new HighestSeverityIssueOnlyIssue(); int groupSafetyCenterEntryLevel = SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNSPECIFIED; List<SafetySource> safetySources = safetySourcesGroup.getSafetySources(); @@ -415,6 +416,7 @@ public final class SafetyCenterDataFactory { groupSafetyCenterEntryLevel, addSafetyCenterEntry( safetyCenterOverallState, + highestSeverityIssueOnlyIssue, entries, safetySource, defaultPackageName, @@ -436,7 +438,10 @@ public final class SafetyCenterDataFactory { CharSequence groupSummary = getSafetyCenterEntryGroupSummary( - safetySourcesGroup, groupSafetyCenterEntryLevel, entries); + safetySourcesGroup, + groupSafetyCenterEntryLevel, + entries, + highestSeverityIssueOnlyIssue); safetyCenterEntryOrGroups.add( new SafetyCenterEntryOrGroup( new SafetyCenterEntryGroup.Builder( @@ -471,7 +476,8 @@ public final class SafetyCenterDataFactory { private CharSequence getSafetyCenterEntryGroupSummary( SafetySourcesGroup safetySourcesGroup, @SafetyCenterEntry.EntrySeverityLevel int groupSafetyCenterEntryLevel, - List<SafetyCenterEntry> entries) { + List<SafetyCenterEntry> entries, + HighestSeverityIssueOnlyIssue highestSeverityIssueOnlyIssue) { switch (groupSafetyCenterEntryLevel) { case SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_CRITICAL_WARNING: case SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_RECOMMENDATION: @@ -500,6 +506,16 @@ public final class SafetyCenterDataFactory { } } + SafetySourceIssue highestSeverityIssueOnlySafetySourceIssue = + highestSeverityIssueOnlyIssue.mSafetySourceIssue; + if (highestSeverityIssueOnlySafetySourceIssue != null + && toSafetyCenterEntrySeverityLevel( + highestSeverityIssueOnlySafetySourceIssue + .getSeverityLevel()) + == groupSafetyCenterEntryLevel) { + return highestSeverityIssueOnlySafetySourceIssue.getTitle(); + } + return getDefaultGroupSummary(safetySourcesGroup, entries); case SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNSPECIFIED: return getDefaultGroupSummary(safetySourcesGroup, entries); @@ -554,6 +570,7 @@ public final class SafetyCenterDataFactory { @SafetyCenterEntry.EntrySeverityLevel private int addSafetyCenterEntry( SafetyCenterOverallState safetyCenterOverallState, + HighestSeverityIssueOnlyIssue highestSeverityIssueOnlyIssue, List<SafetyCenterEntry> entries, SafetySource safetySource, String defaultPackageName, @@ -562,13 +579,10 @@ public final class SafetyCenterDataFactory { boolean isUserRunning) { SafetyCenterEntry safetyCenterEntry = toSafetyCenterEntry( - safetySource, - defaultPackageName, - userId, - profileType, - isUserRunning); + safetySource, defaultPackageName, userId, profileType, isUserRunning); if (safetyCenterEntry == null) { - return SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNSPECIFIED; + return getSafetyCenterEntrySeverityLevelFromIssues( + highestSeverityIssueOnlyIssue, safetySource, userId, isUserRunning); } safetyCenterOverallState.addEntryOverallSeverityLevel( @@ -579,6 +593,64 @@ public final class SafetyCenterDataFactory { return safetyCenterEntry.getSeverityLevel(); } + @SafetyCenterEntry.EntrySeverityLevel + private int getSafetyCenterEntrySeverityLevelFromIssues( + HighestSeverityIssueOnlyIssue highestSeverityIssueOnlyIssue, + SafetySource safetySource, + @UserIdInt int userId, + boolean isUserRunning) { + if (!Flags.safetyCenterIssueOnlyAffectsGroupStatus()) { + return SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNSPECIFIED; + } + if (safetySource.getType() != SafetySource.SAFETY_SOURCE_TYPE_ISSUE_ONLY) { + return SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNSPECIFIED; + } + if (!isUserRunning) { + // Issues don't show for non-running users. + return SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNSPECIFIED; + } + SafetySourceKey key = SafetySourceKey.of(safetySource.getId(), userId); + SafetySourceData safetySourceData = + mSafetyCenterDataManager.getSafetySourceDataInternal(key); + if (safetySourceData == null) { + return SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNSPECIFIED; + } + List<SafetySourceIssue> safetySourceIssues = safetySourceData.getIssues(); + int safetyCenterEntrySeverityLevel = SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNSPECIFIED; + for (int i = 0; i < safetySourceIssues.size(); i++) { + SafetySourceIssue safetySourceIssue = safetySourceIssues.get(i); + + SafetyCenterIssueKey safetyCenterIssueKey = + SafetyCenterIssueKey.newBuilder() + .setSafetySourceId(safetySource.getId()) + .setSafetySourceIssueId(safetySourceIssue.getId()) + .setUserId(userId) + .build(); + + int safetySourceIssueSeverityLevel = safetySourceIssue.getSeverityLevel(); + + if (mSafetyCenterDataManager.isIssueDismissed( + safetyCenterIssueKey, safetySourceIssueSeverityLevel)) { + continue; + } + + SafetySourceIssue highestSeverityIssueOnlySafetySourceIssue = + highestSeverityIssueOnlyIssue.mSafetySourceIssue; + if (highestSeverityIssueOnlySafetySourceIssue == null + || safetySourceIssueSeverityLevel + > highestSeverityIssueOnlySafetySourceIssue.getSeverityLevel()) { + highestSeverityIssueOnlyIssue.mSafetySourceIssue = safetySourceIssue; + } + + safetyCenterEntrySeverityLevel = + mergeSafetyCenterEntrySeverityLevels( + safetyCenterEntrySeverityLevel, + toSafetyCenterEntrySeverityLevel(safetySourceIssueSeverityLevel)); + } + + return safetyCenterEntrySeverityLevel; + } + @Nullable private SafetyCenterEntry toSafetyCenterEntry( SafetySource safetySource, @@ -783,11 +855,7 @@ public final class SafetyCenterDataFactory { boolean isUserRunning) { SafetyCenterStaticEntry staticEntry = toSafetyCenterStaticEntry( - safetySource, - defaultPackageName, - userId, - profileType, - isUserRunning); + safetySource, defaultPackageName, userId, profileType, isUserRunning); if (staticEntry == null) { return; } @@ -987,7 +1055,7 @@ public final class SafetyCenterDataFactory { Log.w( TAG, - "Unexpected SafetySourceData.SeverityLevel in SafetySourceStatus: " + "Unexpected SafetySourceData.SeverityLevel in SafetySourceData: " + safetySourceSeverityLevel); return SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNKNOWN; } @@ -1155,7 +1223,7 @@ public final class SafetyCenterDataFactory { return getIcuPluralsString( "overall_severity_level_action_taken_summary", numAutomaticIssues); } - // Fall through. + // Fall through. case SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_RECOMMENDATION: case SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_CRITICAL_WARNING: return getIcuPluralsString("overall_severity_n_alerts_summary", numIssues); @@ -1201,7 +1269,7 @@ public final class SafetyCenterDataFactory { if (!overallSeverityUnknown) { return null; } - // Fall through. + // Fall through. case SafetyCenterStatus.REFRESH_STATUS_FULL_RESCAN_IN_PROGRESS: return mSafetyCenterResourcesApk.getStringByName("scanning_title"); } @@ -1232,9 +1300,9 @@ public final class SafetyCenterDataFactory { return mSafetyCenterResourcesApk.getString(safetySource.getTitleResId()); case PROFILE_TYPE_MANAGED: return DevicePolicyResources.getSafetySourceWorkString( - mSafetyCenterResourcesApk, - safetySource.getId(), - safetySource.getTitleForWorkResId()); + mSafetyCenterResourcesApk, + safetySource.getId(), + safetySource.getTitleForWorkResId()); case PROFILE_TYPE_PRIVATE: if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) { return mSafetyCenterResourcesApk.getString( @@ -1337,4 +1405,8 @@ public final class SafetyCenterDataFactory { return Math.max(left, right); } } + + private static final class HighestSeverityIssueOnlyIssue { + @Nullable private SafetySourceIssue mSafetySourceIssue = null; + } } |