修复:

修复主列表偶尔闪退问题
修复专辑混乱问题
修复播放界面到主列表动画错乱问题
修复主列表返回播放界面动画失效问题
修复专辑列表图片不显示问题
修复进入专辑详情时图片丢失问题
修复加载动画异常展示问题
修复文件下载遇到/处理成路径问题
优化文件下载遇到非200时不再下载
修复通知栏一直弹的问题
修复播放列表图片错乱问题
修复专辑列表返回键没反应问题
UI:
专辑列表新增播放全部功能
播放界面新增播放列表数量显示
点击播放模式会toast提示
改动:
主列表ListView改成RecyclerView
加载图片使用压缩后图片
This commit is contained in:
Yutousama 2022-05-18 18:42:59 +08:00
parent 17272ec4d3
commit fb21c238d0
26 changed files with 902 additions and 795 deletions

View File

@ -63,7 +63,7 @@ dependencies {
//noinspection GradleCompatible //noinspection GradleCompatible
implementation 'com.android.support:support-media-compat:28.0.0' implementation 'com.android.support:support-media-compat:28.0.0'
implementation 'androidx.palette:palette:1.0.0' implementation 'androidx.palette:palette-ktx:1.0.0'
implementation 'com.github.zrunker:ZTextView:v1.0.2' implementation 'com.github.zrunker:ZTextView:v1.0.2'
//debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.5' // //debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.5' //

View File

@ -26,15 +26,17 @@
<activity <activity
android:name=".views.MainActivity" android:name=".views.MainActivity"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
android:launchMode="singleInstance" android:launchMode="singleTask"
android:theme="@style/Theme.AppCompat.DayNight.NoActionBar" /> android:theme="@style/Theme.AppCompat.DayNight.NoActionBar" />
<activity <activity
android:name=".views.PlayLibsActivity" android:name=".views.PlayLibsActivity"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
android:launchMode="singleTask"
android:theme="@style/Theme.AppCompat.DayNight.NoActionBar" /> android:theme="@style/Theme.AppCompat.DayNight.NoActionBar" />
<activity <activity
android:name=".views.AlbumsActivity" android:name=".views.AlbumsActivity"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
android:launchMode="singleTask"
android:theme="@style/Theme.AppCompat.DayNight.NoActionBar" /> android:theme="@style/Theme.AppCompat.DayNight.NoActionBar" />
<service <service

View File

@ -2,8 +2,7 @@ package com.yutou.nas_music_player.Adapters;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.graphics.Bitmap;
import android.renderscript.AllocationAdapter;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -13,19 +12,16 @@ import android.widget.LinearLayout;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.alibaba.fastjson.JSONObject;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.RequestOptions;
import com.kaopiz.kprogresshud.KProgressHUD;
import com.yutou.nas_music_player.Datas.MusicData; import com.yutou.nas_music_player.Datas.MusicData;
import com.yutou.nas_music_player.Interfaces.NetworkInterface; import com.yutou.nas_music_player.Interfaces.NetworkInterface;
import com.yutou.nas_music_player.R; import com.yutou.nas_music_player.R;
import com.yutou.nas_music_player.containers.MediaBrowserHelper; import com.yutou.nas_music_player.containers.MediaBrowserHelper;
import com.yutou.nas_music_player.containers.MusicContainer; import com.yutou.nas_music_player.containers.MusicContainer;
import com.yutou.nas_music_player.tools.AppTools; import com.yutou.nas_music_player.tools.AppData;
import java.util.List; import java.util.List;
@ -39,13 +35,14 @@ public class AlbumsRecyclerAdapter extends RecyclerView.Adapter<AlbumsRecyclerAd
int model; int model;
int fid; int fid;
public AlbumsRecyclerAdapter(Context context, List<MusicData> list,int model) { public AlbumsRecyclerAdapter(Context context, List<MusicData> list, int model) {
this.list = list; this.list = list;
this.context = context; this.context = context;
this.model=model; this.model = model;
} }
public void setFid(int fid){
this.fid=fid; public void setFid(int fid) {
this.fid = fid;
} }
@NonNull @NonNull
@ -53,7 +50,8 @@ public class AlbumsRecyclerAdapter extends RecyclerView.Adapter<AlbumsRecyclerAd
public AlbumHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public AlbumHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new AlbumHolder(LayoutInflater.from(context).inflate(R.layout.layout_music_libs_item, parent, false)); return new AlbumHolder(LayoutInflater.from(context).inflate(R.layout.layout_music_libs_item, parent, false));
} }
public void onStop(){
public void onStop() {
list.clear(); list.clear();
} }
@ -64,30 +62,34 @@ public class AlbumsRecyclerAdapter extends RecyclerView.Adapter<AlbumsRecyclerAd
holder.title.setText(data.getTitle()); holder.title.setText(data.getTitle());
holder.artist.setText(data.getArtist()); holder.artist.setText(data.getArtist());
holder.icon.setImageResource(R.drawable.ic_dir); holder.icon.setImageResource(R.drawable.ic_dir);
System.out.println("icon.getTag() = " + holder.icon.getTag()+" title = "+data.getTitle());
if (!data.isDir()) { if (!data.isDir()) {
holder.message.setText(data.getBitRate() + "kbps | " + data.getSampleRate() + "hz | " + data.getEncodingType()); holder.message.setText(data.getBitRate() + "kbps | " + data.getSampleRate() + "hz | " + data.getEncodingType());
holder.message.setVisibility(View.VISIBLE); holder.message.setVisibility(View.VISIBLE);
holder.artist.setVisibility(View.VISIBLE); holder.artist.setVisibility(View.VISIBLE);
// holder.icon.setImageBitmap(ThumbnailUtils.extractThumbnail(data.getImg(), 64,64)); // holder.icon.setImageBitmap(ThumbnailUtils.extractThumbnail(data.getImg(), 64,64));
data.getImg(-1, -1, new NetworkInterface() { if (holder.icon.getTag() == null) {
@Override data.getImg(AppData.minImageWidth, AppData.minImageHigh, new NetworkInterface() {
public void httpGetData(Object data, int state) { @Override
Glide.with(context).load(data) public void httpGetData(Object data, int state) {
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(25, 3))) Glide.with(context).load((Bitmap) data)
.into(holder.icon); .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(25, 3)))
} .into(holder.icon);
@Override }
public void httpError(Exception e) {
} @Override
}); public void httpError(Exception e) {
}
});
}
holder.icon.setOnClickListener(new View.OnClickListener() { holder.icon.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (data.getImg(-1, -1) != null) { if (data.getImg(AppData.minImageWidth, AppData.minImageHigh) != null) {
Glide.with(context).load(data.getImg(-1, -1)) Glide.with(context).load(data.getImg(AppData.minImageWidth, AppData.minImageHigh))
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(25, 3))) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(25, 3)))
.into(holder.icon); .into(holder.icon);
} }
@ -109,7 +111,7 @@ public class AlbumsRecyclerAdapter extends RecyclerView.Adapter<AlbumsRecyclerAd
} }
}); });
holder.collection.setOnClickListener(view->{ holder.collection.setOnClickListener(view -> {
MusicContainer.getLibs().removeCollection(fid, new NetworkInterface() { MusicContainer.getLibs().removeCollection(fid, new NetworkInterface() {
@Override @Override
public void httpGetData(Object data, int state) { public void httpGetData(Object data, int state) {
@ -122,10 +124,18 @@ public class AlbumsRecyclerAdapter extends RecyclerView.Adapter<AlbumsRecyclerAd
} }
}, data); }, data);
}); });
holder.layout.setOnClickListener(view -> browserHelper.play(data)); holder.layout.setOnClickListener(view -> {
if(MusicContainer.getInstance().getNowPlayData().getMd5().equals(data.getMd5())){ browserHelper.play(data);
if (MusicContainer.getInstance().getNowPlayData().getMd5().equals(data.getMd5())) {
holder.play_mask.setVisibility(View.VISIBLE);
} else {
holder.play_mask.setVisibility(View.GONE);
}
notifyDataSetChanged();
});
if (MusicContainer.getInstance().getNowPlayData().getMd5().equals(data.getMd5())) {
holder.play_mask.setVisibility(View.VISIBLE); holder.play_mask.setVisibility(View.VISIBLE);
}else{ } else {
holder.play_mask.setVisibility(View.GONE); holder.play_mask.setVisibility(View.GONE);
} }
} }
@ -143,6 +153,10 @@ public class AlbumsRecyclerAdapter extends RecyclerView.Adapter<AlbumsRecyclerAd
this.browserHelper = browserHelper; this.browserHelper = browserHelper;
} }
public List<MusicData> getMusicDatas() {
return list;
}
public static class AlbumHolder extends RecyclerView.ViewHolder { public static class AlbumHolder extends RecyclerView.ViewHolder {
MarqueeTextView title, artist, message; MarqueeTextView title, artist, message;
LinearLayout buttons, layout; LinearLayout buttons, layout;

View File

@ -1,64 +1,66 @@
package com.yutou.nas_music_player.Adapters; package com.yutou.nas_music_player.Adapters;
import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.media.ThumbnailUtils;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.Toast; import android.widget.Toast;
import com.alibaba.fastjson.JSONArray; import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.recyclerview.widget.RecyclerView;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.RequestOptions;
import com.kaopiz.kprogresshud.KProgressHUD; import com.kaopiz.kprogresshud.KProgressHUD;
import com.yutou.nas_music_player.Datas.MusicData; import com.yutou.nas_music_player.Datas.MusicData;
import com.yutou.nas_music_player.Interfaces.NetworkInterface; import com.yutou.nas_music_player.Interfaces.NetworkInterface;
import com.yutou.nas_music_player.MyApplication;
import com.yutou.nas_music_player.R; import com.yutou.nas_music_player.R;
import com.yutou.nas_music_player.containers.MediaBrowserHelper;
import com.yutou.nas_music_player.containers.MusicContainer; import com.yutou.nas_music_player.containers.MusicContainer;
import com.yutou.nas_music_player.tools.AppData; import com.yutou.nas_music_player.tools.AppData;
import com.yutou.nas_music_player.tools.AppTools; import com.yutou.nas_music_player.tools.AppTools;
import com.yutou.nas_music_player.tools.NetworkTool;
import com.yutou.nas_music_player.tools.StringUtil; import com.yutou.nas_music_player.tools.StringUtil;
import com.yutou.nas_music_player.views.AlbumsActivity;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Objects;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.recyclerview.widget.RecyclerView;
import cc.ibooker.ztextviewlib.MarqueeTextView; import cc.ibooker.ztextviewlib.MarqueeTextView;
import jp.wasabeef.glide.transformations.RoundedCornersTransformation; import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
public class MusicLibsAdapter extends ArrayAdapter<MusicData> { public class MusicLibsAdapter extends RecyclerView.Adapter<MusicLibsAdapter.ViewHolder> {
public static final int LIBS_MODEL_ALL = 0; public static final int LIBS_MODEL_ALL = 0;
public static final int LIBS_MODEL_Album = 1; public static final int LIBS_MODEL_Album = 1;
public static final int LIBS_MODEL_Artist = 2; public static final int LIBS_MODEL_Artist = 2;
public static final int LIBS_MODEL_Tmp = 3; public static final int LIBS_MODEL_Tmp = 3;
public static final int LIBS_MODEL_PLAY_LIST = 4; public static final int LIBS_MODEL_PLAY_LIST = 4;
public static final int LIBS_MODEL_PLAY_Collection = 5; public static final int LIBS_MODEL_PLAY_Collection = 5;
KProgressHUD hud;
List<MusicData> list;
Context context;
public MusicLibsAdapter(Context context, int model) { public interface OnClickAction{
super(context, R.layout.layout_music_libs_item); void onClick(Intent intent,View view);
list = new ArrayList<>(); }
protected OnClickAction clickAction;
public void setOnClickAction(OnClickAction onClickAction) {
this.clickAction=onClickAction;
}
List<MusicData> list = new ArrayList<>();
Context context;
MediaBrowserHelper browserHelper;
public MusicLibsAdapter(Context context) {
this.context = context; this.context = context;
initData(model, true);
} }
private int model = -1; private int model = -1;
@ -67,140 +69,21 @@ public class MusicLibsAdapter extends ArrayAdapter<MusicData> {
public void initData(int model, boolean init) { public void initData(int model, boolean init) {
this.model = model; this.model = model;
list.clear(); //list.clear();
if (!init)
hud = AppTools.showLoading(context);
System.out.println("填充序列 设置model " + model + " " + this.model + " &"); System.out.println("填充序列 设置model " + model + " " + this.model + " &");
Map<String, List<MusicData>> map;
switch (model) {
case LIBS_MODEL_Album:
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
String album = null;
MusicContainer.getLibs().onAlbumMusicData(album, new NetworkInterface() {
@Override
public void httpGetData(Object data, int state) {
list.clear();
if (data != null && state == 0)
list.addAll((List<MusicData>) data);
notifyDataSetChanged();
if (hud != null)
hud.dismiss();
}
@Override
public void httpError(Exception e) {
if (hud != null)
hud.dismiss();
}
});
}
}).start();
break;
case LIBS_MODEL_Artist:
break;
case LIBS_MODEL_Tmp:
list.addAll(MusicContainer.getInstance().getTmpPlayList());
System.out.println("临时播放列表:" + MusicContainer.getInstance().getTmpPlayList().size());
if (hud != null)
hud.dismiss();
break;
case LIBS_MODEL_PLAY_LIST:
list.addAll(MusicContainer.getInstance().getPlayList());
break;
case LIBS_MODEL_PLAY_Collection:
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
MusicContainer.getLibs().onCollectionList(null, new NetworkInterface() {
@Override
public void httpGetData(Object data, int state) {
list.clear();
if (data != null && state == 0)
list.addAll((List<MusicData>) data);
notifyDataSetChanged();
if (hud != null)
hud.dismiss();
}
@Override
public void httpError(Exception e) {
if (hud != null)
hud.dismiss();
}
});
}
}).start();
list = new ArrayList<>();
break;
case LIBS_MODEL_ALL:
default:
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
MusicContainer.getLibs().onDirMusicData(musicPath, new NetworkInterface() {
@Override
public void httpGetData(Object data, int state) {
list.clear();
if (data != null && state == 0)
list.addAll((List<MusicData>) data);
AppData.handler.post(new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
if (hud != null)
hud.dismiss();
}
});
}
@Override
public void httpError(Exception e) {
if (hud != null)
hud.dismiss();
}
});
}
}).start();
}
} }
@Override
public int getItemViewType(int position) {
return model;
}
public void initData(int model) { public void initData(int model) {
initData(model, false); initData(model, false);
} }
@Override
public int getCount() {
super.getCount();
int size = list.size();
System.out.println("列表数量:" + size);
return list.size();
}
@Nullable
@Override
public MusicData getItem(int position) {
return list.get(position);
}
private int scrollStatus = 0; private int scrollStatus = 0;
@ -209,199 +92,6 @@ public class MusicLibsAdapter extends ArrayAdapter<MusicData> {
} }
@SuppressLint("SetTextI18n")
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.layout_music_libs_item, null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
MusicData data = list.get(position);
holder.title.setText(data.getTitle());
holder.artist.setText(data.getArtist());
holder.icon.setImageResource(R.drawable.ic_dir);
if (model == LIBS_MODEL_PLAY_Collection) {
holder.collection.setVisibility(View.GONE);
} else {
holder.collection.setVisibility(View.VISIBLE);
}
if (!data.isDir()) {
if (model != LIBS_MODEL_Album && model != LIBS_MODEL_Artist) {
if (model == LIBS_MODEL_PLAY_Collection) {
holder.message.setText("" + data.getComment() + " 首歌");
} else {
holder.message.setText(data.getBitRate() + "kbps | " + data.getSampleRate() + "hz | " + data.getEncodingType());
}
holder.message.setVisibility(View.VISIBLE);
holder.artist.setVisibility(View.VISIBLE);
} else {//为专辑或艺术家
holder.message.setVisibility(View.GONE);
holder.artist.setVisibility(View.GONE);
}
// holder.icon.setImageBitmap(ThumbnailUtils.extractThumbnail(data.getImg(), 64,64));
showImage(data, holder);
holder.icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (data.getImg(-1, -1) != null) {
Glide.with(getContext()).load(data.getImg(-1, -1))
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(25, 3)))
.into(holder.icon);
}
}
});
} else {
holder.message.setText("");
holder.play_mask.setVisibility(View.GONE);
holder.icon.setImageResource(R.drawable.ic_dir);
}
if (MusicContainer.getInstance().getNowPlayData().getMd5().equals(data.getMd5())) {
holder.play_mask.setVisibility(View.VISIBLE);
} else {
holder.play_mask.setVisibility(View.GONE);
}
holder.collection.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (data.isDir()) {
if (model == LIBS_MODEL_Album) {//添加整个专辑
MusicContainer.getLibs().onAlbumMusicData(data.getAlbum(), new NetworkInterface() {
@Override
public void httpGetData(Object md, int state) {
List<MusicData> list = (List<MusicData>) md;
MusicContainer.getLibs().onAddCollectionDir(context, list.toArray(new MusicData[0]));
}
@Override
public void httpError(Exception e) {
}
});
} else {//添加整个文件夹
JSONObject json = new JSONObject();
json.put("path", data.getFile());
json.put("type", true);
MusicContainer.getLibs().onDirMusicData(json, new NetworkInterface() {
@Override
public void httpGetData(Object data, int state) {
List<MusicData> list = (List<MusicData>) data;
MusicContainer.getLibs().onAddCollectionDir(context, list.toArray(new MusicData[0]));
}
@Override
public void httpError(Exception e) {
}
});
}
} else {//单曲
MusicContainer.getLibs().onAddCollectionDir(context, data);
}
}
});
holder.top.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("model = " + model);
if (model == LIBS_MODEL_Album) {
addAlbumList(data.getTitle());
} else if (data.isDir()) {
showAddTmpListDialog(data);
} else {
MusicContainer.getInstance().addTmpList(data);
Toast.makeText(getContext(), "已添加到队列中", Toast.LENGTH_LONG).show();
for (MusicData musicData : MusicContainer.getInstance().getTmpPlayList()) {
System.out.println("临时队列:" + musicData.getTitle());
}
}
}
private void addAlbumList(String album) {
System.out.println("添加专辑:" + album);
MusicContainer.getLibs().onAlbumMusicData(album, new NetworkInterface() {
@Override
public void httpGetData(Object data, int state) {
List<MusicData> list = (List<MusicData>) data;
for (MusicData musicData : list) {
System.out.println(musicData.getTitle() + "| 专辑名 =" + musicData.getAlbum());
MusicContainer.getInstance().addTmpList(musicData);
}
Toast.makeText(getContext(), "已添加到队列中", Toast.LENGTH_LONG).show();
}
@Override
public void httpError(Exception e) {
}
});
}
private void showAddTmpListDialog(MusicData data) {
AlertDialog dialog = new AlertDialog.Builder(getContext())
.setTitle("添加文件夹到队列")
.setMessage("将文件夹中所有歌曲添加到队列?")
.setPositiveButton("添加", new DialogInterface.OnClickListener() {
KProgressHUD hud;
@Override
public void onClick(DialogInterface dialog, int which) {
hud = AppTools.showLoading(getContext());
JSONObject json = new JSONObject();
json.put("path", data.getFile());
json.put("type", true);
MusicContainer.getLibs().onDirMusicData(json, new NetworkInterface() {
@Override
public void httpGetData(Object data, int state) {
List<MusicData> list = (List<MusicData>) data;
for (MusicData musicData : list) {
MusicContainer.getInstance().addTmpList(musicData);
hud.dismiss();
}
}
@Override
public void httpError(Exception e) {
}
});
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).create();
dialog.show();
}
});
return convertView;
}
private void showImage(MusicData musicData, ViewHolder holder) {
musicData.getImg(-1, -1, new NetworkInterface() {
@Override
public void httpGetData(Object data, int state) {
Glide.with(getContext()).load((Bitmap) data)
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(25, 3)))
.into(holder.icon);
System.out.println("展示图片:" + state);
}
@Override
public void httpError(Exception e) {
System.out.println("图片下载失败");
}
});
}
public void onDestroy() { public void onDestroy() {
} }
@ -417,8 +107,97 @@ public class MusicLibsAdapter extends ArrayAdapter<MusicData> {
return model; return model;
} }
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.layout_music_libs_item, parent, false);
switch (viewType) {
case LIBS_MODEL_Album:
return new ViewHolderAlbum(view);
case LIBS_MODEL_PLAY_Collection:
return new ViewHolderCollection(view);
default:
return new ViewHolderAll(view);
}
}
public static class ViewHolder extends RecyclerView.ViewHolder { @Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.bind(list.get(position));
System.out.println("list.size() = " + list.size());
}
@Override
public int getItemCount() {
return list.size();
}
public MusicData getItem(int position) {
return list.get(position);
}
public void setBrowserHelper(MediaBrowserHelper browserHelper) {
this.browserHelper = browserHelper;
}
public void setModel(int model) {
this.model=model;
}
public class ViewHolderCollection extends ViewHolder {
ViewHolderCollection(View itemView) {
super(itemView);
}
@Override
public void bind(MusicData data) {
super.bind(data);
collection.setVisibility(View.GONE);
message.setText("" + data.getComment() + " 首歌");
message.setVisibility(View.VISIBLE);
artist.setVisibility(View.VISIBLE);
collectionDir(data);
topDir(data);
itemView.setOnClickListener(v -> clickCollection(data));
icon.setImageResource(R.drawable.ic_dir);
}
}
public class ViewHolderAll extends ViewHolder {
ViewHolderAll(View itemView) {
super(itemView);
}
@Override
public void bind(MusicData data) {
super.bind(data);
collectionDir(data);
topDir(data);
itemView.setOnClickListener(v -> clickAllList(data));
}
}
public class ViewHolderAlbum extends ViewHolder {
ViewHolderAlbum(View itemView) {
super(itemView);
}
@Override
public void bind(MusicData data) {
super.bind(data);
message.setVisibility(View.GONE);
collectionAlbum(data);
topAlbum(data);
itemView.setOnClickListener(v -> clickAlbum(data));
}
}
public class ViewHolder extends RecyclerView.ViewHolder {
MarqueeTextView title, artist, message; MarqueeTextView title, artist, message;
LinearLayout buttons; LinearLayout buttons;
ImageButton collection, top, dislike; ImageButton collection, top, dislike;
@ -436,5 +215,252 @@ public class MusicLibsAdapter extends ArrayAdapter<MusicData> {
icon = itemView.findViewById(R.id.album_image); icon = itemView.findViewById(R.id.album_image);
play_mask = itemView.findViewById(R.id.play_mask); play_mask = itemView.findViewById(R.id.play_mask);
} }
protected void collectionDir(MusicData data) {
collection.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (data.isDir()) {
JSONObject json = new JSONObject();
json.put("path", data.getFile());
json.put("type", true);
MusicContainer.getLibs().onDirMusicData(json, new NetworkInterface() {
@Override
public void httpGetData(Object data1, int state) {
List<MusicData> list = (List<MusicData>) data1;
MusicContainer.getLibs().onAddCollectionDir(itemView.getContext(), list.toArray(new MusicData[0]));
}
@Override
public void httpError(Exception e) {
}
});
} else {
MusicContainer.getLibs().onAddCollectionDir(itemView.getContext(), data);
}
}
});
}
protected void collectionAlbum(MusicData data) {
collection.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (data.isDir()) {
MusicContainer.getLibs().onAlbumMusicData(data.getAlbum(), new NetworkInterface() {
@Override
public void httpGetData(Object md, int state) {
List<MusicData> list = (List<MusicData>) md;
MusicContainer.getLibs().onAddCollectionDir(itemView.getContext(), list.toArray(new MusicData[0]));
}
@Override
public void httpError(Exception e) {
}
});
} else {
MusicContainer.getLibs().onAddCollectionDir(itemView.getContext(), data);
}
}
});
}
protected void topAlbum(MusicData data) {
top.setOnClickListener(v -> addAlbumList(data.getTitle()));
}
public void topDir(MusicData data) {
top.setOnClickListener(v -> {
if (data.isDir()) {
showAddTmpListDialog(data);
} else {
MusicContainer.getInstance().addTmpList(data);
Toast.makeText(v.getContext(), "已添加到队列中", Toast.LENGTH_LONG).show();
for (MusicData musicData : MusicContainer.getInstance().getTmpPlayList()) {
System.out.println("临时队列:" + musicData.getTitle());
}
}
});
}
protected void clickCollection(MusicData data) {
if (data == null)
return;
if (StringUtil.isEmpty(data.getComment())) {
Toast.makeText(itemView.getContext(), "未收藏任何歌曲", Toast.LENGTH_LONG).show();
return;
}
Intent intent = new Intent(itemView.getContext(), AlbumsActivity.class);
intent.putExtra("model", 2);
intent.putExtra("fid", data.getId());
intent.putExtra("image",data.getImg(AppData.imageWidth, AppData.imageHigh));
if(clickAction!=null){
clickAction.onClick(intent,icon);
}
}
protected void clickAlbum(MusicData data) {
if (data == null)
return;
Intent intent = new Intent(itemView.getContext(), AlbumsActivity.class);
intent.putExtra("model", 0);
intent.putExtra("album", data.getAlbum());
intent.putExtra("image",data.getImg(AppData.imageWidth, AppData.imageHigh));
intent.putExtra("color",AppTools.getImageColor(data.getImg(AppData.minImageWidth,AppData.minImageHigh)));
if(clickAction!=null){
clickAction.onClick(intent,icon);
}
}
protected void clickAllList(MusicData data) {
if (data.isDir()) {
changeList(data.getFile());
} else {
if (browserHelper != null) {
browserHelper.play(data);
notifyDataSetChanged();
} else {
System.out.println("browserHelper为空");
}
}
}
protected void changeList(String path) {
AppTools.showHud(context);
MusicContainer.getLibs().onDirMusicData(path, new NetworkInterface() {
@Override
public void httpGetData(Object data, int state) {
List<MusicData> list = (List<MusicData>) data;
musicPath = path;
AppTools.hideHud();
setData(list);
notifyDataSetChanged();
}
@Override
public void httpError(Exception e) {
AppTools.hideHud();
}
});
}
public void bind(MusicData data) {
title.setText(data.getTitle());
artist.setText(data.getArtist());
icon.setImageResource(R.drawable.ic_dir);
collection.setVisibility(View.VISIBLE);
if (!data.isDir()) {
message.setText(data.getBitRate() + "kbps | " + data.getSampleRate() + "hz | " + data.getEncodingType());
/* message.setVisibility(View.GONE);
artist.setVisibility(View.GONE);*/
// icon.setImageBitmap(ThumbnailUtils.extractThumbnail(data.getImg(), 64,64));
showImage(data, this);
icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (data.getImg(AppData.minImageWidth,AppData.minImageHigh) != null) {
Glide.with(MyApplication.application).load(data.getImg(AppData.minImageWidth,AppData.minImageHigh))
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(25, 3)))
.into(icon);
icon.setTag("img");
}
}
});
} else {
message.setText("");
play_mask.setVisibility(View.GONE);
icon.setImageResource(R.drawable.ic_dir);
}
if (MusicContainer.getInstance().getNowPlayData().getMd5().equals(data.getMd5())) {
play_mask.setVisibility(View.VISIBLE);
} else {
play_mask.setVisibility(View.GONE);
}
}
protected void addAlbumList(String album) {
System.out.println("添加专辑:" + album);
MusicContainer.getLibs().onAlbumMusicData(album, new NetworkInterface() {
@Override
public void httpGetData(Object data, int state) {
List<MusicData> list = (List<MusicData>) data;
for (MusicData musicData : list) {
System.out.println(musicData.getTitle() + "| 专辑名 =" + musicData.getAlbum());
MusicContainer.getInstance().addTmpList(musicData);
}
Toast.makeText(itemView.getContext(), "已添加到队列中", Toast.LENGTH_LONG).show();
}
@Override
public void httpError(Exception e) {
}
});
}
protected void showAddTmpListDialog(MusicData data) {
AlertDialog dialog = new AlertDialog.Builder(itemView.getContext())
.setTitle("添加文件夹到队列")
.setMessage("将文件夹中所有歌曲添加到队列?")
.setPositiveButton("添加", new DialogInterface.OnClickListener() {
KProgressHUD hud;
@Override
public void onClick(DialogInterface dialog, int which) {
hud = AppTools.showLoading(itemView.getContext());
JSONObject json = new JSONObject();
json.put("path", data.getFile());
json.put("type", true);
MusicContainer.getLibs().onDirMusicData(json, new NetworkInterface() {
@Override
public void httpGetData(Object data, int state) {
List<MusicData> list = (List<MusicData>) data;
for (MusicData musicData : list) {
MusicContainer.getInstance().addTmpList(musicData);
hud.dismiss();
}
}
@Override
public void httpError(Exception e) {
}
});
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).create();
dialog.show();
}
protected void showImage(MusicData musicData, ViewHolder holder) {
musicData.getImg(AppData.minImageWidth,AppData.minImageHigh, new NetworkInterface() {
@Override
public void httpGetData(Object data, int state) {
Glide.with(MyApplication.application).load((Bitmap) data)
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(25, 3)))
.into(holder.icon);
}
@Override
public void httpError(Exception e) {
System.out.println("图片下载失败");
}
});
}
} }
} }

