diff --git a/app/build.gradle b/app/build.gradle index 9b02d2f..c59750b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,7 +47,13 @@ dependencies { implementation 'com.google.code.gson:gson:2.8.2' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' //glide - implementation 'com.github.bumptech.glide:glide:4.8.0' + implementation 'com.github.bumptech.glide:glide:4.0.0' //LRecyclerView implementation 'com.github.jdsjlzx:LRecyclerView:1.5.4.3' + //CardView + implementation 'com.android.support:cardview-v7:27.1.1' + //滑动page + implementation 'com.github.florent37:materialviewpager:1.2.3' + implementation 'com.flaviofaria:kenburnsview:1.0.7' + implementation 'com.jpardogo.materialtabstrip:library:1.1.0' } diff --git a/app/src/main/java/com/example/musicplayer/adapter/AlbumSongAdapter.java b/app/src/main/java/com/example/musicplayer/adapter/AlbumSongAdapter.java new file mode 100644 index 0000000..2291e37 --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/adapter/AlbumSongAdapter.java @@ -0,0 +1,96 @@ +package com.example.musicplayer.adapter; + +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +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.AlbumSong; +import com.example.musicplayer.util.FileHelper; + +import java.util.List; + +/** + * Created by 残渊 on 2018/11/27. + */ + +public class AlbumSongAdapter extends RecyclerView.Adapter { + + private List mSongsBeanList; + private int mLastPosition = -1; + private SongClick mSongClick; + + public AlbumSongAdapter(List songsBeans){ + mSongsBeanList =songsBeans; + } + + public void setSongClick(SongClick songClick){ + mSongClick =songClick; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.recycler_song_search_item, parent, false); + ViewHolder viewHolder = new ViewHolder(view); + return viewHolder; + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, final int position) { + AlbumSong.DataBean.SongsBean songsBean=mSongsBeanList.get(position); + holder.artistTv.setText(songsBean.getSinger()); + holder.titleTv.setText(songsBean.getName()); + + if (FileHelper.getSong().getImgUrl() != null) { + //根据点击显示 + holder.playLine.setVisibility((position == mLastPosition ? View.VISIBLE : View.INVISIBLE)); + holder.mItemView.setBackgroundResource((position == mLastPosition ? R.color.click : R.color.translucent)); + } + holder.mItemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mSongClick.onClick(position); + equalPosition(position); + } + }); + } + + @Override + public int getItemCount() { + return mSongsBeanList.size(); + } + + class ViewHolder extends RecyclerView.ViewHolder{ + + TextView titleTv; + TextView artistTv; + View mItemView; + View playLine; + + public ViewHolder(View itemView) { + super(itemView); + titleTv = itemView.findViewById(R.id.tv_title); + artistTv = itemView.findViewById(R.id.tv_artist); + playLine = itemView.findViewById(R.id.line_play); + mItemView = itemView; + } + } + //判断点击的是否为上一个点击的项目 + private void equalPosition(int position) { + if (position != mLastPosition) { + if (mLastPosition != -1) notifyItemChanged(mLastPosition); + mLastPosition = position; + } + notifyItemChanged(position); + } + + public interface SongClick { + void onClick(int position); + } +} diff --git a/app/src/main/java/com/example/musicplayer/adapter/SearchAdapter.java b/app/src/main/java/com/example/musicplayer/adapter/SearchAdapter.java new file mode 100644 index 0000000..49b325c --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/adapter/SearchAdapter.java @@ -0,0 +1,39 @@ +package com.example.musicplayer.adapter; + +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; + +import com.example.musicplayer.view.SearchContentFragment; + +import java.util.List; + +/** + * Created by 残渊 on 2018/11/25. + */ + +public class SearchAdapter extends FragmentPagerAdapter { + private List mFragmentList;//顶部导航栏的内容即fragment + private List mTitle;//顶部导航栏的标题 + + + public SearchAdapter(FragmentManager fragmentManager, Listfragments, Listtitle){ + super(fragmentManager); + mFragmentList=fragments; + mTitle=title; + + } + @Override + public Fragment getItem(int position) { + return mFragmentList.get(position); + } + + @Override + public int getCount() { + return mFragmentList.size(); + } + @Override + public CharSequence getPageTitle(int position) { + return mTitle.get(position); + } +} diff --git a/app/src/main/java/com/example/musicplayer/adapter/SearchContentAdapter.java b/app/src/main/java/com/example/musicplayer/adapter/SearchContentAdapter.java index d7e932f..c258418 100644 --- a/app/src/main/java/com/example/musicplayer/adapter/SearchContentAdapter.java +++ b/app/src/main/java/com/example/musicplayer/adapter/SearchContentAdapter.java @@ -7,83 +7,139 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; import com.example.musicplayer.R; +import com.example.musicplayer.constant.Constant; +import com.example.musicplayer.entiy.Album; +import com.example.musicplayer.entiy.AlbumSong; import com.example.musicplayer.entiy.SeachSong; import com.example.musicplayer.util.CommonUtil; import com.example.musicplayer.util.FileHelper; import java.util.ArrayList; +import java.util.List; /** * Created by 残渊 on 2018/11/21. */ -public class SearchContentAdapter extends RecyclerView.Adapter { - private static final String TAG="SearchContentAdapter"; +public class SearchContentAdapter extends RecyclerView.Adapter { + private static final String TAG = "SearchContentAdapter"; private ArrayList mSongListBeans; + private List mAlbumList; private static ItemClick mItemClick; + private static AlbumClick mAlbumClick; private String mSeek; private Context mContext; private int mLastPosition = -1; + private int mType; - public static void setItemClick(ItemClick itemClick){ + public static void setItemClick(ItemClick itemClick) { mItemClick = itemClick; } - public SearchContentAdapter(ArrayList songListBeans, String seek, Context context){ + public static void setAlbumClick(AlbumClick albumClick) { + mAlbumClick = albumClick; + } + + public SearchContentAdapter(List dataBeans, String seek, Context context, int type) { + mContext = context; + mSeek = seek; + mAlbumList = dataBeans; + mType = type; + } + + + public SearchContentAdapter(ArrayList songListBeans, String seek, Context context, int type) { mContext = context; mSeek = seek; mSongListBeans = songListBeans; + mType = type; } + @NonNull @Override - public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.recycler_song_search_item,parent,false); - ViewHolder viewHolder = new ViewHolder(view); - return viewHolder; + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + final View view; + if (viewType == Constant.TYPE_SONG ) { + view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.recycler_song_search_item, parent, false); + ViewHolder viewHolder = new ViewHolder(view); + return viewHolder; + } else if (viewType == Constant.TYPE_ALBUM) { + view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.recycler_album_item, parent, false); + AlbumHolder albumHolder = new AlbumHolder(view); + return albumHolder; + } + return null; + } @Override - public void onBindViewHolder(@NonNull ViewHolder holder, final int position) { - SeachSong.DataBean songListBean = mSongListBeans.get(position); - holder.artistTv.setText(songListBean.getSinger()); - //设置与搜索一样的string的颜色 - CommonUtil.showStringColor(mSeek,songListBean.getSinger(),holder.artistTv); - holder.titleTv.setText(songListBean.getName()); - CommonUtil.showStringColor(mSeek,songListBean.getName(),holder.titleTv); - - if(FileHelper.getSong().getImgUrl() !=null){ - //根据点击显示 - holder.playLine.setVisibility((position == mLastPosition|| - (songListBean.getName().equals(FileHelper.getSong().getTitle())&& - songListBean.getSinger().equals(FileHelper.getSong().getArtist()))) - ?View.VISIBLE:View.INVISIBLE); - holder.mItemView.setBackgroundResource((position == mLastPosition|| - (songListBean.getName().equals(FileHelper.getSong().getTitle())&& - songListBean.getSinger().equals(FileHelper.getSong().getArtist()))) - ?R.color.click:R.color.translucent); - } - holder.mItemView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mItemClick.onClick(position); - equalPosition(position); + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) { + if (holder instanceof ViewHolder) { + ViewHolder songHolder = (ViewHolder) holder; + SeachSong.DataBean songListBean = mSongListBeans.get(position); + songHolder.artistTv.setText(songListBean.getSinger()); + //设置与搜索一样的string的颜色 + CommonUtil.showStringColor(mSeek, songListBean.getSinger(), songHolder.artistTv); + songHolder.titleTv.setText(songListBean.getName()); + CommonUtil.showStringColor(mSeek, songListBean.getName(), songHolder.titleTv); + + if (FileHelper.getSong().getImgUrl() != null) { + //根据点击显示 + songHolder.playLine.setVisibility((position == mLastPosition ? View.VISIBLE : View.INVISIBLE)); + songHolder.mItemView.setBackgroundResource((position == mLastPosition ? R.color.click : R.color.translucent)); } - }); + songHolder.mItemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Log.d(TAG, "onClick: song"); + mItemClick.onClick(position); + equalPosition(position); + } + }); + } else { + AlbumHolder albumHolder = (AlbumHolder) holder; + Album.DataBean albumList = mAlbumList.get(position); + Glide.with(mContext).load(albumList.getAlbumPic()) + .apply(RequestOptions.errorOf(R.drawable.background)).into(albumHolder.albumIv); + albumHolder.albumName.setText(albumList.getAlbumName()); + albumHolder.singerName.setText(albumList.getSingerName()); + albumHolder.publicTime.setText(albumList.getPublicTime()); + CommonUtil.showStringColor(mSeek, albumList.getAlbumName(), albumHolder.albumName); + CommonUtil.showStringColor(mSeek, albumList.getSingerName(), albumHolder.singerName); + CommonUtil.showStringColor(mSeek, albumList.getPublicTime(), albumHolder.publicTime); + albumHolder.item.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Log.d(TAG, "onClick: album"); + mAlbumClick.onClick(position); + } + }); + } } + @Override public int getItemCount() { - return mSongListBeans.size(); + if (mType == Constant.TYPE_SONG) { + return mSongListBeans.size(); + } else if (mType == Constant.TYPE_ALBUM) { + return mAlbumList.size(); + } + return 0; } - class ViewHolder extends RecyclerView.ViewHolder{ + class ViewHolder extends RecyclerView.ViewHolder { TextView titleTv; TextView artistTv; View mItemView; @@ -98,14 +154,40 @@ public class SearchContentAdapter extends RecyclerView.Adapter { onItemClickListener.onSongClick(); equalPosition(position); - - - - } }); }else{ 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 4a817f4..5de4bc8 100644 --- a/app/src/main/java/com/example/musicplayer/constant/Constant.java +++ b/app/src/main/java/com/example/musicplayer/constant/Constant.java @@ -6,4 +6,7 @@ package com.example.musicplayer.constant; public class Constant { public static final int OFFSET=30; + public static final int TYPE_SONG=1; + public static final int TYPE_ALBUM=2; + public static final int TYPE_ALBUM_SONG=3; } diff --git a/app/src/main/java/com/example/musicplayer/contract/IAlbumSongContract.java b/app/src/main/java/com/example/musicplayer/contract/IAlbumSongContract.java new file mode 100644 index 0000000..2b662d9 --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/contract/IAlbumSongContract.java @@ -0,0 +1,29 @@ +package com.example.musicplayer.contract; + +import com.example.musicplayer.entiy.AlbumSong; + +import java.util.List; + + +/** + * Created by 残渊 on 2018/11/27. + */ + +public interface IAlbumSongContract { + interface Model{ + void getAlbumDetail(String id,int type); //获取专辑的更多信息 + } + interface View{ + void setAlbumSongList(List songList); //成功获取专辑歌曲后填充列表 + void showAlbumSongError();//获取专辑失败 + void showAlbumMessage(String name,String singer,String company,String desc); //展示专辑详细 + void showNetError(); //网络错误 + } + interface Presenter{ + void getAlbumDetail(String id,int type); //获取专辑的更多信息 + void getAlbumDetailSuccess(int type,ListsongList, + String name,String singer,String company,String desc); //成功获取专辑信息 + void getAlbumDetailError(); //获取专辑信息失败 + void getAlbumError(); //接口出现问题 + } +} diff --git a/app/src/main/java/com/example/musicplayer/contract/ISearchContentContract.java b/app/src/main/java/com/example/musicplayer/contract/ISearchContentContract.java index d246db6..910a920 100644 --- a/app/src/main/java/com/example/musicplayer/contract/ISearchContentContract.java +++ b/app/src/main/java/com/example/musicplayer/contract/ISearchContentContract.java @@ -1,8 +1,10 @@ package com.example.musicplayer.contract; +import com.example.musicplayer.entiy.Album; import com.example.musicplayer.entiy.SeachSong; import java.util.ArrayList; +import java.util.List; /** * Created by 残渊 on 2018/11/21. @@ -12,16 +14,23 @@ public interface ISearchContentContract { interface Model{ void search(String seek,int offset); //搜索 void searchMore(String seek,int offset); //搜索更多 + + void searchAlbum(String seek,int offset); //搜索专辑 + void searchAlbumMore(String seek,int offset);//搜索更多专辑 + } interface View{ - String getSeekContent(); //获得搜索的内容 void setSongsList(ArrayList songListBeans); //显示歌曲列表 void searchMoreSuccess(ArrayList songListBeans); //搜索更多内容成功 void searchMoreError(); //搜索更多内容失败 void searchMore();//搜索更多 void showError(); void showSearcherMoreNetworkError();//下拉刷新网络错误 + + void searchAlbumSuccess(List albumList); //获取专辑成功 + void searchAlbumMoreSuccess(List songListBeans); //搜索更多内容成功 + void searchAlbumError(); //获取专辑失败 } interface Presenter{ void search(String seek,int offset); //搜索 @@ -31,5 +40,12 @@ public interface ISearchContentContract { void searchMoreSuccess(ArrayList songListBeans); //搜索更多内容成功 void searchMoreError(); //搜索更多内容失败 void showSearchMoreNetworkError();//下拉刷新网络错误 + + void searchAlbum(String seek,int offset); //搜索专辑 + void searchAlbumSuccess(List albumList); //获取专辑成功 + void searchAlbumError(); //获取专辑失败 + + void searchAlbumMore(String seek,int offset);//搜索更多专辑 + void searchAlbumMoreSuccess(List songListBeans); //搜索更多内容成功 } } diff --git a/app/src/main/java/com/example/musicplayer/entiy/Album.java b/app/src/main/java/com/example/musicplayer/entiy/Album.java new file mode 100644 index 0000000..2985b6e --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/entiy/Album.java @@ -0,0 +1,246 @@ +package com.example.musicplayer.entiy; + +import java.util.List; + +/** + * Created by 残渊 on 2018/11/25. + */ + +public class Album { + + /** + * result : SUCCESS + * code : 200 + * data : [{"albumID":8217,"albumMID":"000I5jJB3blWeN","albumName":"范特西","albumName_hilight":"范特西","albumPic":"http://y.gtimg.cn/music/photo_new/T002R180x180M000000I5jJB3blWeN.jpg","catch_song":"","docid":"9955806126048031202","publicTime":"2001-09-20","singerID":4558,"singerMID":"0025NhlN2yWrP4","singerName":"周杰伦","singerName_hilight":"周杰伦<\/em>","singer_list":[{"id":4558,"mid":"0025NhlN2yWrP4","name":"周杰伦","name_hilight":"周杰伦<\/em>"}],"song_count":10,"type":0}] + */ + + private String result; + private int code; + private List data; + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public static class DataBean { + /** + * albumID : 8217 + * albumMID : 000I5jJB3blWeN + * albumName : 范特西 + * albumName_hilight : 范特西 + * albumPic : http://y.gtimg.cn/music/photo_new/T002R180x180M000000I5jJB3blWeN.jpg + * catch_song : + * docid : 9955806126048031202 + * publicTime : 2001-09-20 + * singerID : 4558 + * singerMID : 0025NhlN2yWrP4 + * singerName : 周杰伦 + * singerName_hilight : 周杰伦 + * singer_list : [{"id":4558,"mid":"0025NhlN2yWrP4","name":"周杰伦","name_hilight":"周杰伦<\/em>"}] + * song_count : 10 + * type : 0 + */ + + private int albumID; + private String albumMID; + private String albumName; + private String albumName_hilight; + private String albumPic; + private String catch_song; + private String docid; + private String publicTime; + private int singerID; + private String singerMID; + private String singerName; + private String singerName_hilight; + private int song_count; + private int type; + private List singer_list; + + public int getAlbumID() { + return albumID; + } + + public void setAlbumID(int albumID) { + this.albumID = albumID; + } + + public String getAlbumMID() { + return albumMID; + } + + public void setAlbumMID(String albumMID) { + this.albumMID = albumMID; + } + + public String getAlbumName() { + return albumName; + } + + public void setAlbumName(String albumName) { + this.albumName = albumName; + } + + public String getAlbumName_hilight() { + return albumName_hilight; + } + + public void setAlbumName_hilight(String albumName_hilight) { + this.albumName_hilight = albumName_hilight; + } + + public String getAlbumPic() { + return albumPic; + } + + public void setAlbumPic(String albumPic) { + this.albumPic = albumPic; + } + + public String getCatch_song() { + return catch_song; + } + + public void setCatch_song(String catch_song) { + this.catch_song = catch_song; + } + + public String getDocid() { + return docid; + } + + public void setDocid(String docid) { + this.docid = docid; + } + + public String getPublicTime() { + return publicTime; + } + + public void setPublicTime(String publicTime) { + this.publicTime = publicTime; + } + + public int getSingerID() { + return singerID; + } + + public void setSingerID(int singerID) { + this.singerID = singerID; + } + + public String getSingerMID() { + return singerMID; + } + + public void setSingerMID(String singerMID) { + this.singerMID = singerMID; + } + + public String getSingerName() { + return singerName; + } + + public void setSingerName(String singerName) { + this.singerName = singerName; + } + + public String getSingerName_hilight() { + return singerName_hilight; + } + + public void setSingerName_hilight(String singerName_hilight) { + this.singerName_hilight = singerName_hilight; + } + + public int getSong_count() { + return song_count; + } + + public void setSong_count(int song_count) { + this.song_count = song_count; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public List getSinger_list() { + return singer_list; + } + + public void setSinger_list(List singer_list) { + this.singer_list = singer_list; + } + + public static class SingerListBean { + /** + * id : 4558 + * mid : 0025NhlN2yWrP4 + * name : 周杰伦 + * name_hilight : 周杰伦 + */ + + private int id; + private String mid; + private String name; + private String name_hilight; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getMid() { + return mid; + } + + public void setMid(String mid) { + this.mid = mid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getName_hilight() { + return name_hilight; + } + + public void setName_hilight(String name_hilight) { + this.name_hilight = name_hilight; + } + } + } +} diff --git a/app/src/main/java/com/example/musicplayer/entiy/AlbumSong.java b/app/src/main/java/com/example/musicplayer/entiy/AlbumSong.java new file mode 100644 index 0000000..0a68387 --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/entiy/AlbumSong.java @@ -0,0 +1,200 @@ +package com.example.musicplayer.entiy; + +import java.util.List; + +/** + * Created by 残渊 on 2018/11/25. + */ + +public class AlbumSong { + + /** + * result : SUCCESS + * code : 200 + * data : {"id":"000I5jJB3blWeN","name":"范特西","company":"杰威尔音乐有限公司","desc":"⊙周杰伦要发片了!\n\n在这段不算短的日子中,喜爱杰伦的歌迷们,仅能透过市面上流传属于杰伦气息的旋律,来稍稍抚慰失落的心情。经过将近一年时间的精墩细熬,大家万众期待的周杰伦第二张专辑---「范特西」,终于在歌迷们的千呼万唤声中,决定于2001年9月份与大众见面!\n\n⊙Welcome To Jay's Fantasy World\n\n此次周杰伦的音乐层面,不仅突破以往的制作水平、创作更臻成熟,他所发挥的奇特幻想力及个人特质,更淋漓尽致地融入于他的歌曲里。听杰伦的音乐,就犹如畅游梦幻的游乐世界;听杰伦的音乐,你将会享受比上一张专辑更多的惊艳。现在,就请你准备系好安全带,和我们一起进入周杰伦的「音乐幻想世界」!\n\n周杰伦的第二张专辑---「范特西」(音同Fantasy),充分反射出杰伦思绪充沛的一面,他独特的想象空间,可说是构成此张专辑的主要原动力。仅仅浏览「爸我回来了」、「双截棍」、「忍者」、「爱在西元前」、「上海一九四三」、「威廉古堡」等特殊歌名,大家的好奇心就会不自觉被轻轻挑起,从杰伦更多元化的音乐尝试,不难嗅出他此番强烈的企图心,而这突破自己的考验,杰伦不仅做到了,而且,做得还十分出色!\n\n⊙作曲无限大 填词铁三角\n\n关于杰伦「范特西」专辑的制作阵容,作曲方面里逤当然由R&B小天王周杰伦一手包办,除了囊括以往大家熟悉的抒情R&B歌曲,如:蕴涵动人情感的「开不了口」、旋律清新明快的「简单爱」、百万绿茶广告曲「对不起」,以及最能敲开听众心扉的「安静」,这一次杰伦更加扩大想象空间,将Hip Hop、Rock、加快版Rap,甚至把非常民族风味的多层次风格搬上台面,例:「双截棍」里宛如李小龙般的勇猛跳跃、「忍者」中犹如进入东洋电玩世界的快感、「爱在西元前」里重回美索不达米亚美丽的传奇、「威廉古堡」中神秘吸血鬼华丽吊诡的气氛,以及重现上海滩怀旧时代的「上海一九四三」,另外,值得一提的是,鲜少人知道杰伦在学时期主修的是大提琴,他在钢琴之外的演奏才华,也将首次在「爸我回来了」这首歌中展露无疑。以上总总所列,已足以让人垂涎三尺,但孰知,这仅是「范特西」专辑中绝妙精华的一部份罢了。\n\n在填词部分,此次则仍维持上张专辑的「铁三角」,由笔触纯稚直接的Vivian徐若瑄、用字饶富新意的新生代填词家方文山,以及惯用特有年轻语言的周杰伦。看徐若瑄的词,会带给人一丝可爱童稚的气息;看方文山的词,会带给人们无限惊喜及文艺气质的提升;看周杰伦的词,会让年轻人打从心底产生共鸣之声,这坚强的「铁三角」组合,不仅为杰伦的音乐架上许多分,更让大家在听歌的同时,同步在视觉上收到惊讶的刺激效果!\n\n⊙视觉造型抢眼多变 MTV多重角色扮演\n\n「忍者」,一向给人神秘、诡谲多变的感觉,他所赋予的使命是神圣不可侵犯,甚至可以不惜牺牲性命去达成。如此职业杀手的强烈视觉,建筑在充满幻想魅力的专辑中,形成了非常有趣的对比及震撼,因此,在这张专辑的内页呈现上,杰伦首度尝试穿上改良后的忍者造型;在MTV的画面表现,杰伦将因应不同歌曲的需求,化身为歌曲中的主角演出,充分满足观众在视觉上的享受,因此,这张专辑所拍摄的音乐录像带,相信将会是除音乐外,另一个令人期待的爆点!\n\n⊙不断挑战音乐的可能性 不断突破自己的可能性\n\n2001年崭新的周杰伦,正以惊人的爆发力在歌坛闯荡,他接续不断地努力超越自己、求新求变的态度,只为求能将最优质的音乐呈现给喜爱他的歌迷,仅让我们拭目以待,周杰伦「范特西」的音乐魔力!\n\n欢迎光临---周杰伦的音乐幻想世界!","singer":"周杰伦","songs":[{"id":"002usg9o4GTAKf","name":"爱在西元前","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=002usg9o4GTAKf&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=002usg9o4GTAKf&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=002usg9o4GTAKf&key=579621905"},{"id":"001mhQbn2eKHiR","name":"爸,我回来了","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=001mhQbn2eKHiR&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=001mhQbn2eKHiR&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=001mhQbn2eKHiR&key=579621905"},{"id":"0009BCJK1nRaad","name":"简单爱","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=0009BCJK1nRaad&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=0009BCJK1nRaad&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=0009BCJK1nRaad&key=579621905"},{"id":"001MNqZU3YDLrE","name":"忍者","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=001MNqZU3YDLrE&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=001MNqZU3YDLrE&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=001MNqZU3YDLrE&key=579621905"},{"id":"0020qX4u2JJRxK","name":"开不了口","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=0020qX4u2JJRxK&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=0020qX4u2JJRxK&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=0020qX4u2JJRxK&key=579621905"},{"id":"002YzCdA2Hybr0","name":"上海一九四三","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=002YzCdA2Hybr0&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=002YzCdA2Hybr0&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=002YzCdA2Hybr0&key=579621905"},{"id":"000F0lmz1cBq4c","name":"对不起","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=000F0lmz1cBq4c&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=000F0lmz1cBq4c&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=000F0lmz1cBq4c&key=579621905"},{"id":"0046grpK0A1l9G","name":"威廉古堡","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=0046grpK0A1l9G&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=0046grpK0A1l9G&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=0046grpK0A1l9G&key=579621905"},{"id":"00218ObD0yrANX","name":"双截棍","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=00218ObD0yrANX&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=00218ObD0yrANX&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=00218ObD0yrANX&key=579621905"},{"id":"000amRvH3wxv56","name":"安静","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=000amRvH3wxv56&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=000amRvH3wxv56&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=000amRvH3wxv56&key=579621905"}]} + */ + + private String result; + private int code; + private DataBean data; + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public static class DataBean { + /** + * id : 000I5jJB3blWeN + * name : 范特西 + * company : 杰威尔音乐有限公司 + * desc : ⊙周杰伦要发片了! + + 在这段不算短的日子中,喜爱杰伦的歌迷们,仅能透过市面上流传属于杰伦气息的旋律,来稍稍抚慰失落的心情。经过将近一年时间的精墩细熬,大家万众期待的周杰伦第二张专辑---「范特西」,终于在歌迷们的千呼万唤声中,决定于2001年9月份与大众见面! + + ⊙Welcome To Jay's Fantasy World + + 此次周杰伦的音乐层面,不仅突破以往的制作水平、创作更臻成熟,他所发挥的奇特幻想力及个人特质,更淋漓尽致地融入于他的歌曲里。听杰伦的音乐,就犹如畅游梦幻的游乐世界;听杰伦的音乐,你将会享受比上一张专辑更多的惊艳。现在,就请你准备系好安全带,和我们一起进入周杰伦的「音乐幻想世界」! + + 周杰伦的第二张专辑---「范特西」(音同Fantasy),充分反射出杰伦思绪充沛的一面,他独特的想象空间,可说是构成此张专辑的主要原动力。仅仅浏览「爸我回来了」、「双截棍」、「忍者」、「爱在西元前」、「上海一九四三」、「威廉古堡」等特殊歌名,大家的好奇心就会不自觉被轻轻挑起,从杰伦更多元化的音乐尝试,不难嗅出他此番强烈的企图心,而这突破自己的考验,杰伦不仅做到了,而且,做得还十分出色! + + ⊙作曲无限大 填词铁三角 + + 关于杰伦「范特西」专辑的制作阵容,作曲方面里逤当然由R&B小天王周杰伦一手包办,除了囊括以往大家熟悉的抒情R&B歌曲,如:蕴涵动人情感的「开不了口」、旋律清新明快的「简单爱」、百万绿茶广告曲「对不起」,以及最能敲开听众心扉的「安静」,这一次杰伦更加扩大想象空间,将Hip Hop、Rock、加快版Rap,甚至把非常民族风味的多层次风格搬上台面,例:「双截棍」里宛如李小龙般的勇猛跳跃、「忍者」中犹如进入东洋电玩世界的快感、「爱在西元前」里重回美索不达米亚美丽的传奇、「威廉古堡」中神秘吸血鬼华丽吊诡的气氛,以及重现上海滩怀旧时代的「上海一九四三」,另外,值得一提的是,鲜少人知道杰伦在学时期主修的是大提琴,他在钢琴之外的演奏才华,也将首次在「爸我回来了」这首歌中展露无疑。以上总总所列,已足以让人垂涎三尺,但孰知,这仅是「范特西」专辑中绝妙精华的一部份罢了。 + + 在填词部分,此次则仍维持上张专辑的「铁三角」,由笔触纯稚直接的Vivian徐若瑄、用字饶富新意的新生代填词家方文山,以及惯用特有年轻语言的周杰伦。看徐若瑄的词,会带给人一丝可爱童稚的气息;看方文山的词,会带给人们无限惊喜及文艺气质的提升;看周杰伦的词,会让年轻人打从心底产生共鸣之声,这坚强的「铁三角」组合,不仅为杰伦的音乐架上许多分,更让大家在听歌的同时,同步在视觉上收到惊讶的刺激效果! + + ⊙视觉造型抢眼多变 MTV多重角色扮演 + + 「忍者」,一向给人神秘、诡谲多变的感觉,他所赋予的使命是神圣不可侵犯,甚至可以不惜牺牲性命去达成。如此职业杀手的强烈视觉,建筑在充满幻想魅力的专辑中,形成了非常有趣的对比及震撼,因此,在这张专辑的内页呈现上,杰伦首度尝试穿上改良后的忍者造型;在MTV的画面表现,杰伦将因应不同歌曲的需求,化身为歌曲中的主角演出,充分满足观众在视觉上的享受,因此,这张专辑所拍摄的音乐录像带,相信将会是除音乐外,另一个令人期待的爆点! + + ⊙不断挑战音乐的可能性 不断突破自己的可能性 + + 2001年崭新的周杰伦,正以惊人的爆发力在歌坛闯荡,他接续不断地努力超越自己、求新求变的态度,只为求能将最优质的音乐呈现给喜爱他的歌迷,仅让我们拭目以待,周杰伦「范特西」的音乐魔力! + + 欢迎光临---周杰伦的音乐幻想世界! + * singer : 周杰伦 + * songs : [{"id":"002usg9o4GTAKf","name":"爱在西元前","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=002usg9o4GTAKf&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=002usg9o4GTAKf&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=002usg9o4GTAKf&key=579621905"},{"id":"001mhQbn2eKHiR","name":"爸,我回来了","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=001mhQbn2eKHiR&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=001mhQbn2eKHiR&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=001mhQbn2eKHiR&key=579621905"},{"id":"0009BCJK1nRaad","name":"简单爱","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=0009BCJK1nRaad&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=0009BCJK1nRaad&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=0009BCJK1nRaad&key=579621905"},{"id":"001MNqZU3YDLrE","name":"忍者","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=001MNqZU3YDLrE&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=001MNqZU3YDLrE&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=001MNqZU3YDLrE&key=579621905"},{"id":"0020qX4u2JJRxK","name":"开不了口","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=0020qX4u2JJRxK&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=0020qX4u2JJRxK&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=0020qX4u2JJRxK&key=579621905"},{"id":"002YzCdA2Hybr0","name":"上海一九四三","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=002YzCdA2Hybr0&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=002YzCdA2Hybr0&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=002YzCdA2Hybr0&key=579621905"},{"id":"000F0lmz1cBq4c","name":"对不起","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=000F0lmz1cBq4c&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=000F0lmz1cBq4c&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=000F0lmz1cBq4c&key=579621905"},{"id":"0046grpK0A1l9G","name":"威廉古堡","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=0046grpK0A1l9G&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=0046grpK0A1l9G&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=0046grpK0A1l9G&key=579621905"},{"id":"00218ObD0yrANX","name":"双截棍","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=00218ObD0yrANX&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=00218ObD0yrANX&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=00218ObD0yrANX&key=579621905"},{"id":"000amRvH3wxv56","name":"安静","singer":"周杰伦","url":"https://api.bzqll.com/music/tencent/url?id=000amRvH3wxv56&key=579621905","pic":"https://api.bzqll.com/music/tencent/pic?id=000amRvH3wxv56&key=579621905","lrc":"https://api.bzqll.com/music/tencent/lrc?id=000amRvH3wxv56&key=579621905"}] + */ + + private String id; + private String name; + private String company; + private String desc; + private String singer; + private List songs; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCompany() { + return company; + } + + public void setCompany(String company) { + this.company = company; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public String getSinger() { + return singer; + } + + public void setSinger(String singer) { + this.singer = singer; + } + + public List getSongs() { + return songs; + } + + public void setSongs(List songs) { + this.songs = songs; + } + + public static class SongsBean { + /** + * id : 002usg9o4GTAKf + * name : 爱在西元前 + * singer : 周杰伦 + * url : https://api.bzqll.com/music/tencent/url?id=002usg9o4GTAKf&key=579621905 + * pic : https://api.bzqll.com/music/tencent/pic?id=002usg9o4GTAKf&key=579621905 + * lrc : https://api.bzqll.com/music/tencent/lrc?id=002usg9o4GTAKf&key=579621905 + */ + + private String id; + private String name; + private String singer; + private String url; + private String pic; + private String lrc; + + public String getId() { + return id; + } + + public void setId(String 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 getLrc() { + return lrc; + } + + public void setLrc(String lrc) { + this.lrc = lrc; + } + } + } +} diff --git a/app/src/main/java/com/example/musicplayer/https/NetWork.java b/app/src/main/java/com/example/musicplayer/https/NetWork.java index 4e5c956..01dbaaa 100644 --- a/app/src/main/java/com/example/musicplayer/https/NetWork.java +++ b/app/src/main/java/com/example/musicplayer/https/NetWork.java @@ -1,6 +1,8 @@ package com.example.musicplayer.https; import com.example.musicplayer.constant.BaseUri; +import com.example.musicplayer.entiy.Album; +import com.example.musicplayer.https.api.AlbumApi; import com.example.musicplayer.https.api.SearchApi; import com.example.musicplayer.https.api.SingerImgApi; @@ -27,6 +29,7 @@ public class NetWork { private static CallAdapter.Factory rxJavaCallAdapterFactory = RxJava2CallAdapterFactory.create(); private static SingerImgApi singerImgApi; private static SearchApi searchApi; + private static AlbumApi albumApi; public static SingerImgApi getSingerImgApi(){ if(singerImgApi==null){ @@ -53,5 +56,18 @@ public class NetWork { } return searchApi; } + public static AlbumApi getAlbumApi(){ + if(albumApi ==null){ + Retrofit retrofit =new Retrofit.Builder() + .client(builder.build()) + .baseUrl(QQ_URL) + .addCallAdapterFactory(rxJavaCallAdapterFactory) + .addConverterFactory(gsonConverterFactory) + .build(); + albumApi = retrofit.create(AlbumApi.class); + } + return albumApi; + } + } diff --git a/app/src/main/java/com/example/musicplayer/https/api/AlbumApi.java b/app/src/main/java/com/example/musicplayer/https/api/AlbumApi.java new file mode 100644 index 0000000..9a4ecb5 --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/https/api/AlbumApi.java @@ -0,0 +1,16 @@ +package com.example.musicplayer.https.api; + +import com.example.musicplayer.entiy.AlbumSong; + +import io.reactivex.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +/** + * Created by 残渊 on 2018/11/27. + */ + +public interface AlbumApi { + @GET("album?key=579621905") + Observable getAlbumSong(@Query("id")String id); +} diff --git a/app/src/main/java/com/example/musicplayer/https/api/SearchApi.java b/app/src/main/java/com/example/musicplayer/https/api/SearchApi.java index 76485f6..d16eeec 100644 --- a/app/src/main/java/com/example/musicplayer/https/api/SearchApi.java +++ b/app/src/main/java/com/example/musicplayer/https/api/SearchApi.java @@ -1,5 +1,6 @@ package com.example.musicplayer.https.api; +import com.example.musicplayer.entiy.Album; import com.example.musicplayer.entiy.SeachSong; import io.reactivex.Observable; @@ -17,4 +18,7 @@ import retrofit2.http.Query; public interface SearchApi { @GET("search?key=579621905&type=song&limit=30") Observable search(@Query("s") String seek,@Query("offset")int offset); + + @GET("search?key=579621905&type=album&limit=30") + Observable searchAlbum(@Query("s") String seek,@Query("offset")int offset); } diff --git a/app/src/main/java/com/example/musicplayer/model/AlbumSongModel.java b/app/src/main/java/com/example/musicplayer/model/AlbumSongModel.java new file mode 100644 index 0000000..3ebed1d --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/model/AlbumSongModel.java @@ -0,0 +1,60 @@ +package com.example.musicplayer.model; + +import android.util.Log; + +import com.example.musicplayer.contract.IAlbumSongContract; +import com.example.musicplayer.entiy.AlbumSong; +import com.example.musicplayer.https.NetWork; + +import io.reactivex.Observer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; + +/** + * Created by 残渊 on 2018/11/27. + */ + +public class AlbumSongModel implements IAlbumSongContract.Model { + private static final String TAG="AlbumSongModel"; + private IAlbumSongContract.Presenter mPresenter; + + public AlbumSongModel(IAlbumSongContract.Presenter presenter){ + mPresenter = presenter; + } + + @Override + public void getAlbumDetail(String id,final int type) { + NetWork.getAlbumApi().getAlbumSong(id) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(AlbumSong value) { + if(value.getResult().equals("SUCCESS")){ + mPresenter.getAlbumDetailSuccess(type,value.getData().getSongs(), + value.getData().getName(),value.getData().getSinger(), + value.getData().getCompany(),value.getData().getDesc()); + }else{ + mPresenter.getAlbumDetailError(); + } + } + + @Override + public void onError(Throwable e) { + Log.d(TAG, "onError: "+e.toString()); + mPresenter.getAlbumError(); + } + + @Override + public void onComplete() { + + } + }); + + } +} diff --git a/app/src/main/java/com/example/musicplayer/model/SearchContentModel.java b/app/src/main/java/com/example/musicplayer/model/SearchContentModel.java index 1532504..8023b2c 100644 --- a/app/src/main/java/com/example/musicplayer/model/SearchContentModel.java +++ b/app/src/main/java/com/example/musicplayer/model/SearchContentModel.java @@ -3,6 +3,7 @@ package com.example.musicplayer.model; import android.util.Log; import com.example.musicplayer.contract.ISearchContentContract; +import com.example.musicplayer.entiy.Album; import com.example.musicplayer.entiy.SeachSong; import com.example.musicplayer.https.NetWork; @@ -27,7 +28,7 @@ public class SearchContentModel implements ISearchContentContract.Model { @Override public void search(String seek, int offset) { - NetWork.getSearchApi().search(seek, offset) + NetWork.getSearchApi().search(seek,offset) .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @Override @@ -55,7 +56,7 @@ public class SearchContentModel implements ISearchContentContract.Model { } @Override - public void searchMore(String seek, int offset) { + public void searchMore(String seek,int offset) { NetWork.getSearchApi().search(seek, offset) .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @@ -90,4 +91,74 @@ public class SearchContentModel implements ISearchContentContract.Model { } }); } + + @Override + public void searchAlbum(String seek, int offset) { + NetWork.getSearchApi().searchAlbum(seek,offset) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(Album value) { + if(value.getResult().equals("SUCCESS")){ + mPresenter.searchAlbumSuccess(value.getData()); + }else{ + mPresenter.searchAlbumError(); + } + } + + @Override + public void onError(Throwable e) { + mPresenter.searchAlbumError(); + Log.d(TAG, "onError: searchAlbumError" + e.toString()); + } + + @Override + public void onComplete() { + + } + }); + + } + + @Override + public void searchAlbumMore(String seek, int offset) { + NetWork.getSearchApi().searchAlbum(seek, offset) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(Album value) { + if (value.getResult().equals("SUCCESS")) { + Log.d(TAG, "onNext: success"); + if (value.getData().size() == 0) { + mPresenter.searchMoreError(); + } else { + mPresenter.searchAlbumMoreSuccess(value.getData()); + } + } else { + mPresenter.searchMoreError(); + } + } + + @Override + public void onError(Throwable e) { + mPresenter.showSearchMoreNetworkError(); + Log.d(TAG, "onError: " + e.toString()); + } + + @Override + public void onComplete() { + + } + }); + } } diff --git a/app/src/main/java/com/example/musicplayer/presenter/AlbumSongPresenter.java b/app/src/main/java/com/example/musicplayer/presenter/AlbumSongPresenter.java new file mode 100644 index 0000000..3075726 --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/presenter/AlbumSongPresenter.java @@ -0,0 +1,58 @@ +package com.example.musicplayer.presenter; + +import android.util.Log; + +import com.example.musicplayer.base.BasePresenter; +import com.example.musicplayer.contract.IAlbumSongContract; +import com.example.musicplayer.entiy.AlbumSong; +import com.example.musicplayer.model.AlbumSongModel; +import com.example.musicplayer.view.AlbumSongFragment; + +import java.util.List; + +/** + * Created by 残渊 on 2018/11/27. + */ + +public class AlbumSongPresenter extends BasePresenter implements IAlbumSongContract.Presenter { + + private final static String TAG="AlbumSongPresenter"; + + private AlbumSongModel mModel; + + public AlbumSongPresenter() { + mModel = new AlbumSongModel(this); + } + + @Override + public void getAlbumDetail(String id,int type) { + mModel.getAlbumDetail(id,type); + } + + @Override + public void getAlbumDetailSuccess(int type, List songList, + String name, String singer, String company, String desc) { + if (isAttachView()) { + if (type == AlbumSongFragment.ALBUM_SONG) { + getMvpView().setAlbumSongList(songList); + Log.d(TAG, "getAlbumDetailSuccess: "+songList.size()); + } else { + getMvpView().showAlbumMessage(name, singer, company, desc); + } + } + } + + @Override + public void getAlbumDetailError() { + if (isAttachView()) { + getMvpView().showAlbumSongError(); + } + } + + @Override + public void getAlbumError() { + if (isAttachView()) { + getMvpView().showNetError(); + } + } +} diff --git a/app/src/main/java/com/example/musicplayer/presenter/SearchContentPresenter.java b/app/src/main/java/com/example/musicplayer/presenter/SearchContentPresenter.java index 0bc477f..96a2e88 100644 --- a/app/src/main/java/com/example/musicplayer/presenter/SearchContentPresenter.java +++ b/app/src/main/java/com/example/musicplayer/presenter/SearchContentPresenter.java @@ -2,10 +2,12 @@ package com.example.musicplayer.presenter; import com.example.musicplayer.base.BasePresenter; import com.example.musicplayer.contract.ISearchContentContract; +import com.example.musicplayer.entiy.Album; import com.example.musicplayer.entiy.SeachSong; import com.example.musicplayer.model.SearchContentModel; import java.util.ArrayList; +import java.util.List; import java.util.logging.Handler; /** @@ -27,7 +29,7 @@ public class SearchContentPresenter extends BasePresenter albumList) { + if(isAttachView()){ + getMvpView().searchAlbumSuccess(albumList); + } + } + + @Override + public void searchAlbumError() { + if(isAttachView()){ + getMvpView().searchAlbumError(); + } + } + + @Override + public void searchAlbumMore(String seek, int offset) { + mModel.searchAlbumMore(seek,offset); + } + + @Override + public void searchAlbumMoreSuccess(final List songListBeans) { + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + if(isAttachView()){ + getMvpView().searchAlbumMoreSuccess(songListBeans); + } + } + },500); + } } diff --git a/app/src/main/java/com/example/musicplayer/util/CommonUtil.java b/app/src/main/java/com/example/musicplayer/util/CommonUtil.java index a209961..fb55050 100644 --- a/app/src/main/java/com/example/musicplayer/util/CommonUtil.java +++ b/app/src/main/java/com/example/musicplayer/util/CommonUtil.java @@ -2,8 +2,13 @@ package com.example.musicplayer.util; import android.app.Activity; import android.content.Context; +import android.graphics.Bitmap; import android.graphics.Color; +import android.graphics.PorterDuff; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; import android.os.Build; +import android.support.annotation.Nullable; import android.text.Html; import android.view.View; import android.view.WindowManager; @@ -14,8 +19,15 @@ import android.widget.Toast; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.RequestOptions; +import com.bumptech.glide.request.target.SimpleTarget; +import com.bumptech.glide.request.target.Target; +import com.bumptech.glide.request.transition.Transition; import com.example.musicplayer.R; import com.example.musicplayer.constant.MyApplication; +import com.example.musicplayer.view.PlayActivity; + +import java.io.IOException; /** * Created by 残渊 on 2018/10/26. @@ -34,7 +46,7 @@ public class CommonUtil { View.SYSTEM_UI_FLAG_LAYOUT_STABLE); activity.getWindow().setStatusBarColor(Color.TRANSPARENT); } - }else { + } else { decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); activity.getWindow().setStatusBarColor(MyApplication.getContext().getResources().getColor(R.color.actionBarColor)); } @@ -70,13 +82,14 @@ public class CommonUtil { } return context.getResources().getDisplayMetrics().heightPixels; } + /** * EditText获取焦点并显示软键盘 */ //弹出软键盘 - public static void showKeyboard(EditText editText,Context context) { + public static void showKeyboard(EditText editText, Context context) { //其中editText为dialog中的输入框的 EditText - if(editText!=null){ + if (editText != null) { //设置可获得焦点 editText.setFocusable(true); editText.setFocusableInTouchMode(true); @@ -90,8 +103,9 @@ public class CommonUtil { /** * 关闭软键盘 + * * @param mEditText 输入框 - * @param context 上下文 + * @param context 上下文 */ public static void closeKeybord(EditText mEditText, Context context) { mEditText.clearFocus(); @@ -102,9 +116,57 @@ public class CommonUtil { /** * 使指定的字符串显示不同的颜色 */ - public static void showStringColor(String appointStr, String originalStr, TextView textView){ - originalStr = originalStr.replaceAll(appointStr, "" + appointStr+ ""); + public static void showStringColor(String appointStr, String originalStr, TextView textView) { + originalStr = originalStr.replaceAll(appointStr, "" + appointStr + ""); textView.setText(Html.fromHtml(originalStr)); } + //获取状态栏高度 + public static int getStatusHeightPx(Activity act) { + int height = 0; + int resourceId = act.getResources().getIdentifier("status_bar_height", "dimen", "android"); + if (resourceId > 0) { + height = act.getResources().getDimensionPixelSize(resourceId); + } + return height; + } + //高斯模糊 + public static Drawable getForegroundDrawable(Bitmap bitmap) { + /*得到屏幕的宽高比,以便按比例切割图片一部分*/ + final float widthHeightSize = (float) (DisplayUtil.getScreenWidth(MyApplication.getContext()) + * 1.0 / DisplayUtil.getScreenHeight(MyApplication.getContext()) * 1.0); + + int cropBitmapWidth = (int) (widthHeightSize * bitmap.getHeight()); + int cropBitmapWidthX = (int) ((bitmap.getWidth() - cropBitmapWidth) / 2.0); + + /*切割部分图片*/ + Bitmap cropBitmap = Bitmap.createBitmap(bitmap, cropBitmapWidthX, 0, cropBitmapWidth, + bitmap.getHeight()); + /*缩小图片*/ + Bitmap scaleBitmap = Bitmap.createScaledBitmap(cropBitmap, bitmap.getWidth() / 50, bitmap + .getHeight() / 50, false); + /*模糊化*/ + final Bitmap blurBitmap = FastBlurUtil.doBlur(scaleBitmap, 5, true); + + final Drawable foregroundDrawable = new BitmapDrawable(blurBitmap); + /*加入灰色遮罩层,避免图片过亮影响其他控件*/ + + return foregroundDrawable; + } + + public static Bitmap getImgBitmap(Context context,String imgUrl){ + SimpleTarget target = new SimpleTarget(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) { + @Override + public void onResourceReady(@Nullable Drawable resource, Transition transition) { + Bitmap bitmap = ((BitmapDrawable) resource).getBitmap(); + } + }; + Glide.with(context) + .load(imgUrl) + .apply(RequestOptions.placeholderOf(R.drawable.welcome)) + .apply(RequestOptions.errorOf(R.drawable.welcome)) + .into(target); + return null; + } + } diff --git a/app/src/main/java/com/example/musicplayer/view/AlbumContentFragment.java b/app/src/main/java/com/example/musicplayer/view/AlbumContentFragment.java new file mode 100644 index 0000000..75d28fa --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/view/AlbumContentFragment.java @@ -0,0 +1,166 @@ +package com.example.musicplayer.view; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentStatePagerAdapter; +import android.support.v7.app.ActionBar; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; +import com.bumptech.glide.request.target.SimpleTarget; +import com.bumptech.glide.request.target.Target; +import com.bumptech.glide.request.transition.Transition; +import com.example.musicplayer.R; +import com.example.musicplayer.util.CommonUtil; +import com.github.florent37.materialviewpager.MaterialViewPager; + +import javax.microedition.khronos.opengles.GL; + +/** + * Created by 残渊 on 2018/11/25. + */ + +public class AlbumContentFragment extends Fragment { + public static final String ALBUM_ID_KEY="id"; + private static final String ALBUM_NAME_KEY="albumName"; + private static final String SINGER_NAME_KEY="singerName"; + private static final String ALBUM_PIC_KEY="albumPic"; + public static final String PUBLIC_TIEM_KEY="publicTime"; + + private String mAlbumName,mSingerNmae,mAlbumPic,mPublicTime,mId; + + private MaterialViewPager mViewPager; + private Toolbar toolbar; + private RelativeLayout mAlbumBackground; + private TextView mSingerNameTv; + private TextView mPublicTimeTv; + private ImageView mAlbumPicIv; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + getBundle(); + View view = inflater.inflate(R.layout.fragment_album_content, container, false); + mViewPager = view.findViewById(R.id.materialViewPager); + toolbar = mViewPager.getToolbar(); + mAlbumBackground = mViewPager.getHeaderBackgroundContainer().findViewById(R.id.relative_album); + mAlbumPicIv = mViewPager.getHeaderBackgroundContainer().findViewById(R.id.iv_album); + mSingerNameTv = mViewPager.getHeaderBackgroundContainer().findViewById(R.id.tv_singer_name); + mPublicTimeTv = mViewPager.getHeaderBackgroundContainer().findViewById(R.id.tv_public_time); + return view; + } + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + initView(); + } + private void initView(){ + toolbar.setTitle(mAlbumName); + + SimpleTarget target = new SimpleTarget(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) { + @Override + public void onResourceReady(@Nullable Drawable resource, Transition transition) { + Bitmap bitmap = ((BitmapDrawable) resource).getBitmap(); + mAlbumBackground.setBackground(CommonUtil.getForegroundDrawable(bitmap)); + mAlbumPicIv.setImageBitmap(bitmap); + } + }; + Glide.with(getActivity()) + .load(mAlbumPic) + .apply(RequestOptions.placeholderOf(R.drawable.welcome)) + .apply(RequestOptions.errorOf(R.drawable.welcome)) + .into(target); + + + + mSingerNameTv.setText("歌手 "+mSingerNmae); + mPublicTimeTv.setText("发行时间 "+mPublicTime); + + toolbar.setTitleTextColor(getActivity().getResources().getColor(R.color.white)); + if (toolbar != null) { + ((AppCompatActivity)getActivity()).setSupportActionBar(toolbar); + + final ActionBar actionBar = ((AppCompatActivity)getActivity()).getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setDisplayShowHomeEnabled(true); + actionBar.setDisplayShowTitleEnabled(true); + actionBar.setDisplayUseLogoEnabled(false); + actionBar.setHomeButtonEnabled(true); + } + } + + mViewPager.getViewPager().setAdapter(new FragmentStatePagerAdapter(getActivity().getSupportFragmentManager()) { + + @Override + public Fragment getItem(int position) { + switch (position) { + case 0: + return AlbumSongFragment.newInstance(AlbumSongFragment.ALBUM_SONG,mId,mPublicTime); + case 1: + return AlbumSongFragment.newInstance(AlbumSongFragment.ALBUM_INFORATION,mId,mPublicTime); + default: + return null; + } + } + + @Override + public int getCount() { + return 2; + } + + @Override + public CharSequence getPageTitle(int position) { + switch (position) { + case 0: + return "歌曲列表"; + case 1: + return "专辑信息"; + } + return ""; + } + }); + + mViewPager.getPagerTitleStrip().setViewPager(mViewPager.getViewPager()); + mViewPager.getPagerTitleStrip().setIndicatorColorResource(R.color.yellow); + mViewPager.getPagerTitleStrip().setTabBackground(R.color.tab); + mViewPager.getPagerTitleStrip().setTextColorStateListResource(R.color.white); + + + } + + public static Fragment newInstance(String id,String albumName,String albumPic,String singerName,String publicTime){ + AlbumContentFragment albumContentFragment = new AlbumContentFragment(); + Bundle bundle = new Bundle(); + bundle.putString(ALBUM_ID_KEY,id); + bundle.putString(ALBUM_NAME_KEY,albumName); + bundle.putString(ALBUM_PIC_KEY,albumPic); + bundle.putString(SINGER_NAME_KEY,singerName); + bundle.putString(PUBLIC_TIEM_KEY,publicTime); + albumContentFragment.setArguments(bundle); + return albumContentFragment; + } + private void getBundle(){ + Bundle bundle =getArguments(); + if(bundle !=null){ + mId =bundle.getString(ALBUM_ID_KEY); + mAlbumName = bundle.getString(ALBUM_NAME_KEY); + mAlbumPic = bundle.getString(ALBUM_PIC_KEY); + mSingerNmae = bundle.getString(SINGER_NAME_KEY); + mPublicTime = bundle.getString(PUBLIC_TIEM_KEY); + } + } +} diff --git a/app/src/main/java/com/example/musicplayer/view/AlbumSongFragment.java b/app/src/main/java/com/example/musicplayer/view/AlbumSongFragment.java new file mode 100644 index 0000000..9f40196 --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/view/AlbumSongFragment.java @@ -0,0 +1,156 @@ +package com.example.musicplayer.view; + +import android.content.Intent; +import android.graphics.BitmapFactory; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.widget.NestedScrollView; +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.TextView; + +import com.example.musicplayer.R; +import com.example.musicplayer.adapter.AlbumSongAdapter; +import com.example.musicplayer.adapter.SearchContentAdapter; +import com.example.musicplayer.constant.Constant; +import com.example.musicplayer.contract.IAlbumSongContract; +import com.example.musicplayer.entiy.Album; +import com.example.musicplayer.entiy.AlbumSong; +import com.example.musicplayer.entiy.SeachSong; +import com.example.musicplayer.entiy.Song; +import com.example.musicplayer.presenter.AlbumSongPresenter; +import com.example.musicplayer.util.CommonUtil; +import com.example.musicplayer.util.FileHelper; +import com.github.florent37.materialviewpager.MaterialViewPagerHelper; +import com.github.florent37.materialviewpager.header.MaterialViewPagerHeaderDecorator; + +import java.util.List; + +import static com.example.musicplayer.view.SearchContentFragment.IS_ONLINE; + +/** + * Created by 残渊 on 2018/11/25. + */ + +public class AlbumSongFragment extends Fragment implements IAlbumSongContract.View{ + private static final String TYPE_KEY = "type_key"; + public static final int ALBUM_SONG = 0; + public static final int ALBUM_INFORATION = 1; + + private AlbumSongPresenter mPresenter; + private String mId; + + private NestedScrollView mScrollView; + private TextView mNameTv,mSingerTv,mDescTv,mCompany,mPublicTimeTv; + private int mType; + private String mPublicTime; + private String mDesc; + + + private List mSongsList; + private RecyclerView mRecycle; + private LinearLayoutManager mLinearManager; + private AlbumSongAdapter mAdapter; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + getBundle(); + View view = null; + if (mType == ALBUM_SONG) { + view = inflater.inflate(R.layout.fragment_album_recycler, container, false); + mRecycle = view.findViewById(R.id.recycler_song_list); + } else { + view = inflater.inflate(R.layout.fragment_album_song, container, false); + mScrollView = view.findViewById(R.id.scrollView); + mDescTv = view.findViewById(R.id.tv_desc); + mNameTv = view.findViewById(R.id.tv_album_name); + mSingerTv = view.findViewById(R.id.tv_singer); + mCompany = view.findViewById(R.id.tv_company); + mPublicTimeTv = view.findViewById(R.id.tv_public_time); + + } + + return view; + } + + @Override + public void onActivityCreated(Bundle save) { + super.onActivityCreated(save); + MaterialViewPagerHelper.registerScrollView(getActivity(), mScrollView); + mPresenter =new AlbumSongPresenter(); + mPresenter.attachView(this); + mPresenter.getAlbumDetail(mId,mType); + initView(); + } + private void initView(){ + + } + private void getBundle(){ + Bundle bundle = getArguments(); + if (bundle != null) { + mType = bundle.getInt(TYPE_KEY); + mId =bundle.getString(AlbumContentFragment.ALBUM_ID_KEY); + mPublicTime = bundle.getString(AlbumContentFragment.PUBLIC_TIEM_KEY); + } + } + + public static Fragment newInstance(int type, String id,String publicTime) { + AlbumSongFragment fragment = new AlbumSongFragment(); + Bundle bundle = new Bundle(); + bundle.putInt(TYPE_KEY, type); + bundle.putString(AlbumContentFragment.ALBUM_ID_KEY,id); + bundle.putString(AlbumContentFragment.PUBLIC_TIEM_KEY, publicTime); + fragment.setArguments(bundle); + return fragment; + } + + @Override + public void setAlbumSongList(final List songList) { + mLinearManager =new LinearLayoutManager(getActivity()); + mRecycle.setLayoutManager(mLinearManager); + mAdapter =new AlbumSongAdapter(songList); + mRecycle.addItemDecoration(new MaterialViewPagerHeaderDecorator()); + mRecycle.setAdapter(mAdapter); + + mAdapter.setSongClick(new AlbumSongAdapter.SongClick() { + @Override + public void onClick(int position) { + AlbumSong.DataBean.SongsBean dataBean= songList.get(position); + Song song = new Song(); + song.setArtist(dataBean.getSinger()); + song.setTitle(dataBean.getName()); + song.setUrl(dataBean.getUrl()); + song.setImgUrl(dataBean.getPic()); + song.setCurrent(FileHelper.getSong() == null ? 0 : FileHelper.getSong().getCurrent()); + FileHelper.saveSong(song); + + Intent intent = new Intent(getActivity(), PlayActivity.class); + intent.putExtra(IS_ONLINE, true); + startActivity(intent); + } + }); + } + + @Override + public void showAlbumSongError() { + CommonUtil.showToast(getActivity(),"获取专辑信息失败"); + } + + @Override + public void showAlbumMessage(String name, String singer, String company, String desc) { + mNameTv.setText(name); + mSingerTv.setText(singer); + mCompany.setText(company); + mDescTv.setText(desc); + mPublicTimeTv.setText(mPublicTime); + } + + @Override + public void showNetError() { + CommonUtil.showToast(getActivity(),"网络错误"); + } +} diff --git a/app/src/main/java/com/example/musicplayer/view/ContentFragment.java b/app/src/main/java/com/example/musicplayer/view/ContentFragment.java new file mode 100644 index 0000000..d10cb31 --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/view/ContentFragment.java @@ -0,0 +1,118 @@ +package com.example.musicplayer.view; + +import android.content.res.Resources; +import android.os.Bundle; +import android.support.design.widget.TabLayout; +import android.support.v4.app.Fragment; +import android.support.v4.view.ViewPager; +import android.util.TypedValue; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; + +import com.example.musicplayer.R; +import com.example.musicplayer.adapter.SearchAdapter; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by 残渊 on 2018/11/25. + */ + +public class ContentFragment extends Fragment { + + private List mTitleList; + private List mFragments; + private ViewPager mPager; + private SearchAdapter mAdapter; + private TabLayout mTabLayout; + private String[] mTitles = {"歌曲", "专辑"}; + private String[] mTypes = {"song", "album"}; + private Bundle mBundle; + private String mSeek; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_content, container, false); + mBundle = getArguments(); + if (mBundle != null) { + mSeek = mBundle.getString(SearchContentFragment.SEEK_KEY); + } + + mPager = view.findViewById(R.id.page); + mTabLayout = view.findViewById(R.id.tab_layout); + mTitleList = new ArrayList<>(); + mFragments = new ArrayList<>(); + + initTab(); + return view; + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + } + + private void initTab() { + for (int i = 0; i < mTitles.length; i++) { + mTitleList.add(mTitles[i]); + mFragments.add(SearchContentFragment.newInstance(mSeek, mTypes[i])); + } + mAdapter = new SearchAdapter(getChildFragmentManager(), mFragments, mTitleList); + mPager.setAdapter(mAdapter); + mTabLayout.setupWithViewPager(mPager); + mTabLayout.post(new Runnable() { + @Override + public void run() { + setIndicator(mTabLayout, 50, 50); + } + }); + + + } + + public static Fragment newInstance(String seek) { + ContentFragment fragment = new ContentFragment(); + Bundle bundle = new Bundle(); + bundle.putString(SearchContentFragment.SEEK_KEY, seek); + fragment.setArguments(bundle); + return fragment; + } + + + //修改tab指示线大小 + public static void setIndicator(TabLayout tabs, int leftDip, int rightDip) { + Class tabLayout = tabs.getClass(); + Field tabStrip = null; + try { + tabStrip = tabLayout.getDeclaredField("mTabStrip"); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + tabStrip.setAccessible(true); + LinearLayout llTab = null; + try { + llTab = (LinearLayout) tabStrip.get(tabs); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + int left = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, leftDip, Resources.getSystem().getDisplayMetrics()); + int right = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, rightDip, Resources.getSystem().getDisplayMetrics()); + for (int i = 0; i < llTab.getChildCount(); i++) { + View child = llTab.getChildAt(i); + child.setPadding(0, 0, 0, 0); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1); + params.leftMargin = left; + params.rightMargin = right; + child.setLayoutParams(params); + child.invalidate(); + } + } + + +} 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 973c843..0d6bb48 100644 --- a/app/src/main/java/com/example/musicplayer/view/LocalMusicFragment.java +++ b/app/src/main/java/com/example/musicplayer/view/LocalMusicFragment.java @@ -74,7 +74,6 @@ public class LocalMusicFragment extends Fragment implements ILocalMusicContract. @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - intentFilter=new IntentFilter(); intentFilter.addAction(BroadcastName.LOCAL_SONG_CHANGE_LIST); songChangeReceiver=new SongChangeLocalMusicReceiver(); diff --git a/app/src/main/java/com/example/musicplayer/view/SearchContentFragment.java b/app/src/main/java/com/example/musicplayer/view/SearchContentFragment.java index bb5adf5..9e20cf4 100644 --- a/app/src/main/java/com/example/musicplayer/view/SearchContentFragment.java +++ b/app/src/main/java/com/example/musicplayer/view/SearchContentFragment.java @@ -4,23 +4,22 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.media.MediaPlayer; import android.os.Bundle; -import android.provider.SyncStateContract; import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.EditText; import com.example.musicplayer.R; import com.example.musicplayer.adapter.SearchContentAdapter; import com.example.musicplayer.constant.BroadcastName; import com.example.musicplayer.constant.Constant; import com.example.musicplayer.contract.ISearchContentContract; +import com.example.musicplayer.entiy.Album; import com.example.musicplayer.entiy.SeachSong; import com.example.musicplayer.entiy.Song; import com.example.musicplayer.presenter.SearchContentPresenter; @@ -30,89 +29,99 @@ import com.github.jdsjlzx.interfaces.OnLoadMoreListener; import com.github.jdsjlzx.interfaces.OnNetWorkErrorListener; import com.github.jdsjlzx.recyclerview.LRecyclerView; import com.github.jdsjlzx.recyclerview.LRecyclerViewAdapter; -import com.github.jdsjlzx.recyclerview.ProgressStyle; -import java.io.IOException; -import java.lang.reflect.Field; import java.util.ArrayList; +import java.util.List; /** * Created by 残渊 on 2018/11/21. */ -public class SearchContentFragment extends Fragment implements ISearchContentContract.View{ - private static final String TAG="SearchContentFragment"; - public static final String IS_ONLINE="online"; - private int mOffset=1; //用于翻页搜索 +public class SearchContentFragment extends Fragment implements ISearchContentContract.View { + private static final String TAG = "SearchContentFragment"; + public static final String TYPE_KEY = "type"; + public static final String SEEK_KEY = "seek"; + public static final String IS_ONLINE = "online"; + private int mOffset = 1; //用于翻页搜索 + + private String mAlbumName,mSingerName,mAlbumPic,mPublicTime; private SearchContentPresenter mPresenter; private LRecyclerView mRecycler; private LinearLayoutManager manager; private SearchContentAdapter mAdapter; - private ArrayList mSongList=new ArrayList<>(); + private ArrayList mSongList = new ArrayList<>(); + private List mAlbumList; private SongFinishReceiver songChangeReceiver; private IntentFilter intentFilter; private LRecyclerViewAdapter mLRecyclerViewAdapter;//下拉刷新 + private Bundle mBundle; + private String mSeek; + private String mType; + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view=inflater.inflate(R.layout.fragment_search_content,container,false); + View view = inflater.inflate(R.layout.fragment_search_content, container, false); + mBundle = getArguments(); + if (mBundle != null) { + mSeek = mBundle.getString(SEEK_KEY); + mType = mBundle.getString(TYPE_KEY); + } + + mRecycler = view.findViewById(R.id.recycler_song_list); + + mPresenter = new SearchContentPresenter(); + mPresenter.attachView(this); + if (mType.equals("song")) { + mPresenter.search(mSeek, 1); + } else if (mType.equals("album")) { + mPresenter.searchAlbum(mSeek, 1); + } + searchMore(); return view; } @Override - public void onActivityCreated(Bundle savedInstanceState){ + public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - mRecycler = getActivity().findViewById(R.id.recycler_song_list); manager = new LinearLayoutManager(getActivity()); - mPresenter = new SearchContentPresenter(); - mPresenter.attachView(this); - mPresenter.search(getSeekContent(),1); - //注册广播 intentFilter = new IntentFilter(); intentFilter.addAction(BroadcastName.ONLINE_SONG_FINISH); SongFinishReceiver songFinishReceiver = new SongFinishReceiver(); - getActivity().registerReceiver(songFinishReceiver,intentFilter); + getActivity().registerReceiver(songFinishReceiver, intentFilter); - searchMore(); } - @Override - public String getSeekContent() { - Log.d(TAG, "getSeekContent: "+getArguments().getString("seek")); - return getArguments().getString("seek").trim(); - } @Override public void setSongsList(final ArrayList songListBeans) { mSongList.addAll(songListBeans); - mAdapter = new SearchContentAdapter(mSongList,getSeekContent(),getActivity()); + mAdapter = new SearchContentAdapter(mSongList, mSeek, getActivity(), Constant.TYPE_SONG); mLRecyclerViewAdapter = new LRecyclerViewAdapter(mAdapter); mRecycler.setLayoutManager(manager); mRecycler.setAdapter(mLRecyclerViewAdapter); - - mAdapter.setItemClick(new SearchContentAdapter.ItemClick() { @Override public void onClick(int position) { SeachSong.DataBean dataBean = mSongList.get(position); - Song song= new Song(); + Song song = new Song(); song.setArtist(dataBean.getSinger()); song.setTitle(dataBean.getName()); song.setUrl(dataBean.getUrl()); song.setImgUrl(dataBean.getPic()); - song.setCurrent(FileHelper.getSong()==null?0:FileHelper.getSong().getCurrent()); + song.setCurrent(FileHelper.getSong() == null ? 0 : FileHelper.getSong().getCurrent()); FileHelper.saveSong(song); - Intent intent=new Intent(getActivity(),PlayActivity.class); - intent.putExtra(IS_ONLINE,true); + Intent intent = new Intent(getActivity(), PlayActivity.class); + intent.putExtra(IS_ONLINE, true); startActivity(intent); } }); @@ -120,7 +129,7 @@ public class SearchContentFragment extends Fragment implements ISearchContentCon @Override public void searchMoreSuccess(ArrayList songListBeans) { - Log.d(TAG, "searchMoreSuccess: success="+songListBeans.size()); + Log.d(TAG, "searchMoreSuccess: success=" + songListBeans.size()); mSongList.addAll(songListBeans); mAdapter.notifyDataSetChanged(); mRecycler.refreshComplete(Constant.OFFSET); @@ -139,20 +148,24 @@ public class SearchContentFragment extends Fragment implements ISearchContentCon @Override public void onLoadMore() { mOffset += 1; - Log.d(TAG, "onLoadMore: mOffset="+mOffset); - mPresenter.searchMore(getSeekContent(),mOffset); + Log.d(TAG, "onLoadMore: mOffset=" + mOffset); + if (mType.equals("song")) { + mPresenter.searchMore(mSeek, mOffset); + }else{ + mPresenter.searchAlbumMore(mSeek,mOffset); + } } }); //设置底部加载颜色 - mRecycler.setFooterViewColor(R.color.colorAccent, R.color.musicStyle_low ,R.color.translucent); + mRecycler.setFooterViewColor(R.color.colorAccent, R.color.musicStyle_low, R.color.translucent); //设置底部加载文字提示 - mRecycler.setFooterViewHint("拼命加载中","已经全部为你呈现了","网络不给力啊,点击再试一次吧"); + mRecycler.setFooterViewHint("拼命加载中", "已经全部为你呈现了", "网络不给力啊,点击再试一次吧"); } @Override public void showError() { - CommonUtil.showToast(getActivity(),"连接超时"); + CommonUtil.showToast(getActivity(), "连接超时"); } @Override @@ -161,10 +174,54 @@ public class SearchContentFragment extends Fragment implements ISearchContentCon @Override public void reload() { mOffset += 1; - mPresenter.searchMore(getSeekContent(),mOffset); + mPresenter.searchMore(mSeek, mOffset); } }); } + + @Override + public void searchAlbumSuccess(final List albumList) { + mAlbumList = new ArrayList<>(); + mAlbumList.addAll(albumList); + mAdapter = new SearchContentAdapter(mAlbumList, mSeek, getActivity(), Constant.TYPE_ALBUM); + mLRecyclerViewAdapter = new LRecyclerViewAdapter(mAdapter); + mRecycler.setLayoutManager(manager); + mRecycler.setAdapter(mLRecyclerViewAdapter); + + mAdapter.setAlbumClick(new SearchContentAdapter.AlbumClick() { + @Override + public void onClick(int position) { + toAlbumContentFragment(mAlbumList.get(position)); + } + }); + } + + @Override + public void searchAlbumMoreSuccess(List songListBeans) { + mAlbumList.addAll(songListBeans); + mAdapter.notifyDataSetChanged(); + mRecycler.refreshComplete(Constant.OFFSET); + } + + @Override + public void searchAlbumError() { + CommonUtil.showToast(getActivity(), "获取专辑信息失败"); + } + + /** + * 构造带参数的fragment + * + * @param type 参数 + */ + public static Fragment newInstance(String seek, String type) { + SearchContentFragment fragment = new SearchContentFragment(); + Bundle bundle = new Bundle(); + bundle.putString(TYPE_KEY, type); + bundle.putString(SEEK_KEY, seek); + fragment.setArguments(bundle); + return fragment; + } + class SongFinishReceiver extends BroadcastReceiver { @Override @@ -172,4 +229,16 @@ public class SearchContentFragment extends Fragment implements ISearchContentCon mAdapter.notifyDataSetChanged(); } } + + public void toAlbumContentFragment(Album.DataBean album){ + FragmentManager manager = getActivity().getSupportFragmentManager(); + FragmentTransaction transaction = manager.beginTransaction(); + transaction.setCustomAnimations(R.anim.fragment_in, R.anim.fragment_out, R.anim.slide_in_right, R.anim.slide_out_right); + transaction.add(R.id.fragment_container,AlbumContentFragment. + newInstance(album.getAlbumMID(),album.getAlbumName(),album.getAlbumPic(),album.getSingerName(),album.getPublicTime())); + transaction.hide(this); + //将事务提交到返回栈 + transaction.addToBackStack(null); + transaction.commit(); + } } diff --git a/app/src/main/java/com/example/musicplayer/view/SearchFragment.java b/app/src/main/java/com/example/musicplayer/view/SearchFragment.java index 3e04ec3..424054a 100644 --- a/app/src/main/java/com/example/musicplayer/view/SearchFragment.java +++ b/app/src/main/java/com/example/musicplayer/view/SearchFragment.java @@ -23,7 +23,6 @@ public class SearchFragment extends Fragment { private static final String TAG = "SearchFragment"; private EditText mSeekEdit; private TextView mSeekTv; - private SearchContentFragment mSearchContentFragment; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -62,12 +61,7 @@ public class SearchFragment extends Fragment { FragmentManager manager = getActivity().getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); - mSearchContentFragment = new SearchContentFragment(); - Bundle bundle = new Bundle(); - Log.d(TAG, "seek:" + mSeekEdit.getText().toString()); - bundle.putString("seek", mSeekEdit.getText().toString()); - mSearchContentFragment.setArguments(bundle); - transaction.replace(R.id.container, mSearchContentFragment); + transaction.replace(R.id.container, ContentFragment.newInstance(mSeekEdit.getText().toString())); transaction.commit(); } } diff --git a/app/src/main/java/com/example/musicplayer/widget/CustomDrawerLayout.java b/app/src/main/java/com/example/musicplayer/widget/CustomDrawerLayout.java new file mode 100644 index 0000000..48f47b7 --- /dev/null +++ b/app/src/main/java/com/example/musicplayer/widget/CustomDrawerLayout.java @@ -0,0 +1,36 @@ +package com.example.musicplayer.widget; + +import android.content.Context; +import android.support.v4.widget.DrawerLayout; +import android.util.AttributeSet; + +/** + * Created by 残渊 on 2018/11/26. + */ + + +public class CustomDrawerLayout extends DrawerLayout { + + public CustomDrawerLayout(Context context) { + super(context); + } + + public CustomDrawerLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public CustomDrawerLayout(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + widthMeasureSpec = MeasureSpec.makeMeasureSpec( + MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY); + heightMeasureSpec = MeasureSpec.makeMeasureSpec( + MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.EXACTLY); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + +} + diff --git a/app/src/main/res/drawable-xxhdpi/jay.jpg b/app/src/main/res/drawable-xxhdpi/jay.jpg new file mode 100644 index 0000000..1fd1f0f Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/jay.jpg differ diff --git a/app/src/main/res/layout/fragment_album_content.xml b/app/src/main/res/layout/fragment_album_content.xml new file mode 100644 index 0000000..e93430d --- /dev/null +++ b/app/src/main/res/layout/fragment_album_content.xml @@ -0,0 +1,32 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_album_recycler.xml b/app/src/main/res/layout/fragment_album_recycler.xml new file mode 100644 index 0000000..ea20f01 --- /dev/null +++ b/app/src/main/res/layout/fragment_album_recycler.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_album_song.xml b/app/src/main/res/layout/fragment_album_song.xml new file mode 100644 index 0000000..e45f938 --- /dev/null +++ b/app/src/main/res/layout/fragment_album_song.xml @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_content.xml b/app/src/main/res/layout/fragment_content.xml new file mode 100644 index 0000000..753756c --- /dev/null +++ b/app/src/main/res/layout/fragment_content.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_search_content.xml b/app/src/main/res/layout/fragment_search_content.xml index bf3ce34..1c8ef10 100644 --- a/app/src/main/res/layout/fragment_search_content.xml +++ b/app/src/main/res/layout/fragment_search_content.xml @@ -3,11 +3,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> - - + + + + + + + + + + + + diff --git a/app/src/main/res/layout/header_logo.xml b/app/src/main/res/layout/header_logo.xml new file mode 100644 index 0000000..d5dde14 --- /dev/null +++ b/app/src/main/res/layout/header_logo.xml @@ -0,0 +1,26 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/my_tabs.xml b/app/src/main/res/layout/my_tabs.xml new file mode 100644 index 0000000..7c534f2 --- /dev/null +++ b/app/src/main/res/layout/my_tabs.xml @@ -0,0 +1,17 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/recycler_album_item.xml b/app/src/main/res/layout/recycler_album_item.xml new file mode 100644 index 0000000..c832e96 --- /dev/null +++ b/app/src/main/res/layout/recycler_album_item.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/recycler_song_item.xml b/app/src/main/res/layout/recycler_song_item.xml index 6d9077a..3970b3c 100644 --- a/app/src/main/res/layout/recycler_song_item.xml +++ b/app/src/main/res/layout/recycler_song_item.xml @@ -48,6 +48,6 @@ android:layout_alignParentBottom="true" android:layout_marginStart="10dp" android:layout_width="match_parent" - android:layout_height="1dip" + android:layout_height="0.1dip" android:background="@color/gray" /> \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index af02825..6cfe092 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -13,10 +13,13 @@ #80FFFFFF #80010738 #99010738 + #2e3259 #050e41 #00000000 #2ad3df #081038 #bcb9b9 #FFC66D + #caeefc + #a7bfc4 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index cae771d..4497f4e 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -14,8 +14,20 @@ @color/musicStyle + + - + - + +