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

Commit 2dfa5c67 authored by Riley Jones's avatar Riley Jones
Browse files

Changing A11yManagerService to respond to user switching from Lifecycle instead of Intents.

This shrinks the window in which AMS holds an incorrect userId to near non-existence, preventing most if not all user-incurred bugs regarding wrong userIds.

Test: atest AccessibilityManagerServiceTest
Flag: com.android.server.accessibility.manager_lifecycle_user_change
Bug: 393626471
Change-Id: I9a8d21a7449da9f27cbf283584e0960d8c79d37e
parent cfec003e
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -222,6 +222,16 @@ flag {
    }
}

flag {
    name: "manager_lifecycle_user_change"
    namespace: "accessibility"
    description: "Use A11yManagerService's Lifecycle to change users, instead of listening for user changed events."
    bug: "393626471"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}

flag {
    name: "motion_event_injector_cancel_fix"
    namespace: "accessibility"
+18 −1
Original line number Diff line number Diff line
@@ -500,6 +500,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
            mService = new AccessibilityManagerService(context);
        }

        @VisibleForTesting
        public Lifecycle(Context context, AccessibilityManagerService service) {
            super(context);
            mService = service;
        }

        @Override
        public void onStart() {
            LocalServices.addService(AccessibilityManagerInternal.class,
@@ -511,6 +517,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        public void onBootPhase(int phase) {
            mService.onBootPhase(phase);
        }

        @Override
        public void onUserSwitching(@androidx.annotation.Nullable TargetUser from,
                @androidx.annotation.NonNull TargetUser to) {
            super.onUserSwitching(from, to);
            if (Flags.managerLifecycleUserChange()) {
                mService.switchUser(to.getUserIdentifier());
            }
        }
    }

    private InputManager.KeyGestureEventHandler mKeyGestureEventHandler =
@@ -1055,7 +1070,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub

                String action = intent.getAction();
                if (Intent.ACTION_USER_SWITCHED.equals(action)) {
                    if (!Flags.managerLifecycleUserChange()) {
                        switchUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0));
                    }
                } else if (Intent.ACTION_USER_UNLOCKED.equals(action)) {
                    unlockUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0));
                } else if (Intent.ACTION_USER_REMOVED.equals(action)) {
+32 −0
Original line number Diff line number Diff line
@@ -82,6 +82,7 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo;
import android.content.res.XmlResourceParser;
import android.graphics.drawable.Icon;
import android.hardware.display.DisplayManager;
@@ -131,6 +132,7 @@ import com.android.internal.accessibility.util.ShortcutUtils;
import com.android.internal.compat.IPlatformCompat;
import com.android.internal.content.PackageMonitor;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.accessibility.AccessibilityManagerService.AccessibilityDisplayListener;
import com.android.server.accessibility.magnification.FullScreenMagnificationController;
import com.android.server.accessibility.magnification.MagnificationConnectionManager;
@@ -2121,6 +2123,36 @@ public class AccessibilityManagerServiceTest {
        verify(mUserInitializationCompleteCallback).onUserInitializationComplete(newUserId);
    }

    @Test
    @EnableFlags(Flags.FLAG_MANAGER_LIFECYCLE_USER_CHANGE)
    public void lifecycle_onUserSwitching_switchesUser() throws RemoteException {
        mA11yms.mUserInitializationCompleteCallbacks.add(mUserInitializationCompleteCallback);
        AccessibilityManagerService.Lifecycle lifecycle =
                new AccessibilityManagerService.Lifecycle(mTestableContext, mA11yms);
        int newUserId = mA11yms.getCurrentUserIdLocked() + 1;

        lifecycle.onUserSwitching(
                new SystemService.TargetUser(new UserInfo(0, "USER", 0)),
                new SystemService.TargetUser(new UserInfo(newUserId, "USER", 0)));
        mTestableLooper.processAllMessages();

        verify(mUserInitializationCompleteCallback).onUserInitializationComplete(newUserId);
    }

    @Test
    @DisableFlags(Flags.FLAG_MANAGER_LIFECYCLE_USER_CHANGE)
    public void intent_user_switched_switchesUser() throws RemoteException {
        mA11yms.mUserInitializationCompleteCallbacks.add(mUserInitializationCompleteCallback);
        int newUserId = mA11yms.getCurrentUserIdLocked() + 1;
        final Intent intent = new Intent(Intent.ACTION_USER_SWITCHED);
        intent.putExtra(Intent.EXTRA_USER_HANDLE, newUserId);

        sendBroadcastToAccessibilityManagerService(intent, mA11yms.getCurrentUserIdLocked());
        mTestableLooper.processAllMessages();

        verify(mUserInitializationCompleteCallback).onUserInitializationComplete(newUserId);
    }

    @Test
    @DisableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED)
    public void getShortcutTypeForGenericShortcutCalls_softwareType() {