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

Commit 15df6703 authored by Romain Guy's avatar Romain Guy
Browse files

Fix potential leak in ViewRoot.

The way View.post() is handled can cause potential leaks in ViewRoot. For instance,
if a View calls post(Runnable) just after being detached from the window (in an
onClickListener for instance,) it will enqueue a Runnable in ViewRoot.RunQueue.
Unfortunately the RunQueue is emptied only on the very first layout of the ViewRoot.
This change prevents the leak by rxecuting the enqueued Runnables on every layout request
The latter did not happen before and to keep views in a correct state I think it
is necessary to always ensure we run the Runnables sent via View.post().
parent 6a2d513a
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -686,7 +686,6 @@ public final class ViewRoot extends Handler implements ViewParent,
            attachInfo.mKeepScreenOn = false;
            viewVisibilityChanged = false;
            host.dispatchAttachedToWindow(attachInfo, 0);
            getRunQueue().executeActions(attachInfo.mHandler);
            //Log.i(TAG, "Screen on initialized: " + attachInfo.mKeepScreenOn);

        } else {
@@ -719,6 +718,10 @@ public final class ViewRoot extends Handler implements ViewParent,
        boolean insetsChanged = false;

        if (mLayoutRequested) {
            // Execute enqueued actions on every layout in case a view that was detached
            // enqueued an action after being detached
            getRunQueue().executeActions(attachInfo.mHandler);

            if (mFirst) {
                host.fitSystemWindows(mAttachInfo.mContentInsets);
                // make sure touch mode code executes by setting cached value
@@ -3142,7 +3145,7 @@ public final class ViewRoot extends Handler implements ViewParent,
                    handler.postDelayed(handlerAction.action, handlerAction.delay);
                }

                mActions.clear();
                actions.clear();
            }
        }

@@ -3156,7 +3159,6 @@ public final class ViewRoot extends Handler implements ViewParent,
                if (o == null || getClass() != o.getClass()) return false;

                HandlerAction that = (HandlerAction) o;

                return !(action != null ? !action.equals(that.action) : that.action != null);

            }