當前位置: 首頁>>代碼示例>>Java>>正文


Java AccessibilityRecordCompat.getSource方法代碼示例

本文整理匯總了Java中android.support.v4.view.accessibility.AccessibilityRecordCompat.getSource方法的典型用法代碼示例。如果您正苦於以下問題:Java AccessibilityRecordCompat.getSource方法的具體用法?Java AccessibilityRecordCompat.getSource怎麽用?Java AccessibilityRecordCompat.getSource使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在android.support.v4.view.accessibility.AccessibilityRecordCompat的用法示例。


在下文中一共展示了AccessibilityRecordCompat.getSource方法的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Java代碼示例。

示例1: shouldDropEvent

import android.support.v4.view.accessibility.AccessibilityRecordCompat; //導入方法依賴的package包/類
private boolean shouldDropEvent(AccessibilityEvent event) {
    final AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);
    final AccessibilityNodeInfoCompat source = record.getSource();

    // Don't drop if we're on pre-ICS or the event was generated (e.g.
    // missing a node).
    if (source == null) {
        return false;
    }

    // Don't drop if the node is currently focused or accessibility focused.
    if (source.isFocused() || source.isAccessibilityFocused()) {
        return false;
    }

    // Don't drop if the node was recently explored.
    return true;
}
 
開發者ID:google,項目名稱:talkback,代碼行數:19,代碼來源:ProgressBarFormatter.java

示例2: accept

import android.support.v4.view.accessibility.AccessibilityRecordCompat; //導入方法依賴的package包/類
@Override
public boolean accept(AccessibilityEvent event, TalkBackService context) {
    if (event.getEventType() != AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) return false;

    AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);
    AccessibilityNodeInfoCompat node = record.getSource();
    if (node == null) {
        return false;
    }

    int liveRegion = node.getLiveRegion();
    node.recycle();

    switch (liveRegion) {
        case View.ACCESSIBILITY_LIVE_REGION_POLITE:
            return true;
        case View.ACCESSIBILITY_LIVE_REGION_ASSERTIVE:
            return true;
        case View.ACCESSIBILITY_LIVE_REGION_NONE:
            return false;
        default:
            return false;
    }
}
 
開發者ID:google,項目名稱:talkback,代碼行數:25,代碼來源:LiveViewFormatter.java

示例3: shouldKeepAutomaticEvent

import android.support.v4.view.accessibility.AccessibilityRecordCompat; //導入方法依賴的package包/類
/**
 * Helper method for {@link #shouldDropEvent} that handles events that
 * automatically occur immediately after a window state change.
 *
 * @param event The automatically generated event to consider retaining.
 * @return Whether to retain the event.
 */
private boolean shouldKeepAutomaticEvent(AccessibilityEvent event) {
    final AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);

    // Don't drop focus events from EditTexts.
    if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_FOCUSED) {
        AccessibilityNodeInfoCompat node = null;

        try {
            node = record.getSource();
            if (Role.getRole(node) == Role.ROLE_EDIT_TEXT) {
                return true;
            }
        } finally {
            AccessibilityNodeInfoUtils.recycleNodes(node);
        }
    }

    return false;
}
 
開發者ID:google,項目名稱:talkback,代碼行數:27,代碼來源:AccessibilityEventProcessor.java

示例4: format

import android.support.v4.view.accessibility.AccessibilityRecordCompat; //導入方法依賴的package包/類
@Override
public boolean format(AccessibilityEvent event, TalkBackService context, Utterance utterance) {
    final AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);
    final AccessibilityNodeInfoCompat source = record.getSource();
    if (source == null) return false;

    CharSequence text = format(context, source, event);
    if (TextUtils.isEmpty(text)) return false;

    utterance.addSpoken(text);
    utterance.getMetadata().putInt(Utterance.KEY_UTTERANCE_GROUP,
            SpeechController.UTTERANCE_GROUP_SEEK_PROGRESS);
    utterance.addSpokenFlag(
            FeedbackItem.FLAG_CLEAR_QUEUED_UTTERANCES_WITH_SAME_UTTERANCE_GROUP);
    utterance.getMetadata().putInt(Utterance.KEY_METADATA_QUEUING,
            SpeechController.QUEUE_MODE_UNINTERRUPTIBLE);
    return true;
}
 
