Merge "Transfer the actual dispatcher when the window is preserved" into tm-dev

This commit is contained in:
Vadim Caen
2022-06-01 14:35:57 +00:00
committed by Android (Google) Code Review
2 changed files with 18 additions and 3 deletions

View File

@@ -90,10 +90,14 @@ public class ProxyOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
synchronized (mLock) { synchronized (mLock) {
mCallbacks.add(Pair.create(callback, priority)); mCallbacks.add(Pair.create(callback, priority));
if (mActualDispatcher != null) { if (mActualDispatcher != null) {
if (priority <= PRIORITY_SYSTEM) {
mActualDispatcher.registerSystemOnBackInvokedCallback(callback);
} else {
mActualDispatcher.registerOnBackInvokedCallback(priority, callback); mActualDispatcher.registerOnBackInvokedCallback(priority, callback);
} }
} }
} }
}
/** /**
* Transfers all the pending callbacks to the provided dispatcher. * Transfers all the pending callbacks to the provided dispatcher.
@@ -171,7 +175,16 @@ public class ProxyOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
return; return;
} }
clearCallbacksOnDispatcher(); 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; mActualDispatcher = actualDispatcher;
}
transferCallbacksToDispatcher(); transferCallbacksToDispatcher();
} }
} }

View File

@@ -342,7 +342,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
boolean mDecorFitsSystemWindows = true; boolean mDecorFitsSystemWindows = true;
private ProxyOnBackInvokedDispatcher mProxyOnBackInvokedDispatcher = private final ProxyOnBackInvokedDispatcher mProxyOnBackInvokedDispatcher =
new ProxyOnBackInvokedDispatcher(); new ProxyOnBackInvokedDispatcher();
static class WindowManagerHolder { 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 // window, as we'll be skipping the addView in handleResumeActivity(), and
// the token will not be updated as for a new window. // the token will not be updated as for a new window.
getAttributes().token = preservedWindow.getAttributes().token; getAttributes().token = preservedWindow.getAttributes().token;
mProxyOnBackInvokedDispatcher.setActualDispatcher(
preservedWindow.getOnBackInvokedDispatcher());
} }
// Even though the device doesn't support picture-in-picture mode, // Even though the device doesn't support picture-in-picture mode,
// an user can force using it through developer options. // an user can force using it through developer options.