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

Commit 630a657d authored by ryanlwlin's avatar ryanlwlin
Browse files

Add transition timestamp to AccessibilityWindowInfo

We use a timestamp to know when is the last transition
of the window. With the value, devlopers could define
the meaning of a stable window.

Bug: 215487047
Test: atest AccessibilityWindowQueryTest AccessibilityWindowInfoTest
      manual test
Change-Id: I3ea1c6f4ff135e9ded0a016a6b8a61eb1f754ed7
parent 2e96df28
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -52211,6 +52211,7 @@ package android.view.accessibility {
    method public android.view.accessibility.AccessibilityNodeInfo getRoot();
    method public android.view.accessibility.AccessibilityNodeInfo getRoot();
    method @Nullable public android.view.accessibility.AccessibilityNodeInfo getRoot(int);
    method @Nullable public android.view.accessibility.AccessibilityNodeInfo getRoot(int);
    method @Nullable public CharSequence getTitle();
    method @Nullable public CharSequence getTitle();
    method public long getTransitionTimeMillis();
    method public int getType();
    method public int getType();
    method public boolean isAccessibilityFocused();
    method public boolean isAccessibilityFocused();
    method public boolean isActive();
    method public boolean isActive();
+32 −0
Original line number Original line Diff line number Diff line
@@ -19,11 +19,13 @@ package android.view.accessibility;
import android.annotation.NonNull;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.annotation.TestApi;
import android.annotation.TestApi;
import android.annotation.UptimeMillisLong;
import android.app.ActivityTaskManager;
import android.app.ActivityTaskManager;
import android.graphics.Rect;
import android.graphics.Rect;
import android.graphics.Region;
import android.graphics.Region;
import android.os.Parcel;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Parcelable;
import android.os.SystemClock;
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.LongArray;
import android.util.LongArray;
import android.util.Pools.SynchronizedPool;
import android.util.Pools.SynchronizedPool;
@@ -126,6 +128,7 @@ public final class AccessibilityWindowInfo implements Parcelable {
    private LongArray mChildIds;
    private LongArray mChildIds;
    private CharSequence mTitle;
    private CharSequence mTitle;
    private long mAnchorId = AccessibilityNodeInfo.UNDEFINED_NODE_ID;
    private long mAnchorId = AccessibilityNodeInfo.UNDEFINED_NODE_ID;
    private long mTransitionTime;


    private int mConnectionId = UNDEFINED_CONNECTION_ID;
    private int mConnectionId = UNDEFINED_CONNECTION_ID;


@@ -526,6 +529,31 @@ public final class AccessibilityWindowInfo implements Parcelable {
        return mDisplayId;
        return mDisplayId;
    }
    }



    /**
     * Sets the timestamp of the transition.
     *
     * @param transitionTime The timestamp from {@link SystemClock#uptimeMillis()} at which the
     *                       transition happens.
     *
     * @hide
     */
    @UptimeMillisLong
    public void setTransitionTimeMillis(long transitionTime) {
        mTransitionTime = transitionTime;
    }

    /**
     * Return the {@link SystemClock#uptimeMillis()} at which the last transition happens.
     * A transition happens when {@link #getBoundsInScreen(Rect)} is changed.
     *
     * @return The transition timestamp.
     */
    @UptimeMillisLong
    public long getTransitionTimeMillis() {
        return mTransitionTime;
    }

    /**
    /**
     * Returns a cached instance if such is available or a new one is
     * Returns a cached instance if such is available or a new one is
     * created.
     * created.
@@ -634,6 +662,7 @@ public final class AccessibilityWindowInfo implements Parcelable {
        mRegionInScreen.writeToParcel(parcel, flags);
        mRegionInScreen.writeToParcel(parcel, flags);
        parcel.writeCharSequence(mTitle);
        parcel.writeCharSequence(mTitle);
        parcel.writeLong(mAnchorId);
        parcel.writeLong(mAnchorId);
        parcel.writeLong(mTransitionTime);


        final LongArray childIds = mChildIds;
        final LongArray childIds = mChildIds;
        if (childIds == null) {
        if (childIds == null) {
@@ -665,6 +694,7 @@ public final class AccessibilityWindowInfo implements Parcelable {
        mRegionInScreen.set(other.mRegionInScreen);
        mRegionInScreen.set(other.mRegionInScreen);
        mTitle = other.mTitle;
        mTitle = other.mTitle;
        mAnchorId = other.mAnchorId;
        mAnchorId = other.mAnchorId;
        mTransitionTime = other.mTransitionTime;


        if (mChildIds != null) mChildIds.clear();
        if (mChildIds != null) mChildIds.clear();
        if (other.mChildIds != null && other.mChildIds.size() > 0) {
        if (other.mChildIds != null && other.mChildIds.size() > 0) {
@@ -689,6 +719,7 @@ public final class AccessibilityWindowInfo implements Parcelable {
        mRegionInScreen = Region.CREATOR.createFromParcel(parcel);
        mRegionInScreen = Region.CREATOR.createFromParcel(parcel);
        mTitle = parcel.readCharSequence();
        mTitle = parcel.readCharSequence();
        mAnchorId = parcel.readLong();
        mAnchorId = parcel.readLong();
        mTransitionTime = parcel.readLong();


        final int childCount = parcel.readInt();
        final int childCount = parcel.readInt();
        if (childCount > 0) {
        if (childCount > 0) {
@@ -739,6 +770,7 @@ public final class AccessibilityWindowInfo implements Parcelable {
        builder.append(", focused=").append(isFocused());
        builder.append(", focused=").append(isFocused());
        builder.append(", active=").append(isActive());
        builder.append(", active=").append(isActive());
        builder.append(", pictureInPicture=").append(isInPictureInPictureMode());
        builder.append(", pictureInPicture=").append(isInPictureInPictureMode());
        builder.append(", transitionTime=").append(mTransitionTime);
        if (DEBUG) {
        if (DEBUG) {
            builder.append(", parent=").append(mParentId);
            builder.append(", parent=").append(mParentId);
            builder.append(", children=[");
            builder.append(", children=[");
+15 −2
Original line number Original line Diff line number Diff line
@@ -31,6 +31,7 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.IBinder;
import android.os.Process;
import android.os.Process;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserHandle;
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArrayMap;
@@ -564,7 +565,7 @@ public class AccessibilityWindowManager {
                    final WindowInfo windowInfo = windows.get(i);
                    final WindowInfo windowInfo = windows.get(i);
                    final AccessibilityWindowInfo window;
                    final AccessibilityWindowInfo window;
                    if (mTrackingWindows) {
                    if (mTrackingWindows) {
                        window = populateReportedWindowLocked(userId, windowInfo);
                        window = populateReportedWindowLocked(userId, windowInfo, oldWindowsById);
                        if (window == null) {
                        if (window == null) {
                            hasWindowIgnore = true;
                            hasWindowIgnore = true;
                        }
                        }
@@ -677,7 +678,7 @@ public class AccessibilityWindowManager {
        }
        }


        private AccessibilityWindowInfo populateReportedWindowLocked(int userId,
        private AccessibilityWindowInfo populateReportedWindowLocked(int userId,
                WindowInfo window) {
                WindowInfo window, SparseArray<AccessibilityWindowInfo> oldWindowsById) {
            final int windowId = findWindowIdLocked(userId, window.token);
            final int windowId = findWindowIdLocked(userId, window.token);
            if (windowId < 0) {
            if (windowId < 0) {
                return null;
                return null;
@@ -716,6 +717,18 @@ public class AccessibilityWindowManager {
                }
                }
            }
            }


            final AccessibilityWindowInfo oldWindowInfo = oldWindowsById.get(windowId);
            if (oldWindowInfo == null) {
                reportedWindow.setTransitionTimeMillis(SystemClock.uptimeMillis());
            } else {
                final Region oldTouchRegion = new Region();
                oldWindowInfo.getRegionInScreen(oldTouchRegion);
                if (oldTouchRegion.equals(window.regionInScreen)) {
                    reportedWindow.setTransitionTimeMillis(oldWindowInfo.getTransitionTimeMillis());
                } else {
                    reportedWindow.setTransitionTimeMillis(SystemClock.uptimeMillis());
                }
            }
            return reportedWindow;
            return reportedWindow;
        }
        }