package com.wm.remusic.activity;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.TransitionDrawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.bilibili.magicasakura.widgets.TintImageView;
import com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView;
import com.github.ksoichiro.android.observablescrollview.ObservableScrollViewCallbacks;
import com.github.ksoichiro.android.observablescrollview.ScrollState;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.nineoldandroids.view.ViewHelper;
import com.wm.remusic.MainApplication;
import com.wm.remusic.R;
import com.wm.remusic.fragment.MoreFragment;
import com.wm.remusic.fragment.NetMoreFragment;
import com.wm.remusic.handler.HandlerUtil;
import com.wm.remusic.info.MusicInfo;
import com.wm.remusic.json.BillboardJson;
import com.wm.remusic.json.MusicDetailInfo;
import com.wm.remusic.net.BMA;
import com.wm.remusic.net.HttpUtil;
import com.wm.remusic.net.MusicDetailInfoGet;
import com.wm.remusic.net.NetworkUtils;
import com.wm.remusic.net.RequestThreadPool;
import com.wm.remusic.service.MusicPlayer;
import com.wm.remusic.uitl.CommonUtils;
import com.wm.remusic.uitl.IConstants;
import com.wm.remusic.uitl.ImageUtils;
import com.wm.remusic.uitl.L;
import com.wm.remusic.widget.DividerItemDecoration;
import java.util.ArrayList;
import java.util.HashMap;
/**
* Created by wm on 2016/4/15.
*/
//歌单
public class RankPlaylistActivity extends BaseActivity implements ObservableScrollViewCallbacks {
private int albumPath;
private String playlistName, playlistDetail;
private ArrayList<BillboardJson> mList = new ArrayList<BillboardJson>();
private ArrayList<MusicInfo> adapterList = new ArrayList<>();
private ImageView albumArt;
private TextView playlistTitleView, playlistDetailView;
private boolean isLocalPlaylist;
private PlaylistDetailAdapter mAdapter;
private Toolbar toolbar;
private SparseArray<MusicDetailInfo> sparseArray = new SparseArray<MusicDetailInfo>();
private FrameLayout loadFrameLayout;
private int musicCount;
private Handler mHandler;
private View loadView;
private int mFlexibleSpaceImageHeight;
private ActionBar actionBar;
private int mActionBarSize;
private int mStatusSize;
private TextView tryAgain;
private FrameLayout headerViewContent; //上部header
private RelativeLayout headerDetail; //上部header信息
private Context mContext;
private int mBillType;
private LoadNetPlaylistInfo mLoadNetList;
private ObservableRecyclerView recyclerView;
private String TAG = "PlaylistActivity";
private boolean d = true;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
if (getIntent().getExtras() != null) {
isLocalPlaylist = false;
mBillType = getIntent().getIntExtra("type", -1);
albumPath = getIntent().getIntExtra("pic", 0);
playlistName = getIntent().getStringExtra("playlistname");
playlistDetail = getIntent().getStringExtra("playlistDetail");
}
mContext = this;
setContentView(R.layout.activity_rank_playlist);
loadFrameLayout = (FrameLayout) findViewById(R.id.state_container);
headerViewContent = (FrameLayout) findViewById(R.id.headerview);
headerDetail = (RelativeLayout) findViewById(R.id.headerdetail);
toolbar = (Toolbar) findViewById(R.id.toolbar);
mHandler = HandlerUtil.getInstance(this);
mFlexibleSpaceImageHeight = getResources().getDimensionPixelSize(R.dimen.flexible_space_image_height);
mActionBarSize = CommonUtils.getActionBarHeight(this);
mStatusSize = CommonUtils.getStatusHeight(this);
tryAgain = (TextView) findViewById(R.id.try_again);
setUpEverything();
}
private void setUpEverything() {
setupToolbar();
setHeaderView();
setAlbumart();
setList();
loadAllLists();
}
private void setupToolbar() {
setSupportActionBar(toolbar);
actionBar = getSupportActionBar();
actionBar.setHomeAsUpIndicator(R.drawable.actionbar_back);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setTitle("歌单");
toolbar.setPadding(0, mStatusSize, 0, 0);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
if (!isLocalPlaylist) {
toolbar.setSubtitle(playlistDetail);
}
}
private void setHeaderView() {
albumArt = (ImageView) findViewById(R.id.album_art);
playlistTitleView = (TextView) findViewById(R.id.album_title);
playlistDetailView = (TextView) findViewById(R.id.album_details);
tryAgain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loadAllLists();
}
});
// if(Integer.parseInt(playlsitId) == IConstants.FAV_PLAYLIST){
// favLayout.setVisibility(View.VISIBLE);
// }
}
private void setList() {
recyclerView = (ObservableRecyclerView) findViewById(R.id.recyclerview);
recyclerView.setScrollViewCallbacks(RankPlaylistActivity.this);
recyclerView.setLayoutManager(new LinearLayoutManager(RankPlaylistActivity.this));
recyclerView.setHasFixedSize(true);
mAdapter = new PlaylistDetailAdapter(RankPlaylistActivity.this, adapterList);
recyclerView.setAdapter(mAdapter);
recyclerView.addItemDecoration(new DividerItemDecoration(RankPlaylistActivity.this, DividerItemDecoration.VERTICAL_LIST));
}
protected void updateViews(int scrollY, boolean animated) {
// If it's ListView, onScrollChanged is called before ListView is laid out (onGlobalLayout).
// This causes weird animation when onRestoreInstanceState occurred,
// so we check if it's laid out already.
// if (!mReady) {
// return;
// }
// Translate header
ViewHelper.setTranslationY(headerViewContent, getHeaderTranslationY(scrollY));
}
protected float getHeaderTranslationY(int scrollY) {
final int headerHeight = headerViewContent.getHeight();
int headerTranslationY = mActionBarSize + mStatusSize - headerHeight;
if (mActionBarSize + mStatusSize <= -scrollY + headerHeight) {
headerTranslationY = -scrollY;
}
return headerTranslationY;
}
private void loadAllLists() {
if (NetworkUtils.isConnectInternet(this)) {
tryAgain.setVisibility(View.GONE);
loadView = LayoutInflater.from(this).inflate(R.layout.loading, loadFrameLayout, false);
loadFrameLayout.addView(loadView);
mLoadNetList = new LoadNetPlaylistInfo();
mLoadNetList.execute();
} else {
tryAgain.setVisibility(View.VISIBLE);
}
}
@Override
public void updateTrack() {
mAdapter.notifyDataSetChanged();
}
class LoadNetPlaylistInfo extends AsyncTask<Void, Void, Boolean> {
@Override
protected Boolean doInBackground(final Void... unused) {
try {
JsonObject jsonObject = HttpUtil.getResposeJsonObject(BMA.Billboard.billSongList(mBillType, 0, 100));
JsonArray pArray = jsonObject.get("song_list").getAsJsonArray();
JsonObject jsonObject1 = jsonObject.get("billboard").getAsJsonObject();
playlistName = jsonObject1.get("name").getAsString();
try {
playlistDetail = "最近更新:" + jsonObject1.get("update_date").getAsString();
} catch (Exception e) {
e.printStackTrace();
}
mHandler.post(showInfo);
musicCount = pArray.size();
for (int i = 0; i < musicCount; i++) {
BillboardJson billboardJson = MainApplication.gsonInstance().fromJson(pArray.get(i), BillboardJson.class);
mList.add(billboardJson);
RequestThreadPool.post(new MusicDetailInfoGet(billboardJson.getSong_id(), i, sparseArray));
}
int tryCount = 0;
while (sparseArray.size() != musicCount && tryCount < 1000 && !isCancelled()) {
tryCount++;
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (sparseArray.size() == musicCount) {
for (int i = 0; i < mList.size(); i++) {
try {
MusicInfo musicInfo = new MusicInfo();
musicInfo.songId = Integer.parseInt(mList.get(i).getSong_id());
musicInfo.musicName = mList.get(i).getTitle();
musicInfo.artist = sparseArray.get(i).getArtist_name();
musicInfo.islocal = false;
musicInfo.albumName = sparseArray.get(i).getAlbum_title();
musicInfo.albumId = Integer.parseInt(mList.get(i).getAlbum_id());
musicInfo.artistId = Integer.parseInt(sparseArray.get(i).getArtist_id());
musicInfo.lrc = sparseArray.get(i).getLrclink();
musicInfo.albumData = sparseArray.get(i).getPic_radio();
adapterList.add(musicInfo);
} catch (Exception e) {
e.printStackTrace();
}
}
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Override
protected void onPostExecute(Boolean complete) {
if (!complete) {
loadFrameLayout.removeAllViews();
tryAgain.setVisibility(View.VISIBLE);
} else {
loadFrameLayout.removeAllViews();
recyclerView.setVisibility(View.VISIBLE);
mAdapter.updateDataSet(adapterList);
}
}
public void cancleTask(){
cancel(true);
RequestThreadPool.finish();
}
}
Runnable showInfo = new Runnable() {
@Override
public void run() {
playlistTitleView.setText(playlistName);
playlistDetailView.setText(playlistDetail);
headerDetail.setVisibility(View.VISIBLE);
}
};
@Override
public void onResume() {
super.onResume();
}
@Override
public void onPause() {
super.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mLoadNetList != null){
mLoadNetList.cancleTask();
}
}
private void setAlbumart() {
playlistTitleView.setText(playlistName);
try {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), albumPath);
new setBlurredAlbumArt().execute(bitmap);
L.D(d, TAG, "albumpath = " + albumPath);
} catch (Exception e) {
e.printStackTrace();
}
}
private class setBlurredAlbumArt extends AsyncTask<Bitmap, Void, Drawable> {
@Override
protected Drawable doInBackground(Bitmap... loadedImage) {
Drawable drawable = null;
try {
drawable = ImageUtils.createBlurredImageFromBitmap(loadedImage[0], RankPlaylistActivity.this, 20);
} catch (Exception e) {
e.printStackTrace();
}
return drawable;
}
@Override
protected void onPostExecute(Drawable result) {
if (result != null) {
if (albumArt.getDrawable() != null) {
final TransitionDrawable td =
new TransitionDrawable(new Drawable[]{
albumArt.getDrawable(),
result
});
albumArt.setImageDrawable(td);
td.startTransition(200);
} else {
albumArt.setImageDrawable(result);
}
}
}
}
@Override
public void onScrollChanged(int scrollY, boolean firstScroll, boolean dragging) {
updateViews(scrollY, false);
if (scrollY > 0 && scrollY < mFlexibleSpaceImageHeight - mActionBarSize - mStatusSize) {
toolbar.setTitle(playlistName);
toolbar.setSubtitle(playlistDetail);
actionBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.toolbar_background));
}
if (scrollY == 0) {
toolbar.setTitle("歌单");
actionBar.setBackgroundDrawable(null);
}
if (scrollY > mFlexibleSpaceImageHeight - mActionBarSize - mStatusSize) {
// if(mBlurDrawable != null){
// mBlurDrawable.setColorFilter(Color.parseColor("#79000000"), PorterDuff.Mode.SRC_OVER);
// actionBar.setBackgroundDrawable(mBlurDrawable);
// }
}
float a = (float) scrollY / (mFlexibleSpaceImageHeight - mActionBarSize - mStatusSize);
headerDetail.setAlpha(1f - a);
}
@Override
public void onDownMotionEvent() {
}
@Override
public void onUpOrCancelMotionEvent(ScrollState scrollState) {
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.playlit_menu, menu);
return super.onCreateOptionsMenu(menu);
}
// @Override
// public boolean onOptionsItemSelected(MenuItem item) {
// switch (item.getItemId()) {
// case R.id.menu_sort_by_az:
// mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_A_Z);
// reloadAdapter();
// return true;
// case R.id.menu_sort_by_date:
// mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_DATE);
// reloadAdapter();
// return true;
// case R.id.menu_sort_by_artist:
// mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_ARTIST);
// reloadAdapter();
// return true;
// case R.id.menu_sort_by_album:
// mPreferences.setSongSortOrder(SortOrder.SongSortOrder.SONG_ALBUM);
// reloadAdapter();
// return true;
//
// }
// return super.onOptionsItemSelected(item);
// }
class PlaylistDetailAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
final static int FIRST_ITEM = 0;
final static int ITEM = 1;
private ArrayList<MusicInfo> arraylist;
private Activity mContext;
public PlaylistDetailAdapter(Activity context, ArrayList<MusicInfo> mList) {
this.arraylist = mList;
this.mContext = context;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
if (viewType == FIRST_ITEM) {
return new CommonItemViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.header_common_item, viewGroup, false));
} else {
return new ItemViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.fragment_playlist_detail_item, viewGroup, false));
}
}
//判断布局类型
@Override
public int getItemViewType(int position) {
return position == FIRST_ITEM ? FIRST_ITEM : ITEM;
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder itemHolder, final int i) {
if (itemHolder instanceof ItemViewHolder) {
final MusicInfo localItem = arraylist.get(i - 1);
//判断该条目音乐是否在播放
if (MusicPlayer.getCurrentAudioId() == localItem.songId) {
((ItemViewHolder) itemHolder).trackNumber.setVisibility(View.GONE);
((ItemViewHolder) itemHolder).playState.setVisibility(View.VISIBLE);
((ItemViewHolder) itemHolder).playState.setImageResource(R.drawable.song_play_icon);
((ItemViewHolder) itemHolder).playState.setImageTintList(R.color.theme_color_primary);
} else {
((ItemViewHolder) itemHolder).playState.setVisibility(View.GONE);
((ItemViewHolder) itemHolder).trackNumber.setVisibility(View.VISIBLE);
((ItemViewHolder) itemHolder).trackNumber.setText(i + "");
}
((ItemViewHolder) itemHolder).title.setText(localItem.musicName);
((ItemViewHolder) itemHolder).artist.setText(localItem.artist);
((ItemViewHolder) itemHolder).menu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (localItem.islocal) {
MoreFragment morefragment = MoreFragment.newInstance(arraylist.get(i - 1),
IConstants.MUSICOVERFLOW);
morefragment.show(((AppCompatActivity) mContext).getSupportFragmentManager(), "music");
} else {
NetMoreFragment morefragment = NetMoreFragment.newInstance(arraylist.get(i - 1),
IConstants.MUSICOVERFLOW);
morefragment.show(((AppCompatActivity) mContext).getSupportFragmentManager(), "music");
}
}
});
} else if (itemHolder instanceof CommonItemViewHolder) {
((CommonItemViewHolder) itemHolder).textView.setText("(共" + arraylist.size() + "首)");
((CommonItemViewHolder) itemHolder).select.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
}
@Override
public int getItemCount() {
return arraylist == null ? 0 : arraylist.size() + 1;
}
public void updateDataSet(ArrayList<MusicInfo> arraylist) {
this.arraylist = arraylist;
this.notifyDataSetChanged();
}
public class CommonItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView textView;
ImageView select;
RelativeLayout layout;
CommonItemViewHolder(View view) {
super(view);
this.textView = (TextView) view.findViewById(R.id.play_all_number);
this.select = (ImageView) view.findViewById(R.id.select);
this.layout = (RelativeLayout) view.findViewById(R.id.play_all_layout);
layout.setOnClickListener(this);
}
public void onClick(View v) {
//// TODO: 2016/1/20
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
HashMap<Long, MusicInfo> infos = new HashMap<Long, MusicInfo>();
int len = arraylist.size();
long[] list = new long[len];
for (int i = 0; i < len; i++) {
MusicInfo info = arraylist.get(i);
list[i] = info.songId;
infos.put(list[i], info);
}
if (getAdapterPosition() > -1)
MusicPlayer.playAll(infos, list, 0, false);
}
}, 70);
}
}
public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
protected TextView title, artist, trackNumber;
protected ImageView menu;
TintImageView playState;
public ItemViewHolder(View view) {
super(view);
this.title = (TextView) view.findViewById(R.id.song_title);
this.artist = (TextView) view.findViewById(R.id.song_artist);
this.trackNumber = (TextView) view.findViewById(R.id.trackNumber);
this.menu = (ImageView) view.findViewById(R.id.popup_menu);
this.playState = (TintImageView) view.findViewById(R.id.play_state);
view.setOnClickListener(this);
}
@Override
public void onClick(View v) {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
HashMap<Long, MusicInfo> infos = new HashMap<Long, MusicInfo>();
int len = arraylist.size();
long[] list = new long[len];
for (int i = 0; i < len; i++) {
MusicInfo info = arraylist.get(i);
list[i] = info.songId;
infos.put(list[i], info);
}
if (getAdapterPosition() > 0)
MusicPlayer.playAll(infos, list, getAdapterPosition() - 1, false);
}
}, 70);
}
}
}
private PlayMusic mPlay;
private volatile boolean tryPlaying = false;
public class PlayMusic extends Thread {
private volatile boolean isInterrupted = false;
private ArrayList<MusicInfo> arrayList;
private int position;
public PlayMusic(ArrayList<MusicInfo> arrayList, int position) {
this.arrayList = arrayList;
this.position = position;
}
public void interrupt() {
isInterrupted = true;
super.interrupt();
}
public void run() {
L.D(d, TAG, " start");
tryPlaying = true;
while (!isInterrupted) {
HashMap<Long, MusicInfo> infos = new HashMap<Long, MusicInfo>();
int len = arrayList.size();
long[] list = new long[len];
for (int i = 0; i < len; i++) {
MusicInfo info = arrayList.get(i);
list[i] = info.songId;
infos.put(list[i], info);
}
MusicPlayer.playAll(infos, list, position, false);
}
tryPlaying = false;
L.D(d, TAG, "已经终止!");
}
}
}