開發者ID:google,項目名稱:talkback,代碼行數:19,代碼來源:RuleSeekBar.java

示例5: format

import android.support.v4.view.accessibility.AccessibilityRecordCompat; //導入方法依賴的package包/類
@Override
public boolean format(AccessibilityEvent event, TalkBackService context, Utterance utterance) {
    AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);
    AccessibilityNodeInfoCompat source = record.getSource();
    AccessibilityNodeInfoCompat refreshedSource =
            AccessibilityNodeInfoUtils.refreshNode(source);

    try {
        if (refreshedSource == null) {
            // Node no longer exists.
            return false;
        }

        // Is source directly checkable?
        if (refreshedSource.isCheckable()) {
            utterance.addSpoken(getStateText(refreshedSource, context));
            return true;
        }

        // Does source contain non-focusable checkable child?
        if (refreshedSource.isAccessibilityFocused() || refreshedSource.isFocused()) {
            AccessibilityNodeInfoCompat checkableChild = findCheckableChild(refreshedSource);
            if (checkableChild != null) {
                utterance.addSpoken(getStateText(checkableChild, context));
                checkableChild.recycle();
                return true;
            }
        }
    } finally {
        AccessibilityNodeInfoUtils.recycleNodes(source, refreshedSource);
    }

    utterance.addSpokenFlag(FeedbackItem.FLAG_NO_SPEECH);
    return true;
}
 
開發者ID:google,項目名稱:talkback,代碼行數:36,代碼來源:ClickFormatter.java

示例6: handleViewScrolled

import android.support.v4.view.accessibility.AccessibilityRecordCompat; //導入方法依賴的package包/類
private void handleViewScrolled(AccessibilityEvent event, AccessibilityRecordCompat record) {
    AccessibilityNodeInfoCompat source = null;

    @TraversalStrategy.SearchDirectionOrUnknown int direction;
    boolean wasScrollAction;
    if (mActionScrolledNode != null) {
        source = record.getSource();
        if (source == null) return;
        if (source.equals(mActionScrolledNode)) {
            direction = mLastScrollDirection;
            wasScrollAction = true;
            clearScrollAction();
        } else {
            direction = getScrollDirection(event);
            wasScrollAction = false;
        }
    } else {
        direction = getScrollDirection(event);
        wasScrollAction = false;
    }

    followScrollEvent(source, record, direction, wasScrollAction);

    mLastScrollFromIndex = record.getFromIndex();
    mLastScrollToIndex = record.getToIndex();
    mLastScrollX = record.getScrollX();
    mLastScrollY = record.getScrollY();

    tryFocusCachedRecord();
}
 
開發者ID:google,項目名稱:talkback,代碼行數:31,代碼來源:ProcessorFocusAndSingleTap.java

示例7: shouldAnnounceEvent

import android.support.v4.view.accessibility.AccessibilityRecordCompat; //導入方法依賴的package包/類
/**
 * Uses a heuristic to guess whether an event should be announced.
 * Any event that comes from an IME, or an invisible window is considered
 * an announcement.
 */
private boolean shouldAnnounceEvent(AccessibilityEvent event, int windowId) {
    // Assume window ID of 0 is the keyboard.
    if (windowId == WINDOW_ID_NONE) {
        return true;
    }

    // If there's an actual window ID, we need to check the window type (if window available).
    boolean shouldAnnounceWindow = false;
    AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);
    AccessibilityNodeInfoCompat source = record.getSource();
    if (source != null) {
        AccessibilityWindowInfoCompat window = source.getWindow();
        if (window != null) {
            shouldAnnounceWindow =
                window.getType() == AccessibilityWindowInfoCompat.TYPE_INPUT_METHOD;
            window.recycle();
        } else {
            // If window is not visible, we cannot know whether the window type is input method
            // or not. Let's announce it for the case. If window is visible but window info is
            // not available, it can be non-focusable visible window. Don't announce it for the
            // case. It can be a toast.
            shouldAnnounceWindow = !source.isVisibleToUser();
        }
        source.recycle();
    }
    return shouldAnnounceWindow;
}
 
開發者ID:google,項目名稱:talkback,代碼行數:33,代碼來源:ProcessorScreen.java

示例8: onAccessibilityEvent

