package com.fsck.k9.activity;
import java.util.StringTokenizer;
import android.support.annotation.Nullable;
import com.fsck.k9.mail.Flag;
import com.fsck.k9.mail.filter.Base64;
import static com.fsck.k9.helper.Preconditions.checkNotNull;
public class MessageReference {
private static final char IDENTITY_VERSION_1 = '!';
private static final String IDENTITY_SEPARATOR = ":";
private final String accountUuid;
private final String folderName;
private final String uid;
private final Flag flag;
@Nullable
public static MessageReference parse(String identity) {
if (identity == null || identity.length() < 1 || identity.charAt(0) != IDENTITY_VERSION_1) {
return null;
}
StringTokenizer tokens = new StringTokenizer(identity.substring(2), IDENTITY_SEPARATOR, false);
if (tokens.countTokens() < 3) {
return null;
}
String accountUuid = Base64.decode(tokens.nextToken());
String folderName = Base64.decode(tokens.nextToken());
String uid = Base64.decode(tokens.nextToken());
if (!tokens.hasMoreTokens()) {
return new MessageReference(accountUuid, folderName, uid, null);
}
Flag flag;
try {
flag = Flag.valueOf(tokens.nextToken());
} catch (IllegalArgumentException e) {
return null;
}
return new MessageReference(accountUuid, folderName, uid, flag);
}
public MessageReference(String accountUuid, String folderName, String uid, Flag flag) {
this.accountUuid = checkNotNull(accountUuid);
this.folderName = checkNotNull(folderName);
this.uid = checkNotNull(uid);
this.flag = flag;
}
public String toIdentityString() {
StringBuilder refString = new StringBuilder();
refString.append(IDENTITY_VERSION_1);
refString.append(IDENTITY_SEPARATOR);
refString.append(Base64.encode(accountUuid));
refString.append(IDENTITY_SEPARATOR);
refString.append(Base64.encode(folderName));
refString.append(IDENTITY_SEPARATOR);
refString.append(Base64.encode(uid));
if (flag != null) {
refString.append(IDENTITY_SEPARATOR);
refString.append(flag.name());
}
return refString.toString();
}
@Override
public boolean equals(Object o) {
if (!(o instanceof MessageReference)) {
return false;
}
MessageReference other = (MessageReference) o;
return equals(other.accountUuid, other.folderName, other.uid);
}
public boolean equals(String accountUuid, String folderName, String uid) {
return this.accountUuid.equals(accountUuid) && this.folderName.equals(folderName) && this.uid.equals(uid);
}
@Override
public int hashCode() {
final int MULTIPLIER = 31;
int result = 1;
result = MULTIPLIER * result + accountUuid.hashCode();
result = MULTIPLIER * result + folderName.hashCode();
result = MULTIPLIER * result + uid.hashCode();
return result;
}
@Override
public String toString() {
return "MessageReference{" +
"accountUuid='" + accountUuid + '\'' +
", folderName='" + folderName + '\'' +
", uid='" + uid + '\'' +
", flag=" + flag +
'}';
}
public String getAccountUuid() {
return accountUuid;
}
public String getFolderName() {
return folderName;
}
public String getUid() {
return uid;
}
public Flag getFlag() {
return flag;
}
public MessageReference withModifiedUid(String newUid) {
return new MessageReference(accountUuid, folderName, newUid, flag);
}
public MessageReference withModifiedFlag(Flag newFlag) {
return new MessageReference(accountUuid, folderName, uid, newFlag);
}
}