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

Commit 1c88bcee authored by Qasid Ahmad Sadiq's avatar Qasid Ahmad Sadiq
Browse files

AccessibilityRequestPreparer shouldn't crash if the view is released before...

AccessibilityRequestPreparer shouldn't crash if the view is released before the preparer is added or removed.

AccessibilityRequestPreparer holds onto a weak reference of the view.
When it is added or removed, AccessibilityManager uses the views accessibilityId to maintain the lists of requestPreparers.
But, it is completely possible, that a view is released before requestPreparer is removed, or even added, and that will cause bad things.
Instead, store the id on the preparer also.

Change-Id: I5d489c061cd8039d066a81f4a927c1d8185d4f06
Fix: 123047944
Test: CtsAccessibilityServiceTestCases
parent 12288221
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -848,7 +848,7 @@ public final class AccessibilityManager {
        if (mRequestPreparerLists == null) {
            mRequestPreparerLists = new SparseArray<>(1);
        }
        int id = preparer.getView().getAccessibilityViewId();
        int id = preparer.getAccessibilityViewId();
        List<AccessibilityRequestPreparer> requestPreparerList = mRequestPreparerLists.get(id);
        if (requestPreparerList == null) {
            requestPreparerList = new ArrayList<>(1);
@@ -864,7 +864,7 @@ public final class AccessibilityManager {
        if (mRequestPreparerLists == null) {
            return;
        }
        int viewId = preparer.getView().getAccessibilityViewId();
        int viewId = preparer.getAccessibilityViewId();
        List<AccessibilityRequestPreparer> requestPreparerList = mRequestPreparerLists.get(viewId);
        if (requestPreparerList != null) {
            requestPreparerList.remove(preparer);
+6 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ public abstract class AccessibilityRequestPreparer {
    public @interface RequestTypes {}

    private final WeakReference<View> mViewRef;
    private final int mAccessibilityViewId;
    private final int mRequestTypes;

    /**
@@ -68,6 +69,7 @@ public abstract class AccessibilityRequestPreparer {
            throw new IllegalStateException("View must be attached to a window");
        }
        mViewRef = new WeakReference<>(view);
        mAccessibilityViewId = view.getAccessibilityViewId();
        mRequestTypes = requestTypes;
        view.addOnAttachStateChangeListener(new ViewAttachStateListener());
    }
@@ -118,4 +120,8 @@ public abstract class AccessibilityRequestPreparer {
            v.removeOnAttachStateChangeListener(this);
        }
    }

    int getAccessibilityViewId() {
        return mAccessibilityViewId;
    }
}