package eoc.studio.voicecard.card.viewer; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import android.content.Context; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnPreparedListener; import android.net.Uri; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import eoc.studio.voicecard.R; public class AudioMessageView extends RelativeLayout { private final static String TAG = "AudioMessageView"; private ImageView controllerIcon; private TextView timeTextView; private String durationText; private boolean isPlayable = true; private MediaPlayer mediaPlayer; private OnTouchListener touchListener = new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { Log.d(TAG, "touchListener onTouch isPlayable: "+isPlayable); Log.d(TAG, "touchListener onTouch isPrepared: "+isPrepared); boolean isConsumed = false; if (isPlayable && isPrepared) { if (isPlaying()) { pausePlaying(); stopTimeUpdate(); isConsumed = true; } else { resumePlaying(); startTimeUpdate(); isConsumed = true; } } return isConsumed; } return false; } }; private boolean isPlaying = false; private boolean isPrepared = false; public AudioMessageView(Context context, AttributeSet attrs) { super(context, attrs); initLayout(); setOnTouchListener(touchListener); } private void initLayout() { LayoutInflater inflater = LayoutInflater.from(getContext()); inflater.inflate(R.layout.view_audio_message, this); timeTextView = (TextView) findViewById(R.id.glb_audio_message_tv_time); // timeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.glb_card_tv_editable_voice_tip_textsize)); controllerIcon = (ImageView) findViewById(R.id.glb_audio_message_iv_control_icon); } public void setDurationText(String durationText) { this.durationText = durationText; timeTextView.setText(durationText); } public void setDuration(int milliseconds) { int min = milliseconds / 1000 / 60; int sec = milliseconds / 1000 % 60; setDurationText(min + ":" + String.format("%02d", sec)); } public void startTimeUpdate() { this.post(updateTimeAction); } public void stopTimeUpdate() { this.removeCallbacks(updateTimeAction); } public void setPlayingState(boolean isPlaying) { this.isPlaying = isPlaying; if (isPlaying) { controllerIcon.setImageResource(R.drawable.icon_pause); } else { controllerIcon.setImageResource(R.drawable.icon_play); } } public boolean isPlaying() { return isPlaying; } public boolean isPrepared() { return isPrepared; } public void setPlayable(boolean playable) { isPlayable = playable; } public void setPlayerSourcceAndPrepare(MediaPlayer player, Uri source, final boolean playAtBeginning) throws IllegalArgumentException, SecurityException, IllegalStateException, IOException { this.mediaPlayer = player; Log.d(TAG, "setPlayerSourcceAndPrepare: "+source); mediaPlayer = new MediaPlayer(); //@bruce add for fix some devices will prepare error File file = new File(source.getPath()); FileInputStream fis = new FileInputStream(file); mediaPlayer.setDataSource(fis.getFD()); // mediaPlayer.setDataSource(getContext(), source); mediaPlayer.prepare(); mediaPlayer.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { isPrepared = true; setDuration(mp.getDuration()); if (playAtBeginning) { mp.start(); setPlayingState(true); } } }); mediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { stopTimeUpdate(); setDurationText(durationText); setPlayingState(false); } }); mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { Log.d(TAG,"mediaPlayer onError what: "+what); return false; } }); } private void pausePlaying() { mediaPlayer.pause(); setPlayingState(false); } private void resumePlaying() { mediaPlayer.start(); setPlayingState(true); } public void play() { if (isPlayable && isPrepared && !isPlaying()) { resumePlaying(); startTimeUpdate(); } } public void pause() { if (isPlayable && isPrepared && isPlaying()) { pausePlaying(); stopTimeUpdate(); } } private void releasePlayer() { try { if (mediaPlayer != null) { mediaPlayer.release(); mediaPlayer = null; } } catch (Throwable e) { e.printStackTrace(); } } private Runnable updateTimeAction = new Runnable() { @Override public void run() { int ms = mediaPlayer.getCurrentPosition(); int min = ms / 1000 / 60; int sec = ms / 1000 % 60; timeTextView.setText(min + ":" + String.format("%02d", sec)); AudioMessageView.this.postDelayed(updateTimeAction, 500); } }; @Override protected void onDetachedFromWindow() { stopTimeUpdate(); releasePlayer(); super.onDetachedFromWindow(); } }