summaryrefslogtreecommitdiff
path: root/service/java
diff options
context:
space:
mode:
author Elliot Sisteron <elliotsisteron@google.com> 2024-08-14 16:27:05 +0000
committer Elliot Sisteron <elliotsisteron@google.com> 2024-08-16 21:35:22 +0000
commitadd8c80a67434d2d8da8a5cbd23b666bd77ce595 (patch)
treec7e370421269a2826f2b2aa68e5ae03b2e4c247b /service/java
parentc34781ec8df432130b4857d8e5409c00857d2501 (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')
-rw-r--r--service/java/com/android/safetycenter/SafetyCenterDataFactory.java112
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;
+ }
}