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:
@@ -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();
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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
|
||||
+ '}';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user