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); } }