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

Commit 4d2ece1b authored by Dieter Hsu's avatar Dieter Hsu
Browse files

Split AccessibilityManagerService.UserState into its own class

Bug: 111889696
Test: atest --test-mapping $ANDROID_BUILD_TOP/frameworks/base/services/accessibility:postsubmit
Change-Id: I6bd02407fc8582409bc9f5a6dcd83969cd5069b9
parent 83255dc9
Loading
Loading
Loading
Loading
+217 −604

File changed.

Preview size limit exceeded, changes collapsed.

+23 −23
Original line number Diff line number Diff line
@@ -35,7 +35,6 @@ import android.provider.Settings;
import android.util.Slog;
import android.view.Display;

import com.android.server.accessibility.AccessibilityManagerService.UserState;
import com.android.server.wm.WindowManagerInternal;

import java.lang.ref.WeakReference;
@@ -52,13 +51,13 @@ import java.util.Set;
class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnection {
    private static final String LOG_TAG = "AccessibilityServiceConnection";
    /*
     Holding a weak reference so there isn't a loop of references. UserState keeps lists of bound
     and binding services. These are freed on user changes, but just in case it somehow gets lost
     the weak reference will let the memory get GCed.
     Holding a weak reference so there isn't a loop of references. AccessibilityUserState keeps
     lists of bound and binding services. These are freed on user changes, but just in case it
     somehow gets lost the weak reference will let the memory get GCed.

     Having the reference be null when being called is a very bad sign, but we check the condition.
    */
    final WeakReference<UserState> mUserStateWeakReference;
    final WeakReference<AccessibilityUserState> mUserStateWeakReference;
    final Intent mIntent;

    private final Handler mMainHandler;
@@ -66,7 +65,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
    private boolean mWasConnectedAndDied;