import android.support.v4.view.accessibility.AccessibilityRecordCompat; //導入方法依賴的package包/類
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    if (!areHintsEnabled()) {
        return;
    }

    // Clear hints that were generated before a click or in an old window configuration.
    final int eventType = event.getEventType();
    if (eventType == AccessibilityEvent.TYPE_VIEW_CLICKED ||
            eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED ||
            eventType == AccessibilityEvent.TYPE_WINDOWS_CHANGED) {
        cancelA11yHint();
        return;
    }

    if (eventType == AccessibilityEventCompat.TYPE_VIEW_ACCESSIBILITY_FOCUSED) {
        EventState eventState = EventState.getInstance();
        if (eventState.checkAndClearRecentEvent(
                EventState.EVENT_SKIP_HINT_AFTER_GRANULARITY_MOVE)) {
            return;
        }
        if (eventState.checkAndClearRecentEvent(
                EventState.EVENT_SKIP_HINT_AFTER_CURSOR_CONTROL)) {
            return;
        }

        AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);
        AccessibilityNodeInfoCompat source = record.getSource();
        if (source != null) {
            postA11yHintRunnable(source);
            // DO NOT RECYCLE. postA11yHintRunnable will save the node.
        }
    }
}
 
開發者ID:google,項目名稱:talkback,代碼行數:35,代碼來源:ProcessorAccessibilityHints.java

示例9: computeQueuingMode

import android.support.v4.view.accessibility.AccessibilityRecordCompat; //導入方法依賴的package包/類
/**
 * Computes the queuing mode for the current utterance.
 *
 * @param utterance to compute queuing from
 * @return A queuing mode, one of:
 *         <ul>
 *         <li>{@link SpeechController#QUEUE_MODE_INTERRUPT}
 *         <li>{@link SpeechController#QUEUE_MODE_QUEUE}
 *         <li>{@link SpeechController#QUEUE_MODE_UNINTERRUPTIBLE}
 *         </ul>
 */
private int computeQueuingMode(Utterance utterance, AccessibilityEvent event) {
    final Bundle metadata = utterance.getMetadata();
    final int eventType = event.getEventType();

    // Queue events that occur automatically after window state changes.
    if (((event.getEventType() & AccessibilityEventProcessor.AUTOMATIC_AFTER_STATE_CHANGE) != 0)
            && ((event.getEventTime() - mLastWindowStateChanged)
                    < AccessibilityEventProcessor.DELAY_AUTO_AFTER_STATE)) {
        return SpeechController.QUEUE_MODE_QUEUE;
    }

    if(eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {
        AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);
        AccessibilityNodeInfoCompat node = record.getSource();
        if (node != null) {
            int liveRegionMode = node.getLiveRegion();
            if (liveRegionMode == View.ACCESSIBILITY_LIVE_REGION_POLITE) {
                return SpeechController.QUEUE_MODE_QUEUE;
            }
        }
    }

    int queueMode = metadata.getInt(Utterance.KEY_METADATA_QUEUING,
            SpeechController.QUEUE_MODE_INTERRUPT);

    // Always collapse events of the same type.
    if (mLastEventType == eventType &&
            queueMode != SpeechController.QUEUE_MODE_UNINTERRUPTIBLE) {
        return SpeechController.QUEUE_MODE_INTERRUPT;
    }

    mLastEventType = eventType;

    return queueMode;
}
 
開發者ID:google,項目名稱:talkback,代碼行數:47,代碼來源:ProcessorEventQueue.java

示例10: shouldDropEvent

import android.support.v4.view.accessibility.AccessibilityRecordCompat; //導入方法依賴的package包/類
/**
 * Returns {@code true} if the specified event is a selection event and
 * should be dropped without providing feedback. Always returns
 * {@code false} for non-selection events.
 */
