private void dismissInternal() {
    // Remove any attached window decor for recycling
    boolean hadDecor = mDecor != null;
    if (hadDecor) {
      mWindowManager.removeView(mDecor);
      mWindowRecycled++;
      mDecor.getViewTreeObserver().removeGlobalOnLayoutListener(this);
      mDecor = null;
      mWindow.closeAllPanels();
    }
    mShowing = false;
    mDismissed = true;

    // Cancel any pending queries
    mHandler.cancelOperation(TOKEN_DATA);
    mQuerying = false;

    // Completely hide header and reset track
    mHeader.setVisibility(View.GONE);
    resetTrack();
  }
  /**
   * Start showing a dialog for the given {@link Contacts#_ID} pointing towards the given location.
   */
  public synchronized void show(Uri lookupUri, Rect anchor, int mode, String[] excludeMimes) {
    if (mQuerying || mShowing) {
      Log.w(TAG, "dismissing before showing");
      dismissInternal();
    }

    if (TRACE_LAUNCH && false /*!android.os.Debug.isMethodTracingActive()*/) {
      android.os.Debug.startMethodTracing(TRACE_TAG);
    }

    // Prepare header view for requested mode
    mLookupUri = lookupUri;
    mAnchor = new Rect(anchor);
    mMode = mode;
    mExcludeMimes = excludeMimes;

    mHeader = getHeaderView(mode);

    setHeaderText(R.id.name, R.string.quickcontact_missing_name);

    setHeaderText(R.id.status, null);
    setHeaderText(R.id.timestamp, null);

    setHeaderImage(R.id.presence, null);

    resetTrack();

    mHasValidSocial = false;
    mDismissed = false;
    mQuerying = true;

    // Start background query for data, but only select photo rows when they
    // directly match the super-primary PHOTO_ID.
    final Uri dataUri = getDataUri(lookupUri);
    mHandler.cancelOperation(TOKEN_DATA);

    // Only request photo data when required by mode
    if (mMode == QuickContact.MODE_LARGE) {
      // Select photos, but only super-primary
      mHandler.startQuery(
          TOKEN_DATA,
          lookupUri,
          dataUri,
          DataQuery.PROJECTION,
          Data.MIMETYPE
              + "!=? OR ("
              + Data.MIMETYPE
              + "=? AND "
              + Data._ID
              + "="
              + Contacts.PHOTO_ID
              + ")",
          new String[] {Photo.CONTENT_ITEM_TYPE, Photo.CONTENT_ITEM_TYPE},
          null);
    } else {
      // Exclude all photos from cursor
      mHandler.startQuery(
          TOKEN_DATA,
          lookupUri,
          dataUri,
          DataQuery.PROJECTION,
          Data.MIMETYPE + "!=?",
          new String[] {Photo.CONTENT_ITEM_TYPE},
          null);
    }
  }