diff --git a/app/src/main/assets/litepal.xml b/app/src/main/assets/litepal.xml index d5df70e..0a86e7f 100644 --- a/app/src/main/assets/litepal.xml +++ b/app/src/main/assets/litepal.xml @@ -2,11 +2,12 @@ - + + \ No newline at end of file diff --git a/app/src/main/java/com/example/musicplayer/adapter/LoveSongAdapter.java b/app/src/main/java/com/example/musicplayer/adapter/LoveSongAdapter.java new file mode 100644 index 0000000..ae77e5c --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/adapter/LoveSongAdapter.java @@ -0,0 +1,137 @@ +package com.example.musicplayer.adapter; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.example.musicplayer.R; +import com.example.musicplayer.entiy.Love; +import com.example.musicplayer.util.FileHelper; + +import java.util.List; + +/** + * Created by 残渊 on 2018/11/30. + */ + +public class LoveSongAdapter extends RecyclerView.Adapter { + private static final String TAG = "LoveSongAdapter"; + private int footerViewType = 1; + private int itemViewType = 0; + private List mLoveList; + private Context mContext; + private int mLastPosition = -1; + private OnItemClickListener onItemClickListener; + + public void setOnItemClickListener(OnItemClickListener onItemClickListener) { + this.onItemClickListener = onItemClickListener; + } + + public LoveSongAdapter(Context context, List loveList) { + mContext = context; + mLoveList = loveList; + } + + + class ViewHolder extends RecyclerView.ViewHolder { + TextView songNameTv; + TextView singerTv; + View mItemView; + View playLine; + + public ViewHolder(View itemView) { + super(itemView); + songNameTv = itemView.findViewById(R.id.tv_title); + singerTv = itemView.findViewById(R.id.tv_artist); + playLine = itemView.findViewById(R.id.line_play); + mItemView = itemView; + } + } + + /** + * 底部holder + */ + static class FooterHolder extends RecyclerView.ViewHolder { + + TextView numTv; + + public FooterHolder(View itemView) { + super(itemView); + numTv = itemView.findViewById(R.id.tv_song_num); + } + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + if (viewType == itemViewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.recycler_song_search_item, parent, false); + ViewHolder viewHolder = new ViewHolder(view); + return viewHolder; + } else { + View footerView = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.footer_local_songs_item, parent, false); + FooterHolder footerHolder = new FooterHolder(footerView); + return footerHolder; + } + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) { + if (viewHolder instanceof ViewHolder) { + ViewHolder holder = (ViewHolder) viewHolder; + final Love love = mLoveList.get(position); + + holder.songNameTv.setText(love.getName()); + holder.singerTv.setText(love.getSinger()); + //根据点击显示 + if(love.getSongId().equals(FileHelper.getSong().getOnlineId())){ + holder.playLine.setVisibility(View.VISIBLE); + mLastPosition =position; + holder.mItemView.setBackgroundResource(R.color.click); + }else { + holder.playLine.setVisibility(View.INVISIBLE); + holder.mItemView.setBackgroundResource(R.color.transparent); + } + holder.mItemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + onItemClickListener.onSongClick(position); + equalPosition(position); + } + }); + } else { + FooterHolder footerHolder = (FooterHolder) viewHolder; + footerHolder.numTv.setText("共" + mLoveList.size() + "首音乐"); + } + } + + //判断点击的是否为上一个点击的项目 + public void equalPosition(int position) { + if (position != mLastPosition) { + notifyItemChanged(mLastPosition); + mLastPosition = position; + } + notifyItemChanged(position); + } + + @Override + public int getItemCount() { + return mLoveList.size() + 1; + } + + @Override + public int getItemViewType(int position) { + return position + 1 == getItemCount() ? footerViewType : itemViewType; + } + + + public interface OnItemClickListener { + void onSongClick(int position); + } + +} diff --git a/app/src/main/java/com/example/musicplayer/adapter/SongAdapter.java b/app/src/main/java/com/example/musicplayer/adapter/SongAdapter.java index 12343fa..069d475 100644 --- a/app/src/main/java/com/example/musicplayer/adapter/SongAdapter.java +++ b/app/src/main/java/com/example/musicplayer/adapter/SongAdapter.java @@ -9,6 +9,7 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import com.example.musicplayer.constant.Constant; import com.example.musicplayer.constant.MyApplication; import com.example.musicplayer.entiy.Song; import com.example.musicplayer.R; @@ -73,10 +74,6 @@ public class SongAdapter extends RecyclerView.Adapter { if (viewType == itemViewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.recycler_song_item, parent, false); -// TypedValue typedValue = new TypedValue(); -// mContext.getTheme().resolveAttribute(R.attr.selectableItemBackground, typedValue, true); -// view.setBackgroundResource(typedValue.resourceId); - ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } else { @@ -123,6 +120,8 @@ public class SongAdapter extends RecyclerView.Adapter { song.setDuration(mp3Info.getDuration()); song.setCurrent(position); song.setOnline(false); + song.setOnlineId(mp3Info.getSongId()); + song.setListType(Constant.LIST_TYPE_LOCAL); FileHelper.saveSong(song); onItemClickListener.onSongClick(); @@ -131,7 +130,8 @@ public class SongAdapter extends RecyclerView.Adapter { }); } else { FooterHolder footerHolder = (FooterHolder) viewHolder; - footerHolder.numTv.setText("共" + mMp3InfoList.size() + "首音乐"); + int num=mMp3InfoList.size()-1; + footerHolder.numTv.setText("共" + num + "首音乐"); } } diff --git a/app/src/main/java/com/example/musicplayer/constant/BroadcastName.java b/app/src/main/java/com/example/musicplayer/constant/BroadcastName.java index 16c75d7..c988ced 100644 --- a/app/src/main/java/com/example/musicplayer/constant/BroadcastName.java +++ b/app/src/main/java/com/example/musicplayer/constant/BroadcastName.java @@ -13,5 +13,6 @@ public class BroadcastName { public static final String SONG_RESUME="song_resume"; public static final String ONLINE_SONG_ERROR="online_song_error"; public static final String ONLINE_ALBUM_SONG_Change="online_album_song_change"; + public static final String LOVE_SONG_CHANGE="love_song_change"; } diff --git a/app/src/main/java/com/example/musicplayer/constant/Constant.java b/app/src/main/java/com/example/musicplayer/constant/Constant.java index 34110c0..82462ca 100644 --- a/app/src/main/java/com/example/musicplayer/constant/Constant.java +++ b/app/src/main/java/com/example/musicplayer/constant/Constant.java @@ -11,4 +11,5 @@ public class Constant { public static final int TYPE_ALBUM_SONG=3; public static final int LIST_TYPE_LOCAL=4; public static final int LIST_TYPE_ONLINE=5; + public static final int LIST_TYPE_LOVE=6; } diff --git a/app/src/main/java/com/example/musicplayer/contract/IPlayContract.java b/app/src/main/java/com/example/musicplayer/contract/IPlayContract.java index 25325ad..3a14362 100644 --- a/app/src/main/java/com/example/musicplayer/contract/IPlayContract.java +++ b/app/src/main/java/com/example/musicplayer/contract/IPlayContract.java @@ -1,5 +1,8 @@ package com.example.musicplayer.contract; +import com.example.musicplayer.entiy.Love; +import com.example.musicplayer.entiy.Song; + /** * Created by 残渊 on 2018/10/26. */ @@ -7,17 +10,27 @@ package com.example.musicplayer.contract; public interface IPlayContract { interface Model{ void getSingerImg(String singer);//网络请求获得歌手uri + void queryLove(String songId);//查询我喜欢的数据库中有没这首歌 + void saveToLove(Song song); //添加到我喜欢的表 + void deleteFromLove(String songId); //从我喜欢的表中移除 } interface View{ String getSingerName(); //得到歌手的姓名 void getSingerAndLrc();//按钮点击事件,获取封面和歌词 void setSingerImg(String ImgUrl); //将图片设置成背景 void setImgFail(String errorMessage); - void setSearchImg();//设置搜索歌曲的图片 + void showLove(boolean love); //判断是否显示我喜欢的图标 + void showLoveAnim(); //喜欢的动画 + void saveToLoveSuccess();//保存到我喜欢数据库成功 } interface Presenter{ void getSingerImg(String singer); void getSingerImgSuccess(String ImgUrl); //成功获取图片 void getSingerImgFail(); //请求失败 + void queryLove(String songId);//查询我喜欢的数据库中有没这首歌 + void saveToLove(Song song); //添加到我喜欢的表 + void deleteFromLove(String songId); //从我喜欢的表中移除 + void saveToLoveSuccess();//保存到我喜欢数据库成功 + void showLove(boolean love); //判断是否显示我喜欢的图标 } } diff --git a/app/src/main/java/com/example/musicplayer/entiy/LocalSong.java b/app/src/main/java/com/example/musicplayer/entiy/LocalSong.java index 3dba1df..f83121d 100644 --- a/app/src/main/java/com/example/musicplayer/entiy/LocalSong.java +++ b/app/src/main/java/com/example/musicplayer/entiy/LocalSong.java @@ -9,6 +9,7 @@ import org.litepal.crud.LitePalSupport; public class LocalSong extends LitePalSupport{ private int id; + private String songId; private String name; private String singer; private String url; @@ -63,4 +64,12 @@ public class LocalSong extends LitePalSupport{ public long getDuration() { return duration; } + + public void setSongId(String songId) { + this.songId = songId; + } + + public String getSongId() { + return songId; + } } diff --git a/app/src/main/java/com/example/musicplayer/entiy/Love.java b/app/src/main/java/com/example/musicplayer/entiy/Love.java new file mode 100644 index 0000000..18f045d --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/entiy/Love.java @@ -0,0 +1,75 @@ +package com.example.musicplayer.entiy; + +import org.litepal.crud.LitePalSupport; + +/** + * Created by 残渊 on 2018/11/30. + */ + +public class Love extends LitePalSupport{ + private int id; + private String songId; + private String name; + private String singer; + private String url; + private String pic; + private boolean isOnline; + + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSinger() { + return singer; + } + + public void setSinger(String singer) { + this.singer = singer; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getPic() { + return pic; + } + + public void setPic(String pic) { + this.pic = pic; + } + + + public String getSongId() { + return songId; + } + + public void setSongId(String songId) { + this.songId = songId; + } + + public void setOnline(boolean online) { + isOnline = online; + } + + public boolean isOnline() { + return isOnline; + } +} diff --git a/app/src/main/java/com/example/musicplayer/entiy/Song.java b/app/src/main/java/com/example/musicplayer/entiy/Song.java index 6548de2..7c7d637 100644 --- a/app/src/main/java/com/example/musicplayer/entiy/Song.java +++ b/app/src/main/java/com/example/musicplayer/entiy/Song.java @@ -18,7 +18,7 @@ public class Song implements Serializable { private int current;//在本地音乐的位置 private String imgUrl; private boolean isOnline; - private boolean isOnlineAlbum; + private int listType; public String getImgUrl() { return imgUrl; @@ -84,12 +84,12 @@ public class Song implements Serializable { isOnline = online; } - public boolean isOnlineAlbum() { - return isOnlineAlbum; + public int getListType() { + return listType; } - public void setOnlineAlbum(boolean onlineAlbum) { - isOnlineAlbum = onlineAlbum; + public void setListType(int listType) { + this.listType = listType; } public String getOnlineId() { @@ -103,7 +103,7 @@ public class Song implements Serializable { public String toString(){ return "songName="+songName+",singer="+singer+",url="+url+",imgUrl="+imgUrl +",duration="+duration+",currentTime="+currentTime+",current="+current - +",onlineId="+onlineId+",isOnline="+isOnline+",isOnlineAlbum="+isOnlineAlbum; + +",onlineId="+onlineId+",isOnline="+isOnline+",listType="+listType; } } diff --git a/app/src/main/java/com/example/musicplayer/model/IPlayModel.java b/app/src/main/java/com/example/musicplayer/model/IPlayModel.java index 221e3ce..b12d765 100644 --- a/app/src/main/java/com/example/musicplayer/model/IPlayModel.java +++ b/app/src/main/java/com/example/musicplayer/model/IPlayModel.java @@ -4,10 +4,17 @@ import android.support.annotation.MainThread; import android.util.Log; import com.example.musicplayer.contract.IPlayContract; +import com.example.musicplayer.entiy.Love; import com.example.musicplayer.entiy.SingerImg; +import com.example.musicplayer.entiy.Song; import com.example.musicplayer.https.NetWork; +import org.litepal.LitePal; +import org.litepal.crud.callback.FindMultiCallback; +import org.litepal.crud.callback.SaveCallback; + import java.io.IOException; +import java.util.List; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -63,4 +70,57 @@ public class IPlayModel implements IPlayContract.Model { } }); } + + @Override + public void queryLove(final String songId) { + new Thread(new Runnable() { + @Override + public void run() { + LitePal.where("songId=?",songId).findAsync(Love.class).listen(new FindMultiCallback() { + @Override + public void onFinish(List list) { + if(list.size()==0){ + mPresenter.showLove(false); + }else{ + mPresenter.showLove(true); + } + } + }); + } + }).start(); + } + + @Override + public void saveToLove(final Song song) { + new Thread(new Runnable() { + @Override + public void run() { + Love love =new Love(); + love.setName(song.getSongName()); + love.setSinger(song.getSinger()); + love.setUrl(song.getUrl()); + love.setPic(song.getImgUrl()); + love.setSongId(song.getOnlineId()); + love.setOnline(song.isOnline()); + love.saveAsync().listen(new SaveCallback() { + @Override + public void onFinish(boolean success) { + if(success){ + mPresenter.saveToLoveSuccess(); + } + } + }); + } + }).start(); + } + + @Override + public void deleteFromLove(final String songId) { + new Thread(new Runnable() { + @Override + public void run() { + LitePal.deleteAll("songId=?",songId); + } + }).start(); + } } diff --git a/app/src/main/java/com/example/musicplayer/model/LocalMusicModel.java b/app/src/main/java/com/example/musicplayer/model/LocalMusicModel.java index 5c7758a..77c234c 100644 --- a/app/src/main/java/com/example/musicplayer/model/LocalMusicModel.java +++ b/app/src/main/java/com/example/musicplayer/model/LocalMusicModel.java @@ -2,6 +2,7 @@ package com.example.musicplayer.model; import android.database.Cursor; import android.provider.MediaStore; +import android.util.Log; import com.example.musicplayer.constant.MyApplication; import com.example.musicplayer.contract.ILocalMusicContract; @@ -18,6 +19,7 @@ import java.util.List; */ public class LocalMusicModel implements ILocalMusicContract.Model { + private static final String TAG="LocalMusicModel"; private ILocalMusicContract.Presenter mPresenter; @@ -65,6 +67,8 @@ public class LocalMusicModel implements ILocalMusicContract.Model { mp3Info.setSinger(artist); mp3Info.setDuration(duration); mp3Info.setUrl(url); + mp3Info.setSongId(String.valueOf(id)); + Log.d(TAG, "run: "+mp3Info.getSongId()); mp3InfoList.add(mp3Info); } } @@ -88,6 +92,7 @@ public class LocalMusicModel implements ILocalMusicContract.Model { song.setSinger(localSong.getSinger()); song.setUrl(localSong.getUrl()); song.setDuration(localSong.getDuration()); + song.setSongId(localSong.getSongId()); song.save(); } } diff --git a/app/src/main/java/com/example/musicplayer/presenter/PlayPresenter.java b/app/src/main/java/com/example/musicplayer/presenter/PlayPresenter.java index ca6a13a..ddc1813 100644 --- a/app/src/main/java/com/example/musicplayer/presenter/PlayPresenter.java +++ b/app/src/main/java/com/example/musicplayer/presenter/PlayPresenter.java @@ -2,6 +2,7 @@ package com.example.musicplayer.presenter; import com.example.musicplayer.base.BasePresenter; import com.example.musicplayer.contract.IPlayContract; +import com.example.musicplayer.entiy.Song; import com.example.musicplayer.model.IPlayModel; /** @@ -34,4 +35,33 @@ public class PlayPresenter extends BasePresenter implements getMvpView().setImgFail("获取歌手照片失败"); } } + + @Override + public void queryLove(String songId) { + mModel.queryLove(songId); + } + + @Override + public void saveToLove(Song song) { + mModel.saveToLove(song); + } + + @Override + public void deleteFromLove(String songId) { + mModel.deleteFromLove(songId); + } + + @Override + public void saveToLoveSuccess() { + if(isAttachView()){ + getMvpView().saveToLoveSuccess(); + } + } + + @Override + public void showLove(boolean love) { + if(isAttachView()){ + getMvpView().showLove(love); + } + } } diff --git a/app/src/main/java/com/example/musicplayer/service/PlayerService.java b/app/src/main/java/com/example/musicplayer/service/PlayerService.java index 9d8ddee..c3be26b 100644 --- a/app/src/main/java/com/example/musicplayer/service/PlayerService.java +++ b/app/src/main/java/com/example/musicplayer/service/PlayerService.java @@ -4,6 +4,7 @@ import android.annotation.SuppressLint; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; +import android.net.ConnectivityManager; import android.os.Binder; import android.os.IBinder; import android.util.Log; @@ -11,6 +12,7 @@ import android.util.Log; import com.example.musicplayer.constant.BroadcastName; import com.example.musicplayer.constant.Constant; import com.example.musicplayer.entiy.LocalSong; +import com.example.musicplayer.entiy.Love; import com.example.musicplayer.entiy.OnlineSong; import com.example.musicplayer.entiy.Song; import com.example.musicplayer.util.FileHelper; @@ -28,10 +30,10 @@ public class PlayerService extends Service { private PlayStatusBinder mPlayStatusBinder = new PlayStatusBinder(); private MediaPlayer mediaPlayer = new MediaPlayer(); //媒体播放器对象 private boolean isPause; //暂停状态 - private Song song; private boolean isPlaying; //是否播放 private List mLocalSongList; private List mSongList; + private List mLoveList; private int mCurrent; private int mListType; @@ -60,7 +62,7 @@ public class PlayerService extends Service { } else { mPlayStatusBinder.stop(); } - } else { + } else if(mListType == Constant.LIST_TYPE_ONLINE){ saveOnlineSongInfo(mCurrent); if (mCurrent <= mSongList.size()) { mPlayStatusBinder.play(Constant.LIST_TYPE_ONLINE); @@ -69,8 +71,15 @@ public class PlayerService extends Service { mPlayStatusBinder.stop(); } + } else { + saveLoveInfo(mCurrent,FileHelper.getSong().isOnline()); + if (mCurrent <= mLoveList.size()) { + mPlayStatusBinder.play(Constant.LIST_TYPE_LOVE); + sendBroadcast(new Intent(BroadcastName.LOVE_SONG_CHANGE));//专辑列表的改变 + } else { + mPlayStatusBinder.stop(); + } } - sendBroadcast(new Intent(BroadcastName.SONG_CHANGE)); //发送广播改变播放栏的信息 sendBroadcast(new Intent(BroadcastName.ONLINE_SONG_FINISH));//发送网络歌曲播放结束的广播改变网络搜索列表的改变 } }); @@ -90,15 +99,6 @@ public class PlayerService extends Service { } public class PlayStatusBinder extends Binder { - //确认播放列表的类型 - public void setListType(int listType) { - mListType = listType; - if (mListType == Constant.LIST_TYPE_ONLINE) { - mSongList = LitePal.findAll(OnlineSong.class); - } else if (mListType == Constant.LIST_TYPE_LOCAL) { - mLocalSongList = LitePal.findAll(LocalSong.class); - } - } /** @@ -115,13 +115,17 @@ public class PlayerService extends Service { mSongList = LitePal.findAll(OnlineSong.class); } else if (mListType == Constant.LIST_TYPE_LOCAL) { mLocalSongList = LitePal.findAll(LocalSong.class); + }else if(mListType == Constant.LIST_TYPE_LOVE){ + mLoveList = orderList(LitePal.findAll(Love.class)); } mCurrent = FileHelper.getSong().getCurrent(); mediaPlayer.reset();//把各项参数恢复到初始状态 if (mListType == Constant.LIST_TYPE_LOCAL) { mediaPlayer.setDataSource(mLocalSongList.get(mCurrent).getUrl()); - } else { + } else if(mListType == Constant.LIST_TYPE_ONLINE){ mediaPlayer.setDataSource(mSongList.get(mCurrent).getUrl()); + } else{ + mediaPlayer.setDataSource(mLoveList.get(mCurrent).getUrl()); } mediaPlayer.prepare(); //进行缓冲 isPlaying = true; @@ -185,16 +189,21 @@ public class PlayerService extends Service { saveLocalSongInfo(mCurrent); mPlayStatusBinder.play(Constant.LIST_TYPE_LOCAL); sendBroadcast(new Intent(BroadcastName.LOCAL_SONG_CHANGE_LIST));//发送广播改变当地列表的显示 - } else { + } else if(mListType == Constant.LIST_TYPE_ONLINE){ if (mCurrent >= mSongList.size()) { mCurrent = 0; } saveOnlineSongInfo(mCurrent); mPlayStatusBinder.play(Constant.LIST_TYPE_ONLINE); sendBroadcast(new Intent(BroadcastName.ONLINE_ALBUM_SONG_Change));//专辑列表的改变 + } else{ + if (mCurrent >= mLoveList.size()) { + mCurrent = 0; + } + saveLoveInfo(mCurrent,FileHelper.getSong().isOnline()); + mPlayStatusBinder.play(Constant.LIST_TYPE_LOVE); + sendBroadcast(new Intent(BroadcastName.LOVE_SONG_CHANGE)); } - - sendBroadcast(new Intent(BroadcastName.SONG_CHANGE)); //发送广播改变播放栏的信息 sendBroadcast(new Intent(BroadcastName.ONLINE_SONG_FINISH));//发送网络歌曲播放结束的广播改变网络搜索列表的改变 } @@ -202,18 +211,27 @@ public class PlayerService extends Service { mCurrent = FileHelper.getSong().getCurrent(); mCurrent--; if (mCurrent == -1) { - mCurrent = mListType == Constant.LIST_TYPE_LOCAL ? mLocalSongList.size() - 1 : mSongList.size() - 1; + if(mListType == Constant.LIST_TYPE_LOCAL){ + mCurrent = mLocalSongList.size()-1; + }else if(mListType ==Constant.LIST_TYPE_ONLINE){ + mCurrent =mSongList.size()-1; + }else { + mCurrent = mLoveList.size()-1; + } } if (mListType == Constant.LIST_TYPE_LOCAL) { saveLocalSongInfo(mCurrent); - mPlayStatusBinder.play(Constant.LIST_TYPE_LOCAL); + mPlayStatusBinder.play(mListType); sendBroadcast(new Intent(BroadcastName.LOCAL_SONG_CHANGE_LIST));//发送广播改变当地列表的显示 - } else { + } else if(mListType == Constant.LIST_TYPE_ONLINE){ saveOnlineSongInfo(mCurrent); - mPlayStatusBinder.play(Constant.LIST_TYPE_ONLINE); + mPlayStatusBinder.play(mListType); sendBroadcast(new Intent(BroadcastName.ONLINE_ALBUM_SONG_Change));//专辑列表的改变 + } else{ + saveLoveInfo(mCurrent,FileHelper.getSong().isOnline()); + mPlayStatusBinder.play(mListType); + sendBroadcast(new Intent(BroadcastName.LOVE_SONG_CHANGE)); } - sendBroadcast(new Intent(BroadcastName.SONG_CHANGE)); //发送广播改变播放栏的信息 sendBroadcast(new Intent(BroadcastName.ONLINE_SONG_FINISH));//发送网络歌曲播放结束的广播改变网络搜索列表的改变 } @@ -296,7 +314,7 @@ public class PlayerService extends Service { song.setDuration(localSong.getDuration()); song.setUrl(localSong.getUrl()); song.setOnline(false); - song.setOnlineAlbum(false); + song.setListType(Constant.LIST_TYPE_LOCAL); FileHelper.saveSong(song); } @@ -311,9 +329,30 @@ public class PlayerService extends Service { song.setUrl(mSongList.get(current).getUrl()); song.setImgUrl(mSongList.get(current).getPic()); song.setOnline(true); - song.setOnlineAlbum(true); + song.setListType(Constant.LIST_TYPE_ONLINE); FileHelper.saveSong(song); } + private void saveLoveInfo(int current,boolean isOnline){ + mLoveList = orderList(LitePal.findAll(Love.class)); + Love love = mLoveList.get(current); + Song song = new Song(); + song.setCurrent(current); + song.setOnlineId(love.getSongId()); + song.setSongName(love.getName()); + song.setSinger(love.getSinger()); + song.setUrl(love.getUrl()); + song.setImgUrl(love.getPic()); + song.setListType(Constant.LIST_TYPE_LOVE); + song.setOnline(isOnline); + } + private List orderList(List tempList){ + List loveList=new ArrayList<>(); + loveList.clear(); + for(int i=tempList.size()-1;i>=0;i--){ + loveList.add(tempList.get(i)); + } + return loveList; + } } diff --git a/app/src/main/java/com/example/musicplayer/view/AlbumSongFragment.java b/app/src/main/java/com/example/musicplayer/view/AlbumSongFragment.java index 972c694..a4a57d8 100644 --- a/app/src/main/java/com/example/musicplayer/view/AlbumSongFragment.java +++ b/app/src/main/java/com/example/musicplayer/view/AlbumSongFragment.java @@ -167,7 +167,7 @@ public class AlbumSongFragment extends Fragment implements IAlbumSongContract.Vi song.setImgUrl(dataBean.getPic()); song.setCurrent(position); song.setOnline(true); - song.setOnlineAlbum(true); + song.setListType(Constant.LIST_TYPE_ONLINE); FileHelper.saveSong(song); mPlayStatusBinder.play(Constant.LIST_TYPE_ONLINE); diff --git a/app/src/main/java/com/example/musicplayer/view/CollectionFragment.java b/app/src/main/java/com/example/musicplayer/view/CollectionFragment.java new file mode 100644 index 0000000..58754b2 --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/view/CollectionFragment.java @@ -0,0 +1,145 @@ +package com.example.musicplayer.view; + + +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.os.Bundle; +import android.os.IBinder; +import android.support.v4.app.Fragment; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; + +import com.example.musicplayer.R; +import com.example.musicplayer.adapter.LoveSongAdapter; +import com.example.musicplayer.adapter.SongAdapter; +import com.example.musicplayer.constant.BroadcastName; +import com.example.musicplayer.constant.Constant; +import com.example.musicplayer.entiy.LocalSong; +import com.example.musicplayer.entiy.Love; +import com.example.musicplayer.entiy.Song; +import com.example.musicplayer.service.PlayerService; +import com.example.musicplayer.util.FileHelper; + +import org.litepal.LitePal; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by 残渊 on 2018/11/30. + */ + +public class CollectionFragment extends Fragment { + private RecyclerView mRecycler; + private ImageView mBackIv; + private LinearLayoutManager mManager; + private LoveSongAdapter mAdapter; + private LinearLayout mSongListLinear; + private RelativeLayout mEmptyRelative; + private List mLoveList; + private List mTempList; + + //注册广播 + private IntentFilter intentFilter; + private SongChangeReceiver songChangeReceiver; + + private PlayerService.PlayStatusBinder mPlayStatusBinder; + private ServiceConnection connection = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + mPlayStatusBinder = (PlayerService.PlayStatusBinder) service; + } + + @Override + public void onServiceDisconnected(ComponentName name) { + + } + }; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View mView = inflater.inflate(R.layout.fragment_love_music, container, false); + mRecycler = mView.findViewById(R.id.recycler_love_songs); + mBackIv = mView.findViewById(R.id.iv_back); + mEmptyRelative = mView.findViewById(R.id.relative_empty); + mSongListLinear = mView.findViewById(R.id.linear_song_list); + mTempList =new ArrayList<>(); + mLoveList = new ArrayList<>(); + return mView; + } + @Override + public void onActivityCreated(Bundle savedInstanceState){ + super.onActivityCreated(savedInstanceState); + //启动服务 + Intent playIntent = new Intent(getActivity(), PlayerService.class); + getActivity().bindService(playIntent, connection, Context.BIND_AUTO_CREATE); + //注册广播 + intentFilter=new IntentFilter(); + intentFilter.addAction(BroadcastName.LOVE_SONG_CHANGE); + songChangeReceiver=new SongChangeReceiver(); + getActivity().registerReceiver(songChangeReceiver,intentFilter); + showSongList(); + onClick(); + } + + + private void showSongList(){ + mLoveList.clear(); + mTempList = LitePal.findAll(Love.class); + if(mTempList.size()==0){ + mEmptyRelative.setVisibility(View.VISIBLE); + mSongListLinear.setVisibility(View.GONE); + }else{ + mEmptyRelative.setVisibility(View.GONE); + mSongListLinear.setVisibility(View.VISIBLE); + } + //对数据库的数据倒序显示 + for(int i=mTempList.size()-1;i>=0;i--){ + mLoveList.add(mTempList.get(i)); + } + mAdapter = new LoveSongAdapter(getActivity(),mLoveList); + mManager = new LinearLayoutManager(getActivity()); + mRecycler.setLayoutManager(mManager); + mRecycler.setAdapter(mAdapter); + } + private void onClick(){ + mAdapter.setOnItemClickListener(new LoveSongAdapter.OnItemClickListener() { + @Override + public void onSongClick(int position) { + Love love = mLoveList.get(position); + Song song =new Song(); + song.setOnlineId(love.getSongId()); + song.setSongName(love.getName()); + song.setSinger(love.getSinger()); + song.setOnline(love.isOnline()); + song.setUrl(love.getUrl()); + song.setImgUrl(love.getPic()); + song.setCurrent(position); + song.setListType(Constant.LIST_TYPE_LOVE); + FileHelper.saveSong(song); + + mPlayStatusBinder.play(Constant.LIST_TYPE_LOVE); + } + }); + } + private class SongChangeReceiver extends BroadcastReceiver{ + @Override + public void onReceive(Context context, Intent intent) { + mAdapter.notifyDataSetChanged(); + if(FileHelper.getSong()!=null) { + mManager.scrollToPositionWithOffset(FileHelper.getSong().getCurrent()+4, mRecycler.getHeight()); + } + } + } +} diff --git a/app/src/main/java/com/example/musicplayer/view/LocalMusicFragment.java b/app/src/main/java/com/example/musicplayer/view/LocalMusicFragment.java index 25b3aa7..c6082d7 100644 --- a/app/src/main/java/com/example/musicplayer/view/LocalMusicFragment.java +++ b/app/src/main/java/com/example/musicplayer/view/LocalMusicFragment.java @@ -55,9 +55,6 @@ public class LocalMusicFragment extends Fragment implements ILocalMusicContract. private ImageView mBackIv; private ViewStub mEmptyViewStub; - - - private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { diff --git a/app/src/main/java/com/example/musicplayer/view/MainActivity.java b/app/src/main/java/com/example/musicplayer/view/MainActivity.java index bc9b427..de4748d 100644 --- a/app/src/main/java/com/example/musicplayer/view/MainActivity.java +++ b/app/src/main/java/com/example/musicplayer/view/MainActivity.java @@ -90,6 +90,7 @@ public class MainActivity extends AppCompatActivity { intentFilter.addAction(BroadcastName.ONLINE_ALBUM_SONG_Change); songChangeReceiver = new SongChangeReceiver(); registerReceiver(songChangeReceiver, intentFilter); + LitePal.getDatabase(); initView(); onClick(); @@ -196,10 +197,8 @@ public class MainActivity extends AppCompatActivity { } else { if (FileHelper.getSong().isOnline()) { mPlayStatusBinder.playOnline(); - } else if(FileHelper.getSong().isOnlineAlbum()){ - mPlayStatusBinder.play(Constant.LIST_TYPE_ONLINE); - }else{ - mPlayStatusBinder.play(Constant.LIST_TYPE_LOCAL); + } else{ + mPlayStatusBinder.play(FileHelper.getSong().getListType()); } mMediaPlayer.seekTo((int) mSong.getCurrentTime()); mCircleAnimator.start(); diff --git a/app/src/main/java/com/example/musicplayer/view/MainFragment.java b/app/src/main/java/com/example/musicplayer/view/MainFragment.java index 4ac9ad2..ce1a2a3 100644 --- a/app/src/main/java/com/example/musicplayer/view/MainFragment.java +++ b/app/src/main/java/com/example/musicplayer/view/MainFragment.java @@ -19,9 +19,14 @@ import android.widget.TextView; import com.example.musicplayer.R; import com.example.musicplayer.adapter.ExpandableListViewAdapter; +import com.example.musicplayer.entiy.History; +import com.example.musicplayer.entiy.LocalSong; +import com.example.musicplayer.entiy.Love; import com.example.musicplayer.util.CommonUtil; import com.example.musicplayer.widget.MyListView; +import org.litepal.LitePal; + /** * A simple {@link Fragment} subclass. */ @@ -30,11 +35,10 @@ public class MainFragment extends Fragment { private LinearLayout mFunctionLinear; private MyListView myListView; - private LocalMusicFragment mLocalMusicFragment; - private SearchFragment mSearchFragment; private ExpandableListAdapter mAdapter; - private LinearLayout mLocalMusicLinear; + private LinearLayout mLocalMusicLinear,mCollectionLinear; private Button playerBtn; + private TextView mLocalMusicNum,mLoveMusicNum,mHistoryMusicNum; private TextView mSeekBtn; private String[] mGroupStrings = {"自建歌单", "收藏歌单"}; @@ -49,12 +53,16 @@ public class MainFragment extends Fragment { Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_main, container, false); mLocalMusicLinear = view.findViewById(R.id.linear_local_music); + mCollectionLinear = view.findViewById(R.id.linear_collection); playerBtn = view.findViewById(R.id.btn_player); mFunctionLinear = view.findViewById(R.id.linear_function); //获取焦点 mFunctionLinear.setFocusableInTouchMode(true); myListView = view.findViewById(R.id.expand_lv_song_list); mSeekBtn = view.findViewById(R.id.tv_seek); + mLocalMusicNum = view.findViewById(R.id.tv_local_music_num); + mLoveMusicNum = view.findViewById(R.id.tv_love_num); + mHistoryMusicNum = view.findViewById(R.id.tv_history_num); return view; } @@ -65,13 +73,12 @@ public class MainFragment extends Fragment { mAdapter = new ExpandableListViewAdapter(getActivity(), mGroupStrings, mSongStrings); myListView.setAdapter(mAdapter); onClick(); - - } @Override public void onResume(){ super.onResume(); CommonUtil.hideStatusBar(getActivity(),true); + showMusicNum(); Log.d(TAG, "onResume: true"); } @@ -79,37 +86,41 @@ public class MainFragment extends Fragment { mLocalMusicLinear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - replaceFragment(1); + replaceFragment(new LocalMusicFragment()); } }); mSeekBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - replaceFragment(2); + replaceFragment(new SearchFragment()); + } + }); + + mCollectionLinear.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + replaceFragment(new CollectionFragment()); } }); } - private void replaceFragment(int type) { + private void replaceFragment(Fragment fragment) { FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); - //进入和退出动画 transaction.setCustomAnimations(R.anim.fragment_in, R.anim.fragment_out, R.anim.slide_in_right, R.anim.slide_out_right); - if (type == 1) { - mLocalMusicFragment = new LocalMusicFragment(); - transaction.add(R.id.fragment_container, mLocalMusicFragment); - } else if (type ==2) { - mSearchFragment = new SearchFragment(); - transaction.add(R.id.fragment_container,mSearchFragment); - } + transaction.add(R.id.fragment_container, fragment); transaction.hide(this); //将事务提交到返回栈 transaction.addToBackStack(null); transaction.commit(); } + private void showMusicNum(){ + mLoveMusicNum.setText(""+LitePal.findAll(LocalSong.class).size()); + mLoveMusicNum.setText(""+LitePal.findAll(Love.class).size()); + } } diff --git a/app/src/main/java/com/example/musicplayer/view/PlayActivity.java b/app/src/main/java/com/example/musicplayer/view/PlayActivity.java index c12a323..4126bf7 100644 --- a/app/src/main/java/com/example/musicplayer/view/PlayActivity.java +++ b/app/src/main/java/com/example/musicplayer/view/PlayActivity.java @@ -1,5 +1,7 @@ package com.example.musicplayer.view; +import android.animation.AnimatorInflater; +import android.animation.AnimatorSet; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -66,7 +68,7 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View { private String TAG = "PlayActivity"; private boolean isOnline; //判断是否为网络歌曲 - private boolean isOnlineAlbum;//判断是否为网络专辑 + private int mListType; //列表类型 private int mPlayStatus; private boolean isChange; //拖动进度条 @@ -90,6 +92,9 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View { private TextView mDurationTimeTv; + private Button mLoveBtn; + private boolean isLove;//是否已经在我喜欢的列表中 + private DiscView mDisc; //唱碟 private ImageView mDiscImg; //唱碟中的歌手头像 private Bitmap mImgBmp; @@ -107,7 +112,6 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View { public void onServiceConnected(ComponentName name, IBinder service) { mPlayStatusBinder = (PlayerService.PlayStatusBinder) service; isOnline = FileHelper.getSong().isOnline(); - isOnlineAlbum = FileHelper.getSong().isOnlineAlbum(); if (isOnline) { mGetImgAndLrcBtn.setVisibility(View.GONE); mDurationTimeTv.setText(MediaUtil.formatTime(FileHelper.getSong().getDuration())); @@ -156,6 +160,7 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View { //与Presenter建立关系 mPresenter = new PlayPresenter(); mPresenter.attachView(this); + //是否为网络歌曲 @@ -185,15 +190,19 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View { mDisc = findViewById(R.id.disc_view); mDiscImg = findViewById(R.id.iv_disc_background); + mLoveBtn = findViewById(R.id.btn_love); + + //界面填充 mSong = FileHelper.getSong(); + mListType = mSong.getListType(); mSingerTv.setText(mSong.getSinger()); mSongTv.setText(mSong.getSongName()); mCurrentTimeTv.setText(MediaUtil.formatTime(mSong.getCurrentTime())); mSeekBar.setMax((int) mSong.getDuration()); mSeekBar.setProgress((int) mSong.getCurrentTime()); - + mPresenter.queryLove(mSong.getOnlineId()); //查找歌曲是否为我喜欢的歌曲 if (mPlayStatus == PlayerStatus.PLAY) { mDisc.play(); @@ -205,7 +214,6 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View { Intent playIntent = new Intent(PlayActivity.this, PlayerService.class); bindService(playIntent, connection, Context.BIND_AUTO_CREATE); - } private void try2UpdateMusicPicBackground(final Bitmap bitmap) { @@ -315,10 +323,8 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View { Log.d(TAG, "onClick: --------play"); if (isOnline) { mPlayStatusBinder.playOnline(); - } else if (isOnlineAlbum) { - mPlayStatusBinder.play(Constant.LIST_TYPE_ONLINE); } else { - mPlayStatusBinder.play(Constant.LIST_TYPE_LOCAL); + mPlayStatusBinder.play(mListType); } mMediaPlayer.seekTo((int) mSong.getCurrentTime()); mDisc.play(); @@ -347,6 +353,21 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View { mDisc.last(); } }); + + mLoveBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showLoveAnim(); + if(isLove){ + mLoveBtn.setSelected(false); + mPresenter.deleteFromLove(FileHelper.getSong().getOnlineId()); + }else { + mLoveBtn.setSelected(true); + mPresenter.saveToLove(FileHelper.getSong()); + } + + } + }); } @Override @@ -379,12 +400,11 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View { //保存图片到本地 FileHelper.saveImgToNative(PlayActivity.this, mImgBmp, getSingerName()); CommonUtil.showToast(PlayActivity.this, "获取封面歌词成功"); - -// //将封面地址放到数据库中 -// LocalSong localSong =new LocalSong(); -// mLocalSong = LitePal.findAll(LocalSong.class); -// localSong.setPic(BaseUri.STORAGE_IMG_FILE + FileHelper.getSong().getSinger() + ".jpg"); -// localSong.updateAll("singer",FileHelper.getSong().getSinger()); + //将封面地址放到数据库中 + LocalSong localSong =new LocalSong(); + mLocalSong = LitePal.findAll(LocalSong.class); + localSong.setPic(BaseUri.STORAGE_IMG_FILE + FileHelper.getSong().getSinger() + ".jpg"); + localSong.updateAll("singer",FileHelper.getSong().getSinger()); } try2UpdateMusicPicBackground(mImgBmp); @@ -406,8 +426,32 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View { } @Override - public void setSearchImg() { + public void showLove(final boolean love) { + isLove =love; + runOnUiThread(new Runnable() { + @Override + public void run() { + if(love){ + mLoveBtn.setSelected(true); + }else{ + mLoveBtn.setSelected(false); + } + } + }); + + } + + @Override + public void showLoveAnim() { + mLoveBtn.setSelected(true); + AnimatorSet animatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(PlayActivity.this, R.animator.favorites_anim); + animatorSet.setTarget(mLoveBtn); + animatorSet.start(); + } + @Override + public void saveToLoveSuccess() { + CommonUtil.showToast(PlayActivity.this,"添加成功"); } @@ -427,7 +471,6 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View { @Override public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); Song mSong = FileHelper.getSong(); mSongTv.setText(mSong.getSongName()); mSingerTv.setText(mSong.getSinger()); @@ -435,7 +478,7 @@ public class PlayActivity extends BaseActivity implements IPlayContract.View { mPlayBtn.setSelected(true); mSeekBar.setMax((int) mSong.getDuration()); startUpdateSeekBarProgress(); - if (action.equals(BroadcastName.ONLINE_ALBUM_SONG_Change) || action.equals(BroadcastName.ONLINE_SONG)) { + if (mSong.isOnline()) { setSingerImg(mSong.getImgUrl()); } else { setLocalImg(mSong.getSinger());//显示照片 diff --git a/app/src/main/java/com/example/musicplayer/view/SearchHistoryFragment.java b/app/src/main/java/com/example/musicplayer/view/SearchHistoryFragment.java index 790e085..e4aebd7 100644 --- a/app/src/main/java/com/example/musicplayer/view/SearchHistoryFragment.java +++ b/app/src/main/java/com/example/musicplayer/view/SearchHistoryFragment.java @@ -11,6 +11,7 @@ import android.view.ViewGroup; import com.example.musicplayer.R; import com.example.musicplayer.adapter.SearchHistoryAdapter; import com.example.musicplayer.entiy.History; +import com.example.musicplayer.widget.DeleteDialog; import org.litepal.LitePal; @@ -56,14 +57,34 @@ public class SearchHistoryFragment extends Fragment { mAdapter.setFooterClickListener(new SearchHistoryAdapter.OnFooterClickListener() { @Override public void onClick() { - LitePal.deleteAll(History.class); - mRecycler.setVisibility(View.GONE); + final DeleteDialog dialog = new DeleteDialog(getActivity()); + dialog.setOnClickListener(new DeleteDialog.OnClickListener() { + @Override + public void selectCancel() { + dialog.dismiss(); + } + + @Override + public void selectDelete() { + //删除数据库中的历史记录 + LitePal.deleteAll(History.class); + mRecycler.setVisibility(View.GONE); + dialog.dismiss(); + } + + @Override + public String setTitle() { + return "确定清空搜索历史?"; + } + }); + dialog.show(); + } }); mAdapter.setOnDeleteClickListener(new SearchHistoryAdapter.OnDeleteClickListener() { @Override public void onClick(int position) { - History history =mTempList.get(position); + History history =mHistoryList.get(position); LitePal.deleteAll(History.class,"history = ?",history.getHistory()); mTempList =LitePal.findAll(History.class); changeList(); diff --git a/app/src/main/java/com/example/musicplayer/widget/DeleteDialog.java b/app/src/main/java/com/example/musicplayer/widget/DeleteDialog.java new file mode 100644 index 0000000..215464c --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/widget/DeleteDialog.java @@ -0,0 +1,84 @@ +package com.example.musicplayer.widget; + +import android.annotation.SuppressLint; +import android.app.Dialog; +import android.content.Context; +import android.support.annotation.NonNull; +import android.util.DisplayMetrics; +import android.view.LayoutInflater; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.TextView; + +import com.example.musicplayer.R; + + +public class DeleteDialog extends Dialog implements View.OnClickListener{ + + private OnClickListener mOnClickListener; + + private TextView mTitle; + + public interface OnClickListener { + void selectCancel(); //选择取消 + void selectDelete(); //选择删除 + String setTitle(); + } + + public void setOnClickListener(OnClickListener onClickListener) { + mOnClickListener = onClickListener; + } + + public DeleteDialog(@NonNull Context context) { + super(context, R.style.MyDialog); + initView(); + } + + private void initView() { + @SuppressLint("InflateParams") View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_delete_photo, null); + mTitle = view.findViewById(R.id.tv_dialog_delete_title); //标题 + TextView cancel = view.findViewById(R.id.tv_dialog_delete_photo_cancel); //取消 + cancel.setOnClickListener(this); + TextView delete = view.findViewById(R.id.tv_dialog_delete_photo_delete); //删除 + delete.setOnClickListener(this); + super.setContentView(view); //设置布局 + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.tv_dialog_delete_photo_cancel: //取消 + mOnClickListener.selectCancel(); //回调给主活动,让主活动处理相关逻辑,下同 + break; + case R.id.tv_dialog_delete_photo_delete: //删除 + mOnClickListener.selectDelete(); + break; + default: + break; + } + } + + /** + * 重新该方法,使dialog适应屏幕的宽高 + */ + @Override + public void show() { + super.show(); + Window dialogWindow = this.getWindow(); + assert dialogWindow != null; + WindowManager.LayoutParams lp = dialogWindow.getAttributes(); + //获取屏幕宽度 + DisplayMetrics dm = new DisplayMetrics(); + WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); + assert wm != null; + wm.getDefaultDisplay().getMetrics(dm); + int screenWidth = dm.widthPixels; + //设置高宽 + lp.width = (int) (screenWidth * 0.9); // 宽度 + lp.height = (int) (lp.width * 0.4); // 高度 + dialogWindow.setAttributes(lp); + + mTitle.setText(mOnClickListener.setTitle()); //设置标题 + } +} diff --git a/app/src/main/res/animator/favorites_anim.xml b/app/src/main/res/animator/favorites_anim.xml new file mode 100644 index 0000000..0525aa0 --- /dev/null +++ b/app/src/main/res/animator/favorites_anim.xml @@ -0,0 +1,17 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/favorites.png b/app/src/main/res/drawable-xxhdpi/favorites.png new file mode 100644 index 0000000..f221e5e Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/favorites.png differ diff --git a/app/src/main/res/drawable-xxhdpi/favorites_selected.png b/app/src/main/res/drawable-xxhdpi/favorites_selected.png new file mode 100644 index 0000000..a67a2ff Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/favorites_selected.png differ diff --git a/app/src/main/res/drawable/dialog_bg.xml b/app/src/main/res/drawable/dialog_bg.xml new file mode 100644 index 0000000..fb26df1 --- /dev/null +++ b/app/src/main/res/drawable/dialog_bg.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/empty_song.png b/app/src/main/res/drawable/empty_song.png new file mode 100644 index 0000000..30faa48 Binary files /dev/null and b/app/src/main/res/drawable/empty_song.png differ diff --git a/app/src/main/res/drawable/love.xml b/app/src/main/res/drawable/love.xml new file mode 100644 index 0000000..b20a0b9 --- /dev/null +++ b/app/src/main/res/drawable/love.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_play.xml b/app/src/main/res/layout/activity_play.xml index abd4f40..4083003 100644 --- a/app/src/main/res/layout/activity_play.xml +++ b/app/src/main/res/layout/activity_play.xml @@ -161,6 +161,16 @@ android:layout_height="60dp" android:background="@drawable/activity_play_next" /> + + +