blob: 67946d52774f2928de2ee2116a582e1e63eeb902 [file] [log] [blame]
package android.support.v17.leanback.widget;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.support.v17.leanback.R;
import android.util.AttributeSet;
/**
* A subclass of {@link SearchOrbView} that visualizes the state of an ongoing speech recognition.
*/
public class SpeechOrbView extends SearchOrbView {
private final float mSoundLevelMaxZoom;
private final Colors mListeningOrbColors;
private final Colors mNotListeningOrbColors;
private int mCurrentLevel = 0;
private boolean mListening = false;
public SpeechOrbView(Context context) {
this(context, null);
}
public SpeechOrbView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SpeechOrbView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
Resources resources = context.getResources();
mSoundLevelMaxZoom =
resources.getFraction(R.fraction.lb_search_bar_speech_orb_max_level_zoom, 1, 1);
mNotListeningOrbColors = new Colors(resources.getColor(R.color.lb_speech_orb_not_recording),
resources.getColor(R.color.lb_speech_orb_not_recording_pulsed),
resources.getColor(R.color.lb_speech_orb_not_recording_icon));
mListeningOrbColors = new Colors(resources.getColor(R.color.lb_speech_orb_recording),
resources.getColor(R.color.lb_speech_orb_recording),
Color.TRANSPARENT);
showNotListening();
}
@Override
int getLayoutResourceId() {
return R.layout.lb_speech_orb;
}
/**
* Sets the view to display listening state.
*/
public void showListening() {
setOrbColors(mListeningOrbColors);
setOrbIcon(getResources().getDrawable(R.drawable.lb_ic_search_mic));
// Assume focused
animateOnFocus(true);
enableOrbColorAnimation(false);
scaleOrbViewOnly(1f);
mCurrentLevel = 0;
mListening = true;
}
/**
* Sets the view to display the not-listening state.
*/
public void showNotListening() {
setOrbColors(mNotListeningOrbColors);
setOrbIcon(getResources().getDrawable(R.drawable.lb_ic_search_mic_out));
animateOnFocus(hasFocus());
scaleOrbViewOnly(1f);
mListening = false;
}
/**
* Sets the sound level while listening to speech.
*/
public void setSoundLevel(int level) {
if (!mListening) return;
// Either ease towards the target level, or decay away from it depending on whether
// its higher or lower than the current.
if (level > mCurrentLevel) {
mCurrentLevel = mCurrentLevel + ((level - mCurrentLevel) / 2);
} else {
mCurrentLevel = (int) (mCurrentLevel * 0.7f);
}
float zoom = 1f + (mSoundLevelMaxZoom - getFocusedZoom()) * mCurrentLevel / 100;
scaleOrbViewOnly(zoom);
}
}