package org.thoughtcrime.securesms.sms; import android.os.Parcel; import android.os.Parcelable; import android.telephony.SmsMessage; import org.whispersystems.textsecure.push.IncomingPushMessage; import java.util.List; public class IncomingTextMessage implements Parcelable { public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @Override public IncomingTextMessage createFromParcel(Parcel in) { return new IncomingTextMessage(in); } @Override public IncomingTextMessage[] newArray(int size) { return new IncomingTextMessage[size]; } }; private final String message; private final String sender; private final int protocol; private final String serviceCenterAddress; private final boolean replyPathPresent; private final String pseudoSubject; private final long sentTimestampMillis; public IncomingTextMessage(SmsMessage message) { this.message = message.getDisplayMessageBody(); this.sender = message.getDisplayOriginatingAddress(); this.protocol = message.getProtocolIdentifier(); this.serviceCenterAddress = message.getServiceCenterAddress(); this.replyPathPresent = message.isReplyPathPresent(); this.pseudoSubject = message.getPseudoSubject(); this.sentTimestampMillis = message.getTimestampMillis(); } public IncomingTextMessage(IncomingPushMessage message) { this.message = message.getMessageText(); this.sender = message.getSource(); this.protocol = 31337; this.serviceCenterAddress = "GCM"; this.replyPathPresent = true; this.pseudoSubject = ""; this.sentTimestampMillis = message.getTimestampMillis(); } public IncomingTextMessage(Parcel in) { this.message = in.readString(); this.sender = in.readString(); this.protocol = in.readInt(); this.serviceCenterAddress = in.readString(); this.replyPathPresent = (in.readInt() == 1); this.pseudoSubject = in.readString(); this.sentTimestampMillis = in.readLong(); } public IncomingTextMessage(IncomingTextMessage base, String newBody) { this.message = newBody; this.sender = base.getSender(); this.protocol = base.getProtocol(); this.serviceCenterAddress = base.getServiceCenterAddress(); this.replyPathPresent = base.isReplyPathPresent(); this.pseudoSubject = base.getPseudoSubject(); this.sentTimestampMillis = base.getSentTimestampMillis(); } public IncomingTextMessage(List fragments) { StringBuilder body = new StringBuilder(); for (IncomingTextMessage message : fragments) { body.append(message.getMessageBody()); } this.message = body.toString(); this.sender = fragments.get(0).getSender(); this.protocol = fragments.get(0).getProtocol(); this.serviceCenterAddress = fragments.get(0).getServiceCenterAddress(); this.replyPathPresent = fragments.get(0).isReplyPathPresent(); this.pseudoSubject = fragments.get(0).getPseudoSubject(); this.sentTimestampMillis = fragments.get(0).getSentTimestampMillis(); } public long getSentTimestampMillis() { return sentTimestampMillis; } public String getPseudoSubject() { return pseudoSubject; } public String getMessageBody() { return message; } public IncomingTextMessage withMessageBody(String message) { return new IncomingTextMessage(this, message); } public String getSender() { return sender; } public int getProtocol() { return protocol; } public String getServiceCenterAddress() { return serviceCenterAddress; } public boolean isReplyPathPresent() { return replyPathPresent; } public boolean isKeyExchange() { return false; } public boolean isSecureMessage() { return false; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel out, int flags) { out.writeString(message); out.writeString(sender); out.writeInt(protocol); out.writeString(serviceCenterAddress); out.writeInt(replyPathPresent ? 1 : 0); out.writeString(pseudoSubject); out.writeLong(sentTimestampMillis); } }