private boolean shouldDropEvent(AccessibilityEvent event) {
    // Only operate on selection events. Never drop granular movement
    // events or other event types.
    final int eventType = event.getEventType();
    if (eventType != AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED) {
        return false;
    }

    // Drop selected events until we've matched the number of changed
    // events. This prevents TalkBack from speaking automatic cursor
    // movement events that result from typing.
    if (sAwaitingSelectionCount > 0) {
        final boolean hasDelayElapsed =
                ((event.getEventTime() - sChangedTimestamp) >= SELECTION_DELAY);
        final boolean hasPackageChanged =
                !TextUtils.equals(event.getPackageName(), sChangedPackage);

        // If the state is still consistent, update the count and drop
        // the event.
        if (!hasDelayElapsed && !hasPackageChanged) {
            sAwaitingSelectionCount--;
            mLastFromIndex = event.getFromIndex();
            mLastToIndex = event.getToIndex();
            if (mLastNode != null) {
                mLastNode.recycle();
            }
            mLastNode = event.getSource();
            return true;
        }

        // The state became inconsistent, so reset the counter.
        sAwaitingSelectionCount = 0;
    }

    // Drop selection events from views that don't have input focus.
    final AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);
    final AccessibilityNodeInfoCompat source = record.getSource();
    if ((source != null) && !source.isFocused()) {
        LogUtils.log(this, Log.VERBOSE, "Dropped selection event from non-focused field");
        return true;
    }

    return false;
}
 
開發者ID:google,項目名稱:talkback,代碼行數:50,代碼來源:TextFormatters.java

示例11: format

import android.support.v4.view.accessibility.AccessibilityRecordCompat; //導入方法依賴的package包/類
/**
 * Formatter that returns an utterance to announce touch exploration.
 */
@Override
public boolean format(AccessibilityEvent event, TalkBackService context, Utterance utterance) {
    if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED &&
            EventState.getInstance().checkAndClearRecentEvent(
                    EventState.EVENT_SKIP_FOCUS_PROCESSING_AFTER_GRANULARITY_MOVE)) {
        return false;
    }
    if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED &&
            EventState.getInstance().checkAndClearRecentEvent(
                    EventState.EVENT_SKIP_FOCUS_PROCESSING_AFTER_CURSOR_CONTROL)) {
        return false;
    }

    final AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);
    final AccessibilityNodeInfoCompat sourceNode = record.getSource();
    final AccessibilityNodeInfoCompat focusedNode = getFocusedNode(
            event.getEventType(), sourceNode);

    // Drop the event if the source node was non-null, but the focus
    // algorithm decided to drop the event by returning null.
    if ((sourceNode != null) && (focusedNode == null)) {
        AccessibilityNodeInfoUtils.recycleNodes(sourceNode);
        return false;
    }

    LogUtils.log(this, Log.VERBOSE, "Announcing node: %s", focusedNode);

    // Transition the collection state if necessary.
    mCollectionState.updateCollectionInformation(focusedNode, event);

    // Populate the utterance.
    addEarconWhenAccessibilityFocusMovesToTheDivider(utterance, focusedNode);
    addSpeechFeedback(utterance, focusedNode, event, sourceNode);
    addAuditoryHapticFeedback(utterance, focusedNode);

    // By default, touch exploration flushes all other events.
    utterance.getMetadata().putInt(Utterance.KEY_METADATA_QUEUING, DEFAULT_QUEUING_MODE);

    // Events formatted by this class should always advance continuous
    // reading, if active.
    utterance.addSpokenFlag(FeedbackItem.FLAG_ADVANCE_CONTINUOUS_READING);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        mLastFocusedWindowId = focusedNode.getWindowId();
    }

    AccessibilityNodeInfoUtils.recycleNodes(sourceNode, focusedNode);

    return true;
}
 
開發者ID:google,項目名稱:talkback,代碼行數:54,代碼來源:TouchExplorationFormatter.java

示例12: format

