summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Ibrahim Yilmaz <iyz@google.com> 2024-10-25 16:08:05 +0000
committer Ibrahim Yilmaz <iyz@google.com> 2024-10-25 16:38:57 +0000
commit88b0b0b67cc593f5a0e88e5207c8d027474045a9 (patch)
treefee4737dba4f22eddc34f29fb0ad84f9bc4218b9
parent387c9494e2e3d61086c5952fd34c208ca3699f6c (diff)
[RONs] Eliminate invalid points from ProgressStyle
Bug: 359128724 Test: presubmit && post ProgressStyle with point whose position is bigger than progressMax Flag: android.app.api_rich_ongoing Change-Id: I9b0901b0d672d694613f6bb2b15219d9c05739c5
-rw-r--r--core/java/android/app/Notification.java24
-rw-r--r--core/java/com/android/internal/widget/NotificationProgressBar.java2
-rw-r--r--core/tests/coretests/src/com/android/internal/widget/NotificationProgressBarTest.java30
3 files changed, 20 insertions, 36 deletions
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 64aa705447aa..ca1662e6bfd0 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -11823,28 +11823,42 @@ public class Notification implements Parcelable
sanitizeProgressColor(indeterminateColor,
backgroundColor, defaultProgressColor));
} else {
-
// Ensure segment color contrasts.
final List<Segment> segments = new ArrayList<>();
+ int totalLength = 0;
for (Segment segment : mProgressSegments) {
- segments.add(sanitizeSegment(segment, backgroundColor,
- defaultProgressColor));
+ final int length = segment.getLength();
+ if (length <= 0) continue;
+
+ try {
+ totalLength += Math.addExact(totalLength, length);
+ segments.add(sanitizeSegment(segment, backgroundColor,
+ defaultProgressColor));
+ } catch (ArithmeticException e) {
+ totalLength = DEFAULT_PROGRESS_MAX;
+ segments.clear();
+ break;
+ }
}
// Create default segment when no segments are provided.
if (segments.isEmpty()) {
- segments.add(sanitizeSegment(new Segment(100), backgroundColor,
+ totalLength = DEFAULT_PROGRESS_MAX;
+ segments.add(sanitizeSegment(new Segment(totalLength), backgroundColor,
defaultProgressColor));
}
// Ensure point color contrasts.
final List<Point> points = new ArrayList<>();
for (Point point : mProgressPoints) {
+ final int position = point.getPosition();
+ if (position < 0 || position > totalLength) continue;
+
points.add(sanitizePoint(point, backgroundColor, defaultProgressColor));
}
model = new NotificationProgressModel(segments, points,
- mProgress, mIsStyledByProgress);
+ Math.clamp(mProgress, 0, totalLength), mIsStyledByProgress);
}
return model;
}
diff --git a/core/java/com/android/internal/widget/NotificationProgressBar.java b/core/java/com/android/internal/widget/NotificationProgressBar.java
index 51a9cf67b06f..c5eac081c85d 100644
--- a/core/java/com/android/internal/widget/NotificationProgressBar.java
+++ b/core/java/com/android/internal/widget/NotificationProgressBar.java
@@ -453,7 +453,7 @@ public final class NotificationProgressBar extends ProgressBar {
}
for (ProgressStyle.Point point : points) {
final int pos = point.getPosition();
- if (pos <= 0 || pos >= progressMax) {
+ if (pos < 0 || pos > progressMax) {
throw new IllegalArgumentException("Invalid Point position : " + pos);
}
}
diff --git a/core/tests/coretests/src/com/android/internal/widget/NotificationProgressBarTest.java b/core/tests/coretests/src/com/android/internal/widget/NotificationProgressBarTest.java
index 35765a9f8e08..5613caf4427e 100644
--- a/core/tests/coretests/src/com/android/internal/widget/NotificationProgressBarTest.java
+++ b/core/tests/coretests/src/com/android/internal/widget/NotificationProgressBarTest.java
@@ -172,36 +172,6 @@ public class NotificationProgressBarTest {
}
@Test(expected = IllegalArgumentException.class)
- public void processAndConvertToDrawableParts_pointPositionIsZero() {
- List<ProgressStyle.Segment> segments = new ArrayList<>();
- segments.add(new ProgressStyle.Segment(100));
- List<ProgressStyle.Point> points = new ArrayList<>();
- points.add(new ProgressStyle.Point(0).setColor(Color.RED));
- int progress = 50;
- int progressMax = 100;
- boolean isStyledByProgress = true;
-
- NotificationProgressBar.processAndConvertToDrawableParts(segments, points, progress,
- progressMax,
- isStyledByProgress);
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void processAndConvertToDrawableParts_pointPositionAtMax() {
- List<ProgressStyle.Segment> segments = new ArrayList<>();
- segments.add(new ProgressStyle.Segment(100));
- List<ProgressStyle.Point> points = new ArrayList<>();
- points.add(new ProgressStyle.Point(100).setColor(Color.RED));
- int progress = 50;
- int progressMax = 100;
- boolean isStyledByProgress = true;
-
- NotificationProgressBar.processAndConvertToDrawableParts(segments, points, progress,
- progressMax,
- isStyledByProgress);
- }
-
- @Test(expected = IllegalArgumentException.class)
public void processAndConvertToDrawableParts_pointPositionAboveMax() {
List<ProgressStyle.Segment> segments = new ArrayList<>();
segments.add(new ProgressStyle.Segment(100));