package org.wikipedia.richtext;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LevelListDrawable;
import android.support.annotation.ColorInt;
import android.support.annotation.DimenRes;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.view.View;
import org.wikipedia.R;
import org.wikipedia.drawable.AppLevelListDrawable;
import org.wikipedia.drawable.CircularProgressDrawable;
import org.wikipedia.media.AvPlayer;
public class AudioUrlSpan extends AnimatedImageSpan {
private static final int STOP_ICON_LEVEL = 0;
private static final int PLAY_ICON_LEVEL = 1;
@NonNull
private final AvPlayer player;
@NonNull
private final AvCallback avCallback = new AvCallback();
@NonNull
private final String path;
public AudioUrlSpan(@NonNull View view,
@NonNull AvPlayer player,
@NonNull String path,
int verticalAlignment) {
super(view, drawable(view.getContext()), verticalAlignment);
this.player = player;
this.path = path;
}
public void setTint(@ColorInt int color) {
DrawableCompat.setTint(getDrawable(), color);
}
@Override
public void start() {
showIcon(PLAY_ICON_LEVEL);
super.start();
player.play(path, avCallback, avCallback);
}
@Override
public void stop() {
showIcon(STOP_ICON_LEVEL);
super.stop();
player.stop();
}
@Override
public boolean isRunning() {
return getIconShown() == PLAY_ICON_LEVEL;
}
@NonNull
@Override
public Drawable getDrawable() {
//noinspection ConstantConditions
return super.getDrawable();
}
private void showIcon(int level) {
getDrawable().setLevel(level);
}
private int getIconShown() {
return getDrawable().getLevel();
}
@NonNull
private static Drawable drawable(Context context) {
LevelListDrawable levels = new AppLevelListDrawable();
levels.addLevel(PLAY_ICON_LEVEL, PLAY_ICON_LEVEL, spinnerDrawable(context));
levels.addLevel(STOP_ICON_LEVEL, STOP_ICON_LEVEL, speakerDrawable(context));
int radius = getDimensionPixelSize(context, R.dimen.audio_url_span_loading_spinner_radius);
levels.setBounds(0, 0, radius * 2, radius * 2);
return levels;
}
@NonNull
private static Drawable speakerDrawable(Context context) {
return ContextCompat.getDrawable(context, R.drawable.ic_volume_up_black_24dp);
}
@NonNull
private static Drawable spinnerDrawable(Context context) {
return new CircularProgressDrawable(Color.WHITE,
getDimensionPixelSize(context, R.dimen.audio_url_span_loading_spinner_border_thickness),
getDimensionPixelSize(context, R.dimen.audio_url_span_loading_spinner_radius));
}
private static int getDimensionPixelSize(Context context, @DimenRes int id) {
return context.getResources().getDimensionPixelSize(id);
}
private class AvCallback implements AvPlayer.Callback, AvPlayer.ErrorCallback {
@Override
public void onSuccess() {
stop();
}
@Override
public void onError() {
stop();
}
}
}