package com.wm.remusic.fragment; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.DialogFragment; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.ImageView; import android.widget.TextView; import com.bilibili.magicasakura.widgets.TintImageView; import com.wm.remusic.R; import com.wm.remusic.dialog.AddNetPlaylistDialog; import com.wm.remusic.handler.HandlerUtil; import com.wm.remusic.info.MusicInfo; import com.wm.remusic.provider.MusicPlaybackState; import com.wm.remusic.recent.QueueLoader; import com.wm.remusic.service.MusicPlayer; import com.wm.remusic.widget.DividerItemDecoration; import java.io.BufferedReader; import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; /** * Created by wm on 2016/2/4. */ public class PlayQueueFragment extends AttachDialogFragment { private RecyclerView.ItemDecoration itemDecoration; private PlaylistAdapter adapter; private ArrayList<MusicInfo> playlist; private TextView playlistNumber, clearAll, addToPlaylist; private MusicInfo musicInfo; private int currentlyPlayingPosition = 0; private MusicPlaybackState musicPlaybackState; private RecyclerView recyclerView; //弹出的activity列表 private LinearLayoutManager layoutManager; private Handler mHandler; private PlayQuueuListener mQueueListener; public interface PlayQuueuListener{ void onPlay(int position); } public void setQueueListener(PlayQuueuListener listener){ mQueueListener = listener; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //设置样式 setStyle(DialogFragment.STYLE_NO_FRAME, R.style.CustomDatePickerDialog); musicPlaybackState = MusicPlaybackState.getInstance(mContext); mHandler = HandlerUtil.getInstance(mContext); } @Override public void onStop() { super.onStop(); } @Override public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //设置无标题 getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE); //设置从底部弹出 WindowManager.LayoutParams params = getDialog().getWindow() .getAttributes(); params.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL; getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); getDialog().getWindow().setAttributes(params); View view = inflater.inflate(R.layout.fragment_queue, container); //布局 playlistNumber = (TextView) view.findViewById(R.id.play_list_number); addToPlaylist = (TextView) view.findViewById(R.id.playlist_addto); clearAll = (TextView) view.findViewById(R.id.playlist_clear_all); addToPlaylist.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AddNetPlaylistDialog.newInstance(playlist).show(getFragmentManager(), "add"); } }); clearAll.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MusicPlayer.clearQueue(); MusicPlayer.stop(); File file = new File(mContext.getCacheDir().getAbsolutePath() + "playlist"); if (file.exists()) { file.delete(); } MusicPlaybackState.getInstance(mContext).clearQueue(); if (adapter != null) adapter.notifyDataSetChanged(); dismiss(); } }); recyclerView = (RecyclerView) view.findViewById(R.id.play_list); layoutManager = new LinearLayoutManager(mContext); recyclerView.setLayoutManager(layoutManager); recyclerView.setHasFixedSize(true); new loadSongs().execute(); return view; } @Override public void onStart() { super.onStart(); //设置fragment高度 、宽度 int dialogHeight = (int) (mContext.getResources().getDisplayMetrics().heightPixels * 0.6); getDialog().getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, dialogHeight); getDialog().setCanceledOnTouchOutside(true); } private String readTextFromSDcard(InputStream is) throws Exception { InputStreamReader reader = new InputStreamReader(is); BufferedReader bufferedReader = new BufferedReader(reader); StringBuffer buffer = new StringBuffer(""); String str; while ((str = bufferedReader.readLine()) != null) { buffer.append(str); buffer.append("\n"); } return buffer.toString(); } //异步加载recyclerview界面 private class loadSongs extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { if (mContext != null) { try { // FileInputStream in = new FileInputStream(new File(getContext().getCacheDir().getAbsolutePath() + "playlist")); // String c = readTextFromSDcard(in); // HashMap<Long, MusicInfo> play = MainApplication.gsonInstance().fromJson(c, new TypeToken<HashMap<Long, MusicInfo>>() { // }.getType()); HashMap<Long, MusicInfo> play = MusicPlayer.getPlayinfos(); if (play != null && play.size() > 0) { long[] queue = MusicPlayer.getQueue(); int len = queue.length; playlist = new ArrayList<>(); for (int i = 0; i < len; i++) { playlist.add(play.get(queue[i])); } } } catch (Exception e) { e.printStackTrace(); } } return null; } @Override protected void onPostExecute(Void result) { if (playlist != null && playlist.size() > 0) { adapter = new PlaylistAdapter(playlist); recyclerView.setAdapter(adapter); itemDecoration = new DividerItemDecoration(mContext, DividerItemDecoration.VERTICAL_LIST); recyclerView.addItemDecoration(itemDecoration); playlistNumber.setText("播放列表(" + playlist.size() + ")"); for (int i = 0; i < playlist.size(); i++) { MusicInfo info = playlist.get(i); if (info != null && MusicPlayer.getCurrentAudioId() == info.songId) { recyclerView.scrollToPosition(i); } } } } } class PlaylistAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private ArrayList<MusicInfo> playlist = new ArrayList<>(); public PlaylistAdapter(ArrayList<MusicInfo> list) { playlist = list; } public void updateDataSet(ArrayList<MusicInfo> list) { this.playlist = list; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { return new ItemViewHolder(LayoutInflater.from(mContext).inflate(R.layout.fragment_playqueue_item, viewGroup, false)); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { musicInfo = playlist.get(position); ((ItemViewHolder) holder).MusicName.setText(playlist.get(position).musicName); ((ItemViewHolder) holder).Artist.setText("-" + playlist.get(position).artist); //判断该条目音乐是否在播放 Log.e("current", MusicPlayer.getCurrentAudioId() + "" + " " + musicInfo.songId); if (MusicPlayer.getCurrentAudioId() == musicInfo.songId) { Log.e("current", MusicPlayer.getCurrentAudioId() + "" + " " + musicInfo.songId); ((ItemViewHolder) holder).playstate.setVisibility(View.VISIBLE); ((ItemViewHolder) holder).playstate.setImageResource(R.drawable.song_play_icon); ((ItemViewHolder) holder).playstate.setImageTintList(R.color.theme_color_primary); currentlyPlayingPosition = position; } else { ((ItemViewHolder) holder).playstate.setVisibility(View.GONE); } } @Override public int getItemCount() { return playlist == null ? 0 : playlist.size(); } class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { ImageView delete; TextView MusicName, Artist; TintImageView playstate; public ItemViewHolder(View itemView) { super(itemView); this.playstate = (TintImageView) itemView.findViewById(R.id.play_state); this.delete = (ImageView) itemView.findViewById(R.id.play_list_delete); this.MusicName = (TextView) itemView.findViewById(R.id.play_list_musicname); this.Artist = (TextView) itemView.findViewById(R.id.play_list_artist); itemView.setOnClickListener(this); this.delete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int a = getAdapterPosition(); long deleteId = playlist.get(a).songId; // musicPlaybackState.Delete(deleteId); notifyItemRemoved(a); MusicPlayer.removeTrack(deleteId); updateDataSet(QueueLoader.getQueueSongs(mContext)); if (playlist == null) { MusicPlayer.stop(); } if (MusicPlayer.isPlaying() && (MusicPlayer.getCurrentAudioId() == deleteId)) { MusicPlayer.next(); } notifyDataSetChanged(); if (playlist != null) { playlistNumber.setText("播放列表(" + playlist.size() + ")"); } else { playlistNumber.setText("播放列表"); } } }); } @Override public void onClick(View v) { mHandler.postDelayed(new Runnable() { @Override public void run() { final int a = getAdapterPosition(); if (a == -1) { return; } long[] ids = new long[1]; ids[0] = playlist.get(a).songId; MusicPlayer.setQueuePosition(a); if(mQueueListener != null) mQueueListener.onPlay(a); notifyItemChanged(currentlyPlayingPosition); notifyItemChanged(a); } }, 70); } } } }