0ace469d74
1) In addition to the Recipient interface, there is now RecipientDevice. A Recipient can have multiple corresponding RecipientDevices. All addressing is done to a Recipient, but crypto sessions and transport delivery are done to RecipientDevice. 2) The Push transport handles the discovery and session setup of additional Recipient devices. 3) Some internal rejiggering of Groups.
171 lines
5.3 KiB
Java
171 lines
5.3 KiB
Java
package org.thoughtcrime.securesms.sms;
|
|
|
|
import android.os.Parcel;
|
|
import android.os.Parcelable;
|
|
import android.telephony.SmsMessage;
|
|
|
|
import org.whispersystems.textsecure.push.IncomingPushMessage;
|
|
import org.whispersystems.textsecure.storage.RecipientDevice;
|
|
|
|
import java.util.List;
|
|
|
|
public class IncomingTextMessage implements Parcelable {
|
|
|
|
public static final Parcelable.Creator<IncomingTextMessage> CREATOR = new Parcelable.Creator<IncomingTextMessage>() {
|
|
@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 senderDeviceId;
|
|
private final int protocol;
|
|
private final String serviceCenterAddress;
|
|
private final boolean replyPathPresent;
|
|
private final String pseudoSubject;
|
|
private final long sentTimestampMillis;
|
|
private final String groupId;
|
|
|
|
public IncomingTextMessage(SmsMessage message) {
|
|
this.message = message.getDisplayMessageBody();
|
|
this.sender = message.getDisplayOriginatingAddress();
|
|
this.senderDeviceId = RecipientDevice.DEFAULT_DEVICE_ID;
|
|
this.protocol = message.getProtocolIdentifier();
|
|
this.serviceCenterAddress = message.getServiceCenterAddress();
|
|
this.replyPathPresent = message.isReplyPathPresent();
|
|
this.pseudoSubject = message.getPseudoSubject();
|
|
this.sentTimestampMillis = message.getTimestampMillis();
|
|
this.groupId = null;
|
|
}
|
|
|
|
public IncomingTextMessage(IncomingPushMessage message, String encodedBody, String groupId) {
|
|
this.message = encodedBody;
|
|
this.sender = message.getSource();
|
|
this.senderDeviceId = message.getSourceDevice();
|
|
this.protocol = 31337;
|
|
this.serviceCenterAddress = "GCM";
|
|
this.replyPathPresent = true;
|
|
this.pseudoSubject = "";
|
|
this.sentTimestampMillis = message.getTimestampMillis();
|
|
this.groupId = groupId;
|
|
}
|
|
|
|
public IncomingTextMessage(Parcel in) {
|
|
this.message = in.readString();
|
|
this.sender = in.readString();
|
|
this.senderDeviceId = in.readInt();
|
|
this.protocol = in.readInt();
|
|
this.serviceCenterAddress = in.readString();
|
|
this.replyPathPresent = (in.readInt() == 1);
|
|
this.pseudoSubject = in.readString();
|
|
this.sentTimestampMillis = in.readLong();
|
|
this.groupId = in.readString();
|
|
}
|
|
|
|
public IncomingTextMessage(IncomingTextMessage base, String newBody) {
|
|
this.message = newBody;
|
|
this.sender = base.getSender();
|
|
this.senderDeviceId = base.getSenderDeviceId();
|
|
this.protocol = base.getProtocol();
|
|
this.serviceCenterAddress = base.getServiceCenterAddress();
|
|
this.replyPathPresent = base.isReplyPathPresent();
|
|
this.pseudoSubject = base.getPseudoSubject();
|
|
this.sentTimestampMillis = base.getSentTimestampMillis();
|
|
this.groupId = base.getGroupId();
|
|
}
|
|
|
|
public IncomingTextMessage(List<IncomingTextMessage> fragments) {
|
|
StringBuilder body = new StringBuilder();
|
|
|
|
for (IncomingTextMessage message : fragments) {
|
|
body.append(message.getMessageBody());
|
|
}
|
|
|
|
this.message = body.toString();
|
|
this.sender = fragments.get(0).getSender();
|
|
this.senderDeviceId = fragments.get(0).getSenderDeviceId();
|
|
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();
|
|
this.groupId = fragments.get(0).getGroupId();
|
|
}
|
|
|
|
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 getSenderDeviceId() {
|
|
return senderDeviceId;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
public boolean isPreKeyBundle() {
|
|
return false;
|
|
}
|
|
|
|
public String getGroupId() {
|
|
return groupId;
|
|
}
|
|
|
|
@Override
|
|
public int describeContents() {
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
public void writeToParcel(Parcel out, int flags) {
|
|
out.writeString(message);
|
|
out.writeString(sender);
|
|
out.writeInt(senderDeviceId);
|
|
out.writeInt(protocol);
|
|
out.writeString(serviceCenterAddress);
|
|
out.writeInt(replyPathPresent ? 1 : 0);
|
|
out.writeString(pseudoSubject);
|
|
out.writeLong(sentTimestampMillis);
|
|
out.writeString(groupId);
|
|
}
|
|
}
|