package com.dingmouren.dingdingmusic.ui.musicplay;
import android.animation.Animator;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.support.design.widget.Snackbar;
import android.support.percent.PercentRelativeLayout;
import android.support.v4.view.ViewPager;
import android.transition.Slide;
import android.transition.Transition;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewAnimationUtils;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.dingmouren.dingdingmusic.Constant;
import com.dingmouren.dingdingmusic.MyApplication;
import com.dingmouren.dingdingmusic.R;
import com.dingmouren.dingdingmusic.base.BaseActivity;
import com.dingmouren.dingdingmusic.bean.MusicBean;
import com.dingmouren.dingdingmusic.listener.MyOnPageChangeListeger;
import com.dingmouren.dingdingmusic.listener.MyOnSeekBarChangeListeger;
import com.dingmouren.dingdingmusic.service.MediaPlayerService;
import com.dingmouren.dingdingmusic.utils.SPUtil;
import com.dingmouren.greendao.MusicBeanDao;
import com.jiongbull.jlog.JLog;
import java.io.Serializable;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import butterknife.BindView;
import butterknife.OnClick;
import jp.wasabeef.glide.transformations.BlurTransformation;
/**
* Created by dingmouren on 2017/1/17.
*/
public class PlayingActivity extends BaseActivity {
private static final String TAG = PlayingActivity.class.getName();
@BindView(R.id.seek_bar) public SeekBar mSeekBar;
// @BindView(R.id.tv_song_name)TextView mTvSongName;
// @BindView(R.id.tv_singer)TextView mTvSinger;
@BindView(R.id.album_viewpager)ViewPager mAlbumViewPager;
@BindView(R.id.btn_playorpause)ImageButton mBtnPlay;
@BindView(R.id.btn_single)ImageButton mPlayMode;
@BindView(R.id.img_bg) public ImageView mImgBg;
@BindView(R.id.contanier_play_activity)PercentRelativeLayout mRootLayout;
@BindView(R.id.btn_like)ImageButton mBtnLike;
@BindView(R.id.btn_share)ImageButton mBtnShare;
@BindView(R.id.tv_category)TextView mTvCategory;
@BindView(R.id.line_playing)View mLine;
public Messenger mServiceMessenger;//来自服务端的Messenger
public float mPercent;//进度的百分比
public AlbumFragmentAdapater mAlbumFragmentAdapater;//专辑图片的适配器
public int mPosition;//传递过来的的歌曲的位置
public int mPositionPlaying;//正在播放的歌曲的位置
public String flag;//歌曲集合的类型
public int currentTime;//实时当前进度
public int duration;//歌曲的总进度
public float mPositionOffset;//viewpager滑动的百分比
public int mState;//viewpager的滑动状态
public List<MusicBean> mList = new ArrayList<>();
public int enterX;//传递过来的x坐标,是点击View的中心点的x坐标,揭露动画
public int enterY;//传递过来的y坐标,是点击View的中心点的y坐标,揭露动画
public String shareSongName;
public String shareSingerName;
public String shareUrl;
public String shareContent;
public String songNamePlaying;
public String singerNamePlaying;
public MusicBean beanToCollected;//要被收藏的bean
public MyOnPageChangeListeger myOnPageChangeListeger;//页面切换监听
public MyRunnable myRunnable;
private MyOnSeekBarChangeListeger myOnSeekBarChangeListeger;//seekbar的监听
private Messenger mPlaygingClientMessenger;
private MyHandler myHandler;
@Override
public int setLayoutResourceID() {
return R.layout.activity_musicplayer;
}
@Override
public void init(Bundle savedInstanceState) {
setTransiton();
bindService(new Intent(getApplicationContext(), MediaPlayerService.class), mServiceConnection, BIND_AUTO_CREATE);
myOnPageChangeListeger = new MyOnPageChangeListeger(this);
myRunnable = new MyRunnable(this);
myOnSeekBarChangeListeger = new MyOnSeekBarChangeListeger(this);
myHandler = new MyHandler(this);
mPlaygingClientMessenger = new Messenger(myHandler);
}
@Override
public void initView() {
updatePlayMode();
mSeekBar.setMax(100);
mAlbumFragmentAdapater = new AlbumFragmentAdapater(getSupportFragmentManager());
mAlbumViewPager.setAdapter(mAlbumFragmentAdapater);
mAlbumViewPager.setOffscreenPageLimit(6);
//揭露动画
mRootLayout.post(myRunnable);
//左上角显示类别
showCategory();
}
@Override
public void initListener() {
//进度条的监听
mSeekBar.setOnSeekBarChangeListener(myOnSeekBarChangeListeger);
//滑动播放上/下一首歌曲的监听,实际上传递过去的是歌曲的position
mAlbumViewPager.addOnPageChangeListener(myOnPageChangeListeger);
//分享功能
mBtnShare.setOnClickListener((view -> share()));
mBtnLike.setOnClickListener((view -> collect()));
}
/**
* 显示是否收藏歌曲
*/
public void showIsLike() {
JLog.e(TAG,"showLike:" + songNamePlaying +"--"+ singerNamePlaying);
if (null == songNamePlaying || null == singerNamePlaying || null == mList) return;
List<MusicBean> list = MyApplication.getDaoSession().getMusicBeanDao().queryBuilder()
.where(MusicBeanDao.Properties.Singername.eq(singerNamePlaying),
MusicBeanDao.Properties.Songname.eq(songNamePlaying)).list();
if (null != list && 0 <list.size()){
boolean isCollected = list.get(0).getIsCollected();
if (isCollected){
Glide.with(MyApplication.mContext).load(R.mipmap.collected).crossFade().into(mBtnLike);
}else {
Glide.with(MyApplication.mContext).load(R.mipmap.no_collected).crossFade().into(mBtnLike);
}
}
}
/**
* 收藏歌曲
*/
private void collect() {
if (null == mList) return;
JLog.e(TAG,"collected:"+songNamePlaying+"--"+ singerNamePlaying);
MusicBean newBean = null;
boolean isCollected = false;
List<MusicBean> listCollected = MyApplication.getDaoSession().getMusicBeanDao().queryBuilder()
.where(MusicBeanDao.Properties.Singername.eq(singerNamePlaying),
MusicBeanDao.Properties.Songname.eq(songNamePlaying)).list();
if (null != listCollected && 0 < listCollected.size()) {
beanToCollected = listCollected.get(0);
isCollected = beanToCollected.getIsCollected();
}else {
newBean = new MusicBean();
newBean.setSongname(mList.get(mPositionPlaying).getSongname());
newBean.setSingername(mList.get(mPositionPlaying).getSingername());
newBean.setAlbumpic_small(mList.get(mPositionPlaying).getAlbumpic_small());
newBean.setAlbumpic_big(mList.get(mPositionPlaying).getAlbumpic_big());
newBean.setSeconds(mList.get(mPositionPlaying).getSeconds());
newBean.setUrl(mList.get(mPositionPlaying).getUrl());
newBean.setIsCollected(mList.get(mPositionPlaying).getIsCollected());
}
if (!isCollected){
JLog.e(TAG,"收藏歌曲");
Glide.with(MyApplication.mContext).load(R.mipmap.collected).crossFade().into(mBtnLike);
if (null != beanToCollected) {
beanToCollected.setIsCollected(true);
MyApplication.getDaoSession().getMusicBeanDao().update(beanToCollected);
}
if (null != newBean){
newBean.setIsCollected(true);
MyApplication.getDaoSession().getMusicBeanDao().insertOrReplace(newBean);
}
Snackbar.make(mRootLayout,"收藏成功",Snackbar.LENGTH_SHORT).show();
}else {
JLog.e(TAG,"取消收藏");
Glide.with(MyApplication.mContext).load(R.mipmap.no_collected).crossFade().into(mBtnLike);
if (null != beanToCollected) {
beanToCollected.setIsCollected(false);
MyApplication.getDaoSession().getMusicBeanDao().update(beanToCollected);
}
Snackbar.make(mRootLayout,"取消收藏",Snackbar.LENGTH_SHORT).show();
}
}
/**
* 分享功能
*/
private void share() {
if (null != mList) {
shareSongName = mList.get(mPositionPlaying).getSongname();
shareSingerName = mList.get(mPositionPlaying).getSingername();
shareUrl = mList.get(mPositionPlaying).getUrl();
shareContent = shareSongName + "--" + shareSingerName + "\n" + shareUrl;
}
if ("".equals(shareContent)) {
Snackbar.make(mRootLayout, "分享失败", Snackbar.LENGTH_SHORT).show();
} else {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, shareContent);
intent.setType("text/plain");
startActivity(Intent.createChooser(intent, "分享到"));
}
}
@Override
public void initData() {
}
@OnClick({R.id.btn_playorpause, R.id.btn_single})
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_playorpause://播放or暂停
if (null != mServiceMessenger) {
Message msgToServicePlay = Message.obtain();
msgToServicePlay.arg1 = 0x40001;//表示这个暂停是由点击按钮造成的,
msgToServicePlay.what = Constant.PLAYING_ACTIVITY_PLAY;
try {
mServiceMessenger.send(msgToServicePlay);
} catch (RemoteException e) {
e.printStackTrace();
}
}
break;
case R.id.btn_single://顺序播放还是单曲循环
Message msgToServceSingle = Message.obtain();
msgToServceSingle.what = Constant.PLAYING_ACTIVITY_SINGLE;
try {
mServiceMessenger.send(msgToServceSingle);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
}
ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
Log.e(TAG, "onServiceConnected");
mServiceMessenger = new Messenger(iBinder);
//用于在服务端初始化来自客户端的Messenger对象,连接成功的时候,就进行初始化
if (null != mServiceMessenger) {
Message msgToService = Message.obtain();
msgToService.replyTo = mPlaygingClientMessenger;
msgToService.what = Constant.PLAYING_ACTIVITY;
if (0 != currentTime) {//当前进度不是0,就更新MediaPlayerService的当前进度
msgToService.arg1 = currentTime;
}
try {
mServiceMessenger.send(msgToService);
} catch (RemoteException e) {
e.printStackTrace();
}
}
//连接成功的时候,
mPosition = getIntent().getIntExtra("position", 0);
flag = getIntent().getStringExtra("flag");
JLog.e(TAG, "传递过来的positon:" + mPosition + " flag:" + flag);
if (null != mServiceMessenger && null != flag) {
Message msgToService = Message.obtain();
msgToService.arg1 = mPosition;
mList.clear();
if (flag.equals(Constant.MUSIC_LOCAL)) {
mList.addAll(MyApplication.getDaoSession().getMusicBeanDao().queryBuilder().where(MusicBeanDao.Properties.Type.eq(Constant.MUSIC_LOCAL)).list());
SPUtil.put(PlayingActivity.this, Constant.CATEGOTY, 1);
mTvCategory.setText("本地音乐");
mLine.setVisibility(View.VISIBLE);
} else if (flag.equals(Constant.MAIN_RANDOM)) {
mList.addAll(MyApplication.getDaoSession().getMusicBeanDao().loadAll());
SPUtil.put(PlayingActivity.this, Constant.CATEGOTY, 2);
mTvCategory.setText("随心听");
mLine.setVisibility(View.VISIBLE);
Collections.shuffle(mList);
} else if (flag.equals(Constant.MUSIC_KOREA)) {
mList.addAll(MyApplication.getDaoSession().getMusicBeanDao().queryBuilder().where(MusicBeanDao.Properties.Type.eq(Constant.MUSIC_KOREA)).list());
SPUtil.put(PlayingActivity.this, Constant.CATEGOTY, 3);
mTvCategory.setText("韩国");
mLine.setVisibility(View.VISIBLE);
} else if (flag.equals(Constant.MUSIC_ROCK)) {
mList.addAll(MyApplication.getDaoSession().getMusicBeanDao().queryBuilder().where(MusicBeanDao.Properties.Type.eq(Constant.MUSIC_ROCK)).list());
SPUtil.put(PlayingActivity.this, Constant.CATEGOTY, 4);
mTvCategory.setText("摇滚");
mLine.setVisibility(View.VISIBLE);
} else if (flag.equals(Constant.MUSIC_VOLKSLIED)) {
mList.addAll(MyApplication.getDaoSession().getMusicBeanDao().queryBuilder().where(MusicBeanDao.Properties.Type.eq(Constant.MUSIC_VOLKSLIED)).list());
SPUtil.put(PlayingActivity.this, Constant.CATEGOTY, 5);
mTvCategory.setText("民谣");
mLine.setVisibility(View.VISIBLE);
} else if (flag.equals(Constant.MUSIC_SEARCH)) {
mList.addAll((List<MusicBean>) getIntent().getSerializableExtra(Constant.SEARCH_ACTIVITY_DATA_KEY));
SPUtil.put(PlayingActivity.this, Constant.CATEGOTY, 6);
mLine.setVisibility(View.INVISIBLE);
mTvCategory.setText("");
}else if (flag.equals(Constant.MUSIC_Like)){
mList.addAll(MyApplication.getDaoSession().getMusicBeanDao().queryBuilder().where(MusicBeanDao.Properties.IsCollected.eq(true)).list());
SPUtil.put(PlayingActivity.this, Constant.MUSIC_Like, 7);
mLine.setVisibility(View.VISIBLE);
mTvCategory.setText("My Love");
}
if (null != mList) {
/* for (int i = 0; i < list.size(); i++) {
JLog.e(TAG, list.get(i).getSongname() + "--" + list.get(i).getUrl());
}*/
//更新专辑图片
mAlbumFragmentAdapater.addList(mList);
mAlbumFragmentAdapater.notifyDataSetChanged();
//显示是否收藏了这首歌曲
showIsLike();
//传递歌曲集合数据
Bundle songsData = new Bundle();
songsData.putSerializable(Constant.PLAYING_ACTIVITY_DATA_KEY, (Serializable) mList);
msgToService.setData(songsData);
msgToService.what = Constant.PLAYING_ACTIVITY_INIT;
try {
mServiceMessenger.send(msgToService);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
JLog.e(TAG, "onServiceDisconnected");
}
};
/**
* 修改播放模式的UI
*/
private void updatePlayMode() {
int playMode = (int) SPUtil.get(MyApplication.mContext, Constant.SP_PLAY_MODE, 0);
if (0 == playMode) {
mPlayMode.setImageResource(R.mipmap.order_mode);
} else if (1 == playMode) {
mPlayMode.setImageResource(R.mipmap.single_mode);
}
}
private void setTransiton() {
Slide slide = new Slide(Gravity.BOTTOM);
slide.setDuration(700);
getWindow().setEnterTransition(slide);
Slide slide1 = new Slide();
slide1.setDuration(700);
slide1.setSlideEdge(Gravity.TOP);
getWindow().setReturnTransition(slide1);
}
private void showCategory() {
int category = (int) SPUtil.get(PlayingActivity.this, Constant.CATEGOTY, 0);
switch (category) {
case 1:
mTvCategory.setText("本地音乐");
break;
case 2:
mTvCategory.setText("随心听");
break;
case 3:
mTvCategory.setText("韩国");
break;
case 4:
mTvCategory.setText("摇滚");
break;
case 5:
mTvCategory.setText("民谣");
break;
case 6:
mLine.setVisibility(View.INVISIBLE);
mTvCategory.setText("");
break;
case 7:
mLine.setVisibility(View.VISIBLE);
mTvCategory.setText("My Love");
break;
}
}
/**
* 揭露动画
*/
private Animator createRevealAnimator(boolean reversed, int x, int y) {
float hypot = (float) Math.hypot(mRootLayout.getHeight(), mRootLayout.getWidth());
float startRadius = reversed ? hypot : 0;
float endRadius = reversed ? 0 : hypot;
Animator animator = ViewAnimationUtils.createCircularReveal(mRootLayout, x, y, startRadius, endRadius);
animator.setDuration(800);
animator.setInterpolator(new AccelerateDecelerateInterpolator());
if (reversed) {
animator.addListener(animatorListener);
}
return animator;
}
private Animator.AnimatorListener animatorListener = new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
mRootLayout.setVisibility(View.INVISIBLE);
finish();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
};
@Override
public void onBackPressed() {
if (enterX != 0 && enterY != 0) {
Animator animator = createRevealAnimator(true, enterX, enterY);
animator.start();
} else {
super.onBackPressed();
}
}
@Override
protected void onDestroy() {
JLog.e(TAG, "onDestroy");
unbindService(mServiceConnection);
if (null != mAlbumViewPager && null != myOnPageChangeListeger) {
JLog.e(TAG, "清空ViewPager所有的子View");
mAlbumViewPager.removeAllViews();
mAlbumViewPager.removeOnPageChangeListener(myOnPageChangeListeger);
}
if (null != mRootLayout) {
mRootLayout.removeCallbacks(myRunnable);
mRootLayout.removeAllViews();
}
if (null != myHandler){
myHandler.removeCallbacksAndMessages(null);//移除消息队列中所有的消息和所有的Runnable
myHandler = null;
}
if (null != myRunnable){
myRunnable = null;
}
System.gc();
super.onDestroy();
// MyApplication.getRefWatcher().watch(this);
}
static class MyRunnable implements Runnable{
private WeakReference<PlayingActivity> weakActivity;
public MyRunnable(PlayingActivity activity) {
weakActivity = new WeakReference<PlayingActivity>(activity);
}
@Override
public void run() {
PlayingActivity activity = weakActivity.get();
if (null != activity) {
activity.enterX = activity.getIntent().getIntExtra("x", 0);
activity.enterY = activity.getIntent().getIntExtra("y", 0);
if (0 != activity.enterX && 0 != activity.enterY) {
Animator animator = activity.createRevealAnimator(false, activity.enterX, activity.enterY);
animator.start();
}
}
}
}
static class MyHandler extends Handler{
private WeakReference<PlayingActivity> weakActivity;
public MyHandler(PlayingActivity activity) {
weakActivity = new WeakReference<PlayingActivity>(activity);
}
@Override
public void handleMessage(Message msgFromService) {
PlayingActivity activity = weakActivity.get();
if (null == activity) return;
switch (msgFromService.what) {
case Constant.MEDIA_PLAYER_SERVICE_PROGRESS://更新进度条
activity.currentTime = msgFromService.arg1;
activity.duration = msgFromService.arg2;
if (0 == activity.duration) break;
activity.mSeekBar.setProgress(activity.currentTime * 100 / activity.duration);
break;
case Constant.MEDIA_PLAYER_SERVICE_SONG_PLAYING:
Bundle bundle = msgFromService.getData();
activity.mList.clear();
activity.mList.addAll((List<MusicBean>) bundle.getSerializable(Constant.MEDIA_PLAYER_SERVICE_MODEL_PLAYING));
if (null != activity.mList && 0 < activity.mList.size()) {
// activity.mTvSongName.setText(activity.mList.get(msgFromService.arg1).getSongname());
// activity.mTvSinger.setText(activity.mList.get(msgFromService.arg1).getSingername());
//更新专辑图片
activity.mAlbumFragmentAdapater.addList(activity.mList);
activity.mAlbumFragmentAdapater.notifyDataSetChanged();
activity.mAlbumViewPager.setCurrentItem(msgFromService.arg1, false);
}
break;
case Constant.MEDIA_PLAYER_SERVICE_IS_PLAYING:
if (1 == msgFromService.arg1) {//正在播放
activity.mBtnPlay.setImageResource(R.mipmap.play);
} else {
activity.mBtnPlay.setImageResource(R.mipmap.pause);
}
break;
case Constant.PLAYING_ACTIVITY_PLAY_MODE://显示播放器的播放模式
activity.updatePlayMode();
break;
case Constant.MEDIA_PLAYER_SERVICE_UPDATE_SONG://播放完成自动播放下一首时,更新正在播放UI
int positionPlaying = msgFromService.arg1;
activity.mAlbumViewPager.setCurrentItem(positionPlaying, false);
JLog.e(TAG, "更新正在播放的UI");
}
super.handleMessage(msgFromService);
}
}
}