package androidx.customview.widget; import android.graphics.Rect; import android.os.Bundle; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.ViewParent; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import androidx.collection.SparseArrayCompat; import androidx.core.view.AccessibilityDelegateCompat; import androidx.core.view.ViewCompat; import androidx.core.view.accessibility.AccessibilityEventCompat; import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; import androidx.core.view.accessibility.AccessibilityNodeProviderCompat; import androidx.core.view.accessibility.AccessibilityRecordCompat; import androidx.customview.widget.FocusStrategy; import java.util.ArrayList; import java.util.List; /* loaded from: classes.dex */ public abstract class ExploreByTouchHelper extends AccessibilityDelegateCompat { private static final String DEFAULT_CLASS_NAME = "android.view.View"; public static final int HOST_ID = -1; public static final int INVALID_ID = Integer.MIN_VALUE; private static final Rect INVALID_PARENT_BOUNDS = new Rect(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE); private static final FocusStrategy.BoundsAdapter NODE_ADAPTER = new FocusStrategy.BoundsAdapter() { // from class: androidx.customview.widget.ExploreByTouchHelper.1 @Override // androidx.customview.widget.FocusStrategy.BoundsAdapter public void obtainBounds(AccessibilityNodeInfoCompat accessibilityNodeInfoCompat, Rect rect) { accessibilityNodeInfoCompat.getBoundsInParent(rect); } }; private static final FocusStrategy.CollectionAdapter, AccessibilityNodeInfoCompat> SPARSE_VALUES_ADAPTER = new FocusStrategy.CollectionAdapter, AccessibilityNodeInfoCompat>() { // from class: androidx.customview.widget.ExploreByTouchHelper.2 @Override // androidx.customview.widget.FocusStrategy.CollectionAdapter public AccessibilityNodeInfoCompat get(SparseArrayCompat sparseArrayCompat, int i) { return sparseArrayCompat.valueAt(i); } @Override // androidx.customview.widget.FocusStrategy.CollectionAdapter public int size(SparseArrayCompat sparseArrayCompat) { return sparseArrayCompat.size(); } }; private final View mHost; private final AccessibilityManager mManager; private MyNodeProvider mNodeProvider; private final Rect mTempScreenRect = new Rect(); private final Rect mTempParentRect = new Rect(); private final Rect mTempVisibleRect = new Rect(); private final int[] mTempGlobalRect = new int[2]; int mAccessibilityFocusedVirtualViewId = Integer.MIN_VALUE; int mKeyboardFocusedVirtualViewId = Integer.MIN_VALUE; private int mHoveredVirtualViewId = Integer.MIN_VALUE; private static int keyToDirection(int i) { if (i == 19) { return 33; } if (i != 21) { return i != 22 ? 130 : 66; } return 17; } public final int getAccessibilityFocusedVirtualViewId() { return this.mAccessibilityFocusedVirtualViewId; } public final int getKeyboardFocusedVirtualViewId() { return this.mKeyboardFocusedVirtualViewId; } protected abstract int getVirtualViewAt(float f, float f2); protected abstract void getVisibleVirtualViews(List list); protected abstract boolean onPerformActionForVirtualView(int i, int i2, Bundle bundle); protected void onPopulateEventForHost(AccessibilityEvent accessibilityEvent) { } protected void onPopulateEventForVirtualView(int i, AccessibilityEvent accessibilityEvent) { } protected void onPopulateNodeForHost(AccessibilityNodeInfoCompat accessibilityNodeInfoCompat) { } protected abstract void onPopulateNodeForVirtualView(int i, AccessibilityNodeInfoCompat accessibilityNodeInfoCompat); protected void onVirtualViewKeyboardFocusChanged(int i, boolean z) { } public ExploreByTouchHelper(View view) { if (view == null) { throw new IllegalArgumentException("View may not be null"); } this.mHost = view; this.mManager = (AccessibilityManager) view.getContext().getSystemService("accessibility"); view.setFocusable(true); if (ViewCompat.getImportantForAccessibility(view) == 0) { ViewCompat.setImportantForAccessibility(view, 1); } } @Override // androidx.core.view.AccessibilityDelegateCompat public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View view) { if (this.mNodeProvider == null) { this.mNodeProvider = new MyNodeProvider(); } return this.mNodeProvider; } public final boolean dispatchHoverEvent(MotionEvent motionEvent) { if (!this.mManager.isEnabled() || !this.mManager.isTouchExplorationEnabled()) { return false; } int action = motionEvent.getAction(); if (action == 7 || action == 9) { int virtualViewAt = getVirtualViewAt(motionEvent.getX(), motionEvent.getY()); updateHoveredVirtualView(virtualViewAt); return virtualViewAt != Integer.MIN_VALUE; } if (action != 10 || this.mHoveredVirtualViewId == Integer.MIN_VALUE) { return false; } updateHoveredVirtualView(Integer.MIN_VALUE); return true; } public final boolean dispatchKeyEvent(KeyEvent keyEvent) { int i = 0; if (keyEvent.getAction() == 1) { return false; } int keyCode = keyEvent.getKeyCode(); if (keyCode != 61) { if (keyCode != 66) { switch (keyCode) { case 19: case 20: case 21: case 22: if (!keyEvent.hasNoModifiers()) { return false; } int keyToDirection = keyToDirection(keyCode); int repeatCount = keyEvent.getRepeatCount() + 1; boolean z = false; while (i < repeatCount && moveFocus(keyToDirection, null)) { i++; z = true; } return z; case 23: break; default: return false; } } if (!keyEvent.hasNoModifiers() || keyEvent.getRepeatCount() != 0) { return false; } clickKeyboardFocusedVirtualView(); return true; } if (keyEvent.hasNoModifiers()) { return moveFocus(2, null); } if (keyEvent.hasModifiers(1)) { return moveFocus(1, null); } return false; } public final void onFocusChanged(boolean z, int i, Rect rect) { int i2 = this.mKeyboardFocusedVirtualViewId; if (i2 != Integer.MIN_VALUE) { clearKeyboardFocusForVirtualView(i2); } if (z) { moveFocus(i, rect); } } private void getBoundsInParent(int i, Rect rect) { obtainAccessibilityNodeInfo(i).getBoundsInParent(rect); } private boolean moveFocus(int i, Rect rect) { AccessibilityNodeInfoCompat accessibilityNodeInfoCompat; SparseArrayCompat allNodes = getAllNodes(); int i2 = this.mKeyboardFocusedVirtualViewId; AccessibilityNodeInfoCompat accessibilityNodeInfoCompat2 = i2 == Integer.MIN_VALUE ? null : allNodes.get(i2); if (i == 1 || i == 2) { accessibilityNodeInfoCompat = (AccessibilityNodeInfoCompat) FocusStrategy.findNextFocusInRelativeDirection(allNodes, SPARSE_VALUES_ADAPTER, NODE_ADAPTER, accessibilityNodeInfoCompat2, i, ViewCompat.getLayoutDirection(this.mHost) == 1, false); } else if (i == 17 || i == 33 || i == 66 || i == 130) { Rect rect2 = new Rect(); int i3 = this.mKeyboardFocusedVirtualViewId; if (i3 != Integer.MIN_VALUE) { getBoundsInParent(i3, rect2); } else if (rect != null) { rect2.set(rect); } else { guessPreviouslyFocusedRect(this.mHost, i, rect2); } accessibilityNodeInfoCompat = (AccessibilityNodeInfoCompat) FocusStrategy.findNextFocusInAbsoluteDirection(allNodes, SPARSE_VALUES_ADAPTER, NODE_ADAPTER, accessibilityNodeInfoCompat2, rect2, i); } else { throw new IllegalArgumentException("direction must be one of {FOCUS_FORWARD, FOCUS_BACKWARD, FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}."); } return requestKeyboardFocusForVirtualView(accessibilityNodeInfoCompat != null ? allNodes.keyAt(allNodes.indexOfValue(accessibilityNodeInfoCompat)) : Integer.MIN_VALUE); } private SparseArrayCompat getAllNodes() { ArrayList arrayList = new ArrayList(); getVisibleVirtualViews(arrayList); SparseArrayCompat sparseArrayCompat = new SparseArrayCompat<>(); for (int i = 0; i < arrayList.size(); i++) { sparseArrayCompat.put(arrayList.get(i).intValue(), createNodeForChild(arrayList.get(i).intValue())); } return sparseArrayCompat; } private static Rect guessPreviouslyFocusedRect(View view, int i, Rect rect) { int width = view.getWidth(); int height = view.getHeight(); if (i == 17) { rect.set(width, 0, width, height); } else if (i == 33) { rect.set(0, height, width, height); } else if (i == 66) { rect.set(-1, 0, -1, height); } else if (i == 130) { rect.set(0, -1, width, -1); } else { throw new IllegalArgumentException("direction must be one of {FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}."); } return rect; } private boolean clickKeyboardFocusedVirtualView() { int i = this.mKeyboardFocusedVirtualViewId; return i != Integer.MIN_VALUE && onPerformActionForVirtualView(i, 16, null); } public final boolean sendEventForVirtualView(int i, int i2) { ViewParent parent; if (i == Integer.MIN_VALUE || !this.mManager.isEnabled() || (parent = this.mHost.getParent()) == null) { return false; } return parent.requestSendAccessibilityEvent(this.mHost, createEvent(i, i2)); } public final void invalidateRoot() { invalidateVirtualView(-1, 1); } public final void invalidateVirtualView(int i) { invalidateVirtualView(i, 0); } public final void invalidateVirtualView(int i, int i2) { ViewParent parent; if (i == Integer.MIN_VALUE || !this.mManager.isEnabled() || (parent = this.mHost.getParent()) == null) { return; } AccessibilityEvent createEvent = createEvent(i, 2048); AccessibilityEventCompat.setContentChangeTypes(createEvent, i2); parent.requestSendAccessibilityEvent(this.mHost, createEvent); } @Deprecated public int getFocusedVirtualView() { return getAccessibilityFocusedVirtualViewId(); } private void updateHoveredVirtualView(int i) { int i2 = this.mHoveredVirtualViewId; if (i2 == i) { return; } this.mHoveredVirtualViewId = i; sendEventForVirtualView(i, 128); sendEventForVirtualView(i2, 256); } private AccessibilityEvent createEvent(int i, int i2) { if (i == -1) { return createEventForHost(i2); } return createEventForChild(i, i2); } private AccessibilityEvent createEventForHost(int i) { AccessibilityEvent obtain = AccessibilityEvent.obtain(i); this.mHost.onInitializeAccessibilityEvent(obtain); return obtain; } @Override // androidx.core.view.AccessibilityDelegateCompat public void onInitializeAccessibilityEvent(View view, AccessibilityEvent accessibilityEvent) { super.onInitializeAccessibilityEvent(view, accessibilityEvent); onPopulateEventForHost(accessibilityEvent); } private AccessibilityEvent createEventForChild(int i, int i2) { AccessibilityEvent obtain = AccessibilityEvent.obtain(i2); AccessibilityNodeInfoCompat obtainAccessibilityNodeInfo = obtainAccessibilityNodeInfo(i); obtain.getText().add(obtainAccessibilityNodeInfo.getText()); obtain.setContentDescription(obtainAccessibilityNodeInfo.getContentDescription()); obtain.setScrollable(obtainAccessibilityNodeInfo.isScrollable()); obtain.setPassword(obtainAccessibilityNodeInfo.isPassword()); obtain.setEnabled(obtainAccessibilityNodeInfo.isEnabled()); obtain.setChecked(obtainAccessibilityNodeInfo.isChecked()); onPopulateEventForVirtualView(i, obtain); if (obtain.getText().isEmpty() && obtain.getContentDescription() == null) { throw new RuntimeException("Callbacks must add text or a content description in populateEventForVirtualViewId()"); } obtain.setClassName(obtainAccessibilityNodeInfo.getClassName()); AccessibilityRecordCompat.setSource(obtain, this.mHost, i); obtain.setPackageName(this.mHost.getContext().getPackageName()); return obtain; } AccessibilityNodeInfoCompat obtainAccessibilityNodeInfo(int i) { if (i == -1) { return createNodeForHost(); } return createNodeForChild(i); } private AccessibilityNodeInfoCompat createNodeForHost() { AccessibilityNodeInfoCompat obtain = AccessibilityNodeInfoCompat.obtain(this.mHost); ViewCompat.onInitializeAccessibilityNodeInfo(this.mHost, obtain); ArrayList arrayList = new ArrayList(); getVisibleVirtualViews(arrayList); if (obtain.getChildCount() > 0 && arrayList.size() > 0) { throw new RuntimeException("Views cannot have both real and virtual children"); } int size = arrayList.size(); for (int i = 0; i < size; i++) { obtain.addChild(this.mHost, ((Integer) arrayList.get(i)).intValue()); } return obtain; } @Override // androidx.core.view.AccessibilityDelegateCompat public void onInitializeAccessibilityNodeInfo(View view, AccessibilityNodeInfoCompat accessibilityNodeInfoCompat) { super.onInitializeAccessibilityNodeInfo(view, accessibilityNodeInfoCompat); onPopulateNodeForHost(accessibilityNodeInfoCompat); } private AccessibilityNodeInfoCompat createNodeForChild(int i) { AccessibilityNodeInfoCompat obtain = AccessibilityNodeInfoCompat.obtain(); obtain.setEnabled(true); obtain.setFocusable(true); obtain.setClassName("android.view.View"); Rect rect = INVALID_PARENT_BOUNDS; obtain.setBoundsInParent(rect); obtain.setBoundsInScreen(rect); obtain.setParent(this.mHost); onPopulateNodeForVirtualView(i, obtain); if (obtain.getText() == null && obtain.getContentDescription() == null) { throw new RuntimeException("Callbacks must add text or a content description in populateNodeForVirtualViewId()"); } obtain.getBoundsInParent(this.mTempParentRect); if (this.mTempParentRect.equals(rect)) { throw new RuntimeException("Callbacks must set parent bounds in populateNodeForVirtualViewId()"); } int actions = obtain.getActions(); if ((actions & 64) != 0) { throw new RuntimeException("Callbacks must not add ACTION_ACCESSIBILITY_FOCUS in populateNodeForVirtualViewId()"); } if ((actions & 128) != 0) { throw new RuntimeException("Callbacks must not add ACTION_CLEAR_ACCESSIBILITY_FOCUS in populateNodeForVirtualViewId()"); } obtain.setPackageName(this.mHost.getContext().getPackageName()); obtain.setSource(this.mHost, i); if (this.mAccessibilityFocusedVirtualViewId == i) { obtain.setAccessibilityFocused(true); obtain.addAction(128); } else { obtain.setAccessibilityFocused(false); obtain.addAction(64); } boolean z = this.mKeyboardFocusedVirtualViewId == i; if (z) { obtain.addAction(2); } else if (obtain.isFocusable()) { obtain.addAction(1); } obtain.setFocused(z); this.mHost.getLocationOnScreen(this.mTempGlobalRect); obtain.getBoundsInScreen(this.mTempScreenRect); if (this.mTempScreenRect.equals(rect)) { obtain.getBoundsInParent(this.mTempScreenRect); if (obtain.mParentVirtualDescendantId != -1) { AccessibilityNodeInfoCompat obtain2 = AccessibilityNodeInfoCompat.obtain(); for (int i2 = obtain.mParentVirtualDescendantId; i2 != -1; i2 = obtain2.mParentVirtualDescendantId) { obtain2.setParent(this.mHost, -1); obtain2.setBoundsInParent(INVALID_PARENT_BOUNDS); onPopulateNodeForVirtualView(i2, obtain2); obtain2.getBoundsInParent(this.mTempParentRect); this.mTempScreenRect.offset(this.mTempParentRect.left, this.mTempParentRect.top); } obtain2.recycle(); } this.mTempScreenRect.offset(this.mTempGlobalRect[0] - this.mHost.getScrollX(), this.mTempGlobalRect[1] - this.mHost.getScrollY()); } if (this.mHost.getLocalVisibleRect(this.mTempVisibleRect)) { this.mTempVisibleRect.offset(this.mTempGlobalRect[0] - this.mHost.getScrollX(), this.mTempGlobalRect[1] - this.mHost.getScrollY()); if (this.mTempScreenRect.intersect(this.mTempVisibleRect)) { obtain.setBoundsInScreen(this.mTempScreenRect); if (isVisibleToUser(this.mTempScreenRect)) { obtain.setVisibleToUser(true); } } } return obtain; } boolean performAction(int i, int i2, Bundle bundle) { if (i == -1) { return performActionForHost(i2, bundle); } return performActionForChild(i, i2, bundle); } private boolean performActionForHost(int i, Bundle bundle) { return ViewCompat.performAccessibilityAction(this.mHost, i, bundle); } private boolean performActionForChild(int i, int i2, Bundle bundle) { if (i2 == 1) { return requestKeyboardFocusForVirtualView(i); } if (i2 == 2) { return clearKeyboardFocusForVirtualView(i); } if (i2 == 64) { return requestAccessibilityFocus(i); } if (i2 == 128) { return clearAccessibilityFocus(i); } return onPerformActionForVirtualView(i, i2, bundle); } private boolean isVisibleToUser(Rect rect) { if (rect == null || rect.isEmpty() || this.mHost.getWindowVisibility() != 0) { return false; } Object parent = this.mHost.getParent(); while (parent instanceof View) { View view = (View) parent; if (view.getAlpha() <= 0.0f || view.getVisibility() != 0) { return false; } parent = view.getParent(); } return parent != null; } private boolean requestAccessibilityFocus(int i) { int i2; if (!this.mManager.isEnabled() || !this.mManager.isTouchExplorationEnabled() || (i2 = this.mAccessibilityFocusedVirtualViewId) == i) { return false; } if (i2 != Integer.MIN_VALUE) { clearAccessibilityFocus(i2); } this.mAccessibilityFocusedVirtualViewId = i; this.mHost.invalidate(); sendEventForVirtualView(i, 32768); return true; } private boolean clearAccessibilityFocus(int i) { if (this.mAccessibilityFocusedVirtualViewId != i) { return false; } this.mAccessibilityFocusedVirtualViewId = Integer.MIN_VALUE; this.mHost.invalidate(); sendEventForVirtualView(i, 65536); return true; } public final boolean requestKeyboardFocusForVirtualView(int i) { int i2; if ((!this.mHost.isFocused() && !this.mHost.requestFocus()) || (i2 = this.mKeyboardFocusedVirtualViewId) == i) { return false; } if (i2 != Integer.MIN_VALUE) { clearKeyboardFocusForVirtualView(i2); } if (i == Integer.MIN_VALUE) { return false; } this.mKeyboardFocusedVirtualViewId = i; onVirtualViewKeyboardFocusChanged(i, true); sendEventForVirtualView(i, 8); return true; } public final boolean clearKeyboardFocusForVirtualView(int i) { if (this.mKeyboardFocusedVirtualViewId != i) { return false; } this.mKeyboardFocusedVirtualViewId = Integer.MIN_VALUE; onVirtualViewKeyboardFocusChanged(i, false); sendEventForVirtualView(i, 8); return true; } /* loaded from: classes.dex */ private class MyNodeProvider extends AccessibilityNodeProviderCompat { MyNodeProvider() { } @Override // androidx.core.view.accessibility.AccessibilityNodeProviderCompat public AccessibilityNodeInfoCompat createAccessibilityNodeInfo(int i) { return AccessibilityNodeInfoCompat.obtain(ExploreByTouchHelper.this.obtainAccessibilityNodeInfo(i)); } @Override // androidx.core.view.accessibility.AccessibilityNodeProviderCompat public boolean performAction(int i, int i2, Bundle bundle) { return ExploreByTouchHelper.this.performAction(i, i2, bundle); } @Override // androidx.core.view.accessibility.AccessibilityNodeProviderCompat public AccessibilityNodeInfoCompat findFocus(int i) { int i2 = i == 2 ? ExploreByTouchHelper.this.mAccessibilityFocusedVirtualViewId : ExploreByTouchHelper.this.mKeyboardFocusedVirtualViewId; if (i2 == Integer.MIN_VALUE) { return null; } return createAccessibilityNodeInfo(i2); } } }