diff options
| author | 2024-10-25 16:08:05 +0000 | |
|---|---|---|
| committer | 2024-10-25 16:38:57 +0000 | |
| commit | 88b0b0b67cc593f5a0e88e5207c8d027474045a9 (patch) | |
| tree | fee4737dba4f22eddc34f29fb0ad84f9bc4218b9 | |
| parent | 387c9494e2e3d61086c5952fd34c208ca3699f6c (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
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)); |