import android.support.v4.view.accessibility.AccessibilityRecordCompat; //導入方法依賴的package包/類
@Override
public boolean format(AccessibilityEvent event, TalkBackService context, Utterance utterance) {
    if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {
        if (sCachedCheckableNode == null) return false;

        // Need to get latest state of cached node before accessing.
        sCachedCheckableNode.refresh();

        utterance.addAuditory(R.raw.tick);
        utterance.addHaptic(R.array.view_clicked_pattern);
        utterance.addSpoken(context.getString(sCachedCheckableNode.isChecked() ?
                R.string.value_checked : R.string.value_not_checked));
        sCachedCheckableNode.recycle();
        sCachedCheckableNode = null;
        return true;
    }

    AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);
    AccessibilityNodeInfoCompat source = record.getSource();

    utterance.addAuditory(R.raw.tick);
    utterance.addHaptic(R.array.view_clicked_pattern);

    CharSequence eventText = AccessibilityEventUtils.getEventTextOrDescription(event);
    if (!TextUtils.isEmpty(eventText)) {
        utterance.addSpoken(eventText);
    }

    // Switch and ToggleButton state is sent along with the event, so only
    // append checked / not checked state for other types of controls.
    // TODO: node.isTwoState()
    if (Role.getRole(source) == Role.ROLE_TOGGLE_BUTTON ||
            Role.getRole(source) == Role.ROLE_SWITCH) {
        return true;
    }

    if (source == null || Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        if (event.isChecked()) {
            utterance.addSpoken(context.getString(R.string.value_checked));
        } else {
            utterance.addSpoken(context.getString(R.string.value_not_checked));
        }

        return true;
    }

    if (source.isCheckable()) {
        if (source.isChecked()) {
            utterance.addSpoken(context.getString(R.string.value_checked));
        } else {
            utterance.addSpoken(context.getString(R.string.value_not_checked));
        }
    }

    return true;
}
 
開發者ID:google,項目名稱:talkback,代碼行數:57,代碼來源:CheckableClickedFormatter.java

示例13: followScrollEvent

import android.support.v4.view.accessibility.AccessibilityRecordCompat; //導入方法依賴的package包/類
private void followScrollEvent(AccessibilityNodeInfoCompat source,
                               AccessibilityRecordCompat record,
                               @TraversalStrategy.SearchDirectionOrUnknown int direction,
                               boolean wasScrollAction) {
    // SEARCH_FOCUS_UNKNOWN can be passed, so need to guarantee that direction is a
    // @TraversalStrategy.SearchDirection before continuing.
    if (direction == TraversalStrategy.SEARCH_FOCUS_UNKNOWN) {
        return;
    }

    AccessibilityNodeInfoCompat root = null;
    AccessibilityNodeInfoCompat accessibilityFocused = null;

    try {
        // First, see if we've already placed accessibility focus.
        root = AccessibilityServiceCompatUtils.getRootInAccessibilityFocusedWindow(mService);
        if (root == null) {
            return;
        }

        accessibilityFocused = root.findFocus(AccessibilityNodeInfo.FOCUS_ACCESSIBILITY);
        boolean validAccessibilityFocus = AccessibilityNodeInfoUtils.shouldFocusNode(
                accessibilityFocused);
        // there are cases when scrollable container was scrolled and application set
        // focus on node that is on new container page. We should keep this focus
        boolean hasInputFocus = accessibilityFocused != null
                && accessibilityFocused.isFocused();

        if (validAccessibilityFocus && (hasInputFocus || !wasScrollAction)) {
            // focused on valid node and scrolled not by scroll action
            // keep focus
            return;
        }

        if (validAccessibilityFocus) {
            // focused on valid node and scrolled by scroll action
            // focus on next focusable node
            if (source == null) {
                source = record.getSource();
                if (source == null) return;
            }
            if (!AccessibilityNodeInfoUtils.hasAncestor(accessibilityFocused, source)) {
                return;
            }
            TraversalStrategy traversal = TraversalStrategyUtils.getTraversalStrategy(root,
                    direction);
            try {
                focusNextFocusedNode(traversal, accessibilityFocused, direction);
            } finally {
                traversal.recycle();
            }
        } else {
            if (mLastFocusedItem == null) {
                // there was no focus - don't set focus
                return;
            }

            if (source == null) {
                source = record.getSource();
                if (source == null) return;
            }
            if (mLastFocusedItem.equals(source) ||
                    AccessibilityNodeInfoUtils.hasAncestor(mLastFocusedItem, source)) {

                // There is no focus now, but it was on source node's child before
                // Try focusing the appropriate child node.
                if (tryFocusingChild(source, direction)) {
                    return;
                }

                // Finally, try focusing the scrollable node itself.
                tryFocusing(source);
            }
        }
    } finally {
        AccessibilityNodeInfoUtils.recycleNodes(root, accessibilityFocused);
    }
}
 
開發者ID:google,項目名稱:talkback,代碼行數:79,代碼來源:ProcessorFocusAndSingleTap.java

示例14: setFocusOnView

import android.support.v4.view.accessibility.AccessibilityRecordCompat; //導入方法依賴的package包/類
/**
 * @param record the AccessbilityRecord for the event
 * @param isViewFocusedEvent true if the event is TYPE_VIEW_FOCUSED, otherwise it is
 * TYPE_VIEW_SELECTED.
 */
