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

Commit 13048f12 authored by Vadim Caen's avatar Vadim Caen
Browse files

Transfer the actual dispatcher when the window is preserved

When recreating the Activity, if the window is preserved,
onAttachedToWindow won't be called and PhoneWindow.onViewRootImplSet
won't be called either, where we set the actual dispatcher to the
Activiy's proxy dispatcher.

So when the window is preserved, we directly assign the actual Dispatcher
from the preserved Window to the new PhoneWindow

Fixes: 228571903
Test: In progress
Test: Open an app with OnBackInvokedCallback enabled, split to top,
      close the other application, do a back gesture
Change-Id: I050247501df8f6cf6cd0024a6233f88a035f6279
parent 0b2c39c7
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -90,10 +90,14 @@ public class ProxyOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
        synchronized (mLock) {
            mCallbacks.add(Pair.create(callback, priority));
            if (mActualDispatcher != null) {
                if (priority <= PRIORITY_SYSTEM) {
                    mActualDispatcher.registerSystemOnBackInvokedCallback(callback);
                } else {
                    mActualDispatcher.registerOnBackInvokedCallback(priority, callback);
                }
            }
        }
    }

    /**
     * Transfers all the pending callbacks to the provided dispatcher.
@@ -171,7 +175,16 @@ public class ProxyOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
                return;
            }
            clearCallbacksOnDispatcher();
            if (actualDispatcher instanceof ProxyOnBackInvokedDispatcher) {
                // We don't want to nest ProxyDispatchers, so if we are given on, we unwrap its
                // actual dispatcher.
                // This can happen when an Activity is recreated but the Window is preserved (e.g.
                // when going from split-screen back to single screen)
                mActualDispatcher =
                        ((ProxyOnBackInvokedDispatcher) actualDispatcher).mActualDispatcher;
            } else {
                mActualDispatcher = actualDispatcher;
            }
            transferCallbacksToDispatcher();
        }
    }
+3 −1
Original line number Diff line number Diff line
@@ -342,7 +342,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {

    boolean mDecorFitsSystemWindows = true;

    private ProxyOnBackInvokedDispatcher mProxyOnBackInvokedDispatcher =
    private final ProxyOnBackInvokedDispatcher mProxyOnBackInvokedDispatcher =
            new ProxyOnBackInvokedDispatcher();

    static class WindowManagerHolder {
@@ -378,6 +378,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
            // window, as we'll be skipping the addView in handleResumeActivity(), and
            // the token will not be updated as for a new window.
            getAttributes().token = preservedWindow.getAttributes().token;
            mProxyOnBackInvokedDispatcher.setActualDispatcher(
                    preservedWindow.getOnBackInvokedDispatcher());
        }
        // Even though the device doesn't support picture-in-picture mode,
        // an user can force using it through developer options.