package com.wm.remusic.activity;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.TransitionDrawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
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.Log;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.bilibili.magicasakura.widgets.TintImageView;
import com.facebook.common.executors.CallerThreadExecutor;
import com.facebook.common.references.CloseableReference;
import com.facebook.datasource.DataSource;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.core.ImagePipeline;
import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber;
import com.facebook.imagepipeline.image.CloseableImage;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;
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.dialog.LoadAllDownInfos;
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.AlbumInfo;
import com.wm.remusic.json.GeDanGeInfo;
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 AlbumsDetailActivity extends BaseActivity implements ObservableScrollViewCallbacks {
private String albumId;
private String albumPath, albumName, albumDes;
private ArrayList<GeDanGeInfo> mList = new ArrayList<GeDanGeInfo>();
private ArrayList<MusicInfo> adapterList = new ArrayList<>();
private SimpleDraweeView albumArtSmall;
private ImageView albumArt;
private TextView albumTitle, tryAgain;
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 FrameLayout headerViewContent;
private RelativeLayout headerDetail;
private LoadNetPlaylistInfo mLoadNetList;
private ObservableRecyclerView recyclerView;
private String TAG = "AlbumsDetailActivity";
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) {
albumId = getIntent().getStringExtra("albumid");
albumPath = getIntent().getStringExtra("albumart");
albumName = getIntent().getStringExtra("albumname");
albumDes = getIntent().getStringExtra("albumdetail");
}
setContentView(R.layout.activity_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();
}
});
toolbar.setSubtitle(albumDes);
}
private void setHeaderView() {
albumArt = (ImageView) findViewById(R.id.album_art);
albumTitle = (TextView) findViewById(R.id.album_title);
albumArtSmall = (SimpleDraweeView) findViewById(R.id.playlist_art);
LinearLayout downAll = (LinearLayout) headerViewContent.findViewById(R.id.playlist_down);
downAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new LoadAllDownInfos((Activity) AlbumsDetailActivity.this, mList).execute();
}
});
tryAgain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loadAllLists();
}
});
}
private void setList() {
recyclerView = (ObservableRecyclerView) findViewById(R.id.recyclerview);
recyclerView.setScrollViewCallbacks(AlbumsDetailActivity.this);
recyclerView.setLayoutManager(new LinearLayoutManager(AlbumsDetailActivity.this));
recyclerView.setHasFixedSize(false);
mAdapter = new PlaylistDetailAdapter(AlbumsDetailActivity.this, adapterList);
recyclerView.setAdapter(mAdapter);
recyclerView.addItemDecoration(new DividerItemDecoration(AlbumsDetailActivity.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();
Log.e("hei", " " + headerHeight);
int headerTranslationY = mActionBarSize + mStatusSize - headerHeight;
if (mActionBarSize + mStatusSize <= -scrollY + headerHeight) {
headerTranslationY = -scrollY;
}
Log.e("headerY", " " + headerTranslationY);
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);
}
}
AlbumInfo albumInfo;
class LoadNetPlaylistInfo extends AsyncTask<Void, Void, Boolean> {
@Override
protected Boolean doInBackground(final Void... unused) {
try {
JsonObject jsonObject = HttpUtil.getResposeJsonObject(BMA.Album.albumInfo(albumId + ""));
JsonArray pArray = jsonObject.get("songlist").getAsJsonArray();
mHandler.post(showInfo);
musicCount = pArray.size();
for (int i = 0; i < musicCount; i++) {
GeDanGeInfo geDanGeInfo = MainApplication.gsonInstance().fromJson(pArray.get(i), GeDanGeInfo.class);
mList.add(geDanGeInfo);
RequestThreadPool.post(new MusicDetailInfoGet(geDanGeInfo.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++) {
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);
}
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() {
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();
}
}
@Override
public void updateTrack() {
mAdapter.notifyDataSetChanged();
}
private void setAlbumart() {
albumTitle.setText(albumName);
albumArtSmall.setImageURI(Uri.parse(albumPath));
try {
ImageRequest imageRequest = ImageRequest.fromUri(albumPath);
// CacheKey cacheKey = DefaultCacheKeyFactory.getInstance()
// .getEncodedCacheKey(imageRequest);
// BinaryResource resource = ImagePipelineFactory.getInstance()
// .getMainDiskStorageCache().getResource(cacheKey);
// File file = ((FileBinaryResource) resource).getFile();
// if (file != null) {
// new setBlurredAlbumArt().execute(ImageUtils.getArtworkQuick(file, 300, 300));
// return;
// }
imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(albumPath))
.setProgressiveRenderingEnabled(true).build();
ImagePipeline imagePipeline = Fresco.getImagePipeline();
DataSource<CloseableReference<CloseableImage>>
dataSource = imagePipeline.fetchDecodedImage(imageRequest, AlbumsDetailActivity.this);
dataSource.subscribe(new BaseBitmapDataSubscriber() {
@Override
public void onNewResultImpl(@Nullable Bitmap bitmap) {
// You can use the bitmap in only limited ways
// No need to do any cleanup.
if (bitmap != null) {
new setBlurredAlbumArt().execute(bitmap);
}
}
@Override
public void onFailureImpl(DataSource dataSource) {
// No cleanup required here.
}
},
CallerThreadExecutor.getInstance());
//drawable = Drawable.createFromStream( new URL(albumPath).openStream(),"src");
} catch (Exception e) {
}
}
private class setBlurredAlbumArt extends AsyncTask<Bitmap, Void, Drawable> {
@Override
protected Drawable doInBackground(Bitmap... loadedImage) {
Drawable drawable = null;
try {
drawable = ImageUtils.createBlurredImageFromBitmap(loadedImage[0], AlbumsDetailActivity.this, 20);
// drawable = ImageUtils.createBlurredImageFromBitmap(ImageUtils.getBitmapFromDrawable(Drawable.createFromStream(new URL(albumPath).openStream(), "src")),
// NetPlaylistDetailActivity.this, 30);
} 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(albumName);
toolbar.setSubtitle(albumDes);
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);
Log.e("alpha", " " + a);
}
@Override
public void onDownMotionEvent() {
}
@Override
public void onUpOrCancelMotionEvent(ScrollState scrollState) {
}
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) {
Log.e("re", "get");
HttpUtil.getResposeJsonObject("http://tingapi.ting.baidu.com/v1/restserver/ting?from=android&version=5.8.1.0&channel=ppzs&operator=3&method=baidu.ting.artist.item&format=json&tinguid=1035&artistid=14");
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);
}
}
}
PlayMusic playMusic;
public class PlayMusic extends Thread {
private volatile boolean isInterrupted = false;
private ArrayList<MusicInfo> arrayList;
public PlayMusic(ArrayList<MusicInfo> arrayList){
this.arrayList = arrayList;
}
public void interrupt(){
isInterrupted = true;
super.interrupt();
}
public void run(){
L.D(d,TAG, " start");
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, 0, false);
// try{
//
// }catch(InterruptedException e){
// L.D(d,TAG, " 从阻塞中退出...");
// L.D(d,TAG, "this.isInterrupted()="+this.isInterrupted());
// }
}
L.D(d,TAG, "已经终止!");
}
}
}