public static void handleReadReport(
      final Context context,
      final Collection<Long> threadIds,
      final int status,
      final Runnable callback) {
    StringBuilder selectionBuilder =
        new StringBuilder(
            Mms.MESSAGE_TYPE
                + " = "
                + PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF
                + " AND "
                + Mms.READ
                + " = 0"
                + " AND "
                + Mms.READ_REPORT
                + " = "
                + PduHeaders.VALUE_YES);

    String[] selectionArgs = null;
    if (threadIds != null) {
      String threadIdSelection = null;
      StringBuilder buf = new StringBuilder();
      selectionArgs = new String[threadIds.size()];
      int i = 0;

      for (long threadId : threadIds) {
        if (i > 0) {
          buf.append(" OR ");
        }
        buf.append(Mms.THREAD_ID).append("=?");
        selectionArgs[i++] = Long.toString(threadId);
      }
      threadIdSelection = buf.toString();

      selectionBuilder.append(" AND (" + threadIdSelection + ")");
    }

    final Cursor c =
        SqliteWrapper.query(
            context,
            context.getContentResolver(),
            Mms.Inbox.CONTENT_URI,
            new String[] {Mms._ID, Mms.MESSAGE_ID},
            selectionBuilder.toString(),
            selectionArgs,
            null);

    if (c == null) {
      return;
    }

    final Map<String, String> map = new HashMap<String, String>();
    try {
      if (c.getCount() == 0) {
        if (callback != null) {
          callback.run();
        }
        return;
      }

      while (c.moveToNext()) {
        Uri uri = ContentUris.withAppendedId(Mms.CONTENT_URI, c.getLong(0));
        map.put(c.getString(1), AddressUtils.getFrom(context, uri));
      }
    } finally {
      c.close();
    }

    OnClickListener positiveListener =
        new OnClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int which) {
            for (final Map.Entry<String, String> entry : map.entrySet()) {
              MmsMessageSender.sendReadRec(context, entry.getValue(), entry.getKey(), status);
            }

            if (callback != null) {
              callback.run();
            }
            dialog.dismiss();
          }
        };

    OnClickListener negativeListener =
        new OnClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int which) {
            if (callback != null) {
              callback.run();
            }
            dialog.dismiss();
          }
        };

    OnCancelListener cancelListener =
        new OnCancelListener() {
          @Override
          public void onCancel(DialogInterface dialog) {
            if (callback != null) {
              callback.run();
            }
            dialog.dismiss();
          }
        };

    confirmReadReportDialog(context, positiveListener, negativeListener, cancelListener);
  }