Java Code Examples for android.view.accessibility.AccessibilityWindowInfo#getId()

The following examples show how to use android.view.accessibility.AccessibilityWindowInfo#getId() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: WindowEventInterpreter.java    From talkback with Apache License 2.0 6 votes vote down vote up
public CharSequence getWindowTitle(int windowId) {
  // Try to get window title from the map.
  CharSequence windowTitle = windowTitlesMap.get(windowId);
  if (windowTitle != null) {
    return windowTitle;
  }

  if (!BuildVersionUtils.isAtLeastN()) {
    return null;
  }

  // Do not try to get system window title from AccessibilityWindowInfo.getTitle, it can
  // return non-translated value.
  if (isSystemWindow(windowId)) {
    return null;
  }

  // Try to get window title from AccessibilityWindowInfo.
  for (AccessibilityWindowInfo window : AccessibilityServiceCompatUtils.getWindows(service)) {
    if (window.getId() == windowId) {
      return window.getTitle();
    }
  }

  return null;
}
 
Example 2
Source File: WindowEventInterpreter.java    From talkback with Apache License 2.0 6 votes vote down vote up
private boolean isSystemWindow(int windowId) {
  if (systemWindowIdsSet.contains(windowId)) {
    return true;
  }

  if (!isSplitScreenModeAvailable) {
    return false;
  }

  for (AccessibilityWindowInfo window : AccessibilityServiceCompatUtils.getWindows(service)) {
    if (window.getId() == windowId && window.getType() == AccessibilityWindowInfo.TYPE_SYSTEM) {
      return true;
    }
  }

  return false;
}
 
Example 3
Source File: WindowManager.java    From talkback with Apache License 2.0 5 votes vote down vote up
public int getWindowType(int windowId) {
  if (mWindows != null) {
    for (AccessibilityWindowInfo window : mWindows) {
      if (window != null && window.getId() == windowId) {
        return window.getType();
      }
    }
  }

  return WRONG_WINDOW_TYPE;
}
 
Example 4
Source File: FocusProcessorForScreenStateChange.java    From talkback with Apache License 2.0 5 votes vote down vote up
private boolean hasValidAccessibilityFocusInWindow(AccessibilityWindowInfo window) {
  AccessibilityNodeInfoCompat currentFocus = null;
  try {
    currentFocus =
        accessibilityFocusMonitor.getAccessibilityFocus(/* useInputFocusIfEmpty= */ false);
    return (currentFocus != null)
        && AccessibilityNodeInfoUtils.isVisible(currentFocus)
        && (currentFocus.getWindowId() == window.getId());
  } finally {
    AccessibilityNodeInfoUtils.recycleNodes(currentFocus);
  }
}
 
Example 5
Source File: ScreenStateMonitor.java    From talkback with Apache License 2.0 5 votes vote down vote up
@Nullable
private AccessibilityWindowInfo getWindowInfoById(
    List<AccessibilityWindowInfo> windows, int windowId) {
  if (windowId < 0) {
    return null;
  }
  for (AccessibilityWindowInfo window : windows) {
    if (window.getId() == windowId) {
      return window;
    }
  }
  return null;
}
 
Example 6
Source File: WindowHierarchyElementAndroid.java    From Accessibility-Test-Framework-for-Android with Apache License 2.0 4 votes vote down vote up
private WindowHierarchyElementAndroid construct(
    int id,
    @Nullable WindowHierarchyElementAndroid parent,
    AccessibilityWindowInfo fromWindow,
    Map<ViewHierarchyElementAndroid, AccessibilityNodeInfo> elementToNodeInfoMap) {
  // Bookkeeping
  this.parentId = (parent != null) ? parent.getId() : null;

  // Window properties
  this.windowId = fromWindow.getId();
  this.layer = fromWindow.getLayer();
  this.type = fromWindow.getType();
  this.focused = fromWindow.isFocused();
  this.accessibilityFocused = fromWindow.isAccessibilityFocused();
  this.active = fromWindow.isActive();

  android.graphics.Rect tempRect = new android.graphics.Rect();
  fromWindow.getBoundsInScreen(tempRect);
  this.boundsInScreen = new Rect(tempRect.left, tempRect.top, tempRect.right, tempRect.bottom);

  // Build the window's view hierarchy
  AccessibilityNodeInfo rootInfo = fromWindow.getRoot();
  this.viewHierarchyElements = new ArrayList<>(); // The ultimate size is unknown
  if (rootInfo != null) {
    buildViewHierarchy(
        rootInfo, viewHierarchyElements, null /* no parent */, elementToNodeInfoMap);
    rootInfo.recycle();
  } else {
    // This could occur in the case where the application state changes between the time that
    // the AccessibilityWindowInfo object is obtained and when its root AccessibilityNodeInfo is
    // extracted.
    LogUtils.w(TAG, "Constructed WindowHierarchyElement with no valid root.");
  }
  return new WindowHierarchyElementAndroid(
      id,
      parentId,
      childIds,
      windowId,
      layer,
      type,
      focused,
      accessibilityFocused,
      active,
      boundsInScreen,
      viewHierarchyElements);
}
 
