/*
* Copyright (C) 2012 Google Inc.
*
* 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.util.Log;
import android.view.accessibility.AccessibilityEvent;
import com.android.talkback.R;
import com.google.android.marvin.talkback.TalkBackService;
import com.android.talkback.Utterance;
import com.android.utils.AccessibilityEventUtils;
import com.android.utils.LogUtils;
/**
* Formatter for progress bar events.
*/
public class ProgressBarFormatter implements EventSpeechRule.AccessibilityEventFormatter {
@Override
public boolean format(AccessibilityEvent event, TalkBackService context, Utterance utterance) {
if (shouldDropEvent(event)) {
LogUtils.log(this, Log.VERBOSE, "Dropping unwanted progress bar event");
return false;
}
final CharSequence text = AccessibilityEventUtils.getEventTextOrDescription(event);
if (!TextUtils.isEmpty(text)) {
utterance.addSpoken(text);
return true;
}
final float percent = getProgressPercent(event);
final float rate = (float) Math.pow(2.0, (percent / 50.0) - 1);
utterance.addAuditory(R.raw.scroll_tone);
utterance.getMetadata().putFloat(Utterance.KEY_METADATA_EARCON_RATE, rate);
utterance.getMetadata().putFloat(Utterance.KEY_METADATA_EARCON_VOLUME, 0.5f);
return true;
}
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;
}
private float getProgressPercent(AccessibilityEvent event) {
final int maxProgress = event.getItemCount();
final int progress = event.getCurrentItemIndex();
final float percent = (progress / (float) maxProgress);
return (100.0f * Math.max(0.0f, Math.min(1.0f, percent)));
}
}