summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/window/ImeOnBackInvokedDispatcher.java7
-rw-r--r--core/java/android/window/WindowOnBackInvokedDispatcher.java13
2 files changed, 17 insertions, 3 deletions
diff --git a/core/java/android/window/ImeOnBackInvokedDispatcher.java b/core/java/android/window/ImeOnBackInvokedDispatcher.java
index 9ef68807419a..0cc9a0d75154 100644
--- a/core/java/android/window/ImeOnBackInvokedDispatcher.java
+++ b/core/java/android/window/ImeOnBackInvokedDispatcher.java
@@ -50,6 +50,8 @@ public class ImeOnBackInvokedDispatcher implements OnBackInvokedDispatcher, Parc
static final int RESULT_CODE_UNREGISTER = 1;
@NonNull
private final ResultReceiver mResultReceiver;
+ @NonNull
+ private final BackProgressAnimator mProgressAnimator = new BackProgressAnimator();
public ImeOnBackInvokedDispatcher(Handler handler) {
mResultReceiver = new ResultReceiver(handler) {
@@ -88,7 +90,7 @@ public class ImeOnBackInvokedDispatcher implements OnBackInvokedDispatcher, Parc
// cause a memory leak because the app side already clears the reference correctly.
final IOnBackInvokedCallback iCallback =
new WindowOnBackInvokedDispatcher.OnBackInvokedCallbackWrapper(
- callback, false /* useWeakRef */);
+ callback, mProgressAnimator, false /* useWeakRef */);
bundle.putBinder(RESULT_KEY_CALLBACK, iCallback.asBinder());
bundle.putInt(RESULT_KEY_PRIORITY, priority);
bundle.putInt(RESULT_KEY_ID, callback.hashCode());
@@ -179,6 +181,9 @@ public class ImeOnBackInvokedDispatcher implements OnBackInvokedDispatcher, Parc
}
}
mImeCallbacks.clear();
+ // We should also stop running animations since all callbacks have been removed.
+ // note: mSpring.skipToEnd(), in ProgressAnimator.reset(), requires the main handler.
+ Handler.getMain().post(mProgressAnimator::reset);
}
static class ImeOnBackInvokedCallback implements OnBackInvokedCallback {
diff --git a/core/java/android/window/WindowOnBackInvokedDispatcher.java b/core/java/android/window/WindowOnBackInvokedDispatcher.java
index 86804c6117c7..658247f1138a 100644
--- a/core/java/android/window/WindowOnBackInvokedDispatcher.java
+++ b/core/java/android/window/WindowOnBackInvokedDispatcher.java
@@ -246,7 +246,10 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
.ImeOnBackInvokedCallback
? ((ImeOnBackInvokedDispatcher.ImeOnBackInvokedCallback)
callback).getIOnBackInvokedCallback()
- : new OnBackInvokedCallbackWrapper(callback, this);
+ : new OnBackInvokedCallbackWrapper(
+ callback,
+ mProgressAnimator,
+ this);
callbackInfo = new OnBackInvokedCallbackInfo(
iCallback,
priority,
@@ -272,7 +275,7 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
}
@NonNull
- private static final BackProgressAnimator mProgressAnimator = new BackProgressAnimator();
+ private final BackProgressAnimator mProgressAnimator = new BackProgressAnimator();
private boolean mIsDispatching = false;
/**
@@ -339,18 +342,24 @@ public class WindowOnBackInvokedDispatcher implements OnBackInvokedDispatcher {
* forwarded and registered on the app's {@link WindowOnBackInvokedDispatcher}. */
@Nullable
private final WindowOnBackInvokedDispatcher mDispatcher;
+ @NonNull
+ private final BackProgressAnimator mProgressAnimator;
OnBackInvokedCallbackWrapper(
@NonNull OnBackInvokedCallback callback,
+ @NonNull BackProgressAnimator progressAnimator,
WindowOnBackInvokedDispatcher dispatcher) {
mCallbackRef = new CallbackRef(callback, true /* useWeakRef */);
+ mProgressAnimator = progressAnimator;
mDispatcher = dispatcher;
}
OnBackInvokedCallbackWrapper(
@NonNull OnBackInvokedCallback callback,
+ @NonNull BackProgressAnimator progressAnimator,
boolean useWeakRef) {
mCallbackRef = new CallbackRef(callback, useWeakRef);
+ mProgressAnimator = progressAnimator;
mDispatcher = null;
}