private void addTile(final QSTile<?> tile) {
    final TileRecord r = new TileRecord();
    r.tile = tile;
    r.tileView = tile.createTileView(mContext);
    r.tileView.setVisibility(View.GONE);
    final QSTile.Callback callback =
        new QSTile.Callback() {
          @Override
          public void onStateChanged(QSTile.State state) {
            int visibility = state.visible ? VISIBLE : GONE;
            if (state.visible && !mGridContentVisible) {

              // We don't want to show it if the content is hidden,
              // then we just set it to invisible, to ensure that it gets visible again
              visibility = INVISIBLE;
            }
            setTileVisibility(r.tileView, visibility);
            r.tileView.onStateChanged(state);
          }

          @Override
          public void onShowDetail(boolean show) {
            QSPanel.this.showDetail(show, r);
          }

          @Override
          public void onToggleStateChanged(boolean state) {
            if (mDetailRecord == r) {
              fireToggleStateChanged(state);
            }
          }

          @Override
          public void onScanStateChanged(boolean state) {
            r.scanState = state;
            if (mDetailRecord == r) {
              fireScanStateChanged(r.scanState);
            }
          }

          @Override
          public void onAnnouncementRequested(CharSequence announcement) {
            announceForAccessibility(announcement);
          }
        };
    r.tile.setCallback(callback);
    final View.OnClickListener click =
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            r.tile.click();
            vibrateTile(20);
          }
        };
    final View.OnClickListener clickSecondary =
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            r.tile.secondaryClick();
            vibrateTile(20);
          }
        };
    final View.OnLongClickListener clickLong =
        new View.OnLongClickListener() {
          @Override
          public boolean onLongClick(View v) {
            r.tile.longClick();
            vibrateTile(20);
            return true;
          }
        };
    r.tileView.init(click, clickSecondary, clickLong);
    r.tile.setListening(mListening);
    callback.onStateChanged(r.tile.getState());
    r.tile.refreshState();
    mRecords.add(r);

    addView(r.tileView);
  }