package cn.bingoogolapple.media.ui.activity; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.view.View; import android.widget.ImageView; import android.widget.SeekBar; import android.widget.TextView; import cn.bingoogolapple.media.R; import cn.bingoogolapple.media.model.MediaFile; import cn.bingoogolapple.media.service.AudioService; import cn.bingoogolapple.media.ui.widget.LyricView; import cn.bingoogolapple.media.util.Logger; import cn.bingoogolapple.media.util.LyricLoader; import cn.bingoogolapple.media.util.LyricParser; import cn.bingoogolapple.media.util.StringUtil; import cn.bingoogolapple.titlebar.BGATitlebar; /** * 作者:王浩 邮件:bingoogolapple@gmail.com * 创建时间:15/9/18 下午11:46 * 描述: */ public class AudioActivity extends BaseActivity { private static final int WHAT_UPDATE_PROGRESS = 0; private static final int WHAT_UPDATE_LYRIC = 1; private ImageView mAnimIv; private AnimationDrawable mAnim; private TextView mArtistTv; private LyricView mLyricView; private TextView mTimeTv; private SeekBar mProgressSb; private ImageView mModeIv; private ImageView mPreIv; private ImageView mPlayIv; private ImageView mNextIv; private AudioServiceConnection mAudioServiceConnection; private AudioService.AudioBinder mAudioBinder; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case WHAT_UPDATE_PROGRESS: updateProgress(); break; case WHAT_UPDATE_LYRIC: updateLyric(); break; } } }; @Override protected void initView(Bundle savedInstanceState) { setContentView(R.layout.activity_audio); mTitlebar = getViewById(R.id.titlebar); mAnimIv = getViewById(R.id.iv_audio_anim); mArtistTv = getViewById(R.id.tv_audio_artist); mLyricView = getViewById(R.id.lyricView); mTimeTv = getViewById(R.id.tv_audio_time); mProgressSb = getViewById(R.id.sb_audio_progress); mModeIv = getViewById(R.id.iv_audio_mode); mPreIv = getViewById(R.id.iv_audio_pre); mPlayIv = getViewById(R.id.iv_audio_play); mNextIv = getViewById(R.id.iv_audio_next); } @Override protected void setListener() { mTitlebar.setDelegate(new BGATitlebar.BGATitlebarDelegate() { @Override public void onClickLeftCtv() { onBackPressed(); } }); mModeIv.setOnClickListener(this); mPreIv.setOnClickListener(this); mPlayIv.setOnClickListener(this); mNextIv.setOnClickListener(this); mProgressSb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { mHandler.removeMessages(WHAT_UPDATE_PROGRESS); mAudioBinder.seekTo(progress); updateProgress(); mHandler.removeMessages(WHAT_UPDATE_LYRIC); updateLyric(); if (!mAudioBinder.isPlaying()) { mAudioBinder.start(); updatePlayIvImageResource(); } } } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); } private void updateProgress() { int progress = mAudioBinder.getCurrentPosition(); mTimeTv.setText(StringUtil.formatTime(progress) + "/" + StringUtil.formatTime(mAudioBinder.getDuration())); mProgressSb.setProgress(progress); mHandler.sendEmptyMessageDelayed(WHAT_UPDATE_PROGRESS, 1000); } private void updateLyric() { mLyricView.roll(mAudioBinder.getCurrentPosition(), mAudioBinder.getDuration()); mHandler.sendEmptyMessageDelayed(WHAT_UPDATE_LYRIC, 200); } @Override protected void processLogic(Bundle savedInstanceState) { registerAudioServiceReceiver(); bindAudioService(); mAnim = (AnimationDrawable) mAnimIv.getDrawable(); } private void registerAudioServiceReceiver() { IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(AudioService.ACTION_AUDIO_PREPARED); intentFilter.addAction(AudioService.ACTION_AUDIO_COMPLETION); intentFilter.addAction(AudioService.ACTION_AUDIO_UPDATE_ICON); mLocalBroadcastManager.registerReceiver(mAudioServiceReceiver, intentFilter); } private void bindAudioService() { mAudioServiceConnection = new AudioServiceConnection(); Intent intent = new Intent(this, AudioService.class); intent.putExtras(getIntent().getExtras()); startService(intent); bindService(intent, mAudioServiceConnection, BIND_AUTO_CREATE); } private void unbindAudioService() { if (mAudioServiceConnection != null) { unbindService(mAudioServiceConnection); } } @Override protected void onDestroy() { mHandler.removeCallbacksAndMessages(null); mLocalBroadcastManager.unregisterReceiver(mAudioServiceReceiver); unbindAudioService(); super.onDestroy(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.iv_audio_mode: mAudioBinder.switchPlayMode(); updateRepeatModeIvImageResource(); break; case R.id.iv_audio_pre: mAudioBinder.pre(); break; case R.id.iv_audio_play: if (mAudioBinder.isPlaying()) { mAudioBinder.pause(); } else { mAudioBinder.start(); } break; case R.id.iv_audio_next: mAudioBinder.next(); break; } } private void updateRepeatModeIvImageResource() { switch (mAudioBinder.getRepeatMode()) { case Order: mModeIv.setImageResource(R.drawable.selector_audio_mode_normal); break; case SingleRepeat: mModeIv.setImageResource(R.drawable.selector_audio_mode_single_repeat); break; case AllRepeat: mModeIv.setImageResource(R.drawable.selector_audio_mode_all_repeat); break; } } private void updatePlayIvImageResource() { if (mAudioBinder.isPlaying()) { mPlayIv.setImageResource(R.drawable.selector_btn_audio_pause); mAnim.start(); } else { mPlayIv.setImageResource(R.drawable.selector_btn_audio_play); mAnim.stop(); } } @Override public void onBackPressed() { backward(); } private final class AudioServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { Logger.i(TAG, "onServiceConnected"); mAudioBinder = (AudioService.AudioBinder) service; updateRepeatModeIvImageResource(); } @Override public void onServiceDisconnected(ComponentName name) { Logger.i(TAG, "onServiceDisconnected"); } } private BroadcastReceiver mAudioServiceReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { MediaFile mediaFile = intent.getParcelableExtra(AudioService.EXTRA_MEDIA_FILE); switch (intent.getAction()) { case AudioService.ACTION_AUDIO_PREPARED: updatePlayIvImageResource(); mTitlebar.setTitleText(mediaFile.name); mArtistTv.setText(mediaFile.artist); mTimeTv.setText("00:00/" + StringUtil.formatTime(mediaFile.duration)); mProgressSb.setMax(mediaFile.duration); mLyricView.setLyrics(LyricParser.parseLyricFromFile(LyricLoader.loadLyricFile(mediaFile.name))); updateProgress(); updateLyric(); break; case AudioService.ACTION_AUDIO_COMPLETION: updatePlayIvImageResource(); mHandler.removeMessages(WHAT_UPDATE_PROGRESS); mHandler.removeMessages(WHAT_UPDATE_LYRIC); mTimeTv.setText(StringUtil.formatTime(mediaFile.duration) + "/" + StringUtil.formatTime(mediaFile.duration)); mProgressSb.setProgress(mediaFile.duration); break; case AudioService.ACTION_AUDIO_UPDATE_ICON: int currentPosition = intent.getIntExtra(AudioService.EXTRA_CURRENT_MEDIA_FILE_POSITION, 0); int total = intent.getIntExtra(AudioService.EXTRA_TOTAL_MEDIA_FILE, 0); mPreIv.setEnabled(currentPosition != 0); mNextIv.setEnabled(currentPosition != total - 1); updatePlayIvImageResource(); break; } } }; }