Merge "DO NOT MERGE Prevent back navigation not working after activity re-created" into tm-qpr-dev

This commit is contained in:
Arthur Hung
2023-02-09 13:14:48 +00:00
committed by Android (Google) Code Review
5 changed files with 36 additions and 12 deletions

View File

@@ -8630,6 +8630,8 @@ public final class ViewRootImpl implements ViewParent,
mInsetsController.dump(prefix, writer);
mOnBackInvokedDispatcher.dump(prefix, writer);
writer.println(prefix + "View Hierarchy:");
dumpViewHierarchy(innerPrefix, writer, mView);
}

View File

@@ -211,6 +211,12 @@ public class ImeOnBackInvokedDispatcher implements OnBackInvokedDispatcher, Parc
IOnBackInvokedCallback getIOnBackInvokedCallback() {
return mIOnBackInvokedCallback;
}
@Override
public String toString() {
return "ImeCallback=ImeOnBackInvokedCallback@" + mId
+ " Callback=" + mIOnBackInvokedCallback;
}
}
/**

View File

@@ -179,16 +179,7 @@ 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;
}
mActualDispatcher = actualDispatcher;
transferCallbacksToDispatcher();
}
}

View File

@@ -27,6 +27,7 @@ import android.util.Log;
import android.view.IWindow;
import android.view.IWindowSession;
import java.io.PrintWriter;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashMap;
@@ -221,6 +222,26 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
@NonNull
private static final BackProgressAnimator mProgressAnimator = new BackProgressAnimator();
/**
* Dump information about this WindowOnBackInvokedDispatcher
* @param prefix the prefix that will be prepended to each line of the produced output
* @param writer the writer that will receive the resulting text
*/
public void dump(String prefix, PrintWriter writer) {
String innerPrefix = prefix + " ";
writer.println(prefix + "WindowOnBackDispatcher:");
if (mAllCallbacks.isEmpty()) {
writer.println(prefix + "<None>");
return;
}
writer.println(innerPrefix + "Top Callback: " + getTopCallback());
writer.println(innerPrefix + "Callbacks: ");
mAllCallbacks.forEach((callback, priority) -> {
writer.println(innerPrefix + " Callback: " + callback + " Priority=" + priority);
});
}
static class OnBackInvokedCallbackWrapper extends IOnBackInvokedCallback.Stub {
private final WeakReference<OnBackInvokedCallback> mCallback;

View File

@@ -379,8 +379,12 @@ 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());
final ViewRootImpl viewRoot = mDecor.getViewRootImpl();
if (viewRoot != null) {
// Clear the old callbacks and attach to the new window.
viewRoot.getOnBackInvokedDispatcher().clear();
onViewRootImplSet(viewRoot);
}
}
// Even though the device doesn't support picture-in-picture mode,
// an user can force using it through developer options.