package com.wm.remusic.activity;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBar;
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.TextView;
import com.facebook.drawee.view.SimpleDraweeView;
import com.github.ksoichiro.android.observablescrollview.CacheFragmentStatePagerAdapter;
import com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView;
import com.github.ksoichiro.android.observablescrollview.ObservableScrollViewCallbacks;
import com.github.ksoichiro.android.observablescrollview.ScrollState;
import com.github.ksoichiro.android.observablescrollview.ScrollUtils;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.nineoldandroids.view.ViewHelper;
import com.nineoldandroids.view.ViewPropertyAnimator;
import com.wm.remusic.MainApplication;
import com.wm.remusic.R;
import com.wm.remusic.fragmentnet.ArtistInfoFragment;
import com.wm.remusic.fragmentnet.ArtistInfoMusicFragment;
import com.wm.remusic.handler.HandlerUtil;
import com.wm.remusic.info.MusicInfo;
import com.wm.remusic.json.ArtistInfo;
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.uitl.CommonUtils;
import java.util.ArrayList;
import java.util.List;
/**
* Created by wm on 2016/4/15.
*/
//歌单
public class ArtistDetailActivity extends BaseActivity implements ObservableScrollViewCallbacks {
private String TAG = ArtistDetailActivity.class.getSimpleName();
private String artistId;
private String artistPath, artistName, artistDes;
private ArrayList<GeDanGeInfo> mList = new ArrayList<GeDanGeInfo>();
private ArrayList<MusicInfo> adapterList = new ArrayList<>();
private SimpleDraweeView artistArt;
private TextView artistTitle, tryAgain;
private Toolbar toolbar;
private SparseArray<MusicDetailInfo> sparseArray = new SparseArray<MusicDetailInfo>();
private FrameLayout loadFrameLayout;
private int musicCount;
private Handler mHandler;
private int tryCount;
private View loadView;
private ActionBar actionBar;
private int mActionBarSize;
private int mStatusSize;
private LinearLayout mHeaderView;
private int mBaseTranslationY;
private ViewPager mPager;
private NavigationAdapter mPagerAdapter;
private TabLayout tabLayout;
private ImageView toolbar_bac;
private LoadNetPlaylistInfo mLoadNetList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
if (getIntent().getExtras() != null) {
artistId = getIntent().getStringExtra("artistid");
artistName = getIntent().getStringExtra("artistname");
}
setContentView(R.layout.activity_artist);
loadFrameLayout = (FrameLayout) findViewById(R.id.state_container);
toolbar = (Toolbar) findViewById(R.id.toolbar);
mHandler = HandlerUtil.getInstance(this);
mActionBarSize = CommonUtils.getActionBarHeight(this);
mStatusSize = CommonUtils.getStatusHeight(this);
artistArt = (SimpleDraweeView) findViewById(R.id.artist_art);
mHeaderView = (LinearLayout) findViewById(R.id.header);
tryAgain = (TextView) findViewById(R.id.try_again);
mPager = (ViewPager) findViewById(R.id.pager);
tabLayout = (TabLayout) findViewById(R.id.sliding_tabs);
toolbar_bac = (ImageView) findViewById(R.id.toolbar_bac);
ViewGroup.LayoutParams layoutParams = toolbar_bac.getLayoutParams();
layoutParams.height = mActionBarSize + mStatusSize;
toolbar_bac.setLayoutParams(layoutParams);
setUpEverything();
}
private void setUpEverything() {
setupToolbar();
setAlbumart();
loadAllLists();
}
private void setupToolbar() {
setSupportActionBar(toolbar);
actionBar = getSupportActionBar();
actionBar.setHomeAsUpIndicator(R.drawable.actionbar_back);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setTitle(artistName);
toolbar.setPadding(0, mStatusSize, 0, 0);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
toolbar.setSubtitle(artistDes);
}
private void loadAllLists() {
tryAgain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
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);
}
}
class LoadNetPlaylistInfo extends AsyncTask<Void, Void, Boolean> {
//artistInfo artistInfo;
@Override
protected Boolean doInBackground(final Void... unused) {
try {
JsonObject jsonObject = HttpUtil.getResposeJsonObject(BMA.Artist.artistSongList("", artistId, 0, 50));
JsonArray pArray = jsonObject.get("songlist").getAsJsonArray();
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++) {
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 comlete) {
if (!comlete) {
tryAgain.setVisibility(View.VISIBLE);
} else {
Log.e("mlist", mList.toString());
loadFrameLayout.removeAllViews();
mPagerAdapter = new NavigationAdapter(getSupportFragmentManager());
mPagerAdapter.addFragment(ArtistInfoMusicFragment.getInstance(adapterList));
mPagerAdapter.addFragment(ArtistInfoFragment.getInstance(artistId));
mPager.setAdapter(mPagerAdapter);
tabLayout.setupWithViewPager(mPager);
mPager.setCurrentItem(0);
}
}
public void cancleTask(){
cancel(true);
RequestThreadPool.finish();
}
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onPause() {
super.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mLoadNetList != null){
mLoadNetList.cancleTask();
}
}
ArtistInfo artistInfo;
private void setAlbumart() {
new Thread(new Runnable() {
@Override
public void run() {
JsonObject object = HttpUtil.getResposeJsonObject(BMA.Artist.artistInfo("", artistId));
artistInfo = MainApplication.gsonInstance().fromJson(object, ArtistInfo.class);
if (artistInfo != null && artistInfo.getAvatar_s500() != null) {
artistPath = artistInfo.getAvatar_s500();
mHandler.post(new Runnable() {
@Override
public void run() {
artistArt.setImageURI(Uri.parse(artistPath));
}
});
Log.e(TAG, artistPath);
}
}
}).start();
}
@Override
public void onScrollChanged(int scrollY, boolean firstScroll, boolean dragging) {
if (dragging) {
int toolbarHeight = mHeaderView.getHeight() - mActionBarSize - mStatusSize - tabLayout.getHeight();
float currentHeaderTranslationY = ViewHelper.getTranslationY(mHeaderView);
if (firstScroll) {
if (-toolbarHeight < currentHeaderTranslationY) {
mBaseTranslationY = scrollY;
}
}
float headerTranslationY = ScrollUtils.getFloat(-(scrollY - mBaseTranslationY), -toolbarHeight, 0);
ViewPropertyAnimator.animate(mHeaderView).cancel();
ViewHelper.setTranslationY(mHeaderView, headerTranslationY);
}
toolbar_bac.setImageResource(R.drawable.toolbar_background_black);
float a = (float) scrollY / (ViewHelper.getScrollY(mHeaderView));
toolbar_bac.setAlpha(a);
}
@Override
public void onDownMotionEvent() {
}
@Override
public void onUpOrCancelMotionEvent(ScrollState scrollState) {
mBaseTranslationY = 0;
Fragment fragment = getCurrentFragment();
if (fragment == null) {
return;
}
View view = fragment.getView();
if (view == null) {
return;
}
int toolbarHeight = mHeaderView.getHeight() - mActionBarSize - mStatusSize - tabLayout.getHeight();
final ObservableRecyclerView listView = (ObservableRecyclerView) view.findViewById(R.id.scroll);
if (listView == null) {
return;
}
int scrollY = listView.getCurrentScrollY();
if (scrollState == ScrollState.DOWN) {
showToolbar();
} else if (scrollState == ScrollState.UP) {
if (toolbarHeight <= scrollY) {
hideToolbar();
} else {
showToolbar();
}
} else {
// Even if onScrollChanged occurs without scrollY changing, toolbar should be adjusted
if (toolbarIsShown() || toolbarIsHidden()) {
// Toolbar is completely moved, so just keep its state
// and propagate it to other pages
propagateToolbarState(toolbarIsShown());
} else {
// Toolbar is moving but doesn't know which to move:
// you can change this to hideToolbar()
showToolbar();
}
}
}
private Fragment getCurrentFragment() {
return mPagerAdapter.getItemAt(mPager.getCurrentItem());
}
private void propagateToolbarState(boolean isShown) {
int toolbarHeight = mHeaderView.getHeight() - mActionBarSize - mStatusSize - tabLayout.getHeight();
// Set scrollY for the fragments that are not created yet
mPagerAdapter.setScrollY(isShown ? 0 : toolbarHeight);
// Set scrollY for the active fragments
for (int i = 0; i < mPagerAdapter.getCount(); i++) {
// Skip current item
if (i == mPager.getCurrentItem()) {
continue;
}
// Skip destroyed or not created item
Fragment f = mPagerAdapter.getItemAt(i);
if (f == null) {
continue;
}
View view = f.getView();
if (view == null) {
continue;
}
ObservableRecyclerView listView = (ObservableRecyclerView) view.findViewById(R.id.scroll);
if (listView == null) {
continue;
}
if (isShown) {
// Scroll up
if (0 < listView.getCurrentScrollY()) {
listView.scrollVerticallyToPosition(0);
}
} else {
// Scroll down (to hide padding)
if (listView.getCurrentScrollY() < toolbarHeight) {
listView.scrollVerticallyToPosition(1);
}
}
}
}
private boolean toolbarIsShown() {
return ViewHelper.getTranslationY(mHeaderView) == 0;
}
private boolean toolbarIsHidden() {
return ViewHelper.getTranslationY(mHeaderView) == -mHeaderView.getHeight() - mActionBarSize - mStatusSize
- tabLayout.getHeight();
}
private void showToolbar() {
float headerTranslationY = ViewHelper.getTranslationY(mHeaderView);
if (headerTranslationY != 0) {
ViewPropertyAnimator.animate(mHeaderView).cancel();
ViewPropertyAnimator.animate(mHeaderView).translationY(0).setDuration(200).start();
}
propagateToolbarState(true);
}
private void hideToolbar() {
float headerTranslationY = ViewHelper.getTranslationY(mHeaderView);
int toolbarHeight = mHeaderView.getHeight() - mActionBarSize - mStatusSize - tabLayout.getHeight();
if (headerTranslationY != -toolbarHeight) {
ViewPropertyAnimator.animate(mHeaderView).cancel();
ViewPropertyAnimator.animate(mHeaderView).translationY(-toolbarHeight).setDuration(200).start();
}
propagateToolbarState(false);
}
private static class NavigationAdapter extends CacheFragmentStatePagerAdapter {
private static final String[] TITLES = new String[]{"热门歌曲", "歌手信息"};
private final List<Fragment> mFragments = new ArrayList<>();
private int mScrollY;
public NavigationAdapter(FragmentManager fm) {
super(fm);
}
public void setScrollY(int scrollY) {
mScrollY = scrollY;
}
public void addFragment(Fragment fragment) {
mFragments.add(fragment);
}
@Override
protected Fragment createItem(int position) {
return mFragments.get(position);
}
@Override
public int getCount() {
return TITLES.length;
}
@Override
public CharSequence getPageTitle(int position) {
return TITLES[position];
}
}
}