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

Commit a0daddd8 authored by RyanlwLin's avatar RyanlwLin
Browse files

Added onGesture(AccessibilityGestureInfo) for mulit-display

We added a new API to help App developers know the gesture information
performed on specific display.

Bug: 133290787
Test: atest AccessibilityGestureDetectorTest
Change-Id: Ic98847691ba9f608f418408e9bef1c3116388f3c
parent 30a8e05a
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -2810,6 +2810,14 @@ package android.accessibilityservice {
    method public void onClicked(android.accessibilityservice.AccessibilityButtonController);
  }
  public final class AccessibilityGestureInfo implements android.os.Parcelable {
    method public int describeContents();
    method public int getDisplayId();
    method public int getGestureId();
    method public void writeToParcel(android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.accessibilityservice.AccessibilityGestureInfo> CREATOR;
  }
  public abstract class AccessibilityService extends android.app.Service {
    ctor public AccessibilityService();
    method public final void disableSelf();
@@ -2824,7 +2832,8 @@ package android.accessibilityservice {
    method public java.util.List<android.view.accessibility.AccessibilityWindowInfo> getWindows();
    method public abstract void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
    method public final android.os.IBinder onBind(android.content.Intent);
    method protected boolean onGesture(int);
    method @Deprecated protected boolean onGesture(int);
    method public boolean onGesture(@NonNull android.accessibilityservice.AccessibilityGestureInfo);
    method public abstract void onInterrupt();
    method protected boolean onKeyEvent(android.view.KeyEvent);
    method protected void onServiceConnected();
+8 −0
Original line number Diff line number Diff line
@@ -32,6 +32,14 @@ package android {

}

package android.accessibilityservice {

  public final class AccessibilityGestureInfo implements android.os.Parcelable {
    ctor public AccessibilityGestureInfo(int, int);
  }

}

package android.animation {

  public class ValueAnimator extends android.animation.Animator {
+19 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.accessibilityservice;

parcelable AccessibilityGestureInfo;
+155 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.accessibilityservice;


import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_DOWN;
import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_DOWN_AND_LEFT;
import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_DOWN_AND_RIGHT;
import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_DOWN_AND_UP;
import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_LEFT;
import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_LEFT_AND_DOWN;
import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_LEFT_AND_RIGHT;
import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_LEFT_AND_UP;
import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_RIGHT;
import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_RIGHT_AND_DOWN;
import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_RIGHT_AND_LEFT;
import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_RIGHT_AND_UP;
import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_UP;
import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_UP_AND_DOWN;
import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_UP_AND_LEFT;
import static android.accessibilityservice.AccessibilityService.GESTURE_SWIPE_UP_AND_RIGHT;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * This class describes the gesture information including gesture id and which display it happens
 * on.
 * <p>
 * <strong>Note:</strong> Accessibility services setting the
 * {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_REQUEST_TOUCH_EXPLORATION_MODE}
 * flag can receive gestures.
 *
 * @see AccessibilityService#onGesture(AccessibilityGestureInfo)
 */

public final class AccessibilityGestureInfo implements Parcelable {

    /** @hide */
    @IntDef(prefix = { "GESTURE_" }, value = {
            GESTURE_SWIPE_UP,
            GESTURE_SWIPE_UP_AND_LEFT,
            GESTURE_SWIPE_UP_AND_DOWN,
            GESTURE_SWIPE_UP_AND_RIGHT,
            GESTURE_SWIPE_DOWN,
            GESTURE_SWIPE_DOWN_AND_LEFT,
            GESTURE_SWIPE_DOWN_AND_UP,
            GESTURE_SWIPE_DOWN_AND_RIGHT,
            GESTURE_SWIPE_LEFT,
            GESTURE_SWIPE_LEFT_AND_UP,
            GESTURE_SWIPE_LEFT_AND_RIGHT,
            GESTURE_SWIPE_LEFT_AND_DOWN,
            GESTURE_SWIPE_RIGHT,
            GESTURE_SWIPE_RIGHT_AND_UP,
            GESTURE_SWIPE_RIGHT_AND_LEFT,
            GESTURE_SWIPE_RIGHT_AND_DOWN
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface GestureType {}

    @GestureType
    private final int mGestureId;
    private final int mDisplayId;

    /** @hide */
    @TestApi
    public AccessibilityGestureInfo(int gestureId, int displayId) {
        mGestureId = gestureId;
        mDisplayId = displayId;
    }

    private AccessibilityGestureInfo(@NonNull Parcel parcel) {
        mGestureId = parcel.readInt();
        mDisplayId = parcel.readInt();
    }

    /**
     * Returns the display id of the received-gesture display, for use with
     * {@link android.hardware.display.DisplayManager#getDisplay(int)}.
     *
     * @return the display id.
     */
    public int getDisplayId() {
        return mDisplayId;
    }

    /**
     * Returns performed gesture id.
     *
     * @return the performed gesture id.
     *
     */
    @GestureType public int getGestureId() {
        return mGestureId;
    }

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder("AccessibilityGestureInfo[");
        stringBuilder.append("gestureId: ").append(mGestureId);
        stringBuilder.append(", ");
        stringBuilder.append("displayId: ").append(mDisplayId);
        stringBuilder.append(']');
        return stringBuilder.toString();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int flags) {
        parcel.writeInt(mGestureId);
        parcel.writeInt(mDisplayId);
    }

    /**
     * @see Parcelable.Creator
     */
    public static final @NonNull Parcelable.Creator<AccessibilityGestureInfo> CREATOR =
            new Parcelable.Creator<AccessibilityGestureInfo>() {
        public AccessibilityGestureInfo createFromParcel(Parcel parcel) {
            return new AccessibilityGestureInfo(parcel);
        }

        public AccessibilityGestureInfo[] newArray(int size) {
            return new AccessibilityGestureInfo[size];
        }
    };

}
+37 −10
Original line number Diff line number Diff line
@@ -381,7 +381,8 @@ public abstract class AccessibilityService extends Service {
        void onInterrupt();
        void onServiceConnected();
        void init(int connectionId, IBinder windowToken);
        boolean onGesture(int gestureId);
        /** The detected gesture information for different displays */
        boolean onGesture(AccessibilityGestureInfo gestureInfo);
        boolean onKeyEvent(KeyEvent event);
        /** Magnification changed callbacks for different displays */
        void onMagnificationChanged(int displayId, @NonNull Region region,
@@ -514,17 +515,18 @@ public abstract class AccessibilityService extends Service {
    }

    /**
     * Called by the system when the user performs a specific gesture on the
     * touch screen.
     * Called by {@link #onGesture(AccessibilityGestureInfo)} when the user performs a specific
     * gesture on the default display.
     *
     * <strong>Note:</strong> To receive gestures an accessibility service must
     * request that the device is in touch exploration mode by setting the
     * {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_REQUEST_TOUCH_EXPLORATION_MODE}
     * {@link AccessibilityServiceInfo#FLAG_REQUEST_TOUCH_EXPLORATION_MODE}
     * flag.
     *
     * @param gestureId The unique id of the performed gesture.
     *
     * @return Whether the gesture was handled.
     * @deprecated Override {@link #onGesture(AccessibilityGestureInfo)} instead.
     *
     * @see #GESTURE_SWIPE_UP
     * @see #GESTURE_SWIPE_UP_AND_LEFT
@@ -543,10 +545,35 @@ public abstract class AccessibilityService extends Service {
     * @see #GESTURE_SWIPE_RIGHT_AND_LEFT
     * @see #GESTURE_SWIPE_RIGHT_AND_DOWN
     */
    @Deprecated
    protected boolean onGesture(int gestureId) {
        return false;
    }

    /**
     * Called by the system when the user performs a specific gesture on the
     * specific touch screen.
     *<p>
     * <strong>Note:</strong> To receive gestures an accessibility service must
     * request that the device is in touch exploration mode by setting the
     * {@link AccessibilityServiceInfo#FLAG_REQUEST_TOUCH_EXPLORATION_MODE}
     * flag.
     *<p>
     * <strong>Note:</strong> The default implementation calls {@link #onGesture(int)} when the
     * touch screen is default display.
     *
     * @param gestureInfo The information of gesture.
     *
     * @return Whether the gesture was handled.
     *
     */
    public boolean onGesture(@NonNull AccessibilityGestureInfo gestureInfo) {
        if (gestureInfo.getDisplayId() == Display.DEFAULT_DISPLAY) {
            onGesture(gestureInfo.getGestureId());
        }
        return false;
    }

    /**
     * Callback that allows an accessibility service to observe the key events
     * before they are passed to the rest of the system. This means that the events
@@ -1647,8 +1674,8 @@ public abstract class AccessibilityService extends Service {
            }

            @Override
            public boolean onGesture(int gestureId) {
                return AccessibilityService.this.onGesture(gestureId);
            public boolean onGesture(AccessibilityGestureInfo gestureInfo) {
                return AccessibilityService.this.onGesture(gestureInfo);
            }

            @Override
@@ -1747,8 +1774,9 @@ public abstract class AccessibilityService extends Service {
            mCaller.sendMessage(message);
        }

        public void onGesture(int gestureId) {
            Message message = mCaller.obtainMessageI(DO_ON_GESTURE, gestureId);
        @Override
        public void onGesture(AccessibilityGestureInfo gestureInfo) {
            Message message = mCaller.obtainMessageO(DO_ON_GESTURE, gestureInfo);
            mCaller.sendMessage(message);
        }

@@ -1861,8 +1889,7 @@ public abstract class AccessibilityService extends Service {

                case DO_ON_GESTURE: {
                    if (mConnectionId != AccessibilityInteractionClient.NO_ID) {
                        final int gestureId = message.arg1;
                        mCallback.onGesture(gestureId);
                        mCallback.onGesture((AccessibilityGestureInfo) message.obj);
                    }
                } return;

Loading