/* Handles intent to show player from notification or from shortcut */
  private void handleShowPlayer(Intent intent) {
    // get station from intent
    Station station = null;
    if (intent.hasExtra(TransistorKeys.EXTRA_STATION)) {
      // get station from notification
      station = intent.getParcelableExtra(TransistorKeys.EXTRA_STATION);
    } else if (intent.hasExtra(TransistorKeys.EXTRA_STREAM_URI)) {
      // get Uri of station from home screen shortcut
      station =
          mCollectionAdapter.findStation(
              Uri.parse(intent.getStringExtra(TransistorKeys.EXTRA_STREAM_URI)));
    } else if (intent.hasExtra(TransistorKeys.EXTRA_LAST_STATION)
        && intent.getBooleanExtra(TransistorKeys.EXTRA_LAST_STATION, false)) {
      // try to get last station
      loadAppState(mActivity);
      if (mStationIDLast > -1 && mStationIDLast < mCollectionAdapter.getItemCount()) {
        station = mCollectionAdapter.getStation(mStationIDLast);
      }
    }

    if (station == null) {
      Toast.makeText(mActivity, getString(R.string.toastalert_station_not_found), Toast.LENGTH_LONG)
          .show();
    }

    // get playback action from intent
    boolean startPlayback;
    if (intent.hasExtra(TransistorKeys.EXTRA_PLAYBACK_STATE)) {
      startPlayback = intent.getBooleanExtra(TransistorKeys.EXTRA_PLAYBACK_STATE, false);
    } else {
      startPlayback = false;
    }

    // prepare arguments or intent
    if (mTwoPane && station != null) {
      mStationIDSelected = mCollectionAdapter.getStationID(station);
      mCollectionAdapter.setStationIDSelected(
          mStationIDSelected, station.getPlaybackState(), startPlayback);
    } else if (station != null) {
      // start player activity - on phone
      Intent playerIntent = new Intent(mActivity, PlayerActivity.class);
      playerIntent.setAction(TransistorKeys.ACTION_SHOW_PLAYER);
      playerIntent.putExtra(TransistorKeys.EXTRA_STATION, station);
      playerIntent.putExtra(TransistorKeys.EXTRA_PLAYBACK_STATE, startPlayback);
      startActivity(playerIntent);
    }
  }
 /* Show or hide call to action view if necessary */
 private void toggleActionCall() {
   // show call to action, if necessary
   if (mCollectionAdapter.getItemCount() == 0) {
     mActionCallView.setVisibility(View.VISIBLE);
     mRecyclerView.setVisibility(View.GONE);
   } else {
     mActionCallView.setVisibility(View.GONE);
     mRecyclerView.setVisibility(View.VISIBLE);
   }
 }
  @Override
  public void onResume() {
    super.onResume();

    // refresh app state
    loadAppState(mActivity);

    // update collection adapter
    mCollectionAdapter.setTwoPane(mTwoPane);
    mCollectionAdapter.refresh();
    if (mCollectionAdapter.getItemCount() > 0) {
      mCollectionAdapter.setStationIDSelected(mStationIDSelected, mPlayback, false);
    }

    // handles the activity's intent
    Intent intent = mActivity.getIntent();
    if (Intent.ACTION_VIEW.equals(intent.getAction())) {
      handleStreamingLink(intent);
    } else if (TransistorKeys.ACTION_SHOW_PLAYER.equals(intent.getAction())) {
      handleShowPlayer(intent);
    }

    // check if folder content has been changed
    int folderSize = mFolder.listFiles().length;
    if (mFolderSize != mFolder.listFiles().length) {
      mFolderSize = folderSize;
      mCollectionAdapter = new CollectionAdapter(mActivity, mFolder);
      mRecyclerView.setAdapter(mCollectionAdapter);
    }

    // show call to action, if necessary
    toggleActionCall();

    // show notification bar if timer is running
    if (mSleepTimerRunning) {
      showSleepTimerNotification(-1);
    }
  }
  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    // retrieve selected image Uri from image picker
    Uri newImageUri = null;
    if (null != data) {
      newImageUri = data.getData();
    }

    if (requestCode == TransistorKeys.REQUEST_LOAD_IMAGE
        && resultCode == Activity.RESULT_OK
        && newImageUri != null) {

      ImageHelper imageHelper = new ImageHelper(newImageUri, mActivity);
      Bitmap newImage = imageHelper.getInputImage();

      if (newImage != null && mTempStationID != -1) {
        // write image to storage
        File stationImageFile = mTempStation.getStationImageFile();
        try (FileOutputStream out = new FileOutputStream(stationImageFile)) {
          newImage.compress(Bitmap.CompressFormat.PNG, 100, out);
        } catch (IOException e) {
          LogHelper.e(LOG_TAG, "Unable to save: " + newImage.toString());
        }
        // update adapter
        mCollectionAdapter.notifyItemChanged(mTempStationID);

      } else {
        LogHelper.e(
            LOG_TAG, "Unable to get image from media picker. Uri was:  " + newImageUri.toString());
      }

    } else {
      LogHelper.e(LOG_TAG, "Unable to get image from media picker. Did not receive an Uri");
    }
  }
 public boolean retainAllIterable(Iterable<?> iterable) {
   return this.retainAll(CollectionAdapter.wrapSet(iterable));
 }
  /* Handles adding, deleting and renaming of station */
  private void handleCollectionChanges(Intent intent) {

    // load app state
    loadAppState(mActivity);

    int newStationPosition;

    switch (intent.getIntExtra(TransistorKeys.EXTRA_COLLECTION_CHANGE, 1)) {

        // CASE: station was added
      case TransistorKeys.STATION_ADDED:
        if (intent.hasExtra(TransistorKeys.EXTRA_STATION)) {

          // get station from intent
          Station station = intent.getParcelableExtra(TransistorKeys.EXTRA_STATION);

          // add station to adapter, scroll to new position and update adapter
          newStationPosition = mCollectionAdapter.add(station);

          if (mCollectionAdapter.getItemCount() > 0) {
            toggleActionCall();
          }

          mLayoutManager.scrollToPosition(newStationPosition);
          mCollectionAdapter.setStationIDSelected(newStationPosition, mPlayback, false);
          mCollectionAdapter.notifyDataSetChanged(); // TODO Remove?
        }
        break;

        // CASE: station was renamed
      case TransistorKeys.STATION_RENAMED:
        if (intent.hasExtra(TransistorKeys.EXTRA_STATION_NEW_NAME)
            && intent.hasExtra(TransistorKeys.EXTRA_STATION)
            && intent.hasExtra(TransistorKeys.EXTRA_STATION_ID)) {

          // get new name, station and station ID from intent
          String newStationName = intent.getStringExtra(TransistorKeys.EXTRA_STATION_NEW_NAME);
          Station station = intent.getParcelableExtra(TransistorKeys.EXTRA_STATION);
          int stationID = intent.getIntExtra(TransistorKeys.EXTRA_STATION_ID, 0);

          // update notification
          if (station.getPlaybackState()) {
            NotificationHelper.update(station, stationID, null, null);
          }

          // change station within in adapter, scroll to new position and update adapter
          newStationPosition = mCollectionAdapter.rename(newStationName, station, stationID);
          mLayoutManager.scrollToPosition(newStationPosition);
          mCollectionAdapter.setStationIDSelected(newStationPosition, mPlayback, false);
          mCollectionAdapter.notifyDataSetChanged(); // TODO Remove?
        }
        break;

        // CASE: station was deleted
      case TransistorKeys.STATION_DELETED:
        if (intent.hasExtra(TransistorKeys.EXTRA_STATION)
            && intent.hasExtra(TransistorKeys.EXTRA_STATION_ID)) {

          // get station and station ID from intent
          Station station = intent.getParcelableExtra(TransistorKeys.EXTRA_STATION);
          int stationID = intent.getIntExtra(TransistorKeys.EXTRA_STATION_ID, 0);

          // dismiss notification
          NotificationHelper.stop();

          if (station.getPlaybackState()) {
            // stop player service and notification using intent
            Intent i = new Intent(mActivity, PlayerService.class);
            i.setAction(TransistorKeys.ACTION_DISMISS);
            mActivity.startService(i);
            LogHelper.v(LOG_TAG, "Stopping player service.");
          }

          // remove station from adapter and update
          newStationPosition = mCollectionAdapter.delete(station, stationID);
          if (newStationPosition == -1 || mCollectionAdapter.getItemCount() == 0) {
            // show call to action
            toggleActionCall();
          } else {
            // scroll to new position
            mCollectionAdapter.setStationIDSelected(newStationPosition, mPlayback, false);
            mLayoutManager.scrollToPosition(newStationPosition);
          }
          mCollectionAdapter.notifyDataSetChanged(); // TODO Remove?
        }
        break;
    }
  }