what-the-bank/sources/io/flutter/view/AccessibilityViewEmbedder.java

444 lines
22 KiB
Java

package io.flutter.view;
import android.graphics.Rect;
import android.os.Build;
import android.os.Bundle;
import android.os.Parcel;
import android.util.SparseArray;
import android.view.MotionEvent;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeProvider;
import android.view.accessibility.AccessibilityRecord;
import io.flutter.Log;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/* loaded from: classes6.dex */
class AccessibilityViewEmbedder {
private static final String TAG = "AccessibilityBridge";
private int nextFlutterId;
private final View rootAccessibilityView;
private final ReflectionAccessors reflectionAccessors = new ReflectionAccessors();
private final SparseArray<ViewAndId> flutterIdToOrigin = new SparseArray<>();
private final Map<ViewAndId, Integer> originToFlutterId = new HashMap();
private final Map<View, Rect> embeddedViewToDisplayBounds = new HashMap();
/* JADX INFO: Access modifiers changed from: package-private */
public AccessibilityViewEmbedder(View view, int i) {
this.rootAccessibilityView = view;
this.nextFlutterId = i;
}
public AccessibilityNodeInfo getRootNode(View view, int i, Rect rect) {
AccessibilityNodeInfo createAccessibilityNodeInfo = view.createAccessibilityNodeInfo();
Long sourceNodeId = this.reflectionAccessors.getSourceNodeId(createAccessibilityNodeInfo);
if (sourceNodeId == null) {
return null;
}
this.embeddedViewToDisplayBounds.put(view, rect);
cacheVirtualIdMappings(view, ReflectionAccessors.getVirtualNodeId(sourceNodeId.longValue()), i);
return convertToFlutterNode(createAccessibilityNodeInfo, i, view);
}
public AccessibilityNodeInfo createAccessibilityNodeInfo(int i) {
AccessibilityNodeInfo createAccessibilityNodeInfo;
ViewAndId viewAndId = this.flutterIdToOrigin.get(i);
if (viewAndId == null || !this.embeddedViewToDisplayBounds.containsKey(viewAndId.view) || viewAndId.view.getAccessibilityNodeProvider() == null || (createAccessibilityNodeInfo = viewAndId.view.getAccessibilityNodeProvider().createAccessibilityNodeInfo(viewAndId.id)) == null) {
return null;
}
return convertToFlutterNode(createAccessibilityNodeInfo, i, viewAndId.view);
}
private AccessibilityNodeInfo convertToFlutterNode(AccessibilityNodeInfo accessibilityNodeInfo, int i, View view) {
AccessibilityNodeInfo obtain = AccessibilityNodeInfo.obtain(this.rootAccessibilityView, i);
obtain.setPackageName(this.rootAccessibilityView.getContext().getPackageName());
obtain.setSource(this.rootAccessibilityView, i);
obtain.setClassName(accessibilityNodeInfo.getClassName());
Rect rect = this.embeddedViewToDisplayBounds.get(view);
copyAccessibilityFields(accessibilityNodeInfo, obtain);
setFlutterNodesTranslateBounds(accessibilityNodeInfo, rect, obtain);
addChildrenToFlutterNode(accessibilityNodeInfo, view, obtain);
setFlutterNodeParent(accessibilityNodeInfo, view, obtain);
return obtain;
}
private void setFlutterNodeParent(AccessibilityNodeInfo accessibilityNodeInfo, View view, AccessibilityNodeInfo accessibilityNodeInfo2) {
Long parentNodeId = this.reflectionAccessors.getParentNodeId(accessibilityNodeInfo);
if (parentNodeId == null) {
return;
}
Integer num = this.originToFlutterId.get(new ViewAndId(view, ReflectionAccessors.getVirtualNodeId(parentNodeId.longValue())));
if (num != null) {
accessibilityNodeInfo2.setParent(this.rootAccessibilityView, num.intValue());
}
}
private void addChildrenToFlutterNode(AccessibilityNodeInfo accessibilityNodeInfo, View view, AccessibilityNodeInfo accessibilityNodeInfo2) {
int i;
for (int i2 = 0; i2 < accessibilityNodeInfo.getChildCount(); i2++) {
Long childId = this.reflectionAccessors.getChildId(accessibilityNodeInfo, i2);
if (childId != null) {
int virtualNodeId = ReflectionAccessors.getVirtualNodeId(childId.longValue());
ViewAndId viewAndId = new ViewAndId(view, virtualNodeId);
if (this.originToFlutterId.containsKey(viewAndId)) {
i = this.originToFlutterId.get(viewAndId).intValue();
} else {
int i3 = this.nextFlutterId;
this.nextFlutterId = i3 + 1;
cacheVirtualIdMappings(view, virtualNodeId, i3);
i = i3;
}
accessibilityNodeInfo2.addChild(this.rootAccessibilityView, i);
}
}
}
private void cacheVirtualIdMappings(View view, int i, int i2) {
ViewAndId viewAndId = new ViewAndId(view, i);
this.originToFlutterId.put(viewAndId, Integer.valueOf(i2));
this.flutterIdToOrigin.put(i2, viewAndId);
}
private void setFlutterNodesTranslateBounds(AccessibilityNodeInfo accessibilityNodeInfo, Rect rect, AccessibilityNodeInfo accessibilityNodeInfo2) {
Rect rect2 = new Rect();
accessibilityNodeInfo.getBoundsInParent(rect2);
accessibilityNodeInfo2.setBoundsInParent(rect2);
Rect rect3 = new Rect();
accessibilityNodeInfo.getBoundsInScreen(rect3);
rect3.offset(rect.left, rect.top);
accessibilityNodeInfo2.setBoundsInScreen(rect3);
}
private void copyAccessibilityFields(AccessibilityNodeInfo accessibilityNodeInfo, AccessibilityNodeInfo accessibilityNodeInfo2) {
accessibilityNodeInfo2.setAccessibilityFocused(accessibilityNodeInfo.isAccessibilityFocused());
accessibilityNodeInfo2.setCheckable(accessibilityNodeInfo.isCheckable());
accessibilityNodeInfo2.setChecked(accessibilityNodeInfo.isChecked());
accessibilityNodeInfo2.setContentDescription(accessibilityNodeInfo.getContentDescription());
accessibilityNodeInfo2.setEnabled(accessibilityNodeInfo.isEnabled());
accessibilityNodeInfo2.setClickable(accessibilityNodeInfo.isClickable());
accessibilityNodeInfo2.setFocusable(accessibilityNodeInfo.isFocusable());
accessibilityNodeInfo2.setFocused(accessibilityNodeInfo.isFocused());
accessibilityNodeInfo2.setLongClickable(accessibilityNodeInfo.isLongClickable());
accessibilityNodeInfo2.setMovementGranularities(accessibilityNodeInfo.getMovementGranularities());
accessibilityNodeInfo2.setPassword(accessibilityNodeInfo.isPassword());
accessibilityNodeInfo2.setScrollable(accessibilityNodeInfo.isScrollable());
accessibilityNodeInfo2.setSelected(accessibilityNodeInfo.isSelected());
accessibilityNodeInfo2.setText(accessibilityNodeInfo.getText());
accessibilityNodeInfo2.setVisibleToUser(accessibilityNodeInfo.isVisibleToUser());
accessibilityNodeInfo2.setEditable(accessibilityNodeInfo.isEditable());
accessibilityNodeInfo2.setCanOpenPopup(accessibilityNodeInfo.canOpenPopup());
accessibilityNodeInfo2.setCollectionInfo(accessibilityNodeInfo.getCollectionInfo());
accessibilityNodeInfo2.setCollectionItemInfo(accessibilityNodeInfo.getCollectionItemInfo());
accessibilityNodeInfo2.setContentInvalid(accessibilityNodeInfo.isContentInvalid());
accessibilityNodeInfo2.setDismissable(accessibilityNodeInfo.isDismissable());
accessibilityNodeInfo2.setInputType(accessibilityNodeInfo.getInputType());
accessibilityNodeInfo2.setLiveRegion(accessibilityNodeInfo.getLiveRegion());
accessibilityNodeInfo2.setMultiLine(accessibilityNodeInfo.isMultiLine());
accessibilityNodeInfo2.setRangeInfo(accessibilityNodeInfo.getRangeInfo());
accessibilityNodeInfo2.setError(accessibilityNodeInfo.getError());
accessibilityNodeInfo2.setMaxTextLength(accessibilityNodeInfo.getMaxTextLength());
accessibilityNodeInfo2.setContextClickable(accessibilityNodeInfo.isContextClickable());
accessibilityNodeInfo2.setDrawingOrder(accessibilityNodeInfo.getDrawingOrder());
accessibilityNodeInfo2.setImportantForAccessibility(accessibilityNodeInfo.isImportantForAccessibility());
accessibilityNodeInfo2.setAvailableExtraData(accessibilityNodeInfo.getAvailableExtraData());
accessibilityNodeInfo2.setHintText(accessibilityNodeInfo.getHintText());
accessibilityNodeInfo2.setShowingHintText(accessibilityNodeInfo.isShowingHintText());
}
public boolean requestSendAccessibilityEvent(View view, View view2, AccessibilityEvent accessibilityEvent) {
AccessibilityEvent obtain = AccessibilityEvent.obtain(accessibilityEvent);
Long recordSourceNodeId = this.reflectionAccessors.getRecordSourceNodeId(accessibilityEvent);
if (recordSourceNodeId == null) {
return false;
}
int virtualNodeId = ReflectionAccessors.getVirtualNodeId(recordSourceNodeId.longValue());
Integer num = this.originToFlutterId.get(new ViewAndId(view, virtualNodeId));
if (num == null) {
int i = this.nextFlutterId;
this.nextFlutterId = i + 1;
num = Integer.valueOf(i);
cacheVirtualIdMappings(view, virtualNodeId, num.intValue());
}
obtain.setSource(this.rootAccessibilityView, num.intValue());
obtain.setClassName(accessibilityEvent.getClassName());
obtain.setPackageName(accessibilityEvent.getPackageName());
for (int i2 = 0; i2 < obtain.getRecordCount(); i2++) {
AccessibilityRecord record = obtain.getRecord(i2);
Long recordSourceNodeId2 = this.reflectionAccessors.getRecordSourceNodeId(record);
if (recordSourceNodeId2 == null) {
return false;
}
ViewAndId viewAndId = new ViewAndId(view, ReflectionAccessors.getVirtualNodeId(recordSourceNodeId2.longValue()));
if (!this.originToFlutterId.containsKey(viewAndId)) {
return false;
}
record.setSource(this.rootAccessibilityView, this.originToFlutterId.get(viewAndId).intValue());
}
return this.rootAccessibilityView.getParent().requestSendAccessibilityEvent(view2, obtain);
}
public boolean performAction(int i, int i2, Bundle bundle) {
AccessibilityNodeProvider accessibilityNodeProvider;
ViewAndId viewAndId = this.flutterIdToOrigin.get(i);
if (viewAndId == null || (accessibilityNodeProvider = viewAndId.view.getAccessibilityNodeProvider()) == null) {
return false;
}
return accessibilityNodeProvider.performAction(viewAndId.id, i2, bundle);
}
public Integer getRecordFlutterId(View view, AccessibilityRecord accessibilityRecord) {
Long recordSourceNodeId = this.reflectionAccessors.getRecordSourceNodeId(accessibilityRecord);
if (recordSourceNodeId == null) {
return null;
}
return this.originToFlutterId.get(new ViewAndId(view, ReflectionAccessors.getVirtualNodeId(recordSourceNodeId.longValue())));
}
public boolean onAccessibilityHoverEvent(int i, MotionEvent motionEvent) {
ViewAndId viewAndId = this.flutterIdToOrigin.get(i);
if (viewAndId == null) {
return false;
}
Rect rect = this.embeddedViewToDisplayBounds.get(viewAndId.view);
int pointerCount = motionEvent.getPointerCount();
MotionEvent.PointerProperties[] pointerPropertiesArr = new MotionEvent.PointerProperties[pointerCount];
MotionEvent.PointerCoords[] pointerCoordsArr = new MotionEvent.PointerCoords[pointerCount];
for (int i2 = 0; i2 < motionEvent.getPointerCount(); i2++) {
MotionEvent.PointerProperties pointerProperties = new MotionEvent.PointerProperties();
pointerPropertiesArr[i2] = pointerProperties;
motionEvent.getPointerProperties(i2, pointerProperties);
MotionEvent.PointerCoords pointerCoords = new MotionEvent.PointerCoords();
motionEvent.getPointerCoords(i2, pointerCoords);
MotionEvent.PointerCoords pointerCoords2 = new MotionEvent.PointerCoords(pointerCoords);
pointerCoordsArr[i2] = pointerCoords2;
pointerCoords2.x -= rect.left;
pointerCoordsArr[i2].y -= rect.top;
}
return viewAndId.view.dispatchGenericMotionEvent(MotionEvent.obtain(motionEvent.getDownTime(), motionEvent.getEventTime(), motionEvent.getAction(), motionEvent.getPointerCount(), pointerPropertiesArr, pointerCoordsArr, motionEvent.getMetaState(), motionEvent.getButtonState(), motionEvent.getXPrecision(), motionEvent.getYPrecision(), motionEvent.getDeviceId(), motionEvent.getEdgeFlags(), motionEvent.getSource(), motionEvent.getFlags()));
}
public View platformViewOfNode(int i) {
ViewAndId viewAndId = this.flutterIdToOrigin.get(i);
if (viewAndId == null) {
return null;
}
return viewAndId.view;
}
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes6.dex */
public static class ViewAndId {
final int id;
final View view;
private ViewAndId(View view, int i) {
this.view = view;
this.id = i;
}
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof ViewAndId)) {
return false;
}
ViewAndId viewAndId = (ViewAndId) obj;
return this.id == viewAndId.id && this.view.equals(viewAndId.view);
}
public int hashCode() {
return ((this.view.hashCode() + 31) * 31) + this.id;
}
}
/* JADX INFO: Access modifiers changed from: package-private */
/* loaded from: classes6.dex */
public static class ReflectionAccessors {
private final Field childNodeIdsField;
private final Method getChildId;
private final Method getParentNodeId;
private final Method getRecordSourceNodeId;
private final Method getSourceNodeId;
private final Method longArrayGetIndex;
/* JADX INFO: Access modifiers changed from: private */
public static int getVirtualNodeId(long j) {
return (int) (j >> 32);
}
private static boolean isBitSet(long j, int i) {
return (j & (1 << i)) != 0;
}
private ReflectionAccessors() {
Method method;
Method method2;
Method method3;
Method method4;
Field declaredField;
Method method5;
Method method6 = null;
try {
method = AccessibilityNodeInfo.class.getMethod("getSourceNodeId", new Class[0]);
} catch (NoSuchMethodException unused) {
Log.w(AccessibilityViewEmbedder.TAG, "can't invoke AccessibilityNodeInfo#getSourceNodeId with reflection");
method = null;
}
try {
method2 = AccessibilityRecord.class.getMethod("getSourceNodeId", new Class[0]);
} catch (NoSuchMethodException unused2) {
Log.w(AccessibilityViewEmbedder.TAG, "can't invoke AccessibiiltyRecord#getSourceNodeId with reflection");
method2 = null;
}
if (Build.VERSION.SDK_INT <= 26) {
try {
method4 = AccessibilityNodeInfo.class.getMethod("getParentNodeId", new Class[0]);
} catch (NoSuchMethodException unused3) {
Log.w(AccessibilityViewEmbedder.TAG, "can't invoke getParentNodeId with reflection");
method4 = null;
}
try {
method3 = AccessibilityNodeInfo.class.getMethod("getChildId", Integer.TYPE);
} catch (NoSuchMethodException unused4) {
Log.w(AccessibilityViewEmbedder.TAG, "can't invoke getChildId with reflection");
method3 = null;
}
} else {
try {
declaredField = AccessibilityNodeInfo.class.getDeclaredField("mChildNodeIds");
declaredField.setAccessible(true);
method5 = Class.forName("android.util.LongArray").getMethod("get", Integer.TYPE);
method3 = null;
} catch (ClassNotFoundException | NoSuchFieldException | NoSuchMethodException | NullPointerException unused5) {
Log.w(AccessibilityViewEmbedder.TAG, "can't access childNodeIdsField with reflection");
method3 = null;
method4 = null;
}
this.getSourceNodeId = method;
this.getParentNodeId = method6;
this.getRecordSourceNodeId = method2;
this.getChildId = method3;
this.childNodeIdsField = declaredField;
this.longArrayGetIndex = method5;
}
method5 = null;
method6 = method4;
declaredField = null;
this.getSourceNodeId = method;
this.getParentNodeId = method6;
this.getRecordSourceNodeId = method2;
this.getChildId = method3;
this.childNodeIdsField = declaredField;
this.longArrayGetIndex = method5;
}
/* JADX INFO: Access modifiers changed from: private */
public Long getSourceNodeId(AccessibilityNodeInfo accessibilityNodeInfo) {
Method method = this.getSourceNodeId;
if (method == null) {
return null;
}
try {
return (Long) method.invoke(accessibilityNodeInfo, new Object[0]);
} catch (IllegalAccessException e) {
Log.w(AccessibilityViewEmbedder.TAG, "Failed to access getSourceNodeId method.", e);
return null;
} catch (InvocationTargetException e2) {
Log.w(AccessibilityViewEmbedder.TAG, "The getSourceNodeId method threw an exception when invoked.", e2);
return null;
}
}
/* JADX INFO: Access modifiers changed from: private */
public Long getChildId(AccessibilityNodeInfo accessibilityNodeInfo, int i) {
Method method = this.getChildId;
if (method == null && (this.childNodeIdsField == null || this.longArrayGetIndex == null)) {
return null;
}
if (method != null) {
try {
return (Long) method.invoke(accessibilityNodeInfo, Integer.valueOf(i));
} catch (IllegalAccessException e) {
Log.w(AccessibilityViewEmbedder.TAG, "Failed to access getChildId method.", e);
} catch (InvocationTargetException e2) {
Log.w(AccessibilityViewEmbedder.TAG, "The getChildId method threw an exception when invoked.", e2);
}
} else {
try {
return Long.valueOf(((Long) this.longArrayGetIndex.invoke(this.childNodeIdsField.get(accessibilityNodeInfo), Integer.valueOf(i))).longValue());
} catch (ArrayIndexOutOfBoundsException e3) {
e = e3;
Log.w(AccessibilityViewEmbedder.TAG, "The longArrayGetIndex method threw an exception when invoked.", e);
return null;
} catch (IllegalAccessException e4) {
Log.w(AccessibilityViewEmbedder.TAG, "Failed to access longArrayGetIndex method or the childNodeId field.", e4);
} catch (InvocationTargetException e5) {
e = e5;
Log.w(AccessibilityViewEmbedder.TAG, "The longArrayGetIndex method threw an exception when invoked.", e);
return null;
}
}
return null;
}
/* JADX INFO: Access modifiers changed from: private */
public Long getParentNodeId(AccessibilityNodeInfo accessibilityNodeInfo) {
Method method = this.getParentNodeId;
if (method != null) {
try {
return Long.valueOf(((Long) method.invoke(accessibilityNodeInfo, new Object[0])).longValue());
} catch (IllegalAccessException e) {
Log.w(AccessibilityViewEmbedder.TAG, "Failed to access getParentNodeId method.", e);
} catch (InvocationTargetException e2) {
Log.w(AccessibilityViewEmbedder.TAG, "The getParentNodeId method threw an exception when invoked.", e2);
}
}
return yoinkParentIdFromParcel(accessibilityNodeInfo);
}
private static Long yoinkParentIdFromParcel(AccessibilityNodeInfo accessibilityNodeInfo) {
AccessibilityNodeInfo obtain = AccessibilityNodeInfo.obtain(accessibilityNodeInfo);
Parcel obtain2 = Parcel.obtain();
obtain2.setDataPosition(0);
obtain.writeToParcel(obtain2, 0);
obtain2.setDataPosition(0);
long readLong = obtain2.readLong();
if (isBitSet(readLong, 0)) {
obtain2.readInt();
}
if (isBitSet(readLong, 1)) {
obtain2.readLong();
}
if (isBitSet(readLong, 2)) {
obtain2.readInt();
}
Long valueOf = isBitSet(readLong, 3) ? Long.valueOf(obtain2.readLong()) : null;
obtain2.recycle();
return valueOf;
}
/* JADX INFO: Access modifiers changed from: private */
public Long getRecordSourceNodeId(AccessibilityRecord accessibilityRecord) {
Method method = this.getRecordSourceNodeId;
if (method == null) {
return null;
}
try {
return (Long) method.invoke(accessibilityRecord, new Object[0]);
} catch (IllegalAccessException e) {
Log.w(AccessibilityViewEmbedder.TAG, "Failed to access the getRecordSourceNodeId method.", e);
return null;
} catch (InvocationTargetException e2) {
Log.w(AccessibilityViewEmbedder.TAG, "The getRecordSourceNodeId method threw an exception when invoked.", e2);
return null;
}
}
}
}