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

Commit a32f22ec authored by Sally Yuen's avatar Sally Yuen Committed by Android (Google) Code Review
Browse files

Merge "Expose A11yDisplayProxy#setFocusAppearance"

parents 5550e838 880c2380
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -16686,6 +16686,7 @@ package android.view.accessibility {
    method public void interrupt();
    method public void interrupt();
    method public void onAccessibilityEvent(@NonNull android.view.accessibility.AccessibilityEvent);
    method public void onAccessibilityEvent(@NonNull android.view.accessibility.AccessibilityEvent);
    method public void onProxyConnected();
    method public void onProxyConnected();
    method public void setAccessibilityFocusAppearance(int, @ColorInt int);
    method public void setInstalledAndEnabledServices(@NonNull java.util.List<android.accessibilityservice.AccessibilityServiceInfo>);
    method public void setInstalledAndEnabledServices(@NonNull java.util.List<android.accessibilityservice.AccessibilityServiceInfo>);
  }
  }
+22 −0
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@ import android.accessibilityservice.AccessibilityServiceInfo;
import android.accessibilityservice.IAccessibilityServiceClient;
import android.accessibilityservice.IAccessibilityServiceClient;
import android.accessibilityservice.IAccessibilityServiceConnection;
import android.accessibilityservice.IAccessibilityServiceConnection;
import android.accessibilityservice.MagnificationConfig;
import android.accessibilityservice.MagnificationConfig;
import android.annotation.ColorInt;
import android.annotation.NonNull;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.SystemApi;
@@ -239,6 +240,27 @@ public abstract class AccessibilityDisplayProxy {
        return Collections.emptyList();
        return Collections.emptyList();
    }
    }


    /**
     * Sets the strokeWidth and color of the accessibility focus rectangle.
     *
     * @param strokeWidth The stroke width of the rectangle in pixels.
     *                    Setting this value to zero results in no focus rectangle being drawn.
     * @param color The color of the rectangle.
     */
    public void setAccessibilityFocusAppearance(int strokeWidth, @ColorInt int color) {
        IAccessibilityServiceConnection connection =
                AccessibilityInteractionClient.getInstance().getConnection(mConnectionId);
        if (connection != null) {
            try {
                connection.setFocusAppearance(strokeWidth, color);
            } catch (RemoteException re) {
                Log.w(LOG_TAG, "Error while setting the strokeWidth and color of the "
                        + "accessibility focus rectangle", re);
                re.rethrowFromSystemServer();
            }
        }
    }

    /**
    /**
     * An IAccessibilityServiceClient that handles interrupts, accessibility events, and system
     * An IAccessibilityServiceClient that handles interrupts, accessibility events, and system
     * connection.
     * connection.
+3 −0
Original line number Original line Diff line number Diff line
@@ -314,6 +314,9 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
        void unbindImeLocked(AbstractAccessibilityServiceConnection connection);
        void unbindImeLocked(AbstractAccessibilityServiceConnection connection);


        void attachAccessibilityOverlayToDisplay(int displayId, SurfaceControl sc);
        void attachAccessibilityOverlayToDisplay(int displayId, SurfaceControl sc);

        void setCurrentUserFocusAppearance(int strokeWidth, int color);

    }
    }


    public AbstractAccessibilityServiceConnection(Context context, ComponentName componentName,
    public AbstractAccessibilityServiceConnection(Context context, ComponentName componentName,
+7 −0
Original line number Original line Diff line number Diff line
@@ -4876,4 +4876,11 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        transaction.apply();
        transaction.apply();
        transaction.close();
        transaction.close();
    }
    }

    @Override
    public void setCurrentUserFocusAppearance(int strokeWidth, int color) {
        synchronized (mLock) {
            getCurrentUserStateLocked().setFocusAppearanceLocked(strokeWidth, color);
        }
    }
}
}
+52 −0
Original line number Original line Diff line number Diff line
@@ -43,6 +43,7 @@ import android.view.accessibility.AccessibilityWindowInfo;


import androidx.annotation.Nullable;
import androidx.annotation.Nullable;


import com.android.internal.R;
import com.android.server.wm.WindowManagerInternal;
import com.android.server.wm.WindowManagerInternal;


import java.util.Arrays;
import java.util.Arrays;
@@ -63,6 +64,11 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon
    private int mDisplayId;
    private int mDisplayId;
    private List<AccessibilityServiceInfo> mInstalledAndEnabledServices;
    private List<AccessibilityServiceInfo> mInstalledAndEnabledServices;


    /** The stroke width of the focus rectangle in pixels */
    private int mFocusStrokeWidth;
    /** The color of the focus rectangle */
    private int mFocusColor;

    ProxyAccessibilityServiceConnection(
    ProxyAccessibilityServiceConnection(
            Context context,
            Context context,
            ComponentName componentName,
            ComponentName componentName,
@@ -77,6 +83,10 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon
                /* systemActionPerformer= */ null, awm, /* activityTaskManagerService= */ null);
                /* systemActionPerformer= */ null, awm, /* activityTaskManagerService= */ null);
        mDisplayId = displayId;
        mDisplayId = displayId;
        setDisplayTypes(DISPLAY_TYPE_PROXY);
        setDisplayTypes(DISPLAY_TYPE_PROXY);
        mFocusStrokeWidth = mContext.getResources().getDimensionPixelSize(
                R.dimen.accessibility_focus_highlight_stroke_width);
        mFocusColor = mContext.getResources().getColor(
                R.color.accessibility_focus_highlight_color);
    }
    }


    /**
    /**
@@ -202,6 +212,48 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon
        return displayWindows;
        return displayWindows;
    }
    }


    @Override
    public void setFocusAppearance(int strokeWidth, int color) {
        synchronized (mLock) {
            if (!hasRightsToCurrentUserLocked()) {
                return;
            }

            if (!mSecurityPolicy.checkAccessibilityAccess(this)) {
                return;
            }

            if (getFocusStrokeWidthLocked() == strokeWidth && getFocusColorLocked() == color) {
                return;
            }

            mFocusStrokeWidth = strokeWidth;
            mFocusColor = color;
            // Sets the appearance data in the A11yUserState for now, since the A11yManagers are not
            // separated.
            // TODO(254545943): Separate proxy and non-proxy states so the focus appearance on the
            // phone is not affected by the appearance of a proxy-ed app.
            mSystemSupport.setCurrentUserFocusAppearance(mFocusStrokeWidth, mFocusColor);
            mSystemSupport.onClientChangeLocked(false);
        }
    }

    /**
     * Gets the stroke width of the focus rectangle.
     * @return The stroke width.
     */
    public int getFocusStrokeWidthLocked() {
        return mFocusStrokeWidth;
    }

    /**
     * Gets the color of the focus rectangle.
     * @return The color.
     */
    public int getFocusColorLocked() {
        return mFocusColor;
    }

    @Override
    @Override
    public void binderDied() {
    public void binderDied() {
    }
    }
Loading