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

Commit 480e230e authored by Robert Horvath's avatar Robert Horvath
Browse files

Rate limit calls from apps to reportKeepClearAreaChanged

Only allows keep clear area changes to be reported every 100ms.
Helpful to keep IPC from app to WindowManager to SystemUI lower during
animations, when Views marked as preferKeepClear change position a lot.

Bug: 226583836
Test: atest KeepClearRectsTests
Change-Id: I9f6c86c5345218c9ee40f50a74d4357dd4e94dc7
parent 9cbaca73
Loading
Loading
Loading
Loading
+43 −5
Original line number Diff line number Diff line
@@ -321,6 +321,11 @@ public final class ViewRootImpl implements ViewParent,

    private static final int UNSET_SYNC_ID = -1;

    /**
     * Minimum time to wait before reporting changes to keep clear areas.
     */
    private static final int KEEP_CLEAR_AREA_REPORT_RATE_MILLIS = 100;

    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    static final ThreadLocal<HandlerActionQueue> sRunQueues = new ThreadLocal<HandlerActionQueue>();

@@ -796,6 +801,8 @@ public final class ViewRootImpl implements ViewParent,
            new ViewRootRectTracker(v -> v.collectPreferKeepClearRects());
    private final ViewRootRectTracker mUnrestrictedKeepClearRectsTracker =
            new ViewRootRectTracker(v -> v.collectUnrestrictedPreferKeepClearRects());
    private List<Rect> mPendingKeepClearAreas;
    private List<Rect> mPendingUnrestrictedKeepClearAreas;

    private IAccessibilityEmbeddedConnection mAccessibilityEmbeddedConnection;

@@ -4824,6 +4831,14 @@ public final class ViewRootImpl implements ViewParent,
                unrestrictedKeepClearRects = Collections.emptyList();
            }

            if (mHandler.hasMessages(MSG_REPORT_KEEP_CLEAR_RECTS)) {
                // Keep clear areas have been reported recently, wait before reporting new set
                // of keep clear areas
                mPendingKeepClearAreas = restrictedKeepClearRects;
                mPendingUnrestrictedKeepClearAreas = unrestrictedKeepClearRects;
            } else {
                mHandler.sendEmptyMessageDelayed(MSG_REPORT_KEEP_CLEAR_RECTS,
                        KEEP_CLEAR_AREA_REPORT_RATE_MILLIS);
                try {
                    mWindowSession.reportKeepClearAreasChanged(mWindow, restrictedKeepClearRects,
                            unrestrictedKeepClearRects);
@@ -4832,6 +4847,25 @@ public final class ViewRootImpl implements ViewParent,
                }
            }
        }
    }

    void reportKeepClearAreasChanged() {
        final List<Rect> restrictedKeepClearRects = mPendingKeepClearAreas;
        final List<Rect> unrestrictedKeepClearRects = mPendingUnrestrictedKeepClearAreas;
        if (restrictedKeepClearRects == null && unrestrictedKeepClearRects == null) {
            return;
        }

        mPendingKeepClearAreas = null;
        mPendingUnrestrictedKeepClearAreas = null;

        try {
            mWindowSession.reportKeepClearAreasChanged(mWindow, restrictedKeepClearRects,
                    unrestrictedKeepClearRects);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Requests that the root render node is invalidated next time we perform a draw, such that
@@ -5325,6 +5359,7 @@ public final class ViewRootImpl implements ViewParent,
    private static final int MSG_REQUEST_SCROLL_CAPTURE = 33;
    private static final int MSG_WINDOW_TOUCH_MODE_CHANGED = 34;
    private static final int MSG_KEEP_CLEAR_RECTS_CHANGED = 35;
    private static final int MSG_REPORT_KEEP_CLEAR_RECTS = 36;


    final class ViewRootHandler extends Handler {
@@ -5601,6 +5636,9 @@ public final class ViewRootImpl implements ViewParent,
                case MSG_KEEP_CLEAR_RECTS_CHANGED: {
                    keepClearRectsChanged();
                }   break;
                case MSG_REPORT_KEEP_CLEAR_RECTS: {
                    reportKeepClearAreasChanged();
                }   break;
                case MSG_REQUEST_SCROLL_CAPTURE:
                    handleScrollCaptureRequest((IScrollCaptureResponseListener) msg.obj);
                    break;