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

Commit 243d5ed9 authored by Ryan Lin's avatar Ryan Lin Committed by Android (Google) Code Review
Browse files

Merge changes Ia418b2f4,If3c35a6b

* changes:
  Delete the obsolete code for accessibility title population
  Send AccessibilityWindowAttributes to accessibility-framework
parents b792f2f5 16701bcf
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -179,6 +179,7 @@ import android.view.accessibility.AccessibilityNodeIdManager;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
import android.view.accessibility.AccessibilityNodeProvider;
import android.view.accessibility.AccessibilityWindowAttributes;
import android.view.accessibility.AccessibilityWindowInfo;
import android.view.accessibility.IAccessibilityEmbeddedConnection;
import android.view.accessibility.IAccessibilityInteractionConnection;
@@ -1362,6 +1363,7 @@ public final class ViewRootImpl implements ViewParent,

                if (mAccessibilityManager.isEnabled()) {
                    mAccessibilityInteractionConnectionManager.ensureConnection();
                    setAccessibilityWindowAttributesIfNeeded();
                }

                if (view.getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
@@ -1390,6 +1392,17 @@ public final class ViewRootImpl implements ViewParent,
        }
    }

    private void setAccessibilityWindowAttributesIfNeeded() {
        final boolean registered = mAttachInfo.mAccessibilityWindowId
                != AccessibilityWindowInfo.UNDEFINED_WINDOW_ID;
        if (registered) {
            final AccessibilityWindowAttributes attributes = new AccessibilityWindowAttributes(
                    mWindowAttributes);
            mAccessibilityManager.setAccessibilityWindowAttributes(getDisplayId(),
                    mAttachInfo.mAccessibilityWindowId, attributes);
        }
    }

    /**
     * Register any kind of listeners if setView was success.
     */
@@ -1707,6 +1720,7 @@ public final class ViewRootImpl implements ViewParent,

            mWindowAttributesChanged = true;
            scheduleTraversals();
            setAccessibilityWindowAttributesIfNeeded();
        }
    }

@@ -10294,6 +10308,7 @@ public final class ViewRootImpl implements ViewParent,
        public void onAccessibilityStateChanged(boolean enabled) {
            if (enabled) {
                ensureConnection();
                setAccessibilityWindowAttributesIfNeeded();
                if (mAttachInfo.mHasWindowFocus && (mView != null)) {
                    mView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
                    View focusedView = mView.findFocus();
+26 −0
Original line number Diff line number Diff line
@@ -1832,6 +1832,32 @@ public final class AccessibilityManager {
        }
    }


    /**
     * Sets the {@link AccessibilityWindowAttributes} to the window associated with the given
     * window id.
     *
     * @param displayId The display id of the window.
     * @param windowId  The id of the window.
     * @param attributes The accessibility window attributes.
     * @hide
     */
    public void setAccessibilityWindowAttributes(int displayId, int windowId,
            AccessibilityWindowAttributes attributes) {
        final IAccessibilityManager service;
        synchronized (mLock) {
            service = getServiceLocked();
            if (service == null) {
                return;
            }
        }
        try {
            service.setAccessibilityWindowAttributes(displayId, windowId, mUserId, attributes);
        } catch (RemoteException re) {
            re.rethrowFromSystemServer();
        }
    }

    private IAccessibilityManager getServiceLocked() {
        if (mService == null) {
            tryConnectToServiceLocked(null);
+19 −0
Original line number Diff line number Diff line
/**
 * Copyright (c) 2022, 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.view.accessibility;

parcelable AccessibilityWindowAttributes;
+110 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.view.accessibility;

import android.annotation.NonNull;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import android.view.WindowManager;

/**
 * This class represents the attributes of a window needed for {@link AccessibilityWindowInfo}.
 *
 * @hide
 */
public final class AccessibilityWindowAttributes implements Parcelable {

    private final CharSequence mWindowTitle;

    public AccessibilityWindowAttributes(@NonNull WindowManager.LayoutParams layoutParams) {
        mWindowTitle = populateWindowTitle(layoutParams);
    }

    private AccessibilityWindowAttributes(Parcel in) {
        mWindowTitle = in.readCharSequence();
    }

    public CharSequence getWindowTitle() {
        return mWindowTitle;
    }

    private CharSequence populateWindowTitle(@NonNull WindowManager.LayoutParams layoutParams) {
        CharSequence windowTitle = layoutParams.accessibilityTitle;
        // Panel windows have no public way to set the a11y title directly. Use the
        // regular title as a fallback.
        final boolean isPanelWindow =
                (layoutParams.type >= WindowManager.LayoutParams.FIRST_SUB_WINDOW)
                        && (layoutParams.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW);
        // Accessibility overlays should have titles that work for accessibility, and can't set
        // the a11y title themselves.
        final boolean isAccessibilityOverlay =
                layoutParams.type == WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;

        if (TextUtils.isEmpty(windowTitle) && (isPanelWindow
                || isAccessibilityOverlay)) {
            windowTitle = TextUtils.isEmpty(layoutParams.getTitle()) ? null
                    : layoutParams.getTitle();
        }
        return  windowTitle;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof AccessibilityWindowAttributes)) return false;

        AccessibilityWindowAttributes that = (AccessibilityWindowAttributes) o;

        return TextUtils.equals(mWindowTitle, that.mWindowTitle);
    }

    @Override
    public int hashCode() {
        return mWindowTitle.hashCode();
    }

    public static final Creator<AccessibilityWindowAttributes> CREATOR =
            new Creator<AccessibilityWindowAttributes>() {
                @Override
                public AccessibilityWindowAttributes createFromParcel(Parcel in) {
                    return new AccessibilityWindowAttributes(in);
                }

                @Override
                public AccessibilityWindowAttributes[] newArray(int size) {
                    return new AccessibilityWindowAttributes[size];
                }
            };

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

    @Override
    public void writeToParcel(@NonNull Parcel parcel, int flags) {
        parcel.writeCharSequence(mWindowTitle);
    }

    @Override
    public String toString() {
        return "AccessibilityWindowAttributes{"
                + "mAccessibilityWindowTitle=" + mWindowTitle
                + '}';
    }
}
+3 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.IAccessibilityInteractionConnection;
import android.view.accessibility.IAccessibilityManagerClient;
import android.view.accessibility.AccessibilityWindowAttributes;
import android.view.accessibility.IWindowMagnificationConnection;
import android.view.IWindow;

@@ -105,4 +106,6 @@ interface IAccessibilityManager {

    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.SET_SYSTEM_AUDIO_CAPTION)")
    void setSystemAudioCaptioningUiEnabled(boolean isEnabled, int userId);

    oneway void setAccessibilityWindowAttributes(int displayId, int windowId, int userId, in AccessibilityWindowAttributes attributes);
}
Loading