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

Commit 89e7ffed authored by Svetoslav's avatar Svetoslav Committed by Android Git Automerger
Browse files

am bd6fabe2: Merge "APIs for an accessibility service to put interaction...

am bd6fabe2: Merge "APIs for an accessibility service to put interaction tracking overlays." into lmp-mr1-dev

* commit 'bd6fabe2':
  APIs for an accessibility service to put interaction tracking overlays.
parents 9dec5df3 bd6fabe2
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -34967,6 +34967,7 @@ package android.view {
    field public static final int SOFT_INPUT_STATE_UNSPECIFIED = 0; // 0x0
    field public static final int SOFT_INPUT_STATE_VISIBLE = 4; // 0x4
    field public static final int TITLE_CHANGED = 64; // 0x40
    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 2032; // 0x7f0
    field public static final int TYPE_APPLICATION = 2; // 0x2
    field public static final int TYPE_APPLICATION_ATTACHED_DIALOG = 1003; // 0x3eb
    field public static final int TYPE_APPLICATION_MEDIA = 1001; // 0x3e9
@@ -35386,6 +35387,7 @@ package android.view.accessibility {
    method public void recycle();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator CREATOR;
    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
    field public static final int TYPE_APPLICATION = 1; // 0x1
    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
    field public static final int TYPE_SYSTEM = 3; // 0x3
+86 −10
Original line number Diff line number Diff line
@@ -24,13 +24,18 @@ import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityInteractionClient;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityWindowInfo;

import com.android.internal.os.HandlerCaller;
import com.android.internal.os.SomeArgs;

import java.util.List;

@@ -366,7 +371,7 @@ public abstract class AccessibilityService extends Service {
        public void onAccessibilityEvent(AccessibilityEvent event);
        public void onInterrupt();
        public void onServiceConnected();
        public void onSetConnectionId(int connectionId);
        public void init(int connectionId, IBinder windowToken);
        public boolean onGesture(int gestureId);
        public boolean onKeyEvent(KeyEvent event);
    }
@@ -375,6 +380,10 @@ public abstract class AccessibilityService extends Service {

    private AccessibilityServiceInfo mInfo;

    private IBinder mWindowToken;

    private WindowManager mWindowManager;

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

    @Override
    public Object getSystemService(String name) {
        if (Context.WINDOW_SERVICE.equals(name)) {
            if (mWindowManager == null) {
                WindowManager wrapped = (WindowManager) super.getSystemService(name);
                mWindowManager = new LocalWindowManager(wrapped);
            }
            return mWindowManager;
        }
        return super.getSystemService(name);
    }

    /**
     * Implement to return the implementation of the internal accessibility
     * service interface.
@@ -634,8 +655,9 @@ public abstract class AccessibilityService extends Service {
            }

            @Override
            public void onSetConnectionId( int connectionId) {
            public void init(int connectionId, IBinder windowToken) {
                mConnectionId = connectionId;
                mWindowToken = windowToken;
            }

            @Override
@@ -658,7 +680,7 @@ public abstract class AccessibilityService extends Service {
     */
    public static class IAccessibilityServiceClientWrapper extends IAccessibilityServiceClient.Stub
            implements HandlerCaller.Callback {
        private static final int DO_SET_SET_CONNECTION = 1;
        private static final int DO_INIT = 1;
        private static final int DO_ON_INTERRUPT = 2;
        private static final int DO_ON_ACCESSIBILITY_EVENT = 3;
        private static final int DO_ON_GESTURE = 4;
@@ -677,9 +699,10 @@ public abstract class AccessibilityService extends Service {
            mCaller = new HandlerCaller(context, looper, this, true /*asyncHandler*/);
        }

        public void setConnection(IAccessibilityServiceConnection connection, int connectionId) {
            Message message = mCaller.obtainMessageIO(DO_SET_SET_CONNECTION, connectionId,
                    connection);
        public void init(IAccessibilityServiceConnection connection, int connectionId,
                IBinder windowToken) {
            Message message = mCaller.obtainMessageIOO(DO_INIT, connectionId,
                    connection, windowToken);
            mCaller.sendMessage(message);
        }

@@ -730,20 +753,24 @@ public abstract class AccessibilityService extends Service {
                    mCallback.onInterrupt();
                } return;

                case DO_SET_SET_CONNECTION: {
                case DO_INIT: {
                    mConnectionId = message.arg1;
                    SomeArgs args = (SomeArgs) message.obj;
                    IAccessibilityServiceConnection connection =
                        (IAccessibilityServiceConnection) message.obj;
                            (IAccessibilityServiceConnection) args.arg1;
                    IBinder windowToken = (IBinder) args.arg2;
                    args.recycle();
                    if (connection != null) {
                        AccessibilityInteractionClient.getInstance().addConnection(mConnectionId,
                                connection);
                        mCallback.onSetConnectionId(mConnectionId);
                        mCallback.init(mConnectionId, windowToken);
                        mCallback.onServiceConnected();
                    } else {
                        AccessibilityInteractionClient.getInstance().removeConnection(
                                mConnectionId);
                        mConnectionId = AccessibilityInteractionClient.NO_ID;
                        AccessibilityInteractionClient.getInstance().clearCache();
                        mCallback.onSetConnectionId(AccessibilityInteractionClient.NO_ID);
                        mCallback.init(AccessibilityInteractionClient.NO_ID, null);
                    }
                } return;

@@ -785,4 +812,53 @@ public abstract class AccessibilityService extends Service {
            }
        }
    }

    private class LocalWindowManager implements WindowManager {
        private final WindowManager mImpl;

        private LocalWindowManager(WindowManager impl) {
            mImpl = impl;
        }

        @Override
        public Display getDefaultDisplay() {
            return mImpl.getDefaultDisplay();
        }

        @Override
        public void addView(View view, ViewGroup.LayoutParams params) {
            if (!(params instanceof WindowManager.LayoutParams)) {
                throw new IllegalArgumentException("Params must be WindowManager.LayoutParams");
            }
            WindowManager.LayoutParams windowParams = (WindowManager.LayoutParams) params;
            if (windowParams.type == LayoutParams.TYPE_ACCESSIBILITY_OVERLAY
                    && windowParams.token == null) {
                windowParams.token = mWindowToken;
            }
            mImpl.addView(view, params);
        }

        @Override
        public void updateViewLayout(View view, ViewGroup.LayoutParams params) {
            if (!(params instanceof WindowManager.LayoutParams)) {
                throw new IllegalArgumentException("Params must be WindowManager.LayoutParams");
            }
            WindowManager.LayoutParams windowParams = (WindowManager.LayoutParams) params;
            if (windowParams.type == LayoutParams.TYPE_ACCESSIBILITY_OVERLAY
                    && windowParams.token == null) {
                windowParams.token = mWindowToken;
            }
            mImpl.updateViewLayout(view, params);
        }

        @Override
        public void removeViewImmediate(View view) {
            mImpl.removeViewImmediate(view);
        }

        @Override
        public void removeView(View view) {
            mImpl.removeView(view);
        }
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ import android.view.KeyEvent;
 */
 oneway interface IAccessibilityServiceClient {

    void setConnection(in IAccessibilityServiceConnection connection, int connectionId);
    void init(in IAccessibilityServiceConnection connection, int connectionId, IBinder windowToken);

    void onAccessibilityEvent(in AccessibilityEvent event);

+2 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Point;
import android.hardware.display.DisplayManagerGlobal;
import android.os.IBinder;
import android.os.Looper;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
@@ -919,7 +920,7 @@ public final class UiAutomation {
        public IAccessibilityServiceClientImpl(Looper looper) {
            super(null, looper, new Callbacks() {
                @Override
                public void onSetConnectionId(int connectionId) {
                public void init(int connectionId, IBinder windowToken) {
                    synchronized (mLock) {
                        mConnectionId = connectionId;
                        mLock.notifyAll();
+13 −0
Original line number Diff line number Diff line
@@ -541,6 +541,19 @@ public interface WindowManager extends ViewManager {
         */
        public static final int TYPE_VOICE_INTERACTION = FIRST_SYSTEM_WINDOW+31;

        /**
         * Window type: Windows that are overlaid <em>only</em> by an {@link
         * android.accessibilityservice.AccessibilityService} for interception of
         * user interactions without changing the windows an accessibility service
         * can introspect. In particular, an accessibility service can introspect
         * only windows that a sighted user can interact with which is they can touch
         * these windows or can type into these windows. For example, if there
         * is a full screen accessibility overlay that is touchable, the windows
         * below it will be introspectable by an accessibility service regardless
         * they are covered by a touchable window.
         */
        public static final int TYPE_ACCESSIBILITY_OVERLAY = FIRST_SYSTEM_WINDOW+32;

        /**
         * End of types of system windows.
         */
Loading