package me.wcy.music.fragment; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.media.AudioManager; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.view.ViewPager; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.TextView; import java.io.File; import java.util.ArrayList; import java.util.List; import me.wcy.lrcview.LrcView; import me.wcy.music.R; import me.wcy.music.adapter.PlayPagerAdapter; import me.wcy.music.constants.Actions; import me.wcy.music.enums.PlayModeEnum; import me.wcy.music.executor.SearchLrc; import me.wcy.music.model.Music; import me.wcy.music.utils.CoverLoader; import me.wcy.music.utils.FileUtils; import me.wcy.music.utils.Preferences; import me.wcy.music.utils.ScreenUtils; import me.wcy.music.utils.SystemUtils; import me.wcy.music.utils.ToastUtils; import me.wcy.music.utils.binding.Bind; import me.wcy.music.widget.AlbumCoverView; import me.wcy.music.widget.IndicatorLayout; /** * 正在播放界面 * Created by wcy on 2015/11/27. */ public class PlayFragment extends BaseFragment implements View.OnClickListener, ViewPager.OnPageChangeListener, SeekBar.OnSeekBarChangeListener { @Bind(R.id.ll_content) private LinearLayout llContent; @Bind(R.id.iv_play_page_bg) private ImageView ivPlayingBg; @Bind(R.id.iv_back) private ImageView ivBack; @Bind(R.id.tv_title) private TextView tvTitle; @Bind(R.id.tv_artist) private TextView tvArtist; @Bind(R.id.vp_play_page) private ViewPager vpPlay; @Bind(R.id.il_indicator) private IndicatorLayout ilIndicator; @Bind(R.id.sb_progress) private SeekBar sbProgress; @Bind(R.id.tv_current_time) private TextView tvCurrentTime; @Bind(R.id.tv_total_time) private TextView tvTotalTime; @Bind(R.id.iv_mode) private ImageView ivMode; @Bind(R.id.iv_play) private ImageView ivPlay; @Bind(R.id.iv_next) private ImageView ivNext; @Bind(R.id.iv_prev) private ImageView ivPrev; private AlbumCoverView mAlbumCoverView; private LrcView mLrcViewSingle; private LrcView mLrcViewFull; private SeekBar sbVolume; private AudioManager mAudioManager; private List<View> mViewPagerContent; private int mLastProgress; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_play, container, false); } @Override protected void init() { initSystemBar(); initViewPager(); ilIndicator.create(mViewPagerContent.size()); initPlayMode(); onChange(getPlayService().getPlayingMusic()); } @Override public void onResume() { super.onResume(); IntentFilter filter = new IntentFilter(Actions.VOLUME_CHANGED_ACTION); getContext().registerReceiver(mVolumeReceiver, filter); } @Override protected void setListener() { ivBack.setOnClickListener(this); ivMode.setOnClickListener(this); ivPlay.setOnClickListener(this); ivPrev.setOnClickListener(this); ivNext.setOnClickListener(this); sbProgress.setOnSeekBarChangeListener(this); sbVolume.setOnSeekBarChangeListener(this); vpPlay.setOnPageChangeListener(this); } /** * 沉浸式状态栏 */ private void initSystemBar() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { int top = ScreenUtils.getSystemBarHeight(); llContent.setPadding(0, top, 0, 0); } } private void initViewPager() { View coverView = LayoutInflater.from(getContext()).inflate(R.layout.fragment_play_page_cover, null); View lrcView = LayoutInflater.from(getContext()).inflate(R.layout.fragment_play_page_lrc, null); mAlbumCoverView = (AlbumCoverView) coverView.findViewById(R.id.album_cover_view); mLrcViewSingle = (LrcView) coverView.findViewById(R.id.lrc_view_single); mLrcViewFull = (LrcView) lrcView.findViewById(R.id.lrc_view_full); sbVolume = (SeekBar) lrcView.findViewById(R.id.sb_volume); mAlbumCoverView.initNeedle(getPlayService().isPlaying()); initVolume(); mViewPagerContent = new ArrayList<>(2); mViewPagerContent.add(coverView); mViewPagerContent.add(lrcView); vpPlay.setAdapter(new PlayPagerAdapter(mViewPagerContent)); } private void initVolume() { mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); sbVolume.setMax(mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)); sbVolume.setProgress(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)); } private void initPlayMode() { int mode = Preferences.getPlayMode(); ivMode.setImageLevel(mode); } /** * 更新播放进度 */ public void onPublish(int progress) { if (isAdded()) { sbProgress.setProgress(progress); if (mLrcViewSingle.hasLrc()) { mLrcViewSingle.updateTime(progress); mLrcViewFull.updateTime(progress); } //更新当前播放时间 if (progress - mLastProgress >= 1000) { tvCurrentTime.setText(formatTime(progress)); mLastProgress = progress; } } } public void onChange(Music music) { if (isAdded()) { onPlay(music); } } public void onPlayerPause() { if (isAdded()) { ivPlay.setSelected(false); mAlbumCoverView.pause(); } } public void onPlayerResume() { if (isAdded()) { ivPlay.setSelected(true); mAlbumCoverView.start(); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.iv_back: onBackPressed(); break; case R.id.iv_mode: switchPlayMode(); break; case R.id.iv_play: play(); break; case R.id.iv_next: next(); break; case R.id.iv_prev: prev(); break; } } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { ilIndicator.setCurrent(position); } @Override public void onPageScrollStateChanged(int state) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { if (seekBar == sbProgress) { if (getPlayService().isPlaying() || getPlayService().isPausing()) { int progress = seekBar.getProgress(); getPlayService().seekTo(progress); mLrcViewSingle.onDrag(progress); mLrcViewFull.onDrag(progress); tvCurrentTime.setText(formatTime(progress)); mLastProgress = progress; } else { seekBar.setProgress(0); } } else if (seekBar == sbVolume) { mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, seekBar.getProgress(), AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); } } private void onPlay(Music music) { if (music == null) { return; } tvTitle.setText(music.getTitle()); tvArtist.setText(music.getArtist()); sbProgress.setMax((int) music.getDuration()); sbProgress.setProgress(0); mLastProgress = 0; tvCurrentTime.setText(R.string.play_time_start); tvTotalTime.setText(formatTime(music.getDuration())); setCoverAndBg(music); setLrc(music); if (getPlayService().isPlaying() || getPlayService().isPreparing()) { ivPlay.setSelected(true); mAlbumCoverView.start(); } else { ivPlay.setSelected(false); mAlbumCoverView.pause(); } } private void play() { getPlayService().playPause(); } private void next() { getPlayService().next(); } private void prev() { getPlayService().prev(); } private void switchPlayMode() { PlayModeEnum mode = PlayModeEnum.valueOf(Preferences.getPlayMode()); switch (mode) { case LOOP: mode = PlayModeEnum.SHUFFLE; ToastUtils.show(R.string.mode_shuffle); break; case SHUFFLE: mode = PlayModeEnum.SINGLE; ToastUtils.show(R.string.mode_one); break; case SINGLE: mode = PlayModeEnum.LOOP; ToastUtils.show(R.string.mode_loop); break; } Preferences.savePlayMode(mode.value()); initPlayMode(); } private void onBackPressed() { getActivity().onBackPressed(); ivBack.setEnabled(false); mHandler.postDelayed(new Runnable() { @Override public void run() { ivBack.setEnabled(true); } }, 300); } private void setCoverAndBg(Music music) { mAlbumCoverView.setCoverBitmap(CoverLoader.getInstance().loadRound(music)); ivPlayingBg.setImageBitmap(CoverLoader.getInstance().loadBlur(music)); } private void setLrc(final Music music) { if (music.getType() == Music.Type.LOCAL) { String lrcPath = FileUtils.getLrcFilePath(music); if (!TextUtils.isEmpty(lrcPath)) { loadLrc(lrcPath); } else { new SearchLrc(music.getArtist(), music.getTitle()) { @Override public void onPrepare() { // 设置tag防止歌词下载完成后已切换歌曲 vpPlay.setTag(music); loadLrc(""); setLrcLabel("正在搜索歌词"); } @Override public void onExecuteSuccess(@NonNull String lrcPath) { if (vpPlay.getTag() != music) { return; } // 清除tag vpPlay.setTag(null); loadLrc(lrcPath); setLrcLabel("暂无歌词"); } @Override public void onExecuteFail(Exception e) { if (vpPlay.getTag() != music) { return; } // 清除tag vpPlay.setTag(null); setLrcLabel("暂无歌词"); } }.execute(); } } else { String lrcPath = FileUtils.getLrcDir() + FileUtils.getLrcFileName(music.getArtist(), music.getTitle()); loadLrc(lrcPath); } } private void loadLrc(String path) { File file = new File(path); mLrcViewSingle.loadLrc(file); mLrcViewFull.loadLrc(file); } private void setLrcLabel(String label) { mLrcViewSingle.setLabel(label); mLrcViewFull.setLabel(label); } private String formatTime(long time) { return SystemUtils.formatTime("mm:ss", time); } private BroadcastReceiver mVolumeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { sbVolume.setProgress(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)); } }; @Override public void onDestroy() { getContext().unregisterReceiver(mVolumeReceiver); super.onDestroy(); } }