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

Commit 94ce2109 authored by Toni Barzic's avatar Toni Barzic
Browse files

Always reload AccessibiiltyInputFilter on user switch

Makes AccessibiilityInputFilter aware of current user ID, and pasess the
user ID to event stream filters that have per-user parameters:
- AutoclickController -> for per-user autoclick delay
- ScreenMagnifier -> for magnification scale

While doing this, make AccessibilityInputFilter.disableFeatures private,
and replace usage in AccessibilityManagerService with
setUserAndEnabledFeatures with feature flags set to 0:
Using disableFatures directly leaves input filter in inconsistent state
where internal mEnabledFeatures flags don't match real state of enabled
features.

BUG=23113412
BUG=24265227

Change-Id: Ib295f4c08de1a3743e55714459844b6d80787637
parent 8c8db072
Loading
Loading
Loading
Loading
+12 −9
Original line number Diff line number Diff line
@@ -45,28 +45,28 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo
    /**
     * Flag for enabling the screen magnification feature.
     *
     * @see #setEnabledFeatures(int)
     * @see #setUserAndEnabledFeatures(int, int)
     */
    static final int FLAG_FEATURE_SCREEN_MAGNIFIER = 0x00000001;

    /**
     * Flag for enabling the touch exploration feature.
     *
     * @see #setEnabledFeatures(int)
     * @see #setUserAndEnabledFeatures(int, int)
     */
    static final int FLAG_FEATURE_TOUCH_EXPLORATION = 0x00000002;

    /**
     * Flag for enabling the filtering key events feature.
     *
     * @see #setEnabledFeatures(int)
     * @see #setUserAndEnabledFeatures(int, int)
     */
    static final int FLAG_FEATURE_FILTER_KEY_EVENTS = 0x00000004;

    /**
     * Flag for enabling "Automatically click on mouse stop" feature.
     *
     * @see #setEnabledFeatures(int)
     * @see #setUserAndEnabledFeatures(int, int)
     */
    static final int FLAG_FEATURE_AUTOCLICK = 0x00000008;

@@ -97,6 +97,8 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo

    private boolean mInstalled;

    private int mUserId;

    private int mEnabledFeatures;

    private TouchExplorer mTouchExplorer;