View File

@ -3,11 +3,10 @@ package com.yutou.nas_music_player.Datas;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.media.ThumbnailUtils; import android.media.ThumbnailUtils;
import android.util.Base64;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.yutou.nas_music_player.Interfaces.DefaultNetworkInterface;
import com.yutou.nas_music_player.Interfaces.DownloadInterface; import com.yutou.nas_music_player.Interfaces.DownloadInterface;
import com.yutou.nas_music_player.Interfaces.NetworkInterface; import com.yutou.nas_music_player.Interfaces.NetworkInterface;
import com.yutou.nas_music_player.MyApplication; import com.yutou.nas_music_player.MyApplication;
@ -20,7 +19,6 @@ import com.yutou.nas_music_player.tools.StringUtil;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.palette.graphics.Palette;
import androidx.room.ColumnInfo; import androidx.room.ColumnInfo;
import androidx.room.Entity; import androidx.room.Entity;
import androidx.room.Ignore; import androidx.room.Ignore;
@ -56,8 +54,7 @@ public class MusicData {
private String file; private String file;
@ColumnInfo(name = "isDir") @ColumnInfo(name = "isDir")
private boolean isDir = false; private boolean isDir = false;
@Ignore
private Bitmap img;
@Ignore @Ignore
private boolean isDownloadImg = false; private boolean isDownloadImg = false;
@ -83,9 +80,6 @@ public class MusicData {
public MusicData() { public MusicData() {
} }
public void setImg(Bitmap img) {
this.img = img;
}
public void setDownloadImg(boolean downloadImg) { public void setDownloadImg(boolean downloadImg) {
isDownloadImg = downloadImg; isDownloadImg = downloadImg;
@ -108,6 +102,9 @@ public class MusicData {
} }
public String getTitle() { public String getTitle() {
if (StringUtil.isEmpty(title)) {
title = album;
}
return title; return title;
} }
@ -223,9 +220,9 @@ public class MusicData {
public String getPlayUrl() { public String getPlayUrl() {
String url= HttpManager.NetworkAPI.HOME + HttpManager.NetworkAPI.MUSIC_PLAY String url = HttpManager.NetworkAPI.HOME + HttpManager.NetworkAPI.MUSIC_PLAY
+ "?random=false&token=" + HttpManager.NetworkAPI.HTTP_KEY + "&filePath=" + getMd5(); + "?random=false&token=" + HttpManager.NetworkAPI.HTTP_KEY + "&filePath=" + getMd5();
System.out.println("播放地址:" +url); System.out.println("播放地址:" + url);
return url; return url;
} }
@ -234,66 +231,55 @@ public class MusicData {
return HttpManager.NetworkAPI.MUSIC_IMAGE + "?fileName=" + getFileBase64(); return HttpManager.NetworkAPI.MUSIC_IMAGE + "?fileName=" + getFileBase64();
} }
public Bitmap getImg() {
return img;
}
public Bitmap getImg(int width, int height) { public Bitmap getImg(int width, int height) {
return getImg(width, height, null); return getImg(width, height, new DefaultNetworkInterface());
} }
public Bitmap getImg(int width, int height, NetworkInterface networkInterface) { public Bitmap getImg(int width, int height,@NonNull NetworkInterface networkInterface) {
if (img != null) { Bitmap img;
if (width == -1 && height == -1) {
if (networkInterface != null)
networkInterface.httpGetData(img, 0);
return img;
}
if (networkInterface != null)
networkInterface.httpGetData(ThumbnailUtils.extractThumbnail(img, width, height), width + height);
return ThumbnailUtils.extractThumbnail(img, width, height);
}
if (isDownloadImg) {
return null;
}
if (StringUtil.isEmpty(file) && StringUtil.isEmpty(title) && StringUtil.isEmpty(album)) { if (StringUtil.isEmpty(file) && StringUtil.isEmpty(title) && StringUtil.isEmpty(album)) {
img = BitmapFactory.decodeResource(MyApplication.application.getResources(), R.mipmap.ic_launcher); img = BitmapFactory.decodeResource(MyApplication.application.getResources(), R.mipmap.ic_launcher);
networkInterface.httpGetData(img, 0);
return img; return img;
} }
String imageSaveName = (StringUtil.isEmpty(album) ? title : album) + ".png"; String imageSaveName = (StringUtil.isEmpty(album) ? title : album) + ".png";
img = AppTools.getSaveBitmap(imageSaveName); img = AppTools.getSaveBitmap(imageSaveName);
if (img != null) { if (img != null) {
if (width == -1 && height == -1) { if (width == -1 && height == -1) {
if (networkInterface != null) networkInterface.httpGetData(img, 0);
networkInterface.httpGetData(img, 0);
return img; return img;
} }
if (networkInterface != null) networkInterface.httpGetData(ThumbnailUtils.extractThumbnail(img, width, height), width + height);
networkInterface.httpGetData(ThumbnailUtils.extractThumbnail(img, width, height), width + height);
return ThumbnailUtils.extractThumbnail(img, width, height); return ThumbnailUtils.extractThumbnail(img, width, height);
} }
img = null; img = BitmapFactory.decodeResource(MyApplication.application.getResources(), R.mipmap.ic_launcher);
if (isDownloadImg) {
networkInterface.httpGetData(img, 0);
return img;
}
isDownloadImg = true; isDownloadImg = true;
JSONObject json = new JSONObject(); JSONObject json = new JSONObject();
if (StringUtil.isEmpty(getAlbum())) { if (!StringUtil.isEmpty(getAlbum())) {
json.put("type", "album");
}
if (!StringUtil.isEmpty(getMd5())) {
json.put("fileName", getMd5()); json.put("fileName", getMd5());
} else { } else {
json.put("fileName", getMd5()); json.put("fileName", getTitle());
json.put("type", "album");
} }
System.out.println("下载图片:" + HttpManager.NetworkAPI.MUSIC_IMAGE + "?" + NetworkTool.toGetSplice(json)); System.out.println("下载图片:" + HttpManager.NetworkAPI.MUSIC_IMAGE + "?" + NetworkTool.toGetSplice(json));
HttpManager.getInstance().downloadImage(HttpManager.NetworkAPI.MUSIC_IMAGE, json, imageSaveName, "post", new DownloadInterface() { HttpManager.getInstance().downloadImage(HttpManager.NetworkAPI.MUSIC_IMAGE, json, imageSaveName, "post", new DownloadInterface() {
@Override @Override
public void onDownloadOver(File oldJar) { public void onDownloadOver(File oldJar) {
isDownloadImg = false;
AppTools.saveBitmap(oldJar, imageSaveName); AppTools.saveBitmap(oldJar, imageSaveName);
img = BitmapFactory.decodeFile(oldJar.getAbsolutePath()); Bitmap img = BitmapFactory.decodeFile(oldJar.getAbsolutePath());
AppData.handler.post(() -> { AppData.handler.post(() -> {
if (width == -1 && height == -1) { if (width == -1 && height == -1) {
if (networkInterface != null) networkInterface.httpGetData(img, 0);
networkInterface.httpGetData(img, 0);
} else { } else {
if (networkInterface != null) networkInterface.httpGetData(ThumbnailUtils.extractThumbnail(img, width, height), width + height);
networkInterface.httpGetData(ThumbnailUtils.extractThumbnail(img, width, height), width + height);
} }
}); });
@ -302,60 +288,17 @@ public class MusicData {
@Override @Override
public void onError(Exception e) { public void onError(Exception e) {
super.onError(e); super.onError(e);
img = BitmapFactory.decodeResource(MyApplication.application.getResources(), R.mipmap.ic_launcher); isDownloadImg = false;
Bitmap img = BitmapFactory.decodeResource(MyApplication.application.getResources(), R.mipmap.ic_launcher);
AppData.handler.post(() -> networkInterface.httpGetData(img, 0));
} }
}); });
/* HttpManager.getInstance().httpGet(HttpManager.NetworkAPI.MUSIC_IMAGE, json, new NetworkInterface() {
@Override
public void httpGetData(Object data, int state) {
JSONObject json = JSONObject.parseObject(data.toString());
try {
if (json.getInteger("code") == 0) {
byte[] bytes = json.getBytes("data");
img = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
AppTools.saveBitmap(img, getFileBase64());
if (networkInterface != null) {
AppData.handler.post(new Runnable() {
@Override
public void run() {
if (width == -1 && height == -1) {
networkInterface.httpGetData(img, 0);
} else
networkInterface.httpGetData(ThumbnailUtils.extractThumbnail(img, width, height), width + height);
}
});
}
}
} catch (Exception e) {
e.printStackTrace();
img = BitmapFactory.decodeResource(MyApplication.application.getResources(), R.mipmap.ic_launcher);
}
}
@Override
public void httpError(Exception e) {
isDownloadImg = false;
}
});*/
if (width == -1 && height == -1) { if (width == -1 && height == -1) {
return img; return img;
} }
return ThumbnailUtils.extractThumbnail(img, width, height); return ThumbnailUtils.extractThumbnail(img, width, height);
} }
public void recycleImg() {
if (img != null) {
img.recycle();
img = null;
}
}
public int getImageColor() {
if (img == null) {
return -1;
}
return Palette.from(img).generate().getLightVibrantColor(Color.parseColor("#6DE1A1"));
}
public int getBitRate() { public int getBitRate() {
return bitRate; return bitRate;
@ -457,7 +400,6 @@ public class MusicData {
", lastDir='" + lastDir + '\'' + ", lastDir='" + lastDir + '\'' +
", file='" + file + '\'' + ", file='" + file + '\'' +
", isDir=" + isDir + ", isDir=" + isDir +
", img=" + img +
", bitRate=" + bitRate + ", bitRate=" + bitRate +
", sampleRate=" + sampleRate + ", sampleRate=" + sampleRate +
", noOfSamples=" + noOfSamples + ", noOfSamples=" + noOfSamples +
@ -473,7 +415,7 @@ public class MusicData {
@NonNull @NonNull
@Override @Override
public MusicData clone() { public MusicData clone() {
MusicData data=new MusicData(); MusicData data = new MusicData();
data.setId(id); data.setId(id);
data.setArtist(artist); data.setArtist(artist);
data.setAlbum(album); data.setAlbum(album);
@ -487,7 +429,6 @@ public class MusicData {
data.setLastDir(lastDir); data.setLastDir(lastDir);
data.setFile(file); data.setFile(file);
data.setDir(isDir); data.setDir(isDir);
data.setImg(img);
data.setBitRate(bitRate); data.setBitRate(bitRate);
data.setSampleRate(sampleRate); data.setSampleRate(sampleRate);
data.setNoOfSamples(noOfSamples); data.setNoOfSamples(noOfSamples);

View File

@ -0,0 +1,13 @@
package com.yutou.nas_music_player.Interfaces;
public class DefaultNetworkInterface implements NetworkInterface {
@Override
public void httpGetData(Object data, int state) {
}
@Override
public void httpError(Exception e) {
}
}

View File

@ -1,14 +1,61 @@
package com.yutou.nas_music_player; package com.yutou.nas_music_player;
import android.app.Activity;
import android.app.Application; import android.app.Application;
import android.content.Context; import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.lang.ref.WeakReference;
public class MyApplication extends Application { public class MyApplication extends Application {
public static Application application; public static Application application;
private static WeakReference<Activity> activityWeakReference=null;
public static Activity getActivity() {
return activityWeakReference.get();
}
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
MyApplication.application = this; MyApplication.application = this;
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
activityWeakReference=new WeakReference<>(activity);
}
@Override
public void onActivityStarted(@NonNull Activity activity) {
}
@Override
public void onActivityResumed(@NonNull Activity activity) {
}
@Override
public void onActivityPaused(@NonNull Activity activity) {
}
@Override
public void onActivityStopped(@NonNull Activity activity) {
}
@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
}
@Override
public void onActivityDestroyed(@NonNull Activity activity) {
}
});
} }
} }

View File

@ -21,10 +21,9 @@ import com.yutou.nas_music_player.Datas.PreviousPlayerList;
import com.yutou.nas_music_player.Interfaces.NetworkInterface; import com.yutou.nas_music_player.Interfaces.NetworkInterface;
import com.yutou.nas_music_player.MyApplication; import com.yutou.nas_music_player.MyApplication;
import com.yutou.nas_music_player.network.HttpManager; import com.yutou.nas_music_player.network.HttpManager;
import com.yutou.nas_music_player.tools.AppData;
import com.yutou.nas_music_player.tools.AppTools; import com.yutou.nas_music_player.tools.AppTools;
import com.yutou.nas_music_player.tools.CollectionTools;
import com.yutou.nas_music_player.tools.ConfigTools; import com.yutou.nas_music_player.tools.ConfigTools;
import com.yutou.nas_music_player.tools.NetworkTool;
import com.yutou.nas_music_player.tools.StringUtil; import com.yutou.nas_music_player.tools.StringUtil;
import java.io.IOException; import java.io.IOException;
@ -34,6 +33,7 @@ import java.util.ArrayList;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Random;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
@ -42,11 +42,11 @@ public class MusicContainer {
public static final int PLAY_MODEL_RANDOM = 0;//随机 public static final int PLAY_MODEL_RANDOM = 0;//随机
public static final int PLAY_MODEL_ORDER = 1;//顺序 public static final int PLAY_MODEL_ORDER = 1;//顺序
public static final int PLAY_MODEL_ONE_LOOP = 2;//单曲循环 public static final int PLAY_MODEL_ONE_LOOP = 2;//单曲循环
public static final int PLAY_MODEL_LOOP = 3;//列表循环 public static final int PLAY_MODEL_LIST_RANDOM = 3;//列表随机
private static MusicContainer container; private static MusicContainer container;
private MusicLibs libs; private MusicLibs libs;
private MediaPlayer mediaPlayer; private MediaPlayer mediaPlayer;
private int playIndex = 0; private int playIndex = -1;
private MusicData nowPlayData = null; private MusicData nowPlayData = null;
private MusicLibsInitInterface initInterface; private MusicLibsInitInterface initInterface;
private List<MediaPlayer.OnCompletionListener> completionListener; private List<MediaPlayer.OnCompletionListener> completionListener;
@ -68,7 +68,7 @@ public class MusicContainer {
collectionMapList = new LinkedHashMap<>(); collectionMapList = new LinkedHashMap<>();
previousPlayerList = new PreviousPlayerList(); previousPlayerList = new PreviousPlayerList();
browserHelpers = new ArrayList<>(); browserHelpers = new ArrayList<>();
playIndex = ConfigTools.getPreferences().getInt("playIndex", 0); playIndex = ConfigTools.getPreferences().getInt("playIndex", -1);
initMediaPlayer(); initMediaPlayer();
libs = new MusicLibs(); libs = new MusicLibs();
} }
@ -220,6 +220,7 @@ public class MusicContainer {
* 默认直接播放下一首 * 默认直接播放下一首
*/ */
public void playOfAllRandom() { public void playOfAllRandom() {
playList.clear();
playOfAllRandom(true, null); playOfAllRandom(true, null);
} }
@ -256,7 +257,6 @@ public class MusicContainer {
}, 0, 1000); }, 0, 1000);
} }
MusicData tmp = data.clone(); MusicData tmp = data.clone();
tmp.setImg(null);
ConfigTools.getPreferences().edit().putString(ConfigTools.previous_music, JSONObject.toJSONString(tmp)).apply(); ConfigTools.getPreferences().edit().putString(ConfigTools.previous_music, JSONObject.toJSONString(tmp)).apply();
MediaNotificationManager manager = MediaNotificationManager.getInstance(); MediaNotificationManager manager = MediaNotificationManager.getInstance();
if (manager != null) { if (manager != null) {
@ -304,13 +304,13 @@ public class MusicContainer {
} }
private MediaMetadataCompat metadataCompat; private MediaMetadataCompat metadataCompat;
private String metaDataFile=""; private String metaDataFile = "";
public MediaMetadataCompat getMetadataCompat(MusicData data) { public MediaMetadataCompat getMetadataCompat(MusicData data) {
if (data.getMd5().equals(metaDataFile)) { if (data.getMd5().equals(metaDataFile)) {
return metadataCompat; return metadataCompat;
} }
metaDataFile=data.getMd5(); metaDataFile = data.getMd5();
MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder(); MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder();
builder.putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, data.getTitle()); builder.putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, data.getTitle());
builder.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, data.getArtist()); builder.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, data.getArtist());
@ -321,8 +321,8 @@ public class MusicContainer {
builder.putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, Long.parseLong(data.getTrack())); builder.putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, Long.parseLong(data.getTrack()));
builder.putLong(MediaMetadataCompat.METADATA_KEY_DISC_NUMBER, Long.parseLong(data.getDisc_no())); builder.putLong(MediaMetadataCompat.METADATA_KEY_DISC_NUMBER, Long.parseLong(data.getDisc_no()));
builder.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, ((int) (data.getDurationAsDouble() * 1000))); builder.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, ((int) (data.getDurationAsDouble() * 1000)));
if (data.getImg(-1, -1) != null) { if (data.getImg(AppData.minImageWidth, AppData.minImageHigh) != null) {
builder.putBitmap(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, data.getImg(1024, 1024)); builder.putBitmap(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, data.getImg(AppData.minImageWidth, AppData.minImageHigh));
} }
builder.putString("md5", data.getMd5()); builder.putString("md5", data.getMd5());
metadataCompat = builder.build(); metadataCompat = builder.build();
@ -352,7 +352,12 @@ public class MusicContainer {
* 播放下一曲 * 播放下一曲
*/ */
public void playNext() { public void playNext() {
System.out.println("播放模式:" + playModel); System.out.println("播放模式:" + playModel + " index = " + playIndex + " play size = " + playList.size());
if (tmpList.size() != 0) {//有插队列表优先播放
play(tmpList.get(0));//先插入的先播
tmpList.remove(0);
return;
}
switch (playModel) { switch (playModel) {
case PLAY_MODEL_ORDER: case PLAY_MODEL_ORDER:
playOrder(false); playOrder(false);
@ -360,16 +365,12 @@ public class MusicContainer {
case PLAY_MODEL_ONE_LOOP: case PLAY_MODEL_ONE_LOOP:
playOneLoop(); playOneLoop();
break; break;
case PLAY_MODEL_LOOP: case PLAY_MODEL_LIST_RANDOM:
playOrder(true); playOrder(true);
break; break;
case PLAY_MODEL_RANDOM: case PLAY_MODEL_RANDOM:
default: default:
if (tmpList.size() != 0) {//有插队列表优先播放 playOfAllRandom();
play(tmpList.get(0));//先插入的先播
tmpList.remove(0);
} else
playOfAllRandom();
} }
} }
@ -389,35 +390,25 @@ public class MusicContainer {
/** /**
* 顺序播放 * 顺序播放
* *
* @param isLoop 循环播放列表 * @param isRandom 随机播放
*/ */
private void playOrder(boolean isLoop) { private void playOrder(boolean isRandom) {
if (tmpList.size() != 0) {//有插队列表优先播放 if (playList.isEmpty()) {//播放列表为空以所有歌列表顺序播放
play(tmpList.get(0));//先插入的先播 playOfAllRandom();
tmpList.remove(0); AppTools.toast("当前播放列表为空,随机播放");
} else if (playList.size() == 0) {//播放列表为空以所有歌列表顺序播放
if (libs.mainData.size() > (playIndex + 1)) {
playIndex++;
} else {
playIndex = 0;
}
if (libs.mainData.isEmpty()) {
playOfAllRandom();
AppTools.toast("当前播放列表为空,随机播放");
} else {
play(libs.mainData.get(playIndex));
}
} else {//播放列表中的歌单 } else {//播放列表中的歌单
if (playList.size() > (playIndex + 1)) { ConfigTools.getPreferences().edit().putInt("playModel", MusicContainer.PLAY_MODEL_ORDER).apply();
playIndex++; if (isRandom) {
} playIndex = new Random().nextInt(playList.size());
if (isLoop) {
playIndex = 0;
play(playList.get(playIndex));
} else { } else {
playList.clear();//列表播放完了清空 if (playList.size() > (playIndex + 1)) {
playOfAllRandom();//暂时先设计成后续随机播放毕竟列表已经空了 playIndex++;
} else {
playIndex = 0;
}
} }
play(playList.get(playIndex));
} }
} }
@ -438,31 +429,13 @@ public class MusicContainer {
} }
public List<MusicData> getPlayList() { public List<MusicData> getPlayList() {
System.out.println("playList.size() = " + playList.size() + " tmpList.size() = " + tmpList.size());
if (!tmpList.isEmpty()) { if (!tmpList.isEmpty()) {
return tmpList; return tmpList;
} }
if (!playList.isEmpty()) { return playList;
return playList;
}
return libs.mainData;
} }
private void flashCollection() {
collectionMapList.clear();
JSONArray array = CollectionTools.readConfig();
for (Object o : array) {
JSONObject json = (JSONObject) o;
JSONArray collections = json.getJSONArray("collections");
List<MusicData> tmp = new ArrayList<>();
for (Object collection : collections) {
MusicData data = libs.findMusic((String) collection, libs.mainData);
if (data != null) {
tmp.add(data);
}
}
collectionMapList.put(json.getString("title"), tmp);
}
}
public void addTmpList(MusicData data) { public void addTmpList(MusicData data) {
if (data.getTitle().equals("返回") && data.getTrack().equals("-1") || data.isDir()) { if (data.getTitle().equals("返回") && data.getTrack().equals("-1") || data.isDir()) {
@ -491,11 +464,27 @@ public class MusicContainer {
return collectionMapList; return collectionMapList;
} }
public void setPlayList(List<MusicData> dataList) {
this.playList = dataList;
this.playIndex = -1;
this.playModel = PLAY_MODEL_ORDER;
}
public void addPlayList(List<MusicData> dataList) {
this.playList.addAll(dataList);
}
public int getPlayModel() {
return playModel;
}
public int getPlayIndex() {
return playIndex;
}
public class MusicLibs { public class MusicLibs {
private List<MusicData> mainData;
private MusicLibs() { private MusicLibs() {
mainData = new ArrayList<>();
initData(); initData();
} }
@ -672,9 +661,6 @@ public class MusicContainer {
}); });
} }
public List<MusicData> getMainData() {
return mainData;
}
private void initData() { private void initData() {
if (nowPlayData == null) { if (nowPlayData == null) {
@ -716,9 +702,11 @@ public class MusicContainer {
} catch (Exception e) { } catch (Exception e) {
List<MusicData> list = new ArrayList<>(); List<MusicData> list = new ArrayList<>();
for (Object album : json.getJSONArray("data")) { for (Object album : json.getJSONArray("data")) {
JSONObject _album = (JSONObject) album;
MusicData musicData = new MusicData(); MusicData musicData = new MusicData();
musicData.setTitle((String) album); musicData.setTitle(_album.getString("title"));
musicData.setAlbum((String) album); musicData.setAlbum(_album.getString("album"));
musicData.setMd5(_album.getString("md5"));
list.add(musicData); list.add(musicData);
} }
new Handler(Looper.getMainLooper()) new Handler(Looper.getMainLooper())
@ -789,62 +777,6 @@ public class MusicContainer {
}); });
} }
public void updateLibsMap() {
for (MusicData musicData : mainData) {
List<MusicData> artist = new ArrayList<>();
List<MusicData> album = new ArrayList<>();
String albumName = StringUtil.isEmpty(musicData.getAlbum()) ?
"未知专辑"
: musicData.getAlbum();
String artistName = StringUtil.isEmpty(musicData.getArtist()) ?
"未知作曲家"
: musicData.getArtist();
if (albumMapList.containsKey(albumName)) {
album.addAll(albumMapList.get(albumName));
}
album.add(musicData);
if (artistMapList.containsKey(artistName)) {
artist.addAll(artistMapList.get(artistName));
}
artist.add(musicData);
artistMapList.put(artistName, artist);
albumMapList.put(albumName, album);
}
//flashCollection();
if (initInterface != null)
initInterface.init();
initInterface = null;
}
public MusicData findMusic(String md5, List<MusicData> list) {
for (MusicData data : list) {
if (data.getMd5() == null) {
continue;
}
if (md5.contains(data.getMd5())) {
return data;
}
}
return null;
}
public int findMusicIndex(String md5, List<MusicData> list) {
if (StringUtil.isEmpty(md5)) {
return -1;
}
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getMd5() == null) {
continue;
}
if (md5.contains((list.get(i).getMd5()))) {
return i;
}
}
return 0;
}
} }
public interface MusicLibsInitInterface { public interface MusicLibsInitInterface {

View File

@ -8,6 +8,7 @@ import androidx.annotation.NonNull;
import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.bumptech.glide.load.HttpException;
import com.yutou.nas_music_player.Interfaces.DownloadInterface; import com.yutou.nas_music_player.Interfaces.DownloadInterface;
import com.yutou.nas_music_player.Interfaces.NetworkInterface; import com.yutou.nas_music_player.Interfaces.NetworkInterface;
import com.yutou.nas_music_player.MyApplication; import com.yutou.nas_music_player.MyApplication;
@ -18,6 +19,7 @@ import com.yutou.nas_music_player.tools.NetworkTool;
import com.yutou.nas_music_player.tools.StringUtil; import com.yutou.nas_music_player.tools.StringUtil;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@ -251,6 +253,10 @@ public class HttpManager {
private List<String> downloadImageList = new ArrayList<>(); private List<String> downloadImageList = new ArrayList<>();
public synchronized void downloadImage(String url, JSONObject body, String saveName, String method, DownloadInterface downloadInterface) { public synchronized void downloadImage(String url, JSONObject body, String saveName, String method, DownloadInterface downloadInterface) {
if(saveName.contains("/")){
downloadImage(url, body, saveName.replace("/","_"), method, downloadInterface);
return;
}
if (!StringUtil.isEmpty(NetworkAPI.HOME) && !url.startsWith("http")) { if (!StringUtil.isEmpty(NetworkAPI.HOME) && !url.startsWith("http")) {
downloadImage(NetworkAPI.HOME + url, body, saveName, method, downloadInterface); downloadImage(NetworkAPI.HOME + url, body, saveName, method, downloadInterface);
return; return;
@ -289,8 +295,13 @@ public class HttpManager {
} }
Log.i("donwloadImage", "下载文件:" + url + "?" + body + " 保存文件:" + saveName); Log.i("donwloadImage", "下载文件:" + url + "?" + body + " 保存文件:" + saveName);
Log.i("downloadImageCode", response.code() + ""); Log.i("downloadImageCode", response.code() + "");
if (response.code() != 200) {
downloadInterface.onError(new HttpException("http error = " + response.code()));
return;
}
InputStream inputStream = response.body().byteStream(); InputStream inputStream = response.body().byteStream();
jar = new File(downloadPath + File.separator + "image_cache" + File.separator + saveName + "_tmp.tmp"); jar = new File(downloadPath + File.separator + "image_cache" + File.separator + saveName + "_tmp.tmp");
if (!new File(downloadPath + File.separator + "image_cache").exists()) { if (!new File(downloadPath + File.separator + "image_cache").exists()) {
new File(downloadPath + File.separator + "image_cache").mkdirs(); new File(downloadPath + File.separator + "image_cache").mkdirs();
@ -307,6 +318,13 @@ public class HttpManager {
} }
outputStream.close(); outputStream.close();
inputStream.close(); inputStream.close();
if(jar.length()==0){
System.out.println("jar.getAbsolutePath() = " + jar.getAbsolutePath());
System.out.println("jar.length() = " + jar.length());
downloadInterface.onError(new FileNotFoundException("文件大小为空"));
jar.delete();
return;
}
File oldJar = new File(downloadPath + saveName); File oldJar = new File(downloadPath + saveName);
/*if (oldJar.exists()) { /*if (oldJar.exists()) {
oldJar.delete(); oldJar.delete();

View File

@ -18,10 +18,10 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.media.MediaBrowserServiceCompat; import androidx.media.MediaBrowserServiceCompat;
import com.yutou.nas_music_player.Datas.MusicData;
import com.yutou.nas_music_player.containers.MediaBrowserHelper; import com.yutou.nas_music_player.containers.MediaBrowserHelper;
import com.yutou.nas_music_player.containers.MediaNotificationManager; import com.yutou.nas_music_player.containers.MediaNotificationManager;
import com.yutou.nas_music_player.containers.MusicContainer; import com.yutou.nas_music_player.containers.MusicContainer;
import com.yutou.nas_music_player.Datas.MusicData;
import com.yutou.nas_music_player.views.MainActivity; import com.yutou.nas_music_player.views.MainActivity;
import java.util.ArrayList; import java.util.ArrayList;
@ -71,6 +71,20 @@ public class MusicService extends MediaBrowserServiceCompat {
notificationManager.getManager() notificationManager.getManager()
.notify(MediaNotificationManager.NOTIFICATION_ID, notification); .notify(MediaNotificationManager.NOTIFICATION_ID, notification);
} }
@Override
public void onPlaybackStateChanged(PlaybackStateCompat state) {
super.onPlaybackStateChanged(state);
if(mState==state.getState()){
return;
}
mState=state.getState();
MusicData data = MusicContainer.getInstance().getNowPlayData();
MediaMetadataCompat metadataCompat = MusicContainer.getInstance().getMetadataCompat(data);
Notification notification = notificationManager.getNotification(metadataCompat, builderState(state.getPosition()).build(), getSessionToken());
notificationManager.getManager()
.notify(MediaNotificationManager.NOTIFICATION_ID, notification);
}
}); });
} }

View File

@ -13,4 +13,8 @@ public class AppData {
public static String dir= MyApplication.application.getFilesDir() + File.separator; public static String dir= MyApplication.application.getFilesDir() + File.separator;
public static boolean isDebug=true; public static boolean isDebug=true;
public static Handler handler=new Handler(Looper.getMainLooper()); public static Handler handler=new Handler(Looper.getMainLooper());
public static int imageWidth=400;
public static int imageHigh=400;
public static int minImageWidth=200;
public static int minImageHigh=200;
} }

View File

@ -3,10 +3,13 @@ package com.yutou.nas_music_player.tools;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Matrix; import android.graphics.Matrix;
import android.util.Base64; import android.util.Base64;
import android.widget.Toast; import android.widget.Toast;
import androidx.palette.graphics.Palette;
import com.kaopiz.kprogresshud.KProgressHUD; import com.kaopiz.kprogresshud.KProgressHUD;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache; import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.DisplayImageOptions;
@ -20,8 +23,22 @@ import java.io.File;
import java.security.MessageDigest; import java.security.MessageDigest;
public class AppTools { public class AppTools {
private static KProgressHUD hud;
public static KProgressHUD showLoading(Context context,String title){ public static synchronized void showHud(Context context) {
hideHud();
hud = AppTools.showLoading(context);
hud.show();
}
public static void hideHud() {
if (hud != null && hud.isShowing()) {
hud.dismiss();
hud = null;
}
}
public static KProgressHUD showLoading(Context context, String title) {
return KProgressHUD.create(context) return KProgressHUD.create(context)
.setStyle(KProgressHUD.Style.SPIN_INDETERMINATE) .setStyle(KProgressHUD.Style.SPIN_INDETERMINATE)
.setDetailsLabel(title) .setDetailsLabel(title)
@ -31,30 +48,34 @@ public class AppTools {
.show(); .show();
} }
public static KProgressHUD showLoading(Context context){ public static KProgressHUD showLoading(Context context) {
return showLoading(context,"loading..."); return showLoading(context, "loading...");
} }
public static void saveBitmap(final File img, final String saveKey){
ConfigTools.getPreferences().edit().putString("img_"+saveKey,img.getAbsolutePath()).apply(); public static void saveBitmap(final File img, final String saveKey) {
ConfigTools.getPreferences().edit().putString("img_" + saveKey, img.getAbsolutePath()).apply();
} }
public static Bitmap getSaveBitmap(String saveKey){
String path=ConfigTools.getPreferences().getString("img_"+saveKey,null); public static Bitmap getSaveBitmap(String saveKey) {
if(path==null){ String path = ConfigTools.getPreferences().getString("img_" + saveKey, null);
if (path == null) {
return null; return null;
} }
File img=new File(path); File img = new File(path);
if(img.length()>3145728){ if (img.length() > 3145728) {
Bitmap bitmap=BitmapFactory.decodeFile(path); Bitmap bitmap = BitmapFactory.decodeFile(path);
return compressQuality(bitmap); return compressQuality(bitmap);
} }
return BitmapFactory.decodeFile(path); return BitmapFactory.decodeFile(path);
} }
private static Bitmap compressQuality(Bitmap bm) { private static Bitmap compressQuality(Bitmap bm) {
Matrix matrix = new Matrix(); Matrix matrix = new Matrix();
matrix.setScale(0.5f, 0.5f); matrix.setScale(0.5f, 0.5f);
return Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true); return Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
} }
public static String getMD5(String data) { public static String getMD5(String data) {
try { try {
MessageDigest digest = MessageDigest.getInstance("MD5"); MessageDigest digest = MessageDigest.getInstance("MD5");
@ -65,6 +86,7 @@ public class AppTools {
} }
return null; return null;
} }
private static String bytesToHexString(byte[] src) { private static String bytesToHexString(byte[] src) {
StringBuilder stringBuilder = new StringBuilder(""); StringBuilder stringBuilder = new StringBuilder("");
if (src == null || src.length <= 0) { if (src == null || src.length <= 0) {
@ -80,6 +102,7 @@ public class AppTools {
} }
return stringBuilder.toString(); return stringBuilder.toString();
} }
private static DisplayImageOptions initDisplayOptions() { private static DisplayImageOptions initDisplayOptions() {
DisplayImageOptions.Builder displayImageOptionsBuilder = new DisplayImageOptions.Builder(); DisplayImageOptions.Builder displayImageOptionsBuilder = new DisplayImageOptions.Builder();
displayImageOptionsBuilder.cacheInMemory(false); displayImageOptionsBuilder.cacheInMemory(false);
@ -103,15 +126,25 @@ public class AppTools {
imageLoader.init(builder.build()); imageLoader.init(builder.build());
return imageLoader; return imageLoader;
} }
public static String getUrlBase64(String text){
return new String(Base64.encode(text.getBytes(), Base64.DEFAULT)).replace("\n", ""); public static String getUrlBase64(String text) {
return new String(Base64.encode(text.getBytes(), Base64.DEFAULT)).replace("\n", "");
} }
public static void toast(String s) { public static void toast(String s) {
AppData.handler.post(new Runnable() { AppData.handler.post(new Runnable() {
@Override @Override
public void run() { public void run() {
Toast.makeText(MyApplication.application,s,Toast.LENGTH_LONG).show(); Toast.makeText(MyApplication.application, s, Toast.LENGTH_LONG).show();
} }
}); });
} }
public static int getImageColor(Bitmap img) {
try {
return Palette.from(img).generate().getLightVibrantColor(Color.parseColor("#bbbbbb"));
} catch (Exception e) {
return Color.parseColor("#bbbbbb");
}
}
} }

View File

@ -62,10 +62,6 @@ public class CollectionTools {
JSONObject json= (JSONObject) o; JSONObject json= (JSONObject) o;
if(json.getString("title").equals(title)) { if(json.getString("title").equals(title)) {
JSONArray co=json.getJSONArray("collections"); JSONArray co=json.getJSONArray("collections");
for (Object md5 : co) {
MusicData data=MusicContainer.getLibs().findMusic((String)md5,MusicContainer.getLibs().getMainData());
list.add(data);
}
break; break;
} }
} }

View File

@ -1,8 +1,12 @@
package com.yutou.nas_music_player.views; package com.yutou.nas_music_player.views;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.media.session.MediaControllerCompat; import android.support.v4.media.session.MediaControllerCompat;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
@ -21,6 +25,7 @@ import com.yutou.nas_music_player.R;
import com.yutou.nas_music_player.containers.MediaBrowserHelper; import com.yutou.nas_music_player.containers.MediaBrowserHelper;
import com.yutou.nas_music_player.containers.MusicContainer; import com.yutou.nas_music_player.containers.MusicContainer;
import com.yutou.nas_music_player.tools.AppData; import com.yutou.nas_music_player.tools.AppData;
import com.yutou.nas_music_player.tools.AppTools;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -34,10 +39,12 @@ public class AlbumsActivity extends AppCompatActivity {
private AlbumsRecyclerAdapter adapter; private AlbumsRecyclerAdapter adapter;
private AppBarLayout appBarLayout; private AppBarLayout appBarLayout;
private TextView breakApp; private TextView breakApp;
private Button playAll;
private int model;//0 专辑, 1 歌手, 2 收藏 private int model;//0 专辑, 1 歌手, 2 收藏
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_album); setContentView(R.layout.activity_album);
model = getIntent().getIntExtra("model", -1); model = getIntent().getIntExtra("model", -1);
@ -52,9 +59,23 @@ public class AlbumsActivity extends AppCompatActivity {
default: default:
finish(); finish();
} }
Bitmap image=getIntent().getParcelableExtra("image");
if(image!=null){
album_image.setImageBitmap(image);
Glide.with(AlbumsActivity.this).load(image)
.apply(RequestOptions.bitmapTransform(new BlurTransformation(25, 3)))
.into(image_background);
}else{
album_image.setImageResource(R.mipmap.ic_launcher);
Glide.with(AlbumsActivity.this).load(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
.apply(RequestOptions.bitmapTransform(new BlurTransformation(25, 3)))
.into(image_background);
}
browserHelper = new MediaBrowserHelper(this); browserHelper = new MediaBrowserHelper(this);
browserHelper.regPlayListener(new PlayListener()); browserHelper.regPlayListener(new PlayListener());
adapter.setPlayListener(browserHelper); adapter.setPlayListener(browserHelper);
listView.setBackgroundColor(getIntent().getIntExtra("color", Color.parseColor("#bbbbbb")));
playAll.setBackgroundColor(getIntent().getIntExtra("color", Color.parseColor("#bbbbbb")));
} }
@ -72,14 +93,13 @@ public class AlbumsActivity extends AppCompatActivity {
adapter.notifyDataSetChanged(); adapter.notifyDataSetChanged();
if (list.isEmpty()) if (list.isEmpty())
return; return;
list.get(0).getImg(-1, -1, new NetworkInterface() { list.get(0).getImg(AppData.imageWidth,AppData.imageHigh, new NetworkInterface() {
@Override @Override
public void httpGetData(Object data, int state) { public void httpGetData(Object data, int state) {
album_image.setImageBitmap((Bitmap) data); album_image.setImageBitmap((Bitmap) data);
Glide.with(AlbumsActivity.this).load(data) Glide.with(AlbumsActivity.this).load(data)
.apply(RequestOptions.bitmapTransform(new BlurTransformation(25, 3))) .apply(RequestOptions.bitmapTransform(new BlurTransformation(25, 3)))
.into(image_background); .into(image_background);
listView.setBackgroundColor(list.get(0).getImageColor());
} }
@Override @Override
@ -106,22 +126,6 @@ public class AlbumsActivity extends AppCompatActivity {
adapter.notifyDataSetChanged(); adapter.notifyDataSetChanged();
}); });
list.get(0).getImg(-1, -1, new NetworkInterface() {
@Override
public void httpGetData(Object data, int state) {
album_image.setImageBitmap((Bitmap) data);
Glide.with(AlbumsActivity.this).load(data)
.apply(RequestOptions.bitmapTransform(new BlurTransformation(25, 3)))
.into(image_background);
listView.setBackgroundColor(list.get(0).getImageColor());
}
@Override
public void httpError(Exception e) {
}
});
} }
@Override @Override
@ -138,6 +142,7 @@ public class AlbumsActivity extends AppCompatActivity {
listView = findViewById(R.id.album_list); listView = findViewById(R.id.album_list);
breakApp = findViewById(R.id.breakApp); breakApp = findViewById(R.id.breakApp);
appBarLayout = findViewById(R.id.appbar); appBarLayout = findViewById(R.id.appbar);
playAll=findViewById(R.id.playAll);
listView.setLayoutManager(new LinearLayoutManager(this)); listView.setLayoutManager(new LinearLayoutManager(this));
adapter = new AlbumsRecyclerAdapter(AlbumsActivity.this, new ArrayList<>(), model); adapter = new AlbumsRecyclerAdapter(AlbumsActivity.this, new ArrayList<>(), model);
listView.setAdapter(adapter); listView.setAdapter(adapter);
@ -148,8 +153,11 @@ public class AlbumsActivity extends AppCompatActivity {
breakApp.setTextColor(getResources().getColor(R.color.musicTitle, null)); breakApp.setTextColor(getResources().getColor(R.color.musicTitle, null));
} }
}); });
appBarLayout.setOnClickListener(v -> finish()); breakApp.setOnClickListener(v -> finish());
playAll.setOnClickListener(v -> {
MusicContainer.getInstance().setPlayList(new ArrayList<>(adapter.getMusicDatas()));
MusicContainer.getInstance().playNext();
});
} }
@Override @Override

View File

@ -1,21 +1,25 @@
package com.yutou.nas_music_player.views.Fragments; package com.yutou.nas_music_player.views.Fragments;
import static com.yutou.nas_music_player.Adapters.MusicLibsAdapter.LIBS_MODEL_ALL;
import static com.yutou.nas_music_player.Adapters.MusicLibsAdapter.LIBS_MODEL_Album;
import static com.yutou.nas_music_player.Adapters.MusicLibsAdapter.LIBS_MODEL_Artist;
import static com.yutou.nas_music_player.Adapters.MusicLibsAdapter.LIBS_MODEL_PLAY_Collection;
import static com.yutou.nas_music_player.Adapters.MusicLibsAdapter.LIBS_MODEL_PLAY_LIST;
import static com.yutou.nas_music_player.Adapters.MusicLibsAdapter.LIBS_MODEL_Tmp;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.app.ActivityOptionsCompat; import androidx.core.app.ActivityOptionsCompat;
import androidx.core.util.Pair; import androidx.core.util.Pair;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.yutou.nas_music_player.Adapters.MusicLibsAdapter; import com.yutou.nas_music_player.Adapters.MusicLibsAdapter;
import com.yutou.nas_music_player.Datas.MusicData; import com.yutou.nas_music_player.Datas.MusicData;
@ -23,15 +27,16 @@ import com.yutou.nas_music_player.Interfaces.NetworkInterface;
import com.yutou.nas_music_player.R; import com.yutou.nas_music_player.R;
import com.yutou.nas_music_player.containers.MediaBrowserHelper; import com.yutou.nas_music_player.containers.MediaBrowserHelper;
import com.yutou.nas_music_player.containers.MusicContainer; import com.yutou.nas_music_player.containers.MusicContainer;
import com.yutou.nas_music_player.tools.StringUtil; import com.yutou.nas_music_player.tools.AppData;
import com.yutou.nas_music_player.views.AlbumsActivity; import com.yutou.nas_music_player.tools.AppTools;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public class MusicLibsFragment extends Fragment { public class MusicLibsFragment extends Fragment {
private Context context; private Context context;
private View view; private View view;
private ListView listView; private RecyclerView listView;
private int model = 0; private int model = 0;
private MediaBrowserHelper browserHelper; private MediaBrowserHelper browserHelper;
@ -67,9 +72,10 @@ public class MusicLibsFragment extends Fragment {
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (view != null) if (view != null)
return view; return view;
view = inflater.inflate(R.layout.fragment_music_libs, null); view = inflater.inflate(R.layout.fragment_music_libs, container, false);
if (adapter == null || listView == null) if (adapter == null || listView == null)
initViews(); initViews();
initData();
return view; return view;
} }
@ -77,128 +83,33 @@ public class MusicLibsFragment extends Fragment {
public void initViews() { public void initViews() {
listView = view.findViewById(R.id.listView); listView = view.findViewById(R.id.listView);
// recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); listView.setLayoutManager(new LinearLayoutManager(getContext()));
adapter = new MusicLibsAdapter(getContext(), model); adapter = new MusicLibsAdapter(getContext());
listView.setAdapter(adapter); listView.setAdapter(adapter);
listView.setOnScrollListener(new AbsListView.OnScrollListener() { adapter.setBrowserHelper(browserHelper);
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
adapter.setScrollStatus(1);
adapter.notifyDataSetChanged();
} else {
adapter.setScrollStatus(0);
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
});
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
System.out.println("点击列表:"+adapter.getModel());
switch (adapter.getModel()) {
case MusicLibsAdapter.LIBS_MODEL_ALL:
clickAllList(position);
break;
case MusicLibsAdapter.LIBS_MODEL_Album:
clickAlbum(position, view);
break;
case MusicLibsAdapter.LIBS_MODEL_PLAY_Collection:
clickCollection(position, view);
break;
}
}
private void clickCollection(int position, View view) {
MusicLibsAdapter.ViewHolder holder = (MusicLibsAdapter.ViewHolder) view.getTag();
Pair<View, String> pImage = Pair.create(holder.itemView, "album_image");
Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), pImage).toBundle();
MusicData data = adapter.getItem(position);
if (data == null)
return;
if(StringUtil.isEmpty(data.getComment())){
Toast.makeText(getContext(),"未收藏任何歌曲",Toast.LENGTH_LONG).show();
return;
}
Intent intent = new Intent(getContext(), AlbumsActivity.class);
intent.putExtra("model",2);
intent.putExtra("fid", data.getId());
startActivity(intent, bundle);
}
private void clickAlbum(int position, View view) {
MusicLibsAdapter.ViewHolder holder = (MusicLibsAdapter.ViewHolder) view.getTag();
Pair<View, String> pImage = Pair.create(holder.itemView, "album_image");
Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), pImage).toBundle();
MusicData data = adapter.getItem(position);
if (data == null)
return;
Intent intent = new Intent(getContext(), AlbumsActivity.class);
intent.putExtra("model",0);
intent.putExtra("album", data.getAlbum());
startActivity(intent, bundle);
}
private void clickAllList(int position) {
MusicData musicData = adapter.getItem(position);
if (musicData != null) {
if (musicData.isDir()) {
changeList(musicData.getFile());
} else {
if (browserHelper != null) {
browserHelper.play(adapter.getItem(position));
adapter.notifyDataSetChanged();
}else{
System.out.println("browserHelper为空");
}
}
}
}
});
adapter.setScrollStatus(1); adapter.setScrollStatus(1);
adapter.setOnClickAction((intent, view) -> {
Pair<View, String> pImage = Pair.create(view, "main_album_image");
Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), pImage).toBundle();
getContext().startActivity(intent, bundle);
});
adapter.notifyDataSetChanged(); adapter.notifyDataSetChanged();
int pos = 0; if(MusicContainer.getInstance().getNowPlayData()==null){
switch (model) { return;
case MusicLibsAdapter.LIBS_MODEL_ALL:
pos = MusicContainer.getLibs().findMusicIndex(MusicContainer.getInstance().getNowPlayData().getMd5()
, MusicContainer.getLibs().getMainData());
break;
} }
if (pos != -1)
listView.setSelection(pos);
} }
public MusicLibsAdapter getAdapter() { public MusicLibsAdapter getAdapter() {
return adapter; return adapter;
} }
private void changeList(String path) {
MusicContainer.getLibs().onDirMusicData(path, new NetworkInterface() {
@Override
public void httpGetData(Object data, int state) {
List<MusicData> list = (List<MusicData>) data;
adapter.setPath(path);
adapter.setData(list);
adapter.notifyDataSetChanged();
}
@Override
public void httpError(Exception e) {
}
});
}
public void flash() { public void flash() {
if (adapter == null) if (adapter == null)
return; return;
if (model == MusicLibsAdapter.LIBS_MODEL_Tmp) { if (model == MusicLibsAdapter.LIBS_MODEL_Tmp) {
adapter.initData(model); // adapter.initData(model);
initData();
} }
adapter.notifyDataSetChanged(); adapter.notifyDataSetChanged();
} }
@ -209,4 +120,92 @@ public class MusicLibsFragment extends Fragment {
adapter.initData(model); adapter.initData(model);
adapter.notifyDataSetChanged(); adapter.notifyDataSetChanged();
} }
List<MusicData> list = new ArrayList<>();
private String musicPath = "root";
public void initData() {
AppTools.showHud(context);
list.clear();
adapter.setModel(model);
switch (model) {
case LIBS_MODEL_Album:
String album = null;
MusicContainer.getLibs().onAlbumMusicData(album, new NetworkInterface() {
@Override
public void httpGetData(Object data, int state) {
list.clear();
if (data != null && state == 0)
list.addAll((List<MusicData>) data);
adapter.setData(list);
adapter.notifyDataSetChanged();
AppTools.hideHud();
}
@Override
public void httpError(Exception e) {
AppTools.hideHud();
}
});
break;
case LIBS_MODEL_Artist:
AppTools.hideHud();
break;
case LIBS_MODEL_Tmp:
list.addAll(MusicContainer.getInstance().getTmpPlayList());
System.out.println("临时播放列表:" + MusicContainer.getInstance().getTmpPlayList().size());
AppTools.hideHud();
break;
case LIBS_MODEL_PLAY_LIST:
list.addAll(MusicContainer.getInstance().getPlayList());
AppTools.hideHud();
break;
case LIBS_MODEL_PLAY_Collection:
MusicContainer.getLibs().onCollectionList(null, new NetworkInterface() {
@Override
public void httpGetData(Object data, int state) {
list.clear();
if (data != null && state == 0)
list.addAll((List<MusicData>) data);
adapter.setData(list);
adapter.notifyDataSetChanged();
AppTools.hideHud();
}
@Override
public void httpError(Exception e) {
AppTools.hideHud();
}
});
break;
case LIBS_MODEL_ALL:
default:
MusicContainer.getLibs().onDirMusicData(musicPath, new NetworkInterface() {
@Override
public void httpGetData(Object data, int state) {
list.clear();
if (data != null && state == 0)
list.addAll((List<MusicData>) data);
AppData.handler.post(new Runnable() {
@Override
public void run() {
adapter.setData(list);
AppTools.hideHud();
adapter.notifyDataSetChanged();
}
});
}
@Override
public void httpError(Exception e) {
AppData.handler.post(AppTools::hideHud);
}
});
}
System.out.println("list.size() = " + list.size());
adapter.setData(list);
adapter.notifyDataSetChanged();
}
} }

View File

@ -12,7 +12,6 @@ import android.support.v4.media.session.PlaybackStateCompat;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.Window;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.ImageView; import android.widget.ImageView;
@ -32,6 +31,7 @@ import com.yutou.nas_music_player.R;
import com.yutou.nas_music_player.containers.MediaBrowserHelper; import com.yutou.nas_music_player.containers.MediaBrowserHelper;
import com.yutou.nas_music_player.containers.MusicContainer; import com.yutou.nas_music_player.containers.MusicContainer;
import com.yutou.nas_music_player.tools.AppData; import com.yutou.nas_music_player.tools.AppData;
import com.yutou.nas_music_player.tools.AppTools;
import com.yutou.nas_music_player.tools.ConfigTools; import com.yutou.nas_music_player.tools.ConfigTools;
import java.util.List; import java.util.List;
@ -48,12 +48,11 @@ public class MainActivity extends AppCompatActivity {
private MediaBrowserHelper browserHelper; private MediaBrowserHelper browserHelper;
private ImageView album_image, background_image; private ImageView album_image, background_image;
private MarqueeTextView title, album, artist; private MarqueeTextView title, album, artist;
private TextView positionTime, durationTime, bitRate; private TextView positionTime, durationTime, bitRate, playIndex;
private SeekBar seekBar; private SeekBar seekBar;
private Handler handler; private Handler handler;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setBarColor(android.R.color.transparent); setBarColor(android.R.color.transparent);
@ -86,7 +85,6 @@ public class MainActivity extends AppCompatActivity {
@Override @Override
public void run() { public void run() {
browserHelper.getTransportControls().skipToNext(); browserHelper.getTransportControls().skipToNext();
} }
}); });
@ -131,11 +129,11 @@ public class MainActivity extends AppCompatActivity {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
int model = (int) playModel.getTag(); int model = (int) playModel.getTag();
if (model == MusicContainer.PLAY_MODEL_LOOP) { if (model == MusicContainer.PLAY_MODEL_LIST_RANDOM) {
setPlayModelButton(MusicContainer.PLAY_MODEL_RANDOM); setPlayModelButton(MusicContainer.PLAY_MODEL_RANDOM,true);
return; return;
} }
setPlayModelButton(model + 1); setPlayModelButton(model + 1,true);
} }
}); });
getWindow().getDecorView().setOnTouchListener(new View.OnTouchListener() { getWindow().getDecorView().setOnTouchListener(new View.OnTouchListener() {
@ -148,14 +146,13 @@ public class MainActivity extends AppCompatActivity {
downPosition_y = event.getRawY(); downPosition_y = event.getRawY();
} else if (event.getAction() == MotionEvent.ACTION_UP) { } else if (event.getAction() == MotionEvent.ACTION_UP) {
if (Math.abs(downPosition_x - event.getRawX()) < 500 && downPosition_y - event.getRawY() > 500) { if (Math.abs(downPosition_x - event.getRawX()) < 500 && downPosition_y - event.getRawY() > 500) {
Pair<View, String> pImage = Pair.create((View) album_image, "album_image"); Pair<View, String> pImage = Pair.create((View) album_image, "main_album_image");
Pair<View, String> pPrevious = Pair.create((View) previous, "previous"); Pair<View, String> pPrevious = Pair.create((View) previous, "previous");
Pair<View, String> pPlay = Pair.create((View) play, "play"); Pair<View, String> pPlay = Pair.create((View) play, "play");
Pair<View, String> pNext = Pair.create((View) next, "next"); Pair<View, String> pNext = Pair.create((View) next, "next");
Pair<View, String> pTitle = Pair.create((View) title, "title"); Pair<View, String> pTitle = Pair.create((View) title, "title");
Pair<View, String> pArtist = Pair.create((View) artist, "artist"); Pair<View, String> pArtist = Pair.create((View) artist, "artist");
Pair<View, String> pBar = Pair.create((View) seekBar, "bar"); Pair<View, String> pBar = Pair.create((View) seekBar, "bar");
//ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity.this,list);
Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity.this, Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity.this,
pImage, pImage,
pPrevious, pPrevious,
@ -211,6 +208,11 @@ public class MainActivity extends AppCompatActivity {
artist.setText(data.getArtist()); artist.setText(data.getArtist());
album.setText(data.getAlbum()); album.setText(data.getAlbum());
bitRate.setText(data.getBitRate() + "kbps / " + data.getSampleRate() + "hz"); bitRate.setText(data.getBitRate() + "kbps / " + data.getSampleRate() + "hz");
if (MusicContainer.getInstance().getPlayList().isEmpty()) {
playIndex.setText("(∞)");
} else {
playIndex.setText("(" + (MusicContainer.getInstance().getPlayIndex() + 1) + "/" + MusicContainer.getInstance().getPlayList().size() + ")");
}
seekBar.setMax((int) (data.getDurationAsDouble() * 1000)); seekBar.setMax((int) (data.getDurationAsDouble() * 1000));
int minutes = (int) (data.getDurationAsDouble() / 60); int minutes = (int) (data.getDurationAsDouble() / 60);
int seconds = (int) (data.getDurationAsDouble() % 60); int seconds = (int) (data.getDurationAsDouble() % 60);
@ -218,13 +220,13 @@ public class MainActivity extends AppCompatActivity {
+ String.format(Locale.CHINA, "%02d", seconds)); + String.format(Locale.CHINA, "%02d", seconds));
int model = ConfigTools.getPreferences().getInt("playModel", MusicContainer.PLAY_MODEL_RANDOM); int model = ConfigTools.getPreferences().getInt("playModel", MusicContainer.PLAY_MODEL_RANDOM);
setPlayModelButton(model); setPlayModelButton(model);
if (data.getImg(-1, -1) != null) { if (data.getImg(AppData.imageWidth, AppData.imageHigh) != null) {
setImage(data); setImage(data);
} else { } else {
new Timer().schedule(new TimerTask() { new Timer().schedule(new TimerTask() {
@Override @Override
public void run() { public void run() {
if (data.getImg(-1, -1) != null) { if (data.getImg(AppData.imageWidth, AppData.imageHigh) != null) {
AppData.handler.post(new Runnable() { AppData.handler.post(new Runnable() {
@Override @Override
public void run() { public void run() {
@ -240,31 +242,46 @@ public class MainActivity extends AppCompatActivity {
} }
private void setPlayModelButton(int model) { private void setPlayModelButton(int model) {
setPlayModelButton(model, false);
}
private void setPlayModelButton(int model, boolean isButton) {
playModel.setTag(model); playModel.setTag(model);
MusicContainer.getInstance().setPlayModel(model); MusicContainer.getInstance().setPlayModel(model);
switch (model) { switch (model) {
case MusicContainer.PLAY_MODEL_RANDOM: case MusicContainer.PLAY_MODEL_RANDOM:
playModel.setImageResource(R.drawable.ic_play_random); playModel.setImageResource(R.drawable.ic_play_random);
if (isButton)
AppTools.toast("全列表随机模式");
break; break;
case MusicContainer.PLAY_MODEL_ORDER: case MusicContainer.PLAY_MODEL_ORDER:
playModel.setImageResource(R.drawable.ic_play_list); playModel.setImageResource(R.drawable.ic_play_list);
if (isButton)
AppTools.toast("列表顺序模式");
break; break;
case MusicContainer.PLAY_MODEL_ONE_LOOP: case MusicContainer.PLAY_MODEL_ONE_LOOP:
playModel.setImageResource(R.drawable.ic_play_one_loop); playModel.setImageResource(R.drawable.ic_play_one_loop);
if (isButton)
AppTools.toast("单曲循环");
break; break;
case MusicContainer.PLAY_MODEL_LOOP: case MusicContainer.PLAY_MODEL_LIST_RANDOM:
playModel.setImageResource(R.drawable.ic_play_loop); playModel.setImageResource(R.drawable.ic_play_loop);
if (isButton)
AppTools.toast("列表随机");
break; break;
default:
setPlayModelButton(MusicContainer.PLAY_MODEL_RANDOM,isButton);
return;
} }
ConfigTools.getPreferences().edit().putInt("playModel", model).apply(); ConfigTools.getPreferences().edit().putInt("playModel", model).apply();
} }
private void setImage(MusicData data) { private void setImage(MusicData data) {
setBarColor(data.getImageColor()); // setBarColor(data.getImageColor());
Glide.with(this).load(data.getImg(-1, -1)) Glide.with(this).load(data.getImg(AppData.imageWidth, AppData.imageHigh))
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(25, 3))) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(25, 3)))
.into(album_image); .into(album_image);
Glide.with(this).load(data.getImg(200, 200)) Glide.with(this).load(data.getImg(AppData.minImageWidth, AppData.minImageHigh))
.apply(RequestOptions.bitmapTransform(new BlurTransformation(25, 3))) .apply(RequestOptions.bitmapTransform(new BlurTransformation(25, 3)))
.into(background_image); .into(background_image);
} }
@ -283,11 +300,14 @@ public class MainActivity extends AppCompatActivity {
durationTime = findViewById(R.id.durationTime); durationTime = findViewById(R.id.durationTime);
seekBar = findViewById(R.id.seekBar); seekBar = findViewById(R.id.seekBar);
playModel = findViewById(R.id.playModel); playModel = findViewById(R.id.playModel);
playIndex = findViewById(R.id.playIndex);
int model = ConfigTools.getPreferences().getInt("playModel", MusicContainer.PLAY_MODEL_RANDOM);
setPlayModelButton(model);
} }
public void setBarColor(int color) { public void setBarColor(int color) {
getWindow().setStatusBarColor(color); //getWindow().setStatusBarColor(color);
getWindow().setNavigationBarColor(color); // getWindow().setNavigationBarColor(Color.parseColor("#00FFFFFF"));
} }
@Override @Override
@ -300,6 +320,12 @@ public class MainActivity extends AppCompatActivity {
finish(); finish();
} }
@Override
protected void onResume() {
super.onResume();
setPlayData(MusicContainer.getInstance().getNowPlayData());
}
@Override @Override
protected void onNewIntent(Intent intent) { protected void onNewIntent(Intent intent) {
super.onNewIntent(intent); super.onNewIntent(intent);
@ -308,29 +334,32 @@ public class MainActivity extends AppCompatActivity {
@Override @Override
public boolean onKeyUp(int keyCode, KeyEvent event) { public boolean onKeyUp(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK){ if (keyCode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(true); moveTaskToBack(true);
return false; return false;
} }
return super.onKeyUp(keyCode, event); return super.onKeyUp(keyCode, event);
} }
float downX=0;
float downY=0; float downX = 0;
float downY = 0;
@Override @Override
public boolean onTouchEvent(MotionEvent event) { public boolean onTouchEvent(MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN){ if (event.getAction() == MotionEvent.ACTION_DOWN) {
downX=event.getRawX(); downX = event.getRawX();
downY=event.getRawY(); downY = event.getRawY();
}else if (event.getAction()==MotionEvent.ACTION_UP){ } else if (event.getAction() == MotionEvent.ACTION_UP) {
pass(event.getRawX(),event.getRawY()); pass(event.getRawX(), event.getRawY());
} }
return super.onTouchEvent(event); return super.onTouchEvent(event);
} }
private void pass(float upX,float upY){
boolean isOkY=Math.abs(upY-downY)<=200; private void pass(float upX, float upY) {
if(upX-downX>200&&isOkY){ boolean isOkY = Math.abs(upY - downY) <= 200;
if (upX - downX > 200 && isOkY) {
previous.callOnClick(); previous.callOnClick();
}else if (upX-downX<-200&&isOkY){ } else if (upX - downX < -200 && isOkY) {
next.callOnClick(); next.callOnClick();
} }
} }
@ -340,7 +369,7 @@ public class MainActivity extends AppCompatActivity {
@Override @Override
public void onPlaybackStateChanged(PlaybackStateCompat state) { public void onPlaybackStateChanged(PlaybackStateCompat state) {
super.onPlaybackStateChanged(state); super.onPlaybackStateChanged(state);
System.out.println("播放状态变化:" + state.getPosition() + " " + seekBar.getMax()); //System.out.println("播放状态变化:" + state.getPosition() + " " + seekBar.getMax());
if (state.getState() == PlaybackStateCompat.STATE_PLAYING) { if (state.getState() == PlaybackStateCompat.STATE_PLAYING) {
int duration = (int) (state.getPosition() / 1000); int duration = (int) (state.getPosition() / 1000);
int minutes = duration / 60; int minutes = duration / 60;
@ -348,6 +377,7 @@ public class MainActivity extends AppCompatActivity {
positionTime.setText(String.format(Locale.CHINA, "%02d", minutes) + ":" positionTime.setText(String.format(Locale.CHINA, "%02d", minutes) + ":"
+ String.format(Locale.CHINA, "%02d", seconds)); + String.format(Locale.CHINA, "%02d", seconds));
seekBar.setProgress((int) (state.getPosition())); seekBar.setProgress((int) (state.getPosition()));
play.setImageResource(android.R.drawable.ic_media_pause); play.setImageResource(android.R.drawable.ic_media_pause);
} else { } else {
play.setImageResource(android.R.drawable.ic_media_play); play.setImageResource(android.R.drawable.ic_media_play);
@ -381,9 +411,5 @@ public class MainActivity extends AppCompatActivity {
super.onQueueChanged(queue); super.onQueueChanged(queue);
System.out.println("不知道是啥变换了"); System.out.println("不知道是啥变换了");
} }
public void setImage() {
}
} }
} }

View File

@ -9,7 +9,6 @@ import android.support.v4.media.session.MediaControllerCompat;
import android.support.v4.media.session.MediaSessionCompat; import android.support.v4.media.session.MediaSessionCompat;
import android.support.v4.media.session.PlaybackStateCompat; import android.support.v4.media.session.PlaybackStateCompat;
import android.view.View; import android.view.View;
import android.view.Window;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ProgressBar; import android.widget.ProgressBar;
@ -31,6 +30,7 @@ import com.yutou.nas_music_player.Interfaces.NetworkInterface;
import com.yutou.nas_music_player.R; import com.yutou.nas_music_player.R;
import com.yutou.nas_music_player.containers.MediaBrowserHelper; import com.yutou.nas_music_player.containers.MediaBrowserHelper;
import com.yutou.nas_music_player.containers.MusicContainer; import com.yutou.nas_music_player.containers.MusicContainer;
import com.yutou.nas_music_player.tools.AppData;
import com.yutou.nas_music_player.views.Fragments.MusicLibsFragment; import com.yutou.nas_music_player.views.Fragments.MusicLibsFragment;
import java.util.ArrayList; import java.util.ArrayList;
@ -54,7 +54,6 @@ public class PlayLibsActivity extends AppCompatActivity {
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_list); setContentView(R.layout.activity_play_list);
PlayListener playListener = new PlayListener(); PlayListener playListener = new PlayListener();
@ -191,7 +190,7 @@ public class PlayLibsActivity extends AppCompatActivity {
artist.setText(data.getArtist()); artist.setText(data.getArtist());
progressBar.setMax((int) (data.getDurationAsDouble() * 1000)); progressBar.setMax((int) (data.getDurationAsDouble() * 1000));
progressBar.setProgress(bar_pos); progressBar.setProgress(bar_pos);
data.getImg(-1, -1, new NetworkInterface() { data.getImg(AppData.minImageWidth,AppData.minImageHigh, new NetworkInterface() {
@Override @Override
public void httpGetData(Object data, int state) { public void httpGetData(Object data, int state) {
setImage((Bitmap) data); setImage((Bitmap) data);

View File

@ -29,7 +29,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:transitionName="album_image" android:transitionName="main_album_image"
app:srcCompat="@drawable/ic_launcher_background" /> app:srcCompat="@drawable/ic_launcher_background" />
<androidx.appcompat.widget.Toolbar <androidx.appcompat.widget.Toolbar
@ -46,13 +46,33 @@
android:textColor="@color/musicArtist" /> android:textColor="@color/musicArtist" />
</androidx.appcompat.widget.Toolbar> </androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.CollapsingToolbarLayout> </com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:orientation="vertical">
<Button
android:id="@+id/playAll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="播放全部" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/album_list" android:id="@+id/album_list"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="0dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior" /> android:layout_weight="1"
>
</androidx.recyclerview.widget.RecyclerView>
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -34,7 +34,7 @@
android:layout_marginTop="150dp" android:layout_marginTop="150dp"
android:contentDescription="专辑图" android:contentDescription="专辑图"
android:src="@drawable/ic_launcher_foreground" android:src="@drawable/ic_launcher_foreground"
android:transitionName="album_image" android:transitionName="main_album_image"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
@ -98,6 +98,19 @@
android:text="TextView" android:text="TextView"
android:textColor="@color/textColorWhite" /> android:textColor="@color/textColorWhite" />
<TextView
android:id="@+id/playIndex"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="right"
android:shadowColor="@color/colorBlack"
android:shadowDx="5"
android:shadowDy="5"
android:shadowRadius="1"
android:text="(0/0)"
android:textColor="@color/textColorWhite" />
<TextView <TextView
android:id="@+id/durationTime" android:id="@+id/durationTime"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@ -5,7 +5,8 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
<ListView
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/listView" android:id="@+id/listView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent" />

View File

@ -56,7 +56,7 @@
android:shadowRadius="1" android:shadowRadius="1"
android:text="TextView" android:text="TextView"
android:textColor="@color/colorBlack" android:textColor="@color/colorBlack"
android:transitionName="title" /> />
<cc.ibooker.ztextviewlib.MarqueeTextView <cc.ibooker.ztextviewlib.MarqueeTextView
android:id="@+id/artist" android:id="@+id/artist"
@ -71,7 +71,7 @@
android:text="TextView" android:text="TextView"
android:textColor="@color/colorBlack" android:textColor="@color/colorBlack"
android:textSize="10sp" android:textSize="10sp"
android:transitionName="artist" /> />
<cc.ibooker.ztextviewlib.MarqueeTextView <cc.ibooker.ztextviewlib.MarqueeTextView
android:id="@+id/message" android:id="@+id/message"
@ -86,7 +86,7 @@
android:text="TextView" android:text="TextView"
android:textColor="@color/colorBlack" android:textColor="@color/colorBlack"
android:textSize="8sp" android:textSize="8sp"
android:transitionName="artist" /> />
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
@ -103,7 +103,6 @@
android:layout_height="40dp" android:layout_height="40dp"
android:layout_gravity="center" android:layout_gravity="center"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:transitionName="previous"
app:srcCompat="@drawable/ic_dislike" /> app:srcCompat="@drawable/ic_dislike" />
<ImageButton <ImageButton
@ -112,7 +111,6 @@
android:layout_height="40dp" android:layout_height="40dp"
android:layout_gravity="center" android:layout_gravity="center"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:transitionName="play"
app:srcCompat="@drawable/ic_collection" /> app:srcCompat="@drawable/ic_collection" />
<ImageButton <ImageButton
@ -122,7 +120,6 @@
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginEnd="10dp" android:layout_marginEnd="10dp"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:transitionName="next"
app:srcCompat="@drawable/ic_top" /> app:srcCompat="@drawable/ic_top" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View File

@ -14,7 +14,7 @@
android:id="@+id/album_image" android:id="@+id/album_image"
android:layout_width="64dp" android:layout_width="64dp"
android:layout_height="64dp" android:layout_height="64dp"
android:transitionName="album_image" android:transitionName="main_album_image"
app:srcCompat="@mipmap/ic_launcher" /> app:srcCompat="@mipmap/ic_launcher" />
<LinearLayout <LinearLayout

View File

@ -9,4 +9,6 @@
<color name="musicArtist">#000000</color> <color name="musicArtist">#000000</color>
<color name="textColorGray">#DEDEDE</color> <color name="textColorGray">#DEDEDE</color>
<color name="textColorWhite">#FFFFFF</color> <color name="textColorWhite">#FFFFFF</color>
<color name="bar">#3BFFFFFF</color>
<color name="transparent">#00FFFFFF</color>
</resources> </resources>

View File

@ -5,6 +5,8 @@
<item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item> <item name="colorAccent">@color/colorAccent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:statusBarColor">@android:color/transparent</item>
</style> </style>
</resources> </resources>

View File

@ -7,7 +7,7 @@ buildscript {
jcenter() jcenter()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:7.1.3' classpath 'com.android.tools.build:gradle:7.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

View File

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip