/**
   * Clear a limiter.
   *
   * @param type Which type of limiter to clear.
   */
  public void clearLimiter(int type) {
    maintainPosition();

    if (type == MediaUtils.TYPE_FILE) {
      if (mFilesAdapter == null) {
        mPendingFileLimiter = null;
      } else {
        mFilesAdapter.setLimiter(null);
        requestRequery(mFilesAdapter);
      }
    } else {
      if (mAlbumAdapter == null) {
        mPendingAlbumLimiter = null;
      } else {
        mAlbumAdapter.setLimiter(null);
        loadSortOrder(mAlbumAdapter);
        requestRequery(mAlbumAdapter);
      }
      if (mSongAdapter == null) {
        mPendingSongLimiter = null;
      } else {
        mSongAdapter.setLimiter(null);
        loadSortOrder(mSongAdapter);
        requestRequery(mSongAdapter);
      }
    }
  }
 @Override
 public Parcelable saveState() {
   Bundle out = new Bundle(10);
   if (mAlbumAdapter != null) out.putSerializable("limiter_albums", mAlbumAdapter.getLimiter());
   if (mSongAdapter != null) out.putSerializable("limiter_songs", mSongAdapter.getLimiter());
   if (mFilesAdapter != null) out.putSerializable("limiter_files", mFilesAdapter.getLimiter());
   maintainPosition();
   return out;
 }
  /**
   * Update the adapters with the given limiter.
   *
   * @param limiter The limiter to set.
   * @return The tab type that should be switched to to expand the row.
   */
  public int setLimiter(Limiter limiter) {
    int tab;

    maintainPosition();

    switch (limiter.type) {
      case MediaUtils.TYPE_ALBUM:
        if (mSongAdapter == null) {
          mPendingSongLimiter = limiter;
        } else {
          mSongAdapter.setLimiter(limiter);
          loadSortOrder(mSongAdapter);
          requestRequery(mSongAdapter);
        }
        tab = mSongsPosition;
        break;
      case MediaUtils.TYPE_ARTIST:
        if (mAlbumAdapter == null) {
          mPendingAlbumLimiter = limiter;
        } else {
          mAlbumAdapter.setLimiter(limiter);
          loadSortOrder(mAlbumAdapter);
          requestRequery(mAlbumAdapter);
        }
        if (mSongAdapter == null) {
          mPendingSongLimiter = limiter;
        } else {
          mSongAdapter.setLimiter(limiter);
          loadSortOrder(mSongAdapter);
          requestRequery(mSongAdapter);
        }
        tab = mAlbumsPosition;
        if (tab == -1) tab = mSongsPosition;
        break;
      case MediaUtils.TYPE_GENRE:
        if (mAlbumAdapter == null) {
          mPendingAlbumLimiter = limiter;
        } else {
          mAlbumAdapter.setLimiter(limiter);
          loadSortOrder(mAlbumAdapter);
          requestRequery(mAlbumAdapter);
        }
        if (mSongAdapter == null) {
          mPendingSongLimiter = limiter;
        } else {
          mSongAdapter.setLimiter(limiter);
          loadSortOrder(mSongAdapter);
          requestRequery(mSongAdapter);
        }
        tab = mSongsPosition;
        break;
      case MediaUtils.TYPE_FILE:
        if (mFilesAdapter == null) {
          mPendingFileLimiter = limiter;
        } else {
          mFilesAdapter.setLimiter(limiter);
          requestRequery(mFilesAdapter);
        }
        tab = -1;
        break;
      default:
        throw new IllegalArgumentException("Unsupported limiter type: " + limiter.type);
    }

    return tab;
  }