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

Commit 7da087d8 authored by Phil Weaver's avatar Phil Weaver Committed by Android (Google) Code Review
Browse files

Merge "Accessibility can capture fingerprint gestures"

parents 94ea5727 27fcd9c9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -182,6 +182,7 @@ LOCAL_SRC_FILES += \
	core/java/android/hardware/display/IVirtualDisplayCallback.aidl \
	core/java/android/hardware/fingerprint/IFingerprintService.aidl \
	core/java/android/hardware/fingerprint/IFingerprintServiceLockoutResetCallback.aidl \
	core/java/android/hardware/fingerprint/IFingerprintClientActiveCallback.aidl \
	core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl \
	core/java/android/hardware/hdmi/IHdmiControlCallback.aidl \
	core/java/android/hardware/hdmi/IHdmiControlService.aidl \
+20 −0
Original line number Diff line number Diff line
@@ -349,6 +349,7 @@ package android {
    field public static final int calendarTextColor = 16843931; // 0x101049b
    field public static final int calendarViewShown = 16843596; // 0x101034c
    field public static final int calendarViewStyle = 16843613; // 0x101035d
    field public static final int canCaptureFingerprintGestures = 16844111; // 0x101054f
    field public static final int canControlMagnification = 16844039; // 0x1010507
    field public static final int canPerformGestures = 16844045; // 0x101050d
    field public static final int canRecord = 16844060; // 0x101051c
@@ -2692,6 +2693,7 @@ package android.accessibilityservice {
    method public final void disableSelf();
    method public final boolean dispatchGesture(android.accessibilityservice.GestureDescription, android.accessibilityservice.AccessibilityService.GestureResultCallback, android.os.Handler);
    method public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
    method public final android.accessibilityservice.FingerprintGestureController getFingerprintGestureController();
    method public final android.accessibilityservice.AccessibilityService.MagnificationController getMagnificationController();
    method public android.view.accessibility.AccessibilityNodeInfo getRootInActiveWindow();
    method public final android.accessibilityservice.AccessibilityServiceInfo getServiceInfo();
@@ -2783,6 +2785,7 @@ package android.accessibilityservice {
    method public java.lang.String getSettingsActivityName();
    method public java.lang.String loadDescription(android.content.pm.PackageManager);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final int CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES = 64; // 0x40
    field public static final int CAPABILITY_CAN_CONTROL_MAGNIFICATION = 16; // 0x10
    field public static final int CAPABILITY_CAN_PERFORM_GESTURES = 32; // 0x20
    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
@@ -2798,6 +2801,7 @@ package android.accessibilityservice {
    field public static final int FEEDBACK_HAPTIC = 2; // 0x2
    field public static final int FEEDBACK_SPOKEN = 1; // 0x1
    field public static final int FEEDBACK_VISUAL = 8; // 0x8
    field public static final int FLAG_CAPTURE_FINGERPRINT_GESTURES = 512; // 0x200
    field public static final int FLAG_ENABLE_ACCESSIBILITY_VOLUME = 128; // 0x80
    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
@@ -2812,6 +2816,22 @@ package android.accessibilityservice {
    field public java.lang.String[] packageNames;
  }
  public final class FingerprintGestureController {
    method public boolean isGestureDetectionAvailable();
    method public void registerFingerprintGestureCallback(android.accessibilityservice.FingerprintGestureController.FingerprintGestureCallback, android.os.Handler);
    method public void unregisterFingerprintGestureCallback(android.accessibilityservice.FingerprintGestureController.FingerprintGestureCallback);
    field public static final int FINGERPRINT_GESTURE_SWIPE_DOWN = 8; // 0x8
    field public static final int FINGERPRINT_GESTURE_SWIPE_LEFT = 2; // 0x2
    field public static final int FINGERPRINT_GESTURE_SWIPE_RIGHT = 1; // 0x1
    field public static final int FINGERPRINT_GESTURE_SWIPE_UP = 4; // 0x4
  }
  public static abstract class FingerprintGestureController.FingerprintGestureCallback {
    ctor public FingerprintGestureController.FingerprintGestureCallback();
    method public void onGesture(int);
    method public void onGestureDetectionAvailabilityChanged(boolean);
  }
  public final class GestureDescription {
    method public static long getMaxGestureDuration();
    method public static int getMaxStrokeCount();
+20 −0
Original line number Diff line number Diff line
@@ -461,6 +461,7 @@ package android {
    field public static final int calendarTextColor = 16843931; // 0x101049b
    field public static final int calendarViewShown = 16843596; // 0x101034c
    field public static final int calendarViewStyle = 16843613; // 0x101035d
    field public static final int canCaptureFingerprintGestures = 16844111; // 0x101054f
    field public static final int canControlMagnification = 16844039; // 0x1010507
    field public static final int canPerformGestures = 16844045; // 0x101050d
    field public static final int canRecord = 16844060; // 0x101051c
@@ -2811,6 +2812,7 @@ package android.accessibilityservice {
    method public final void disableSelf();
    method public final boolean dispatchGesture(android.accessibilityservice.GestureDescription, android.accessibilityservice.AccessibilityService.GestureResultCallback, android.os.Handler);
    method public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
    method public final android.accessibilityservice.FingerprintGestureController getFingerprintGestureController();
    method public final android.accessibilityservice.AccessibilityService.MagnificationController getMagnificationController();
    method public android.view.accessibility.AccessibilityNodeInfo getRootInActiveWindow();
    method public final android.accessibilityservice.AccessibilityServiceInfo getServiceInfo();
@@ -2902,6 +2904,7 @@ package android.accessibilityservice {
    method public java.lang.String getSettingsActivityName();
    method public java.lang.String loadDescription(android.content.pm.PackageManager);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final int CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES = 64; // 0x40
    field public static final int CAPABILITY_CAN_CONTROL_MAGNIFICATION = 16; // 0x10
    field public static final int CAPABILITY_CAN_PERFORM_GESTURES = 32; // 0x20
    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
@@ -2917,6 +2920,7 @@ package android.accessibilityservice {
    field public static final int FEEDBACK_HAPTIC = 2; // 0x2
    field public static final int FEEDBACK_SPOKEN = 1; // 0x1
    field public static final int FEEDBACK_VISUAL = 8; // 0x8
    field public static final int FLAG_CAPTURE_FINGERPRINT_GESTURES = 512; // 0x200
    field public static final int FLAG_ENABLE_ACCESSIBILITY_VOLUME = 128; // 0x80
    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
@@ -2931,6 +2935,22 @@ package android.accessibilityservice {
    field public java.lang.String[] packageNames;
  }
  public final class FingerprintGestureController {
    method public boolean isGestureDetectionAvailable();
    method public void registerFingerprintGestureCallback(android.accessibilityservice.FingerprintGestureController.FingerprintGestureCallback, android.os.Handler);
    method public void unregisterFingerprintGestureCallback(android.accessibilityservice.FingerprintGestureController.FingerprintGestureCallback);
    field public static final int FINGERPRINT_GESTURE_SWIPE_DOWN = 8; // 0x8
    field public static final int FINGERPRINT_GESTURE_SWIPE_LEFT = 2; // 0x2
    field public static final int FINGERPRINT_GESTURE_SWIPE_RIGHT = 1; // 0x1
    field public static final int FINGERPRINT_GESTURE_SWIPE_UP = 4; // 0x4
  }
  public static abstract class FingerprintGestureController.FingerprintGestureCallback {
    ctor public FingerprintGestureController.FingerprintGestureCallback();
    method public void onGesture(int);
    method public void onGestureDetectionAvailabilityChanged(boolean);
  }
  public final class GestureDescription {
    method public static long getMaxGestureDuration();
    method public static int getMaxStrokeCount();
+20 −0
Original line number Diff line number Diff line
@@ -349,6 +349,7 @@ package android {
    field public static final int calendarTextColor = 16843931; // 0x101049b
    field public static final int calendarViewShown = 16843596; // 0x101034c
    field public static final int calendarViewStyle = 16843613; // 0x101035d
    field public static final int canCaptureFingerprintGestures = 16844111; // 0x101054f
    field public static final int canControlMagnification = 16844039; // 0x1010507
    field public static final int canPerformGestures = 16844045; // 0x101050d
    field public static final int canRecord = 16844060; // 0x101051c
@@ -2692,6 +2693,7 @@ package android.accessibilityservice {
    method public final void disableSelf();
    method public final boolean dispatchGesture(android.accessibilityservice.GestureDescription, android.accessibilityservice.AccessibilityService.GestureResultCallback, android.os.Handler);
    method public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
    method public final android.accessibilityservice.FingerprintGestureController getFingerprintGestureController();
    method public final android.accessibilityservice.AccessibilityService.MagnificationController getMagnificationController();
    method public android.view.accessibility.AccessibilityNodeInfo getRootInActiveWindow();
    method public final android.accessibilityservice.AccessibilityServiceInfo getServiceInfo();
@@ -2783,6 +2785,7 @@ package android.accessibilityservice {
    method public java.lang.String getSettingsActivityName();
    method public java.lang.String loadDescription(android.content.pm.PackageManager);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final int CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES = 64; // 0x40
    field public static final int CAPABILITY_CAN_CONTROL_MAGNIFICATION = 16; // 0x10
    field public static final int CAPABILITY_CAN_PERFORM_GESTURES = 32; // 0x20
    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
@@ -2798,6 +2801,7 @@ package android.accessibilityservice {
    field public static final int FEEDBACK_HAPTIC = 2; // 0x2
    field public static final int FEEDBACK_SPOKEN = 1; // 0x1
    field public static final int FEEDBACK_VISUAL = 8; // 0x8
    field public static final int FLAG_CAPTURE_FINGERPRINT_GESTURES = 512; // 0x200
    field public static final int FLAG_ENABLE_ACCESSIBILITY_VOLUME = 128; // 0x80
    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
@@ -2812,6 +2816,22 @@ package android.accessibilityservice {
    field public java.lang.String[] packageNames;
  }
  public final class FingerprintGestureController {
    method public boolean isGestureDetectionAvailable();
    method public void registerFingerprintGestureCallback(android.accessibilityservice.FingerprintGestureController.FingerprintGestureCallback, android.os.Handler);
    method public void unregisterFingerprintGestureCallback(android.accessibilityservice.FingerprintGestureController.FingerprintGestureCallback);
    field public static final int FINGERPRINT_GESTURE_SWIPE_DOWN = 8; // 0x8
    field public static final int FINGERPRINT_GESTURE_SWIPE_LEFT = 2; // 0x2
    field public static final int FINGERPRINT_GESTURE_SWIPE_RIGHT = 1; // 0x1
    field public static final int FINGERPRINT_GESTURE_SWIPE_UP = 4; // 0x4
  }
  public static abstract class FingerprintGestureController.FingerprintGestureCallback {
    ctor public FingerprintGestureController.FingerprintGestureCallback();
    method public void onGesture(int);
    method public void onGestureDetectionAvailabilityChanged(boolean);
  }
  public final class GestureDescription {
    method public static long getMaxGestureDuration();
    method public static int getMaxStrokeCount();
+85 −11
Original line number Diff line number Diff line
@@ -20,11 +20,13 @@ import android.accessibilityservice.GestureDescription.MotionEventGenerator;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ParceledListSlice;
import android.graphics.Region;
import android.hardware.fingerprint.FingerprintManager;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
@@ -33,11 +35,9 @@ import android.os.RemoteException;
import android.provider.Settings;
import android.util.ArrayMap;
import android.util.Log;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.view.WindowManagerImpl;
import android.view.accessibility.AccessibilityEvent;
@@ -362,19 +362,22 @@ public abstract class AccessibilityService extends Service {
    private static final String LOG_TAG = "AccessibilityService";

    /**
     * Interface used by IAccessibilityServiceWrapper to call the service from its main thread.
     * @hide
     */
    public interface Callbacks {
        public void onAccessibilityEvent(AccessibilityEvent event);
        public void onInterrupt();
        public void onServiceConnected();
        public void init(int connectionId, IBinder windowToken);
        public boolean onGesture(int gestureId);
        public boolean onKeyEvent(KeyEvent event);
        public void onMagnificationChanged(@NonNull Region region,
        void onAccessibilityEvent(AccessibilityEvent event);
        void onInterrupt();
        void onServiceConnected();
        void init(int connectionId, IBinder windowToken);
        boolean onGesture(int gestureId);
        boolean onKeyEvent(KeyEvent event);
        void onMagnificationChanged(@NonNull Region region,
                float scale, float centerX, float centerY);
        public void onSoftKeyboardShowModeChanged(int showMode);
        public void onPerformGestureResult(int sequence, boolean completedSuccessfully);
        void onSoftKeyboardShowModeChanged(int showMode);
        void onPerformGestureResult(int sequence, boolean completedSuccessfully);
        void onFingerprintCapturingGesturesChanged(boolean active);
        void onFingerprintGesture(int gesture);
    }

    /**
@@ -404,6 +407,8 @@ public abstract class AccessibilityService extends Service {

    private final Object mLock = new Object();

    private FingerprintGestureController mFingerprintGestureController;

    /**
     * Callback for {@link android.view.accessibility.AccessibilityEvent}s.
     *
@@ -597,6 +602,32 @@ public abstract class AccessibilityService extends Service {
        }
    }

    /**
     * Get the controller for fingerprint gestures. This feature requires {@link
     * AccessibilityServiceInfo#CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES}.
     *
     *<strong>Note: </strong> The service must be connected before this method is called.
     *
     * @return The controller for fingerprint gestures, or {@code null} if gestures are unavailable.
     */
    @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT)
    public final @Nullable FingerprintGestureController getFingerprintGestureController() {
        if (mFingerprintGestureController == null) {
            FingerprintManager fingerprintManager = getSystemService(FingerprintManager.class);
            if ((fingerprintManager != null) && fingerprintManager.isHardwareDetected()) {
                AccessibilityServiceInfo info = getServiceInfo();
                int fingerprintCapabilityMask =
                        AccessibilityServiceInfo.CAPABILITY_CAN_CAPTURE_FINGERPRINT_GESTURES;
                if ((info.getCapabilities() & fingerprintCapabilityMask) != 0) {
                    mFingerprintGestureController = new FingerprintGestureController(
                            AccessibilityInteractionClient.getInstance()
                                    .getConnection(mConnectionId));
                }
            }
        }
        return mFingerprintGestureController;
    }

    /**
     * Dispatch a gesture to the touch screen. Any gestures currently in progress, whether from
     * the user, this service, or another service, will be cancelled.
@@ -693,6 +724,22 @@ public abstract class AccessibilityService extends Service {
        }
    }

    /**
     * Callback for fingerprint gesture handling
     * @param active If gesture detection is active
     */
    private void onFingerprintCapturingGesturesChanged(boolean active) {
        getFingerprintGestureController().onGestureDetectionActiveChanged(active);
    }

    /**
     * Callback for fingerprint gesture handling
     * @param gesture The identifier for the gesture performed
     */
    private void onFingerprintGesture(int gesture) {
        getFingerprintGestureController().onGesture(gesture);
    }

    /**
     * Used to control and query the state of display magnification.
     */
@@ -1486,6 +1533,16 @@ public abstract class AccessibilityService extends Service {
            public void onPerformGestureResult(int sequence, boolean completedSuccessfully) {
                AccessibilityService.this.onPerformGestureResult(sequence, completedSuccessfully);
            }

            @Override
            public void onFingerprintCapturingGesturesChanged(boolean active) {
                AccessibilityService.this.onFingerprintCapturingGesturesChanged(active);
            }

            @Override
            public void onFingerprintGesture(int gesture) {
                AccessibilityService.this.onFingerprintGesture(gesture);
            }
        });
    }

@@ -1506,6 +1563,8 @@ public abstract class AccessibilityService extends Service {
        private static final int DO_ON_MAGNIFICATION_CHANGED = 7;
        private static final int DO_ON_SOFT_KEYBOARD_SHOW_MODE_CHANGED = 8;
        private static final int DO_GESTURE_COMPLETE = 9;
        private static final int DO_ON_FINGERPRINT_ACTIVE_CHANGED = 10;
        private static final int DO_ON_FINGERPRINT_GESTURE = 11;

        private final HandlerCaller mCaller;

@@ -1577,6 +1636,15 @@ public abstract class AccessibilityService extends Service {
            mCaller.sendMessage(message);
        }

        public void onFingerprintCapturingGesturesChanged(boolean active) {
            mCaller.sendMessage(mCaller.obtainMessageI(
                    DO_ON_FINGERPRINT_ACTIVE_CHANGED, active ? 1 : 0));
        }

        public void onFingerprintGesture(int gesture) {
            mCaller.sendMessage(mCaller.obtainMessageI(DO_ON_FINGERPRINT_GESTURE, gesture));
        }

        @Override
        public void executeMessage(Message message) {
            switch (message.what) {
@@ -1675,6 +1743,12 @@ public abstract class AccessibilityService extends Service {
                    final boolean successfully = message.arg2 == 1;
                    mCallback.onPerformGestureResult(message.arg1, successfully);
                } return;
                case DO_ON_FINGERPRINT_ACTIVE_CHANGED: {
                    mCallback.onFingerprintCapturingGesturesChanged(message.arg1 == 1);
                } return;
                case DO_ON_FINGERPRINT_GESTURE: {
                    mCallback.onFingerprintGesture(message.arg1);
                } return;

                default :
                    Log.w(LOG_TAG, "Unknown message type " + message.what);
Loading