Added locales field to AccessibilityWindowInfo. Locales will reflect the LocaleList obtainable by ViewRootImpl.

Bug: 134731341
Test: Existing tests are adjusted for the locales field.
Change-Id: Ice260ab7d2ef6fe07eecb5eadca7822cde15b446
This commit is contained in:
Riley Jones
2022-11-30 09:30:04 +00:00
parent cda60c2403
commit 8b97d7ec75
10 changed files with 87 additions and 11 deletions

View File

@@ -53773,6 +53773,7 @@ package android.view.accessibility {
method public int getDisplayId();
method public int getId();
method public int getLayer();
method @NonNull public android.os.LocaleList getLocales();
method public android.view.accessibility.AccessibilityWindowInfo getParent();
method public void getRegionInScreen(@NonNull android.graphics.Region);
method public android.view.accessibility.AccessibilityNodeInfo getRoot();

View File

@@ -1424,7 +1424,7 @@ public final class ViewRootImpl implements ViewParent,
!= AccessibilityWindowInfo.UNDEFINED_WINDOW_ID;
if (registered) {
final AccessibilityWindowAttributes attributes = new AccessibilityWindowAttributes(
mWindowAttributes);
mWindowAttributes, mContext.getResources().getConfiguration().getLocales());
if (!attributes.equals(mAccessibilityWindowAttributes)) {
mAccessibilityWindowAttributes = attributes;
mAccessibilityManager.setAccessibilityWindowAttributes(getDisplayId(),

View File

@@ -20,6 +20,7 @@ import android.app.ActivityTaskManager;
import android.graphics.Matrix;
import android.graphics.Region;
import android.os.IBinder;
import android.os.LocaleList;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Pools;
@@ -60,6 +61,8 @@ public class WindowInfo implements Parcelable {
public MagnificationSpec mMagnificationSpec = new MagnificationSpec();
public LocaleList locales = LocaleList.getEmptyLocaleList();
private WindowInfo() {
/* do nothing - hide constructor */
}
@@ -99,6 +102,7 @@ public class WindowInfo implements Parcelable {
}
}
window.mMagnificationSpec.setTo(other.mMagnificationSpec);
window.locales = other.locales;
return window;
}
@@ -136,6 +140,7 @@ public class WindowInfo implements Parcelable {
parcel.writeInt(0);
}
mMagnificationSpec.writeToParcel(parcel, flags);
parcel.writeParcelable(locales, flags);
}
@Override
@@ -160,6 +165,7 @@ public class WindowInfo implements Parcelable {
matrix.setValues(mTransformMatrix);
builder.append(", mTransformMatrix=").append(matrix);
builder.append(", mMagnificationSpec=").append(mMagnificationSpec);
builder.append(", locales=").append(locales);
builder.append(']');
return builder.toString();
}
@@ -187,6 +193,7 @@ public class WindowInfo implements Parcelable {
parcel.readBinderList(childTokens);
}
mMagnificationSpec = MagnificationSpec.CREATOR.createFromParcel(parcel);
locales = parcel.readParcelable(null, LocaleList.class);
}
private void clear() {
@@ -210,6 +217,7 @@ public class WindowInfo implements Parcelable {
mMagnificationSpec.clear();
title = null;
accessibilityIdOfAnchor = AccessibilityNodeInfo.UNDEFINED_NODE_ID;
locales = LocaleList.getEmptyLocaleList();
}
public static final @android.annotation.NonNull Parcelable.Creator<WindowInfo> CREATOR =

View File

@@ -17,11 +17,14 @@
package android.view.accessibility;
import android.annotation.NonNull;
import android.os.LocaleList;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import android.view.WindowManager;
import java.util.Objects;
/**
* This class represents the attributes of a window needed for {@link AccessibilityWindowInfo}.
*
@@ -30,13 +33,22 @@ import android.view.WindowManager;
public final class AccessibilityWindowAttributes implements Parcelable {
private final CharSequence mWindowTitle;
private final LocaleList mLocales;
public AccessibilityWindowAttributes(@NonNull WindowManager.LayoutParams layoutParams) {
public AccessibilityWindowAttributes(@NonNull WindowManager.LayoutParams layoutParams,
@NonNull LocaleList locales) {
mWindowTitle = populateWindowTitle(layoutParams);
mLocales = locales;
}
private AccessibilityWindowAttributes(Parcel in) {
mWindowTitle = in.readCharSequence();
LocaleList inLocales = in.readParcelable(null, LocaleList.class);
if (inLocales != null) {
mLocales = inLocales;
} else {
mLocales = LocaleList.getEmptyLocaleList();
}
}
public CharSequence getWindowTitle() {
@@ -63,6 +75,10 @@ public final class AccessibilityWindowAttributes implements Parcelable {
return windowTitle;
}
public @NonNull LocaleList getLocales() {
return mLocales;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
@@ -70,12 +86,13 @@ public final class AccessibilityWindowAttributes implements Parcelable {
AccessibilityWindowAttributes that = (AccessibilityWindowAttributes) o;
return TextUtils.equals(mWindowTitle, that.mWindowTitle);
return TextUtils.equals(mWindowTitle, that.mWindowTitle) && Objects.equals(
mLocales, that.mLocales);
}
@Override
public int hashCode() {
return mWindowTitle.hashCode();
return Objects.hash(mWindowTitle, mLocales);
}
public static final Creator<AccessibilityWindowAttributes> CREATOR =
@@ -99,12 +116,14 @@ public final class AccessibilityWindowAttributes implements Parcelable {
@Override
public void writeToParcel(@NonNull Parcel parcel, int flags) {
parcel.writeCharSequence(mWindowTitle);
parcel.writeParcelable(mLocales, flags);
}
@Override
public String toString() {
return "AccessibilityWindowAttributes{"
+ "mAccessibilityWindowTitle=" + mWindowTitle
+ "mLocales=" + mLocales
+ '}';
}
}

View File

@@ -23,6 +23,7 @@ import android.annotation.UptimeMillisLong;
import android.app.ActivityTaskManager;
import android.graphics.Rect;
import android.graphics.Region;
import android.os.LocaleList;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.SystemClock;
@@ -132,6 +133,8 @@ public final class AccessibilityWindowInfo implements Parcelable {
private int mConnectionId = UNDEFINED_CONNECTION_ID;
private LocaleList mLocales = LocaleList.getEmptyLocaleList();
/**
* Creates a new {@link AccessibilityWindowInfo}.
*/
@@ -554,6 +557,26 @@ public final class AccessibilityWindowInfo implements Parcelable {
return mTransitionTime;
}
/**
* Sets the locales of the window. Locales are populated by the view root by default.
*
* @param locales The {@link android.os.LocaleList}.
*
* @hide
*/
public void setLocales(@NonNull LocaleList locales) {
mLocales = locales;
}
/**
* Return the {@link android.os.LocaleList} of the window.
*
* @return the locales of the window.
*/
public @NonNull LocaleList getLocales() {
return mLocales;
}
/**
* Returns a cached instance if such is available or a new one is
* created.
@@ -676,6 +699,7 @@ public final class AccessibilityWindowInfo implements Parcelable {
}
parcel.writeInt(mConnectionId);
parcel.writeParcelable(mLocales, flags);
}
/**
@@ -706,6 +730,7 @@ public final class AccessibilityWindowInfo implements Parcelable {
}
mConnectionId = other.mConnectionId;
mLocales = other.mLocales;
}
private void initFromParcel(Parcel parcel) {
@@ -733,6 +758,7 @@ public final class AccessibilityWindowInfo implements Parcelable {
}
mConnectionId = parcel.readInt();
mLocales = parcel.readParcelable(null, LocaleList.class);
}
@Override

View File

@@ -28,6 +28,7 @@ import static org.mockito.Mockito.mock;
import android.app.ActivityTaskManager;
import android.graphics.Matrix;
import android.os.IBinder;
import android.os.LocaleList;
import android.os.Parcel;
import android.platform.test.annotations.Presubmit;
import android.text.TextUtils;
@@ -41,6 +42,7 @@ import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Locale;
/**
* Class for testing {@link WindowInfo}.
@@ -48,6 +50,7 @@ import java.util.Arrays;
@Presubmit
@RunWith(AndroidJUnit4.class)
public class WindowInfoTest {
private static final LocaleList TEST_LOCALES = new LocaleList(Locale.ROOT);
@SmallTest
@Test
@@ -129,6 +132,7 @@ public class WindowInfoTest {
assertTrue(windowinfo.regionInScreen.isEmpty());
assertEquals(windowinfo.mTransformMatrix.length, 9);
assertTrue(windowinfo.mMagnificationSpec.isNop());
assertEquals(windowinfo.locales, LocaleList.getEmptyLocaleList());
}
private boolean areWindowsEqual(WindowInfo w1, WindowInfo w2) {
@@ -141,6 +145,7 @@ public class WindowInfoTest {
equality &= w1.mMagnificationSpec.equals(w2.mMagnificationSpec);
equality &= Arrays.equals(w1.mTransformMatrix, w2.mTransformMatrix);
equality &= TextUtils.equals(w1.title, w2.title);
equality &= w1.locales.equals(w2.locales);
return equality;
}
@@ -164,5 +169,6 @@ public class WindowInfoTest {
windowInfo.mMagnificationSpec.offsetX = 100f;
windowInfo.mMagnificationSpec.offsetY = 200f;
Matrix.IDENTITY_MATRIX.getValues(windowInfo.mTransformMatrix);
windowInfo.locales = TEST_LOCALES;
}
}

View File

@@ -20,6 +20,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotSame;
import android.os.LocaleList;
import android.os.Parcel;
import android.platform.test.annotations.Presubmit;
import android.view.WindowManager;
@@ -30,6 +31,8 @@ import androidx.test.filters.SmallTest;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Locale;
/**
* Class for testing {@link AccessibilityWindowAttributes}.
*/
@@ -37,11 +40,13 @@ import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
public class AccessibilityWindowAttributesTest {
private static final String TEST_WINDOW_TITLE = "test window title";
private static final LocaleList TEST_LOCALES = new LocaleList(Locale.ROOT);
@SmallTest
@Test
public void testParceling() {
final AccessibilityWindowAttributes windowAttributes = createInstance(TEST_WINDOW_TITLE);
final AccessibilityWindowAttributes windowAttributes = createInstance(
TEST_WINDOW_TITLE, TEST_LOCALES);
Parcel parcel = Parcel.obtain();
windowAttributes.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
@@ -56,14 +61,21 @@ public class AccessibilityWindowAttributesTest {
@SmallTest
@Test
public void testNonequality() {
final AccessibilityWindowAttributes windowAttributes = createInstance(null);
final AccessibilityWindowAttributes windowAttributes2 = createInstance(TEST_WINDOW_TITLE);
final AccessibilityWindowAttributes windowAttributes = createInstance(
null, TEST_LOCALES);
final AccessibilityWindowAttributes windowAttributes1 = createInstance(
TEST_WINDOW_TITLE, TEST_LOCALES);
final AccessibilityWindowAttributes windowAttributes2 = createInstance(
TEST_WINDOW_TITLE, null);
assertNotEquals(windowAttributes, windowAttributes1);
assertNotEquals(windowAttributes, windowAttributes2);
assertNotEquals(windowAttributes1, windowAttributes2);
}
private static AccessibilityWindowAttributes createInstance(String windowTitle) {
private static AccessibilityWindowAttributes createInstance(
String windowTitle, LocaleList locales) {
final WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
layoutParams.accessibilityTitle = windowTitle;
return new AccessibilityWindowAttributes(layoutParams);
return new AccessibilityWindowAttributes(layoutParams, locales);
}
}

View File

@@ -430,6 +430,7 @@ public class AccessibilityWindowManager {
return;
}
windowInfo.title = attributes.getWindowTitle();
windowInfo.locales = attributes.getLocales();
}
private boolean shouldUpdateWindowsLocked(boolean forceSend,
@@ -756,6 +757,7 @@ public class AccessibilityWindowManager {
reportedWindow.setPictureInPicture(window.inPictureInPicture);
reportedWindow.setDisplayId(window.displayId);
reportedWindow.setTaskId(window.taskId);
reportedWindow.setLocales(window.locales);
final int parentId = findWindowIdLocked(userId, window.parentToken);
if (parentId >= 0) {

View File

@@ -55,6 +55,7 @@ import android.graphics.drawable.Icon;
import android.hardware.display.DisplayManagerGlobal;
import android.os.Bundle;
import android.os.IBinder;
import android.os.LocaleList;
import android.os.UserHandle;
import android.provider.Settings;
import android.testing.TestableContext;
@@ -487,7 +488,7 @@ public class AccessibilityManagerServiceTest {
final int userid = 10;
final int windowId = 100;
final AccessibilityWindowAttributes attributes = new AccessibilityWindowAttributes(
new WindowManager.LayoutParams());
new WindowManager.LayoutParams(), LocaleList.getEmptyLocaleList());
mA11yms.setAccessibilityWindowAttributes(displayId, windowId, userid, attributes);

View File

@@ -43,6 +43,7 @@ import static org.mockito.Mockito.when;
import android.graphics.Region;
import android.os.IBinder;
import android.os.LocaleList;
import android.os.RemoteException;
import android.os.UserHandle;
import android.text.TextUtils;
@@ -909,7 +910,7 @@ public class AccessibilityWindowManagerTest {
final WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
layoutParams.accessibilityTitle = "accessibility window title";
final AccessibilityWindowAttributes attributes = new AccessibilityWindowAttributes(
layoutParams);
layoutParams, new LocaleList());
mA11yWindowManager.setAccessibilityWindowAttributes(Display.DEFAULT_DISPLAY, windowId,
USER_SYSTEM_ID, attributes);