private boolean setFocusOnView(AccessibilityRecordCompat record, boolean isViewFocusedEvent) {
    AccessibilityNodeInfoCompat source = null;
    AccessibilityNodeInfoCompat existing = null;
    AccessibilityNodeInfoCompat child = null;

    try {
        source = record.getSource();
        if (source == null) {
            return false;
        }

        if (record.getItemCount() > 0) {
            final int index = (record.getCurrentItemIndex() - record.getFromIndex());
            if (index >= 0 && index < source.getChildCount()) {
                child = source.getChild(index);
                if (child != null) {
                    if (AccessibilityNodeInfoUtils.isTopLevelScrollItem(child) &&
                            tryFocusing(child)) {
                        return true;
                    }
                }
            }
        }

        if (!isViewFocusedEvent) {
            return false;
        }

        // Logic below is only specific to TYPE_VIEW_FOCUSED event
        // Try focusing the source node.
        if (tryFocusing(source)) {
            return true;
        }

        // If we fail and the source node already contains focus, abort.
        existing = source.findFocus(AccessibilityNodeInfo.FOCUS_ACCESSIBILITY);
        if (existing != null) {
            return false;
        }

        // If we fail to focus a node, perhaps because it is a focusable
        // but non-speaking container, we should still attempt to place
        // focus on a speaking child within the container.
        child = AccessibilityNodeInfoUtils.searchFromBfs(source,
                AccessibilityNodeInfoUtils.FILTER_SHOULD_FOCUS);
        return child != null && tryFocusing(child);

    } finally {
        AccessibilityNodeInfoUtils.recycleNodes(source, existing, child);
    }
}
 
開發者ID:google,項目名稱:talkback,代碼行數:57,代碼來源:ProcessorFocusAndSingleTap.java

示例15: onAccessibilityEvent

import android.support.v4.view.accessibility.AccessibilityRecordCompat; //導入方法依賴的package包/類
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    // Only announce relevant events
    if (!AccessibilityEventUtils.eventMatchesAnyType(event, MASK_ACCEPTED_EVENT_TYPES)) {
        return;
    }

    final AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);
    final AccessibilityNodeInfoCompat source = record.getSource();

    // Drop consecutive qualifying events from the same node.
    if (mLastNode != null && mLastNode.equals(source)) {
        return;
    } else {
        if (mLastNode != null) {
            mLastNode.recycle();
        }
        mLastNode = source;
    }

    // Only announce nodes that have legacy web content.
    if (!WebInterfaceUtils.hasLegacyWebContent(source)) {
        return;
    }

    if (WebInterfaceUtils.isScriptInjectionEnabled(mService)) {
        // Instruct accessibility script to announce the page title as long
        // as continuous reading isn't active.
        final FullScreenReadController fullScreen = mService.getFullScreenReadController();
        if (fullScreen.isReadingLegacyWebContent()) {
            // Reset the state for full screen reading now that we've moved
            // into web content.
            fullScreen.interrupt();
        } else {
            WebInterfaceUtils.performSpecialAction(
                    source, WebInterfaceUtils.ACTION_READ_PAGE_TITLE_ELEMENT);
        }
    } else if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        // On versions that include a script injection preference, inform
        // the user that script injection is disabled.
        final String preferenceName = AutomationUtils.getPackageString(
                mService, PACKAGE_SETTINGS, RES_NAME_SCRIPT_INJECTION_TITLE);
        if (preferenceName != null) {
            final CharSequence announcement = mService.getString(
                    R.string.hint_script_injection, preferenceName);
            mService.getSpeechController().speak(
                    announcement, SpeechController.QUEUE_MODE_INTERRUPT, 0, null);
        }
    }
}
 
開發者ID:google,項目名稱:talkback,代碼行數:51,代碼來源:ProcessorWebContent.java


注:本文中的android.support.v4.view.accessibility.AccessibilityRecordCompat.getSource方法示例由純淨天空整理自Github/MSDocs等開源代碼及文檔管理平台,相關代碼片段篩選自各路編程大神貢獻的開源項目,源碼版權歸原作者所有,傳播和使用請參考對應項目的License;未經允許,請勿轉載。