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,7 +90,11 @@ public class ProxyOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
synchronized (mLock) {
mCallbacks.add(Pair.create(callback, priority));
if (mActualDispatcher != null) {
mActualDispatcher.registerOnBackInvokedCallback(priority, callback);
if (priority <= PRIORITY_SYSTEM) {
mActualDispatcher.registerSystemOnBackInvokedCallback(callback);
} else {
mActualDispatcher.registerOnBackInvokedCallback(priority, callback);
}
}
}
}
@@ -171,7 +175,16 @@ public class ProxyOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
return;
}
clearCallbacksOnDispatcher();
mActualDispatcher = actualDispatcher;
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();
}
}

View File

@@ -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.