    public AccessibilityServiceConnection(UserState userState, Context context,
    AccessibilityServiceConnection(AccessibilityUserState userState, Context context,
            ComponentName componentName,
            AccessibilityServiceInfo accessibilityServiceInfo, int id, Handler mainHandler,
            Object lock, AccessibilitySecurityPolicy securityPolicy, SystemSupport systemSupport,
@@ -74,7 +73,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
            SystemActionPerformer systemActionPerfomer, AccessibilityWindowManager awm) {
        super(context, componentName, accessibilityServiceInfo, id, mainHandler, lock,
                securityPolicy, systemSupport, windowManagerInternal, systemActionPerfomer, awm);
        mUserStateWeakReference = new WeakReference<UserState>(userState);
        mUserStateWeakReference = new WeakReference<AccessibilityUserState>(userState);
        mIntent = new Intent().setComponent(mComponentName);
        mMainHandler = mainHandler;
        mIntent.putExtra(Intent.EXTRA_CLIENT_LABEL,
@@ -89,13 +88,13 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
    }

    public void bindLocked() {
        UserState userState = mUserStateWeakReference.get();
        AccessibilityUserState userState = mUserStateWeakReference.get();
        if (userState == null) return;
        final long identity = Binder.clearCallingIdentity();
        try {
            int flags = Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE
                    | Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS;
            if (userState.getBindInstantServiceAllowed()) {
            if (userState.getBindInstantServiceAllowedLocked()) {
                flags |= Context.BIND_ALLOW_INSTANT;
            }
            if (mService == null && mContext.bindServiceAsUser(
@@ -109,7 +108,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect

    public void unbindLocked() {
        mContext.unbindService(this);
        UserState userState = mUserStateWeakReference.get();
        AccessibilityUserState userState = mUserStateWeakReference.get();
        if (userState == null) return;
        userState.removeServiceLocked(this);
        mSystemSupport.getMagnificationController().resetAllIfNeeded(mId);
@@ -123,7 +122,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
    @Override
    public void disableSelf() {
        synchronized (mLock) {
            UserState userState = mUserStateWeakReference.get();
            AccessibilityUserState userState = mUserStateWeakReference.get();
            if (userState == null) return;
            if (userState.getEnabledServicesLocked().remove(mComponentName)) {
                final long identity = Binder.clearCallingIdentity();
@@ -156,7 +155,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
                }
            }
            mServiceInterface = IAccessibilityServiceClient.Stub.asInterface(service);
            UserState userState = mUserStateWeakReference.get();
            AccessibilityUserState userState = mUserStateWeakReference.get();
            if (userState == null) return;
            userState.addServiceLocked(this);
            mSystemSupport.onClientChangeLocked(false);
@@ -177,7 +176,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
    private void initializeService() {
        IAccessibilityServiceClient serviceInterface = null;
        synchronized (mLock) {
            UserState userState = mUserStateWeakReference.get();
            AccessibilityUserState userState = mUserStateWeakReference.get();
            if (userState == null) return;
            Set<ComponentName> bindingServices = userState.getBindingServicesLocked();
            if (bindingServices.contains(mComponentName) || mWasConnectedAndDied) {
@@ -240,7 +239,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
            if (!hasRightsToCurrentUserLocked()) {
                return false;
            }
            final UserState userState = mUserStateWeakReference.get();
            final AccessibilityUserState userState = mUserStateWeakReference.get();
            if (userState == null) return false;
            return userState.setSoftKeyboardModeLocked(showMode, mComponentName);
        }
@@ -248,8 +247,8 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect

    @Override
    public int getSoftKeyboardShowMode() {
        final UserState userState = mUserStateWeakReference.get();
        return (userState != null) ? userState.getSoftKeyboardShowMode() : 0;
        final AccessibilityUserState userState = mUserStateWeakReference.get();
        return (userState != null) ? userState.getSoftKeyboardShowModeLocked() : 0;
    }

    @Override
@@ -258,7 +257,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
            if (!hasRightsToCurrentUserLocked()) {
                return false;
            }
            UserState userState = mUserStateWeakReference.get();
            AccessibilityUserState userState = mUserStateWeakReference.get();
            return (userState != null) && isAccessibilityButtonAvailableLocked(userState);
        }
    }
@@ -273,7 +272,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
                return;
            }
            mWasConnectedAndDied = true;
            UserState userState = mUserStateWeakReference.get();
            AccessibilityUserState userState = mUserStateWeakReference.get();
            if (userState != null) {
                userState.serviceDisconnectedLocked(this);
            }
@@ -283,7 +282,7 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
        }
    }

    public boolean isAccessibilityButtonAvailableLocked(UserState userState) {
    public boolean isAccessibilityButtonAvailableLocked(AccessibilityUserState userState) {
        // If the service does not request the accessibility button, it isn't available
        if (!mRequestAccessibilityButton) {
            return false;
@@ -295,8 +294,8 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
        }

        // If magnification is on and assigned to the accessibility button, services cannot be
        if (userState.mIsNavBarMagnificationEnabled
                && userState.mIsNavBarMagnificationAssignedToAccessibilityButton) {
        if (userState.isNavBarMagnificationEnabledLocked()
                && userState.isNavBarMagnificationAssignedToAccessibilityButtonLocked()) {
            return false;
        }

@@ -314,13 +313,14 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect
            return true;
        } else {
            // With more than one active service, we derive the target from the user's settings
            if (userState.mServiceAssignedToAccessibilityButton == null) {
            if (userState.getServiceAssignedToAccessibilityButtonLocked() == null) {
                // If the user has not made an assignment, we treat the button as available to
                // all services until the user interacts with the button to make an assignment
                return true;
            } else {
                // If an assignment was made, it defines availability
                return mComponentName.equals(userState.mServiceAssignedToAccessibilityButton);
                return mComponentName.equals(
                        userState.getServiceAssignedToAccessibilityButtonLocked());
            }
        }
    }
+571 −0

File added.

Preview size limit exceeded, changes collapsed.

+8 −1
Original line number Diff line number Diff line
@@ -41,12 +41,14 @@ import android.content.pm.ServiceInfo;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.UserHandle;
import android.testing.DexmakerShareClassLoaderRule;
import android.view.Display;

import com.android.server.wm.WindowManagerInternal;

import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -65,9 +67,14 @@ public class AccessibilityServiceConnectionTest {
            "com.android.server.accessibility", "AccessibilityServiceConnectionTest");
    static final int SERVICE_ID = 42;

    // Mock package-private AccessibilityUserState class
    @Rule
    public final DexmakerShareClassLoaderRule mDexmakerShareClassLoaderRule =
            new DexmakerShareClassLoaderRule();

    AccessibilityServiceConnection mConnection;

    @Mock AccessibilityManagerService.UserState mMockUserState;
    @Mock AccessibilityUserState mMockUserState;
    @Mock Context mMockContext;
    @Mock AccessibilityServiceInfo mMockServiceInfo;
    @Mock ResolveInfo mMockResolveInfo;
+296 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading