/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.talkback.formatter; import android.support.v4.view.accessibility.AccessibilityEventCompat; import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; import android.support.v4.view.accessibility.AccessibilityRecordCompat; import android.text.TextUtils; import android.view.View; import android.view.accessibility.AccessibilityEvent; import com.android.talkback.FeedbackItem; import com.android.talkback.SpeechController; import com.google.android.marvin.talkback.TalkBackService; import com.android.talkback.Utterance; import com.android.talkback.speechrules.NodeSpeechRuleProcessor; /** * Formatter that will speak a live view update event. */ public final class LiveViewFormatter implements EventSpeechRule.AccessibilityEventFilter, EventSpeechRule.AccessibilityEventFormatter { @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; } } @Override public boolean format(AccessibilityEvent event, TalkBackService context, Utterance utterance) { AccessibilityNodeInfoCompat node = new AccessibilityNodeInfoCompat(event.getSource()); if (node.getInfo() == null) { return false; } int liveRegion = node.getLiveRegion(); switch (liveRegion) { case View.ACCESSIBILITY_LIVE_REGION_POLITE: break; case View.ACCESSIBILITY_LIVE_REGION_ASSERTIVE: utterance.getMetadata().putInt(Utterance.KEY_METADATA_QUEUING, SpeechController.QUEUE_MODE_INTERRUPT); break; case View.ACCESSIBILITY_LIVE_REGION_NONE: return false; default: return false; } CharSequence text = NodeSpeechRuleProcessor.getInstance() .getDescriptionForTree(node, event, node); if (TextUtils.isEmpty(text)) { return false; } utterance.addSpoken(text); utterance.addSpokenFlag(FeedbackItem.FLAG_SKIP_DUPLICATE); return true; } }