Improve mitigation for finding the top resumed activity
Current mitigation does not work well as there is no guarantee anything has a focus. Using isTopResumedActivity is more robust.
Keeping the old mitigation which might still be helpful for cases when there is an external keyboard/mouse/trackpad.
Change-Id: I4f1ca94f1c28dd9f237f400ac928170caf5e589d
Fixes: 290379905
diff --git a/core/java/android/app/Application.java b/core/java/android/app/Application.java
index 2767b43..6a50e74 100644
--- a/core/java/android/app/Application.java
+++ b/core/java/android/app/Application.java
@@ -616,9 +616,8 @@
Log.v(TAG, "getAutofillClient(): null on super, trying to find activity thread");
}
// Okay, ppl use the application context when they should not. This breaks
- // autofill among other things. We pick the focused activity since autofill
- // interacts only with the currently focused activity and we need the fill
- // client only if a call comes from the focused activity. Sigh...
+ // autofill among other things. Below is a mitigation to find the top resumed
+ // activity.
final ActivityThread activityThread = ActivityThread.currentActivityThread();
if (activityThread == null) {
return null;
@@ -634,16 +633,27 @@
if (activity == null) {
continue;
}
+ if (record.isTopResumedActivity) {
+ if (android.view.autofill.Helper.sVerbose) {
+ Log.v(TAG, "getAutofillClient(): found top resumed activity for " + this +
+ ": " + activity);
+ }
+ return activity.getAutofillClient();
+ }
+ // As a back up option, we pick the focused activity since autofill interacts only
+ // with the currently focused activity and we need the fill client only if a call
+ // comes from the focused activity.
if (activity.getWindow().getDecorView().hasFocus()) {
if (android.view.autofill.Helper.sVerbose) {
- Log.v(TAG, "getAutofillClient(): found activity for " + this + ": " + activity);
+ Log.v(TAG, "getAutofillClient(): found focused activity for " + this +
+ ": " + activity);
}
return activity.getAutofillClient();
}
}
if (android.view.autofill.Helper.sVerbose) {
Log.v(TAG, "getAutofillClient(): none of the " + activityCount + " activities on "
- + this + " have focus");
+ + this + " are top resumed nor have focus");
}
return null;
}