@@ -327,13 +329,14 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo
        /* do nothing */
    }

    void setEnabledFeatures(int enabledFeatures) {
        if (mEnabledFeatures == enabledFeatures) {
    void setUserAndEnabledFeatures(int userId, int enabledFeatures) {
        if (mEnabledFeatures == enabledFeatures && mUserId == userId) {
            return;
        }
        if (mInstalled) {
            disableFeatures();
        }
        mUserId = userId;
        mEnabledFeatures = enabledFeatures;
        if (mInstalled) {
            enableFeatures();
@@ -350,7 +353,7 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo
        resetStreamState();

        if ((mEnabledFeatures & FLAG_FEATURE_AUTOCLICK) != 0) {
            mAutoclickController = new AutoclickController(mContext);
            mAutoclickController = new AutoclickController(mContext, mUserId);
            addFirstEventHandler(mAutoclickController);
        }

@@ -360,7 +363,7 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo
        }

        if ((mEnabledFeatures & FLAG_FEATURE_SCREEN_MAGNIFIER) != 0) {
            mScreenMagnifier = new ScreenMagnifier(mContext,
            mScreenMagnifier = new ScreenMagnifier(mContext, mUserId,
                    Display.DEFAULT_DISPLAY, mAms);
            addFirstEventHandler(mScreenMagnifier);
        }
@@ -386,7 +389,7 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo
        mEventHandler = handler;
    }

    void disableFeatures() {
    private void disableFeatures() {
        if (mAutoclickController != null) {
            mAutoclickController.onDestroy();
            mAutoclickController = null;
+2 −2
Original line number Diff line number Diff line
@@ -1296,11 +1296,11 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
                    inputFilter = mInputFilter;
                    setInputFilter = true;
                }
                mInputFilter.setEnabledFeatures(flags);
                mInputFilter.setUserAndEnabledFeatures(userState.mUserId, flags);
            } else {
                if (mHasInputFilter) {
                    mHasInputFilter = false;
                    mInputFilter.disableFeatures();
                    mInputFilter.setUserAndEnabledFeatures(userState.mUserId, 0);
                    inputFilter = null;
                    setInputFilter = true;
                }
+12 −7
Original line number Diff line number Diff line
@@ -51,6 +51,8 @@ import android.view.accessibility.AccessibilityEvent;
 *
 * It is expected that each instance will receive mouse events from a single mouse device. User of
 * the class should handle cases where multiple mouse devices are present.
 *
 * Each instance is associated to a single user (and it does not handle user switch itself).
 */
public class AutoclickController implements EventStreamTransformation {

@@ -60,13 +62,15 @@ public class AutoclickController implements EventStreamTransformation {

    private EventStreamTransformation mNext;
    private final Context mContext;
    private final int mUserId;

    // Lazily created on the first mouse motion event.
    private ClickScheduler mClickScheduler;
    private ClickDelayObserver mClickDelayObserver;

    public AutoclickController(Context context) {
    public AutoclickController(Context context, int userId) {
        mContext = context;
        mUserId = userId;
    }

    @Override
@@ -75,7 +79,7 @@ public class AutoclickController implements EventStreamTransformation {
            if (mClickScheduler == null) {
                Handler handler = new Handler(mContext.getMainLooper());
                mClickScheduler = new ClickScheduler(handler, DEFAULT_CLICK_DELAY_MS);
                mClickDelayObserver = new ClickDelayObserver(handler);
                mClickDelayObserver = new ClickDelayObserver(mUserId, handler);
                mClickDelayObserver.start(mContext.getContentResolver(), mClickScheduler);
            }

@@ -168,9 +172,11 @@ public class AutoclickController implements EventStreamTransformation {

        private ContentResolver mContentResolver;
        private ClickScheduler mClickScheduler;
        private final int mUserId;

        public ClickDelayObserver(Handler handler) {
        public ClickDelayObserver(int userId, Handler handler) {
            super(handler);
            mUserId = userId;
        }

        /**
@@ -199,7 +205,7 @@ public class AutoclickController implements EventStreamTransformation {
            mContentResolver = contentResolver;
            mClickScheduler = clickScheduler;
            mContentResolver.registerContentObserver(mAutoclickDelaySettingUri, false, this,
                    UserHandle.USER_ALL);
                    mUserId);

            // Initialize mClickScheduler's initial delay value.
            onChange(true, mAutoclickDelaySettingUri);
@@ -222,10 +228,9 @@ public class AutoclickController implements EventStreamTransformation {
        @Override
        public void onChange(boolean selfChange, Uri uri) {
            if (mAutoclickDelaySettingUri.equals(uri)) {
                // TODO: Plumb current user id down to here and use getIntForUser.
                int delay = Settings.Secure.getInt(
                int delay = Settings.Secure.getIntForUser(
                        mContentResolver, Settings.Secure.ACCESSIBILITY_AUTOCLICK_DELAY,
                        DEFAULT_CLICK_DELAY_MS);
                        DEFAULT_CLICK_DELAY_MS, mUserId);
                mClickScheduler.updateDelay(delay);
            }
        }
+9 −5
Original line number Diff line number Diff line
@@ -137,6 +137,8 @@ public final class ScreenMagnifier implements WindowManagerInternal.Magnificatio

    private final AccessibilityManagerService mAms;

    private final int mUserId;

    private final int mTapTimeSlop = ViewConfiguration.getJumpTapTimeout();
    private final int mMultiTapTimeSlop;
    private final int mTapDistanceSlop;
@@ -188,8 +190,10 @@ public final class ScreenMagnifier implements WindowManagerInternal.Magnificatio
        }
    };

    public ScreenMagnifier(Context context, int displayId, AccessibilityManagerService service) {
    public ScreenMagnifier(Context context, int userId, int displayId,
            AccessibilityManagerService service) {
        mContext = context;
        mUserId = userId;
        mWindowManager = LocalServices.getService(WindowManagerInternal.class);
        mAms = service;

@@ -882,17 +886,17 @@ public final class ScreenMagnifier implements WindowManagerInternal.Magnificatio
        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                Settings.Secure.putFloat(mContext.getContentResolver(),
                        Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, scale);
                Settings.Secure.putFloatForUser(mContext.getContentResolver(),
                        Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, scale, mUserId);
                return null;
            }
        }.execute();
    }

    private float getPersistedScale() {
        return Settings.Secure.getFloat(mContext.getContentResolver(),
        return Settings.Secure.getFloatForUser(mContext.getContentResolver(),
                Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE,
                DEFAULT_MAGNIFICATION_SCALE);
                DEFAULT_MAGNIFICATION_SCALE, mUserId);
    }

    private static boolean isScreenMagnificationAutoUpdateEnabled(Context context) {