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

Commit 29daa92b authored by Robert Carr's avatar Robert Carr
Browse files

Detach children when stopping app.

Prior to the implementation of detachChildren we handled this
case via the "mWindowStopped" codepath in SurfaceView.java which this
CL deletes. That codepath however causes confusion due to it's failure
to set null the SurfaceControl, meaning we may not necessarily
recreate it when resuming if we didn't hit any other code-path
to do such as happens in linked bug 78588930. Anyway it seems clearest
to handle all these preserve-child-surfaces-on-tear-down cases via
one mechanism (detachChildren).

Bug: 78588930
Test: Manual.
Change-Id: Iac7c0bc0c6b4da0d405bdc2b57d13d5c881611b0
parent 2897fd31
Loading
Loading
Loading
Loading
+3 −9
Original line number Original line Diff line number Diff line
@@ -700,17 +700,11 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
                    mIsCreating = false;
                    mIsCreating = false;
                    if (mSurfaceControl != null && !mSurfaceCreated) {
                    if (mSurfaceControl != null && !mSurfaceCreated) {
                        mSurface.release();
                        mSurface.release();
                        // If we are not in the stopped state, then the destruction of the Surface

                        // represents a visual change we need to display, and we should go ahead
                        // and destroy the SurfaceControl. However if we are in the stopped state,
                        // we can just leave the Surface around so it can be a part of animations,
                        // and we let the life-time be tied to the parent surface.
                        if (!mWindowStopped) {
                        mSurfaceControl.destroy();
                        mSurfaceControl.destroy();
                        mSurfaceControl = null;
                        mSurfaceControl = null;
                    }
                    }
                }
                }
                }
            } catch (Exception ex) {
            } catch (Exception ex) {
                Log.e(TAG, "Exception configuring surface", ex);
                Log.e(TAG, "Exception configuring surface", ex);
            }
            }
+4 −0
Original line number Original line Diff line number Diff line
@@ -1626,6 +1626,10 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
        if (parent != null) {
        if (parent != null) {
            parent.onActivityStateChanged(this, state, reason);
            parent.onActivityStateChanged(this, state, reason);
        }
        }

        if (state == STOPPING) {
            mWindowContainerController.notifyAppStopping();
        }
    }
    }


    ActivityState getState() {
    ActivityState getState() {
+11 −0
Original line number Original line Diff line number Diff line
@@ -671,6 +671,17 @@ public class AppWindowContainerController
        }
        }
    }
    }


    public void notifyAppStopping() {
        synchronized(mWindowMap) {
            if (mContainer == null) {
                Slog.w(TAG_WM, "Attempted to notify stopping on non-existing app token: "
                        + mToken);
                return;
            }
            mContainer.detachChildren();
        }
    }

    public void notifyAppStopped() {
    public void notifyAppStopped() {
        synchronized(mWindowMap) {
        synchronized(mWindowMap) {
            if (mContainer == null) {
            if (mContainer == null) {
+6 −2
Original line number Original line Diff line number Diff line
@@ -913,12 +913,16 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
        // try and clean up it's child surfaces. We need to prevent this from
        // try and clean up it's child surfaces. We need to prevent this from
        // happening, so we sever the children, transfering their ownership
        // happening, so we sever the children, transfering their ownership
        // from the client it-self to the parent surface (owned by us).
        // from the client it-self to the parent surface (owned by us).
        detachChildren();

        mPendingRelaunchCount++;
    }

    void detachChildren() {
        for (int i = mChildren.size() - 1; i >= 0; i--) {
        for (int i = mChildren.size() - 1; i >= 0; i--) {
            final WindowState w = mChildren.get(i);
            final WindowState w = mChildren.get(i);
            w.mWinAnimator.detachChildren();
            w.mWinAnimator.detachChildren();
        }
        }

        mPendingRelaunchCount++;
    }
    }


    void finishRelaunching() {
    void finishRelaunching() {