Example 7
Source File: FocusProcessorForScreenStateChange.java    From talkback with Apache License 2.0 4 votes vote down vote up
public boolean onScreenStateChanged(
    @Nullable ScreenState oldScreenState,
    @NonNull ScreenState newScreenState,
    long startTime,
    EventId eventId) {
  try {
    primesController.startTimer(Timer.INITIALIZE_FOCUS);

    if (oldScreenState == null) {
      // We don't have old ScreenState when TalkBack starts.
      return false;
    }

    AccessibilityWindowInfo currentActiveWindow = newScreenState.getActiveWindow();
    if (currentActiveWindow == null) {
      LogUtils.w(TAG, "Cannot find active window.");
      return false;
    }

    int activeWindowId = currentActiveWindow.getId();
    CharSequence activeWindowTitle = newScreenState.getWindowTitle(activeWindowId);

    AccessibilityFocusActionHistory.Reader history = actorState.getFocusHistory();
    // Fix , initial focus will be skipped if user interacts on old window. So we only
    // skip initial focus if the interaction is happened on active window to ensure it can grant
    // focus.
    FocusActionRecord lastRecordOnActiveWindow =
        history.getLastFocusActionRecordInWindow(activeWindowId, activeWindowTitle);
    if ((lastRecordOnActiveWindow != null)
        && (lastRecordOnActiveWindow.getActionTime() > startTime)) {
      int sourceAction = lastRecordOnActiveWindow.getExtraInfo().sourceAction;
      if ((sourceAction == FocusActionInfo.TOUCH_EXPLORATION)
          || (sourceAction == FocusActionInfo.LOGICAL_NAVIGATION)) {
        LogUtils.v(
            TAG,
            "User changes accessibility focus on active window during window transition, "
                + "don't set initial focus here.");
        return false;
      }
    }

    AccessibilityWindowInfo previousActiveWindow = oldScreenState.getActiveWindow();
    if (AccessibilityWindowInfoUtils.equals(currentActiveWindow, previousActiveWindow)
        && TextUtils.equals(
            newScreenState.getActiveWindowTitle(), oldScreenState.getActiveWindowTitle())) {
      LogUtils.v(TAG, "Do not reassign initial focus when active window is not changed.");
      return false;
    }

    if (isActiveWindowShiftingWithIdenticalWindowSet(oldScreenState, newScreenState)) {
      LogUtils.v(
          TAG,
          "Do not assign initial focus when active window shifts with window set unchanged.");
      return false;
    }

    if (hasValidAccessibilityFocusInWindow(currentActiveWindow)) {
      return false;
    }

    if (actorState.getOverrideFocusRestoreUptimeMs() > handledOverrideFocusRestoreUptimeMs) {
      if (pipeline.returnFeedback(eventId, Feedback.focus(RESTORE))) {
        return true;
      }
    }

    return assignFocusOnWindow(currentActiveWindow, activeWindowTitle, eventId);
  } finally {
    /**
     * Refresh the update-time whenever window transition finished. Sometimes focus won't restore
     * in special cases, like dismiss dialog when screen off. If we don't refresh the flag, it
     * won't restore focus at screen off stage but restore focus at next visible window transition
     * instead.
     */
    handledOverrideFocusRestoreUptimeMs = actorState.getOverrideFocusRestoreUptimeMs();
    primesController.stopTimer(Timer.INITIALIZE_FOCUS);
  }
}