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

Commit ea162c3c authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Prepare to replace windows across recreate()." into nyc-dev

parents e2cdb20c 77bdfb51
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -4168,7 +4168,7 @@ public final class ActivityThread {
                }
                IBinder wtoken = v.getWindowToken();
                if (r.activity.mWindowAdded) {
                    if (r.onlyLocalRequest || r.mPreserveWindow) {
                    if (r.mPreserveWindow) {
                        // Hold off on removing this until the new activity's
                        // window is being added.
                        r.mPendingRemoveWindow = r.window;
@@ -4403,15 +4403,20 @@ public final class ActivityThread {
        // be replaced and defer requests to destroy or hide them. This way we can achieve
        // visual continuity. It's important that we do this here prior to pause and destroy
        // as that is when we may hide or remove the child views.
        //
        // There is another scenario, if we have decided locally to relaunch the app from a
        // call to recreate, then none of the windows will be prepared for replacement or
        // preserved by the server, so we want to notify it that we are preparing to replace
        // everything
        try {
            if (r.mPreserveWindow) {
                WindowManagerGlobal.getWindowSession().prepareToReplaceChildren(r.token);
            if (r.mPreserveWindow || r.onlyLocalRequest) {
                WindowManagerGlobal.getWindowSession().prepareToReplaceWindows(
                        r.token, !r.onlyLocalRequest);
            }
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }


        // Need to ensure state is saved.
        if (!r.paused) {
            performPauseActivity(r.token, false, r.isPreHoneycomb(), "handleRelaunchActivity");
+4 −2
Original line number Diff line number Diff line
@@ -125,11 +125,13 @@ interface IWindowSession {

    /*
     * Notify the window manager that an application is relaunching and
     * child windows should be prepared for replacement.
     * windows should be prepared for replacement.
     *
     * @param appToken The application
     * @param childrenOnly Whether to only prepare child windows for replacement
     * (for example when main windows are being reused via preservation).
     */
    void prepareToReplaceChildren(IBinder appToken);
    void prepareToReplaceWindows(IBinder appToken, boolean childrenOnly);

    /**
     * If a call to relayout() asked to have the surface destroy deferred,
+2 −2
Original line number Diff line number Diff line
@@ -201,8 +201,8 @@ final class Session extends IWindowSession.Stub
    }

    @Override
    public void prepareToReplaceChildren(IBinder appToken) {
        mService.setReplacingChildren(appToken);
    public void prepareToReplaceWindows(IBinder appToken, boolean childrenOnly) {
        mService.setReplacingWindows(appToken, childrenOnly);
    }

    public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs,
+13 −4
Original line number Diff line number Diff line
@@ -10700,12 +10700,16 @@ public class WindowManagerService extends IWindowManager.Stub
    }

    /**
     * Hint to a token that its children will be replaced across activity relaunch.
     * The children would otherwise be removed  shortly following this as the
     * Hint to a token that its windows will be replaced across activity relaunch.
     * The windows would otherwise be removed  shortly following this as the
     * activity is torn down.
     * @param token Application token for which the activity will be relaunched.
     * @param childrenOnly Whether to mark only child windows for replacement
     *                     (for the case where main windows are being preserved/
     *                     reused rather than replaced).
     *
     */
    public void setReplacingChildren(IBinder token) {
    public void setReplacingWindows(IBinder token, boolean childrenOnly) {
        AppWindowToken appWindowToken = null;
        synchronized (mWindowMap) {
            appWindowToken = findAppWindowToken(token);
@@ -10715,7 +10719,12 @@ public class WindowManagerService extends IWindowManager.Stub
                return;
            }

            if (childrenOnly) {
                appWindowToken.setReplacingChildren();
            } else {
                appWindowToken.setReplacingWindows(false /* animate */);
            }

            scheduleClearReplacingWindowIfNeeded(token, true /* replacing */);
        }
    }
+1 −1
Original line number Diff line number Diff line
@@ -233,7 +233,7 @@ public final class BridgeWindowSession implements IWindowSession {
    }

    @Override
    public void prepareToReplaceChildren(IBinder appToken) {
    public void prepareToReplaceWindows(IBinder appToken, boolean childrenOnly) {
        // pass for now.
    }