Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e31a4f82 authored by Alex Salo's avatar Alex Salo
Browse files

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
parent cd91200b
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -616,9 +616,8 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 {
            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 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 {
            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;
    }