content: package com.alium.orin.ui.activities;
  
  import android.content.Context;
  import android.os.Bundle;
  import android.support.annotation.NonNull;
  import android.support.v4.app.LoaderManager;
  import android.support.v4.content.Loader;
  import android.support.v7.widget.LinearLayoutManager;
  import android.support.v7.widget.RecyclerView;
  import android.support.v7.widget.Toolbar;
  import android.view.Menu;
  import android.view.MenuItem;
  import android.view.View;
  import android.widget.TextView;
  
  import com.afollestad.materialcab.MaterialCab;
  import com.alium.orin.adapter.song.CustomPlaylistSongAdapter;
  import com.alium.orin.adapter.song.PlaylistSongAdapter;
  import com.alium.orin.helper.MusicPlayerRemote;
  import com.alium.orin.interfaces.CabHolder;
  import com.alium.orin.loader.PlaylistSongLoader;
  import com.alium.orin.model.Playlist;
  import com.alium.orin.model.Song;
  import com.alium.orin.ui.activities.base.AbsSlidingMusicPanelActivity;
  import com.alium.orin.util.NavigationUtil;
  import com.alium.orin.util.PhonographColorUtil;
  import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator;
  import com.h6ah4i.android.widget.advrecyclerview.animator.RefactoredDefaultItemAnimator;
  import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager;
  import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils;
  import com.kabouzeid.appthemehelper.ThemeStore;
  import com.alium.orin.R;
  import com.alium.orin.adapter.song.SongAdapter;
  import com.alium.orin.dialogs.SleepTimerDialog;
  import com.alium.orin.interfaces.LoaderIds;
  import com.alium.orin.misc.WrappedAsyncTaskLoader;
  import com.alium.orin.model.AbsCustomPlaylist;
  import com.alium.orin.model.PlaylistSong;
  import com.alium.orin.util.PlaylistsUtil;
  import com.alium.orin.util.ViewUtil;
  import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import butterknife.BindView;
  import butterknife.ButterKnife;
  
  public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity implements CabHolder, LoaderManager.LoaderCallbacks<ArrayList<Song>> {
  
      public static final String TAG = PlaylistDetailActivity.class.getSimpleName();
  
      private static final int LOADER_ID = LoaderIds.PLAYLIST_DETAIL_ACTIVITY;
  
      @NonNull
      public static String EXTRA_PLAYLIST = "extra_playlist";
  
      @BindView(R.id.recycler_view)
      RecyclerView recyclerView;
      @BindView(R.id.toolbar)
      Toolbar toolbar;
      @BindView(android.R.id.empty)
      TextView empty;
  
      private Playlist playlist;
  
      private MaterialCab cab;
      private SongAdapter adapter;
  
      private RecyclerView.Adapter wrappedAdapter;
      private RecyclerViewDragDropManager recyclerViewDragDropManager;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setDrawUnderStatusbar(true);
          ButterKnife.bind(this);
  
          setStatusbarColorAuto();
          setNavigationbarColorAuto();
          setTaskDescriptionColorAuto();
  
          playlist = getIntent().getExtras().getParcelable(EXTRA_PLAYLIST);
  
          setUpRecyclerView();
  
          setUpToolBar();
  
          getSupportLoaderManager().initLoader(LOADER_ID, null, this);
      }
  
      @Override
      protected View createContentView() {
          return wrapSlidingMusicPanel(R.layout.activity_playlist_detail);
      }
  
      private void setUpRecyclerView() {
          ViewUtil.setUpFastScrollRecyclerViewColor(this, ((FastScrollRecyclerView) recyclerView), ThemeStore.accentColor(this));
          recyclerView.setLayoutManager(new LinearLayoutManager(this));
          if (playlist instanceof AbsCustomPlaylist) {
              adapter = new CustomPlaylistSongAdapter(this, new ArrayList<Song>(), R.layout.item_list, false, this);
              recyclerView.setAdapter(adapter);
          } else {
              recyclerViewDragDropManager = new RecyclerViewDragDropManager();
              final GeneralItemAnimator animator = new RefactoredDefaultItemAnimator();
              adapter = new PlaylistSongAdapter(this, new ArrayList<PlaylistSong>(), R.layout.item_list, false, this, new PlaylistSongAdapter.OnMoveItemListener() {
                  @Override
                  public void onMoveItem(int fromPosition, int toPosition) {
                      if (PlaylistsUtil.moveItem(PlaylistDetailActivity.this, playlist.id, fromPosition, toPosition)) {
                          Song song = adapter.getDataSet().remove(fromPosition);
                          adapter.getDataSet().add(toPosition, song);
                          adapter.notifyItemMoved(fromPosition, toPosition);
                      }
                  }
              });
              wrappedAdapter = recyclerViewDragDropManager.createWrappedAdapter(adapter);
  
              recyclerView.setAdapter(wrappedAdapter);
              recyclerView.setItemAnimator(animator);
  
              recyclerViewDragDropManager.attachRecyclerView(recyclerView);
          }
  
          adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
              @Override
              public void onChanged() {
                  super.onChanged();
                  checkIsEmpty();
              }
          });
      }
  
      private void setUpToolBar() {
          toolbar.setBackgroundColor(ThemeStore.primaryColor(this));
          setSupportActionBar(toolbar);
          //noinspection ConstantConditions
          getSupportActionBar().setTitle(playlist.name);
          getSupportActionBar().setDisplayHomeAsUpEnabled(true);
      }
  
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          getMenuInflater().inflate(R.menu.menu_playlist_detail, menu);
          return super.onCreateOptionsMenu(menu);
      }
  
      @Override
      public boolean onOptionsItemSelected(@NonNull MenuItem item) {
          int id = item.getItemId();
          switch (id) {
              case R.id.action_sleep_timer:
                  new SleepTimerDialog().show(getSupportFragmentManager(), "SET_SLEEP_TIMER");
                  return true;
              case R.id.action_shuffle_playlist:
                  MusicPlayerRemote.openAndShuffleQueue(adapter.getDataSet(), true);
                  return true;
              case R.id.action_equalizer:
                  NavigationUtil.openEqualizer(this);
                  return true;
              case android.R.id.home:
                  onBackPressed();
                  return true;
          }
          return super.onOptionsItemSelected(item);
      }
  
      @NonNull
      @Override
      public MaterialCab openCab(final int menu, final MaterialCab.Callback callback) {
          if (cab != null && cab.isActive()) cab.finish();
          cab = new MaterialCab(this, R.id.cab_stub)
                  .setMenu(menu)
                  .setCloseDrawableRes(R.drawable.ic_close_white_24dp)
                  .setBackgroundColor(PhonographColorUtil.shiftBackgroundColorForLightText(ThemeStore.primaryColor(this)))
                  .start(callback);
          return cab;
      }
  
      @Override
      public void onBackPressed() {
          if (cab != null && cab.isActive()) cab.finish();
          else {
              recyclerView.stopScroll();
              super.onBackPressed();
          }
      }
  
      @Override
      public void onMediaStoreChanged() {
          super.onMediaStoreChanged();
          getSupportLoaderManager().restartLoader(LOADER_ID, null, this);
      }
  
      private void checkIsEmpty() {
          empty.setVisibility(
                  adapter.getItemCount() == 0 ? View.VISIBLE : View.GONE
          );
      }
  
      @Override
      public void onPause() {
          if (recyclerViewDragDropManager != null) {
              recyclerViewDragDropManager.cancelDrag();
          }
          super.onPause();
      }
  
      @Override
      protected void onDestroy() {
          if (recyclerViewDragDropManager != null) {
              recyclerViewDragDropManager.release();
              recyclerViewDragDropManager = null;
          }
  
          if (recyclerView != null) {
              recyclerView.setItemAnimator(null);
              recyclerView.setAdapter(null);
              recyclerView = null;
          }
  
          if (wrappedAdapter != null) {
              WrapperAdapterUtils.releaseAll(wrappedAdapter);
              wrappedAdapter = null;
          }
          adapter = null;
  
          super.onDestroy();
      }
  
      @Override
      public Loader<ArrayList<Song>> onCreateLoader(int id, Bundle args) {
          return new AsyncPlaylistSongLoader(this, playlist);
      }
  
      @Override
      public void onLoadFinished(Loader<ArrayList<Song>> loader, ArrayList<Song> data) {
          if (adapter != null)
              adapter.swapDataSet(data);
      }
  
      @Override
      public void onLoaderReset(Loader<ArrayList<Song>> loader) {
          if (adapter != null)
              adapter.swapDataSet(new ArrayList<Song>());
      }
  
      private static class AsyncPlaylistSongLoader extends WrappedAsyncTaskLoader<ArrayList<Song>> {
          private final Playlist playlist;
  
          public AsyncPlaylistSongLoader(Context context, Playlist playlist) {
              super(context);
              this.playlist = playlist;
          }
  
          @Override
          public ArrayList<Song> loadInBackground() {
              if (playlist instanceof AbsCustomPlaylist) {
                  return ((AbsCustomPlaylist) playlist).getSongs(getContext());
              } else {
                  //noinspection unchecked
                  return (ArrayList<Song>) (List) PlaylistSongLoader.getPlaylistSongList(getContext(), playlist.id);
              }
          }
      }
  }
  