package be.lukin.android.babble; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageButton; public class MicButton extends ImageButton { private Drawable mDrawableMic; private Drawable mDrawableMicTranscribing; private List<Drawable> mVolumeLevels; private Animation mAnimFadeIn; private Animation mAnimFadeOut; private Animation mAnimFadeInOutInf; private int mVolumeLevel = 0; public MicButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initAnimations(context); } public MicButton(Context context, AttributeSet attrs) { super(context, attrs); initAnimations(context); } public MicButton(Context context) { super(context); initAnimations(context); } public void setState(Constants.State state) { switch(state) { case INIT: clearAnimation(); setBackgroundDrawable(mDrawableMic); break; case RECORDING: setBackgroundDrawable(mVolumeLevels.get(0)); break; case LISTENING: break; case TRANSCRIBING: setBackgroundDrawable(mDrawableMicTranscribing); startAnimation(mAnimFadeInOutInf); break; case ERROR: clearAnimation(); setBackgroundDrawable(mDrawableMic); break; default: break; } } public void setVolumeLevel(float rmsdB) { // TODO: take these from some configuration float min = 15.f; float max = 30.f; final int maxLevel = mVolumeLevels.size() - 1; int index = (int) ((rmsdB - min) / (max - min) * maxLevel); int level = Math.min(Math.max(0, index), maxLevel); if (level != mVolumeLevel) { mVolumeLevel = level; setBackgroundDrawable(mVolumeLevels.get(level)); } } public void fadeIn() { Animations.startFadeAnimation(mAnimFadeIn, this, View.VISIBLE); } public void fadeOut() { Animations.startFadeAnimation(mAnimFadeOut, this, View.INVISIBLE); } private void initAnimations(Context context) { Resources res = getResources(); mDrawableMic = res.getDrawable(R.drawable.button_mic); mDrawableMicTranscribing = res.getDrawable(R.drawable.button_mic_transcribing); mVolumeLevels = new ArrayList<Drawable>(); mVolumeLevels.add(res.getDrawable(R.drawable.button_mic_recording_0)); mVolumeLevels.add(res.getDrawable(R.drawable.button_mic_recording_1)); mVolumeLevels.add(res.getDrawable(R.drawable.button_mic_recording_2)); mVolumeLevels.add(res.getDrawable(R.drawable.button_mic_recording_3)); mAnimFadeIn = AnimationUtils.loadAnimation(context, R.anim.fade_in); mAnimFadeOut = AnimationUtils.loadAnimation(context, R.anim.fade_out); mAnimFadeInOutInf = AnimationUtils.loadAnimation(context, R.anim.fade_inout_inf); } }