package io.hefuyi.listener.ui.fragment; import android.graphics.Rect; import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; 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.PlaylistUpdateEvent; import io.hefuyi.listener.injector.component.ApplicationComponent; import io.hefuyi.listener.injector.component.DaggerPlaylistComponent; import io.hefuyi.listener.injector.component.PlaylistComponent; import io.hefuyi.listener.injector.module.PlaylistModule; import io.hefuyi.listener.mvp.contract.PlaylistContract; import io.hefuyi.listener.mvp.model.Playlist; import io.hefuyi.listener.ui.adapter.PlaylistAdapter; import io.hefuyi.listener.ui.dialogs.CreatePlaylistDialog; import io.hefuyi.listener.util.ATEUtil; import io.hefuyi.listener.util.DensityUtil; import io.hefuyi.listener.util.PreferencesUtility; import io.hefuyi.listener.widget.DividerItemDecoration; import io.hefuyi.listener.widget.fastscroller.FastScrollRecyclerView; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.schedulers.Schedulers; public class PlaylistFragment extends Fragment implements PlaylistContract.View { @Inject PlaylistContract.Presenter mPresenter; @BindView(R.id.recyclerview) FastScrollRecyclerView recyclerView; @BindView(R.id.view_empty) View emptyView; @BindView(R.id.toolbar) Toolbar toolbar; private PlaylistAdapter mAdapter; private GridLayoutManager layoutManager; private RecyclerView.ItemDecoration itemDecoration; private PreferencesUtility mPreferences; private boolean isGrid; @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); injectDependences(); mPresenter.attachView(this); mPreferences = PreferencesUtility.getInstance(getActivity()); isGrid = mPreferences.getPlaylistView() == Constants.PLAYLIST_VIEW_GRID; mAdapter = new PlaylistAdapter(this, null); if (isGrid) { layoutManager = new GridLayoutManager(getActivity(), 2); } else { layoutManager = new GridLayoutManager(getActivity(), 1); } } private void injectDependences() { ApplicationComponent applicationComponent = ((ListenerApp) getActivity().getApplication()).getApplicationComponent(); PlaylistComponent playlistComponent = DaggerPlaylistComponent.builder() .applicationComponent(applicationComponent) .playlistModule(new PlaylistModule()) .build(); playlistComponent.inject(this); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_list_layout, container, false); ButterKnife.bind(this, rootView); return rootView; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ATE.apply(this, ATEUtil.getATEKey(getActivity())); if (Build.VERSION.SDK_INT < 21 && view.findViewById(R.id.status_bar) != null) { view.findViewById(R.id.status_bar).setVisibility(View.GONE); if (Build.VERSION.SDK_INT >= 19) { int statusBarHeight = DensityUtil.getStatusBarHeight(getContext()); view.findViewById(R.id.toolbar).setPadding(0, statusBarHeight, 0, 0); } } ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); final ActionBar ab = ((AppCompatActivity) getActivity()).getSupportActionBar(); ab.setHomeAsUpIndicator(R.drawable.ic_menu); ab.setDisplayHomeAsUpEnabled(true); ab.setTitle(R.string.playlists); recyclerView.setLayoutManager(layoutManager); recyclerView.setAdapter(mAdapter); setItemDecoration(); mPresenter.subscribe(); subscribePlaylistUpdateEvent(); } @Override public void onActivityCreated(final Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); } @Override public void onDestroyView() { super.onDestroyView(); mPresenter.unsubscribe(); RxBus.getInstance().unSubscribe(this); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.menu_playlist, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_new_playlist: CreatePlaylistDialog.newInstance().show(getChildFragmentManager(), "CREATE_PLAYLIST"); return true; case R.id.menu_show_as_list: if (isGrid) { mPreferences.setPlaylistView(Constants.PLAYLIST_VIEW_LIST); isGrid = false; updateLayoutManager(1); } return true; case R.id.menu_show_as_grid: if (!isGrid) { mPreferences.setPlaylistView(Constants.PLAYLIST_VIEW_GRID); isGrid = true; updateLayoutManager(2); } return true; } return super.onOptionsItemSelected(item); } @Override public void showPlaylist(List<Playlist> playlists) { emptyView.setVisibility(View.GONE); mAdapter.setPlaylist(playlists); } @Override public void showEmptyView() { emptyView.setVisibility(View.VISIBLE); recyclerView.setVisibility(View.GONE); } private void setItemDecoration() { if (isGrid) { int spacingInPixels = getActivity().getResources().getDimensionPixelSize(R.dimen.spacing_card_album_grid); itemDecoration = new PlaylistFragment.SpacesItemDecoration(spacingInPixels); } else { itemDecoration = new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST, false); } recyclerView.addItemDecoration(itemDecoration); } private void updateLayoutManager(int column) { recyclerView.removeItemDecoration(itemDecoration); mAdapter = new PlaylistAdapter(this, null); recyclerView.setAdapter(mAdapter); layoutManager.setSpanCount(column); layoutManager.requestLayout(); setItemDecoration(); mPresenter.loadPlaylist(); } private void subscribePlaylistUpdateEvent() { Subscription subscription = RxBus.getInstance() .toObservable(PlaylistUpdateEvent.class) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<PlaylistUpdateEvent>() { @Override public void call(PlaylistUpdateEvent event) { mPresenter.loadPlaylist(); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { } }); RxBus.getInstance().addSubscription(this, subscription); } public class SpacesItemDecoration extends RecyclerView.ItemDecoration { private int space; public SpacesItemDecoration(int space) { this.space = space; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { int position = parent.getChildAdapterPosition(view); if (position % 2 == 0) { outRect.left = 0; outRect.top = space; outRect.right = space / 2; } else { outRect.left = space / 2; outRect.top = space; outRect.right = 0; } } } }