125aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichetpackage android.support.v17.leanback.widget;
225aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet
325aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichetimport android.content.Context;
425aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichetimport android.content.res.Resources;
54c696a0ad561090035960c2f34a058562c7f2aadCraig Stoutimport android.graphics.Color;
625aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichetimport android.support.v17.leanback.R;
725aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichetimport android.util.AttributeSet;
825aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet
94c696a0ad561090035960c2f34a058562c7f2aadCraig Stoutpublic class SpeechOrbView extends SearchOrbView {
1025aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet    private final float mSoundLevelMaxZoom;
114c696a0ad561090035960c2f34a058562c7f2aadCraig Stout    private final Colors mListeningOrbColors;
124c696a0ad561090035960c2f34a058562c7f2aadCraig Stout    private final Colors mNotListeningOrbColors;
1325aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet
1425aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet    private int mCurrentLevel = 0;
1525aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet    private boolean mListening = false;
1625aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet
1725aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet    public SpeechOrbView(Context context) {
1825aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet        this(context, null);
1925aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet    }
2025aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet
2125aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet    public SpeechOrbView(Context context, AttributeSet attrs) {
2225aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet        this(context, attrs, 0);
2325aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet    }
2425aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet
2525aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet    public SpeechOrbView(Context context, AttributeSet attrs, int defStyle) {
2625aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet        super(context, attrs, defStyle);
2725aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet
2825aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet        Resources resources = context.getResources();
2925aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet        mSoundLevelMaxZoom =
3025aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet                resources.getFraction(R.fraction.lb_search_bar_speech_orb_max_level_zoom, 1, 1);
3125aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet
324c696a0ad561090035960c2f34a058562c7f2aadCraig Stout        mNotListeningOrbColors = new Colors(resources.getColor(R.color.lb_speech_orb_not_recording),
334c696a0ad561090035960c2f34a058562c7f2aadCraig Stout                resources.getColor(R.color.lb_speech_orb_not_recording_pulsed),
344c696a0ad561090035960c2f34a058562c7f2aadCraig Stout                resources.getColor(R.color.lb_speech_orb_not_recording_icon));
354c696a0ad561090035960c2f34a058562c7f2aadCraig Stout        mListeningOrbColors = new Colors(resources.getColor(R.color.lb_speech_orb_recording),
364c696a0ad561090035960c2f34a058562c7f2aadCraig Stout                resources.getColor(R.color.lb_speech_orb_recording),
374c696a0ad561090035960c2f34a058562c7f2aadCraig Stout                Color.TRANSPARENT);
3825aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet
394c696a0ad561090035960c2f34a058562c7f2aadCraig Stout        showNotListening();
4025aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet    }
4125aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet
4225aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet    @Override
434c696a0ad561090035960c2f34a058562c7f2aadCraig Stout    int getLayoutResourceId() {
444c696a0ad561090035960c2f34a058562c7f2aadCraig Stout        return R.layout.lb_speech_orb;
4525aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet    }
4625aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet
4725aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet    public void showListening() {
484c696a0ad561090035960c2f34a058562c7f2aadCraig Stout        setOrbColors(mListeningOrbColors);
494c696a0ad561090035960c2f34a058562c7f2aadCraig Stout        setOrbIcon(getResources().getDrawable(R.drawable.lb_ic_search_mic));
504c696a0ad561090035960c2f34a058562c7f2aadCraig Stout        // Assume focused
514c696a0ad561090035960c2f34a058562c7f2aadCraig Stout        animateOnFocus(true);
5249bd8747a667ae5f45a132d803cc18a80e963545Jerome Poichet        enableOrbColorAnimation(false);
534c696a0ad561090035960c2f34a058562c7f2aadCraig Stout        scaleOrbViewOnly(1f);
549e3b908cd06f14bc7810e744ccb174ee55c972a5Craig Stout        mCurrentLevel = 0;
5525aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet        mListening = true;
5625aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet    }
5725aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet
5825aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet    public void showNotListening() {
594c696a0ad561090035960c2f34a058562c7f2aadCraig Stout        setOrbColors(mNotListeningOrbColors);
604c696a0ad561090035960c2f34a058562c7f2aadCraig Stout        setOrbIcon(getResources().getDrawable(R.drawable.lb_ic_search_mic_out));
614c696a0ad561090035960c2f34a058562c7f2aadCraig Stout        animateOnFocus(hasFocus());
624c696a0ad561090035960c2f34a058562c7f2aadCraig Stout        scaleOrbViewOnly(1f);
6325aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet        mListening = false;
6425aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet    }
6525aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet
6625aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet    public void setSoundLevel(int level) {
6725aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet        if (!mListening) return;
6825aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet
6925aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet        // Either ease towards the target level, or decay away from it depending on whether
7025aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet        // its higher or lower than the current.
7125aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet        if (level > mCurrentLevel) {
7249bd8747a667ae5f45a132d803cc18a80e963545Jerome Poichet            mCurrentLevel = mCurrentLevel + ((level - mCurrentLevel) / 2);
7325aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet        } else {
7449bd8747a667ae5f45a132d803cc18a80e963545Jerome Poichet            mCurrentLevel = (int) (mCurrentLevel * 0.7f);
7525aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet        }
7625aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet
779e3b908cd06f14bc7810e744ccb174ee55c972a5Craig Stout        float zoom = 1f + (mSoundLevelMaxZoom - getFocusedZoom()) * mCurrentLevel / 100;
7849bd8747a667ae5f45a132d803cc18a80e963545Jerome Poichet
794c696a0ad561090035960c2f34a058562c7f2aadCraig Stout        scaleOrbViewOnly(zoom);
8025aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet    }
8125aacd3f5896ec09053739cc731bdbab3a6f2b81Jerome Poichet}
82