1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.view.accessibility; 18 19 import android.annotation.NonNull; 20 import android.os.LocaleList; 21 import android.os.Parcel; 22 import android.os.Parcelable; 23 import android.text.TextUtils; 24 import android.view.WindowManager; 25 26 import java.util.Objects; 27 28 /** 29 * This class represents the attributes of a window needed for {@link AccessibilityWindowInfo}. 30 * 31 * @hide 32 */ 33 public final class AccessibilityWindowAttributes implements Parcelable { 34 35 private final CharSequence mWindowTitle; 36 private final LocaleList mLocales; 37 AccessibilityWindowAttributes(@onNull WindowManager.LayoutParams layoutParams, @NonNull LocaleList locales)38 public AccessibilityWindowAttributes(@NonNull WindowManager.LayoutParams layoutParams, 39 @NonNull LocaleList locales) { 40 mWindowTitle = populateWindowTitle(layoutParams); 41 mLocales = locales; 42 } 43 AccessibilityWindowAttributes(Parcel in)44 private AccessibilityWindowAttributes(Parcel in) { 45 mWindowTitle = in.readCharSequence(); 46 LocaleList inLocales = in.readParcelable(null, LocaleList.class); 47 if (inLocales != null) { 48 mLocales = inLocales; 49 } else { 50 mLocales = LocaleList.getEmptyLocaleList(); 51 } 52 } 53 getWindowTitle()54 public CharSequence getWindowTitle() { 55 return mWindowTitle; 56 } 57 populateWindowTitle(@onNull WindowManager.LayoutParams layoutParams)58 private CharSequence populateWindowTitle(@NonNull WindowManager.LayoutParams layoutParams) { 59 CharSequence windowTitle = layoutParams.accessibilityTitle; 60 // Panel windows have no public way to set the a11y title directly. Use the 61 // regular title as a fallback. 62 final boolean isPanelWindow = 63 (layoutParams.type >= WindowManager.LayoutParams.FIRST_SUB_WINDOW) 64 && (layoutParams.type <= WindowManager.LayoutParams.LAST_SUB_WINDOW); 65 // Accessibility overlays should have titles that work for accessibility, and can't set 66 // the a11y title themselves. 67 final boolean isAccessibilityOverlay = 68 layoutParams.type == WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY; 69 70 if (TextUtils.isEmpty(windowTitle) && (isPanelWindow 71 || isAccessibilityOverlay)) { 72 windowTitle = TextUtils.isEmpty(layoutParams.getTitle()) ? null 73 : layoutParams.getTitle(); 74 } 75 return windowTitle; 76 } 77 getLocales()78 public @NonNull LocaleList getLocales() { 79 return mLocales; 80 } 81 82 @Override equals(Object o)83 public boolean equals(Object o) { 84 if (this == o) return true; 85 if (!(o instanceof AccessibilityWindowAttributes)) return false; 86 87 AccessibilityWindowAttributes that = (AccessibilityWindowAttributes) o; 88 89 return TextUtils.equals(mWindowTitle, that.mWindowTitle) && Objects.equals( 90 mLocales, that.mLocales); 91 } 92 93 @Override hashCode()94 public int hashCode() { 95 return Objects.hash(mWindowTitle, mLocales); 96 } 97 98 public static final Creator<AccessibilityWindowAttributes> CREATOR = 99 new Creator<AccessibilityWindowAttributes>() { 100 @Override 101 public AccessibilityWindowAttributes createFromParcel(Parcel in) { 102 return new AccessibilityWindowAttributes(in); 103 } 104 105 @Override 106 public AccessibilityWindowAttributes[] newArray(int size) { 107 return new AccessibilityWindowAttributes[size]; 108 } 109 }; 110 111 @Override describeContents()112 public int describeContents() { 113 return 0; 114 } 115 116 @Override writeToParcel(@onNull Parcel parcel, int flags)117 public void writeToParcel(@NonNull Parcel parcel, int flags) { 118 parcel.writeCharSequence(mWindowTitle); 119 parcel.writeParcelable(mLocales, flags); 120 } 121 122 @Override toString()123 public String toString() { 124 return "AccessibilityWindowAttributes{" 125 + "mAccessibilityWindowTitle=" + mWindowTitle 126 + "mLocales=" + mLocales 127 + '}'; 128 } 129 } 130