package io.hefuyi.listener.ui.fragment; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.afollestad.appthemeengine.ATE; import java.util.List; import javax.inject.Inject; import butterknife.BindView; import butterknife.ButterKnife; import io.hefuyi.listener.Constants; import io.hefuyi.listener.ListenerApp; import io.hefuyi.listener.R; import io.hefuyi.listener.RxBus; import io.hefuyi.listener.event.MetaChangedEvent; import io.hefuyi.listener.injector.component.ApplicationComponent; import io.hefuyi.listener.injector.component.ArtistSongsComponent; import io.hefuyi.listener.injector.component.DaggerArtistSongsComponent; import io.hefuyi.listener.injector.module.ArtistSongModule; import io.hefuyi.listener.mvp.contract.ArtistSongContract; import io.hefuyi.listener.mvp.model.Song; import io.hefuyi.listener.ui.adapter.ArtistSongAdapter; import io.hefuyi.listener.util.ATEUtil; import io.hefuyi.listener.widget.DividerItemDecoration; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.schedulers.Schedulers; /** * A simple {@link Fragment} subclass. */ public class ArtistMusicFragment extends Fragment implements ArtistSongContract.View { @Inject ArtistSongContract.Presenter mPresenter; @BindView(R.id.recycler_view_songs) RecyclerView songsRecyclerview; private long artistID = -1; ArtistSongAdapter mSongAdapter; public static ArtistMusicFragment newInstance(long id) { ArtistMusicFragment fragment = new ArtistMusicFragment(); Bundle args = new Bundle(); args.putLong(Constants.ARTIST_ID, id); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); injectDependences(); mPresenter.attachView(this); if (getArguments() != null) { artistID = getArguments().getLong(Constants.ARTIST_ID); } } private void injectDependences() { ApplicationComponent applicationComponent = ((ListenerApp) getActivity().getApplication()).getApplicationComponent(); ArtistSongsComponent artistSongsComponent = DaggerArtistSongsComponent.builder() .applicationComponent(applicationComponent) .artistSongModule(new ArtistSongModule()) .build(); artistSongsComponent.inject(this); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_artist_music, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ButterKnife.bind(this, view); ATE.apply(this, ATEUtil.getATEKey(getActivity())); songsRecyclerview.setLayoutManager(new LinearLayoutManager(getActivity())); songsRecyclerview.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST, true)); mSongAdapter = new ArtistSongAdapter(getActivity(), null, artistID); songsRecyclerview.setAdapter(mSongAdapter); mPresenter.subscribe(artistID); subscribeMetaChangedEvent(); } @Override public void onDestroyView() { super.onDestroyView(); mPresenter.unsubscribe(); RxBus.getInstance().unSubscribe(this); } @Override public void showSongs(List<Song> songList) { // adding one dummy song to top of arraylist // there will be albums header at this position in recyclerview songList.add(0, new Song(-1, -1, -1, "dummy", "dummy", "dummy", -1, -1)); mSongAdapter.setSongList(songList); } private void subscribeMetaChangedEvent() { Subscription subscription = RxBus.getInstance() .toObservable(MetaChangedEvent.class) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .distinctUntilChanged() .subscribe(new Action1<MetaChangedEvent>() { @Override public void call(MetaChangedEvent event) { mSongAdapter.notifyDataSetChanged(); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { } }); RxBus.getInstance().addSubscription(this, subscription); } }