Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ea4d818a authored by Xiaowen Lei's avatar Xiaowen Lei
Browse files

Scale tracker icon to desired height and ensure aspect ratio.

Also `setAutoMirrored(true)`. The auto mirroring works now that the
canvas is translated to the tracker position.

Flag: android.app.api_rich_ongoing
Fix: 375251723
Fix: 372909308
Test: post a ProgressStyle Notification. (patch ag/29870217 to post.)
Test: patch ag/30006048 and run ProgressStyleNotificationScreenshotTest
Change-Id: I2e9036aef26b7839dfc387509a40a2a30b0a3679
parent d6b10e74
Loading
Loading
Loading
Loading
+67 −6
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
@@ -65,6 +66,11 @@ public final class NotificationProgressBar extends ProgressBar {

    @Nullable
    private Drawable mTracker = null;
    private final int mTrackerHeight;
    private int mTrackerWidth;
    private int mTrackerPos;
    private final Matrix mMatrix = new Matrix();
    private Matrix mTrackerDrawMatrix = null;

    public NotificationProgressBar(Context context) {
        this(context, null);
@@ -92,6 +98,11 @@ public final class NotificationProgressBar extends ProgressBar {
        // via {@code setProgressTrackerIcon}.
        final Drawable tracker = a.getDrawable(R.styleable.NotificationProgressBar_tracker);
        setTracker(tracker);

        // If this is configured to be non-zero, will scale the tracker drawable and ensure its
        // aspect ration is between 2:1 to 1:2.
        mTrackerHeight = a.getDimensionPixelSize(R.styleable.NotificationProgressBar_trackerHeight,
                0);
    }

    /**
@@ -195,6 +206,10 @@ public final class NotificationProgressBar extends ProgressBar {

        if (tracker != null) {
            tracker.setCallback(this);
            if (getMirrorForRtl()) {
                tracker.setAutoMirrored(true);
            }

            if (canResolveLayoutDirection()) {
                tracker.setLayoutDirection(getLayoutDirection());
            }
@@ -207,6 +222,9 @@ public final class NotificationProgressBar extends ProgressBar {
        }

        mTracker = tracker;

        configureTrackerBounds();

        invalidate();

        if (needUpdate) {
@@ -219,6 +237,43 @@ public final class NotificationProgressBar extends ProgressBar {
        }
    }

    private void configureTrackerBounds() {
        // Reset the tracker draw matrix to null
        mTrackerDrawMatrix = null;

        if (mTracker == null || mTrackerHeight <= 0) {
            return;
        }

        final int dWidth = mTracker.getIntrinsicWidth();
        final int dHeight = mTracker.getIntrinsicHeight();
        if (dWidth <= 0 || dHeight <= 0) {
            return;
        }
        final int maxDWidth = dHeight * 2;
        final int maxDHeight = dWidth * 2;

        mTrackerDrawMatrix = mMatrix;
        float scale;
        float dx = 0, dy = 0;

        if (dWidth > maxDWidth) {
            scale = (float) mTrackerHeight / (float) dHeight;
            dx = (maxDWidth * scale - dWidth * scale) * 0.5f;
            mTrackerWidth = (int) (maxDWidth * scale);
        } else if (dHeight > maxDHeight) {
            scale = (float) mTrackerHeight * 0.5f / (float) dWidth;
            dy = (maxDHeight * scale - dHeight * scale) * 0.5f;
            mTrackerWidth = mTrackerHeight / 2;
        } else {
            scale = (float) mTrackerHeight / (float) dHeight;
            mTrackerWidth = (int) (dWidth * scale);
        }

        mTrackerDrawMatrix.setScale(scale, scale);
        mTrackerDrawMatrix.postTranslate(Math.round(dx), Math.round(dy));
    }

    @Override
    @RemotableViewMethod
    public synchronized void setIndeterminate(boolean indeterminate) {
@@ -278,7 +333,8 @@ public final class NotificationProgressBar extends ProgressBar {
        // The max height does not incorporate padding, whereas the height
        // parameter does.
        final int barHeight = Math.min(getMaxHeight(), paddedHeight);
        final int trackerHeight = tracker == null ? 0 : tracker.getIntrinsicHeight();
        final int trackerHeight = tracker == null ? 0
                : ((mTrackerHeight == 0) ? tracker.getIntrinsicHeight() : mTrackerHeight);

        // Apply offset to whichever item is taller.
        final int barOffsetY;
@@ -323,7 +379,7 @@ public final class NotificationProgressBar extends ProgressBar {
        int available = w - mPaddingLeft - mPaddingRight;
        final int trackerWidth = tracker.getIntrinsicWidth();
        final int trackerHeight = tracker.getIntrinsicHeight();
        available -= trackerWidth;
        available -= ((mTrackerHeight == 0) ? trackerWidth : mTrackerWidth);

        final int trackerPos = (int) (scale * available + 0.5f);

@@ -337,7 +393,8 @@ public final class NotificationProgressBar extends ProgressBar {
            bottom = offsetY + trackerHeight;
        }

        final int left = (isLayoutRtl() && getMirrorForRtl()) ? available - trackerPos : trackerPos;
        mTrackerPos = (isLayoutRtl() && getMirrorForRtl()) ? available - trackerPos : trackerPos;
        final int left = 0;
        final int right = left + trackerWidth;

        final Drawable background = getBackground();
@@ -373,9 +430,13 @@ public final class NotificationProgressBar extends ProgressBar {
    private void drawTracker(Canvas canvas) {
        if (mTracker != null) {
            final int saveCount = canvas.save();
            // Translate the padding. For the x, we need to allow the tracker to
            // draw in its extra space
            canvas.translate(mPaddingLeft, mPaddingTop);
            // Translate the canvas origin to tracker position to make the draw matrix and the RtL
            // transformations work.
            canvas.translate(mPaddingLeft + mTrackerPos, mPaddingTop);
            canvas.clipRect(0, 0, mTrackerWidth, mTrackerHeight);
            if (mTrackerDrawMatrix != null) {
                canvas.concat(mTrackerDrawMatrix);
            }
            mTracker.draw(canvas);
            canvas.restoreToCount(saveCount);
        }
+2 −0
Original line number Diff line number Diff line
@@ -5735,6 +5735,8 @@
    <declare-styleable name="NotificationProgressBar">
        <!-- Draws the tracker on a NotificationProgressBar. -->
        <attr name="tracker" format="reference" />
        <!-- Height of the tracker. -->
        <attr name="trackerHeight" format="dimension" />
    </declare-styleable>
    <declare-styleable name="StackView">
+1 −0
Original line number Diff line number Diff line
@@ -504,6 +504,7 @@ please see styles_device_defaults.xml.

    <style name="Widget.Material.Notification.NotificationProgressBar" parent="Widget.Material.Light.ProgressBar.Horizontal">
        <item name="progressDrawable">@drawable/notification_progress</item>
        <item name="trackerHeight">@dimen/notification_progress_tracker_height</item>
    </style>

    <style name="Widget.Material.Notification.Text" parent="Widget.Material.Light.TextView">