Loading core/java/android/view/ViewRootImpl.java +15 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -1362,6 +1363,7 @@ public final class ViewRootImpl implements ViewParent, if (mAccessibilityManager.isEnabled()) { mAccessibilityInteractionConnectionManager.ensureConnection(); setAccessibilityWindowAttributesIfNeeded(); } if (view.getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) { Loading Loading @@ -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. */ Loading Loading @@ -1707,6 +1720,7 @@ public final class ViewRootImpl implements ViewParent, mWindowAttributesChanged = true; scheduleTraversals(); setAccessibilityWindowAttributesIfNeeded(); } } Loading Loading @@ -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(); Loading core/java/android/view/accessibility/AccessibilityManager.java +26 −0 Original line number Diff line number Diff line Loading @@ -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); Loading core/java/android/view/accessibility/AccessibilityWindowAttributes.aidl 0 → 100644 +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; core/java/android/view/accessibility/AccessibilityWindowAttributes.java 0 → 100644 +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 + '}'; } } core/java/android/view/accessibility/IAccessibilityManager.aidl +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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
core/java/android/view/ViewRootImpl.java +15 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -1362,6 +1363,7 @@ public final class ViewRootImpl implements ViewParent, if (mAccessibilityManager.isEnabled()) { mAccessibilityInteractionConnectionManager.ensureConnection(); setAccessibilityWindowAttributesIfNeeded(); } if (view.getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) { Loading Loading @@ -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. */ Loading Loading @@ -1707,6 +1720,7 @@ public final class ViewRootImpl implements ViewParent, mWindowAttributesChanged = true; scheduleTraversals(); setAccessibilityWindowAttributesIfNeeded(); } } Loading Loading @@ -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(); Loading
core/java/android/view/accessibility/AccessibilityManager.java +26 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
core/java/android/view/accessibility/AccessibilityWindowAttributes.aidl 0 → 100644 +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;
core/java/android/view/accessibility/AccessibilityWindowAttributes.java 0 → 100644 +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 + '}'; } }
core/java/android/view/accessibility/IAccessibilityManager.aidl +3 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); }