private static String getNotificationIndDetails(Context context, Cursor cursor) {
    StringBuilder details = new StringBuilder();
    Resources res = context.getResources();

    long id = cursor.getLong(MessageListAdapter.COLUMN_ID);
    Uri uri = ContentUris.withAppendedId(Mms.CONTENT_URI, id);
    NotificationInd nInd;

    try {
      nInd = (NotificationInd) PduPersister.getPduPersister(context).load(uri);
    } catch (MmsException e) {
      Log.e(TAG, "Failed to load the message: " + uri, e);
      return context.getResources().getString(R.string.cannot_get_details);
    }

    // Message Type: Mms Notification.
    details.append(res.getString(R.string.message_type_label));
    details.append(res.getString(R.string.multimedia_notification));

    // From: ***
    String from = extractEncStr(context, nInd.getFrom());
    details.append('\n');
    details.append(res.getString(R.string.from_label));
    details.append(!TextUtils.isEmpty(from) ? from : res.getString(R.string.hidden_sender_address));

    // Date: ***
    details.append('\n');
    details.append(
        res.getString(
            R.string.expire_on,
            MessageUtils.formatTimeStampString(context, nInd.getExpiry() * 1000L, true)));

    // Subject: ***
    details.append('\n');
    details.append(res.getString(R.string.subject_label));

    EncodedStringValue subject = nInd.getSubject();
    if (subject != null) {
      details.append(subject.getString());
    }

    // Message class: Personal/Advertisement/Infomational/Auto
    details.append('\n');
    details.append(res.getString(R.string.message_class_label));
    details.append(new String(nInd.getMessageClass()));

    // Message size: *** KB
    details.append('\n');
    details.append(res.getString(R.string.message_size_label));
    details.append(String.valueOf((nInd.getMessageSize() + 1023) / 1024));
    details.append(context.getString(R.string.kilobyte));

    return details.toString();
  }
 private static String extractEncStr(Context context, EncodedStringValue value) {
   if (value != null) {
     return value.getString();
   } else {
     return "";
   }
 }
 private void interpretFrom(EncodedStringValue from, Uri messageUri) {
   if (from != null) {
     mAddress = from.getString();
   } else {
     // In the rare case when getting the "from" address from the pdu fails,
     // (e.g. from == null) fall back to a slower, yet more reliable method of
     // getting the address from the "addr" table. This is what the Messaging
     // notification system uses.
     mAddress = AddressUtils.getFrom(mContext, messageUri);
   }
   mContact = TextUtils.isEmpty(mAddress) ? "" : Contact.get(mAddress, false).getName();
 }
  private static String getMultimediaMessageDetails(Context context, Cursor cursor, int size) {
    int type = cursor.getInt(MessageListAdapter.COLUMN_MMS_MESSAGE_TYPE);
    if (type == PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND) {
      return getNotificationIndDetails(context, cursor);
    }

    StringBuilder details = new StringBuilder();
    Resources res = context.getResources();

    long id = cursor.getLong(MessageListAdapter.COLUMN_ID);
    Uri uri = ContentUris.withAppendedId(Mms.CONTENT_URI, id);
    MultimediaMessagePdu msg;

    try {
      msg = (MultimediaMessagePdu) PduPersister.getPduPersister(context).load(uri);
    } catch (MmsException e) {
      Log.e(TAG, "Failed to load the message: " + uri, e);
      return context.getResources().getString(R.string.cannot_get_details);
    }

    // Message Type: Text message.
    details.append(res.getString(R.string.message_type_label));
    details.append(res.getString(R.string.multimedia_message));

    if (msg instanceof RetrieveConf) {
      // From: ***
      String from = extractEncStr(context, ((RetrieveConf) msg).getFrom());
      details.append('\n');
      details.append(res.getString(R.string.from_label));
      details.append(
          !TextUtils.isEmpty(from) ? from : res.getString(R.string.hidden_sender_address));
    }

    // To: ***
    details.append('\n');
    details.append(res.getString(R.string.to_address_label));
    EncodedStringValue[] to = msg.getTo();
    if (to != null) {
      details.append(EncodedStringValue.concat(to));
    } else {
      Log.w(TAG, "recipient list is empty!");
    }

    // Bcc: ***
    if (msg instanceof SendReq) {
      EncodedStringValue[] values = ((SendReq) msg).getBcc();
      if ((values != null) && (values.length > 0)) {
        details.append('\n');
        details.append(res.getString(R.string.bcc_label));
        details.append(EncodedStringValue.concat(values));
      }
    }

    // Date: ***
    details.append('\n');
    int msgBox = cursor.getInt(MessageListAdapter.COLUMN_MMS_MESSAGE_BOX);
    if (msgBox == Mms.MESSAGE_BOX_DRAFTS) {
      details.append(res.getString(R.string.saved_label));
    } else if (msgBox == Mms.MESSAGE_BOX_INBOX) {
      details.append(res.getString(R.string.received_label));
    } else {
      details.append(res.getString(R.string.sent_label));
    }

    details.append(MessageUtils.formatTimeStampString(context, msg.getDate() * 1000L, true));

    // Subject: ***
    details.append('\n');
    details.append(res.getString(R.string.subject_label));

    EncodedStringValue subject = msg.getSubject();
    if (subject != null) {
      String subStr = subject.getString();
      // Message size should include size of subject.
      size += subStr.length();
      details.append(subStr);
    }

    // Priority: High/Normal/Low
    details.append('\n');
    details.append(res.getString(R.string.priority_label));
    details.append(getPriorityDescription(context, msg.getPriority()));

    // Message size: *** KB
    details.append('\n');
    details.append(res.getString(R.string.message_size_label));
    details.append((size - 1) / 1000 + 1);
    details.append(" KB");

    return details.toString();
  }
  MessageItem(Context context, String type, Cursor cursor, ColumnsMap columnsMap, String highlight)
      throws MmsException {
    mContext = context;
    mMsgId = cursor.getLong(columnsMap.mColumnMsgId);
    mHighlight = highlight != null ? highlight.toLowerCase() : null;
    mType = type;

    if ("sms".equals(type)) {
      mReadReport = false; // No read reports in sms

      long status = cursor.getLong(columnsMap.mColumnSmsStatus);
      if (status == Sms.STATUS_NONE) {
        // No delivery report requested
        mDeliveryStatus = DeliveryStatus.NONE;
      } else if (status >= Sms.STATUS_FAILED) {
        // Failure
        mDeliveryStatus = DeliveryStatus.FAILED;
      } else if (status >= Sms.STATUS_PENDING) {
        // Pending
        mDeliveryStatus = DeliveryStatus.PENDING;
      } else {
        // Success
        mDeliveryStatus = DeliveryStatus.RECEIVED;
      }

      mMessageUri = ContentUris.withAppendedId(Sms.CONTENT_URI, mMsgId);
      // Set contact and message body
      mBoxId = cursor.getInt(columnsMap.mColumnSmsType);
      mAddress = cursor.getString(columnsMap.mColumnSmsAddress);
      if (Sms.isOutgoingFolder(mBoxId)) {
        String meString = context.getString(R.string.messagelist_sender_self);

        mContact = meString;
      } else {
        // For incoming messages, the ADDRESS field contains the sender.
        mContact = Contact.get(mAddress, false).getName();
      }
      mBody = cursor.getString(columnsMap.mColumnSmsBody);

      if (isEncrypted()) {
        encrypted = true;
        if (MessageEncryptionFactory.isAuthenticated()) {
          try {
            mBody = MessageEncryptionFactory.stripHeader(mBody);
            mBody = MessageEncryption.decrypt(context, mAddress, Base64.decode(mBody));
          } catch (Exception e) {
            Log.e(TAG, "Error decrypting message");
            e.printStackTrace();
          }
        } else if (ComposeMessageActivity.encryptIfNeeded
            && !MessageEncryptionFactory.isAuthenticating()) {
          ComposeMessageActivity.encryptIfNeeded = false;
          MessageEncryptionFactory.setAuthenticating(true);
          Intent intent = new Intent(context, AuthenticateActivity.class);
          context.startActivity(intent);
        }
      } else if (isPublicKey()) {
        publickey = true;
        mBody = context.getString(R.string.parandroid_public_key_snippet);
      }

      if (!isOutgoingMessage()) {
        // Set "sent" time stamp
        long date = cursor.getLong(columnsMap.mColumnSmsDate);
        mTimestamp =
            String.format(
                context.getString(R.string.sent_on),
                MessageUtils.formatTimeStampString(context, date));
      }

      mLocked = cursor.getInt(columnsMap.mColumnSmsLocked) != 0;
    } else if ("mms".equals(type)) {
      mMessageUri = ContentUris.withAppendedId(Mms.CONTENT_URI, mMsgId);
      mBoxId = cursor.getInt(columnsMap.mColumnMmsMessageBox);
      mMessageType = cursor.getInt(columnsMap.mColumnMmsMessageType);
      mErrorType = cursor.getInt(columnsMap.mColumnMmsErrorType);
      String subject = cursor.getString(columnsMap.mColumnMmsSubject);
      if (!TextUtils.isEmpty(subject)) {
        EncodedStringValue v =
            new EncodedStringValue(
                cursor.getInt(columnsMap.mColumnMmsSubjectCharset), PduPersister.getBytes(subject));
        mSubject = v.getString();
      }
      mLocked = cursor.getInt(columnsMap.mColumnMmsLocked) != 0;

      long timestamp = 0L;
      PduPersister p = PduPersister.getPduPersister(mContext);
      if (PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND == mMessageType) {
        mDeliveryStatus = DeliveryStatus.NONE;
        NotificationInd notifInd = (NotificationInd) p.load(mMessageUri);
        interpretFrom(notifInd.getFrom(), mMessageUri);
        // Borrow the mBody to hold the URL of the message.
        mBody = new String(notifInd.getContentLocation());
        mMessageSize = (int) notifInd.getMessageSize();
        timestamp = notifInd.getExpiry() * 1000L;
      } else {
        MultimediaMessagePdu msg = (MultimediaMessagePdu) p.load(mMessageUri);
        mSlideshow = SlideshowModel.createFromPduBody(context, msg.getBody());
        mAttachmentType = MessageUtils.getAttachmentType(mSlideshow);

        if (mMessageType == PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF) {
          RetrieveConf retrieveConf = (RetrieveConf) msg;
          interpretFrom(retrieveConf.getFrom(), mMessageUri);
          timestamp = retrieveConf.getDate() * 1000L;
        } else {
          // Use constant string for outgoing messages
          mContact = mAddress = context.getString(R.string.messagelist_sender_self);
          timestamp = ((SendReq) msg).getDate() * 1000L;
        }

        String report = cursor.getString(columnsMap.mColumnMmsDeliveryReport);
        if ((report == null)
            || !mAddress.equals(context.getString(R.string.messagelist_sender_self))) {
          mDeliveryStatus = DeliveryStatus.NONE;
        } else {
          int reportInt;
          try {
            reportInt = Integer.parseInt(report);
            if (reportInt == PduHeaders.VALUE_YES) {
              mDeliveryStatus = DeliveryStatus.INFO;
            } else {
              mDeliveryStatus = DeliveryStatus.NONE;
            }
          } catch (NumberFormatException nfe) {
            Log.e(TAG, "Value for delivery report was invalid.");
            mDeliveryStatus = DeliveryStatus.NONE;
          }
        }

        report = cursor.getString(columnsMap.mColumnMmsReadReport);
        if ((report == null)
            || !mAddress.equals(context.getString(R.string.messagelist_sender_self))) {
          mReadReport = false;
        } else {
          int reportInt;
          try {
            reportInt = Integer.parseInt(report);
            mReadReport = (reportInt == PduHeaders.VALUE_YES);
          } catch (NumberFormatException nfe) {
            Log.e(TAG, "Value for read report was invalid.");
            mReadReport = false;
          }
        }

        SlideModel slide = mSlideshow.get(0);
        if ((slide != null) && slide.hasText()) {
          TextModel tm = slide.getText();
          if (tm.isDrmProtected()) {
            mBody = mContext.getString(R.string.drm_protected_text);
          } else {
            mBody = tm.getText();
          }
        }

        mMessageSize = mSlideshow.getCurrentMessageSize();
      }

      if (!isOutgoingMessage()) {
        mTimestamp =
            context.getString(
                getTimestampStrId(), MessageUtils.formatTimeStampString(context, timestamp));
      }
    } else {
      throw new MmsException("Unknown type of the message: " + type);
    }
  }