public PlaylistViewHolder(View itemView) {
    super(itemView);
    playlistName = (TextView) itemView.findViewById(R.id.instanceTitle);
    moreButton = (ImageView) itemView.findViewById(R.id.instanceMore);

    playlistName.setTextColor(Themes.getListText());
    moreButton.setColorFilter(Themes.getListText());

    itemView.setOnClickListener(this);
    moreButton.setOnClickListener(this);

    context = itemView.getContext();
  }
  @Override
  public View onCreateView(
      LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_player_controls, container, false);

    songTitle = (TextView) view.findViewById(R.id.textSongTitle);
    songArtist = (TextView) view.findViewById(R.id.textArtistName);
    songAlbum = (TextView) view.findViewById(R.id.textAlbumTitle);

    moreInfoButton = (ImageButton) view.findViewById(R.id.songDetail);
    skipNextButton = (ImageButton) view.findViewById(R.id.nextButton);
    skipPrevButton = (ImageButton) view.findViewById(R.id.previousButton);
    playPauseButton = (ImageButton) view.findViewById(R.id.playButton);

    moreInfoButton.setOnClickListener(this);
    skipNextButton.setOnClickListener(this);
    skipPrevButton.setOnClickListener(this);
    playPauseButton.setOnClickListener(this);

    seekBar = (SeekBar) view.findViewById(R.id.songSeekBar);
    timePosition = (TimeView) view.findViewById(R.id.songTimeCurr);
    timeDuration = (TimeView) view.findViewById(R.id.songTimeMax);
    scrubberThumb = (TimeView) view.findViewById(R.id.seekThumb);

    seekBar.setOnSeekBarChangeListener(this);
    scrubberThumb.getBackground().setColorFilter(Themes.getAccent(), PorterDuff.Mode.SRC_IN);

    return view;
  }
  @Override
  public void onBackPressed() {
    if (!editedReference.isEqual(reference) || rulesChanged()) {
      AlertDialog dialog =
          new AlertDialog.Builder(this)
              .setMessage("Save changes?")
              .setPositiveButton(
                  "Save",
                  new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                      if (validateName()) {
                        saveChanges();
                        Navigate.back(AutoPlaylistEditActivity.this);
                      }
                    }
                  })
              .setNegativeButton(
                  "Discard",
                  new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                      Navigate.back(AutoPlaylistEditActivity.this);
                    }
                  })
              .setNeutralButton("Cancel", null)
              .show();

      Themes.themeAlertDialog(dialog);
    } else {
      super.onBackPressed();
    }
  }
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_instance_no_miniplayer);

    reference = getIntent().getParcelableExtra(PLAYLIST_EXTRA);
    if (reference == null) {
      reference = AutoPlaylist.EMPTY;
    }

    if (savedInstanceState != null) {
      editedReference = savedInstanceState.getParcelable(EDITED_HEADER);
      editedRules = savedInstanceState.getParcelableArrayList(EDITED_RULES);
    }

    if (editedReference == null || editedRules == null) {
      editedReference = new AutoPlaylist(reference);
      editedRules = new ArrayList<>(reference.getRules().length);
      Collections.addAll(editedRules, editedReference.getRules());
    }

    if (getSupportActionBar() != null) {
      if (reference == null) {
        getSupportActionBar().setTitle(R.string.playlist_auto_new);
      } else {
        getSupportActionBar().setTitle(reference.getPlaylistName());
      }
      getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_done_24dp);
    }

    adapter =
        new HeterogeneousAdapter()
            .addSection(new RuleHeaderSingleton(editedReference))
            .addSection(new RuleSection(editedRules, this));

    RecyclerView list = (RecyclerView) findViewById(R.id.list);
    list.setAdapter(adapter);
    list.setLayoutManager(new LinearLayoutManager(this));
    list.addItemDecoration(new BackgroundDecoration(Themes.getBackgroundElevated()));
    list.addItemDecoration(new DividerDecoration(this));
  }
  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
      case R.id.add:
        editedRules.add(new AutoPlaylist.Rule(AutoPlaylist.Rule.EMPTY));
        adapter.notifyItemInserted(editedRules.size());
        return true;
      case R.id.discard:
        if (rulesChanged()) {
          AlertDialog dialog =
              new AlertDialog.Builder(this)
                  .setMessage("Discard changes?")
                  .setPositiveButton(
                      "Discard",
                      new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                          finish();
                        }
                      })
                  .setNegativeButton(R.string.action_cancel, null)
                  .show();

          Themes.themeAlertDialog(dialog);
        } else {
          finish();
        }
        return true;
      case android.R.id.home:
        if (validateName()) {
          if (!editedReference.isEqual(reference) || rulesChanged()) {
            saveChanges();
          }
        } else {
          return true;
        }
        break;
    }
    return super.onOptionsItemSelected(item);
  }