package com.fsck.k9.helper;
import java.util.ArrayList;
import java.util.List;
import android.net.Uri;
import com.fsck.k9.mail.Address;
public final class MailTo {
private static final String MAILTO_SCHEME = "mailto";
private static final String TO = "to";
private static final String BODY = "body";
private static final String CC = "cc";
private static final String BCC = "bcc";
private static final String SUBJECT = "subject";
private static final Address[] EMPTY_ADDRESS_LIST = new Address[0];
private final Address[] toAddresses;
private final Address[] ccAddresses;
private final Address[] bccAddresses;
private final String subject;
private final String body;
public static boolean isMailTo(Uri uri) {
return uri != null && MAILTO_SCHEME.equals(uri.getScheme());
}
public static MailTo parse(Uri uri) throws NullPointerException, IllegalArgumentException {
if (uri == null || uri.toString() == null) {
throw new NullPointerException("Argument 'uri' must not be null");
}
if (!isMailTo(uri)) {
throw new IllegalArgumentException("Not a mailto scheme");
}
String schemaSpecific = uri.getSchemeSpecificPart();
int end = schemaSpecific.indexOf('?');
if (end == -1) {
end = schemaSpecific.length();
}
CaseInsensitiveParamWrapper params =
new CaseInsensitiveParamWrapper(Uri.parse("foo://bar?" + uri.getEncodedQuery()));
// Extract the recipient's email address from the mailto URI if there's one.
String recipient = Uri.decode(schemaSpecific.substring(0, end));
List<String> toList = params.getQueryParameters(TO);
if (recipient.length() != 0) {
toList.add(0, recipient);
}
List<String> ccList = params.getQueryParameters(CC);
List<String> bccList = params.getQueryParameters(BCC);
Address[] toAddresses = toAddressArray(toList);
Address[] ccAddresses = toAddressArray(ccList);
Address[] bccAddresses = toAddressArray(bccList);
String subject = getFirstParameterValue(params, SUBJECT);
String body = getFirstParameterValue(params, BODY);
return new MailTo(toAddresses, ccAddresses, bccAddresses, subject, body);
}
private static String getFirstParameterValue(CaseInsensitiveParamWrapper params, String paramName) {
List<String> paramValues = params.getQueryParameters(paramName);
return (paramValues.isEmpty()) ? null : paramValues.get(0);
}
private static Address[] toAddressArray(List<String> recipients) {
if (recipients.isEmpty()) {
return EMPTY_ADDRESS_LIST;
}
String addressList = toCommaSeparatedString(recipients);
return Address.parse(addressList);
}
private static String toCommaSeparatedString(List<String> list) {
StringBuilder stringBuilder = new StringBuilder();
for (String item : list) {
stringBuilder.append(item).append(',');
}
stringBuilder.setLength(stringBuilder.length() - 1);
return stringBuilder.toString();
}
private MailTo(Address[] toAddresses, Address[] ccAddresses, Address[] bccAddresses, String subject, String body) {
this.toAddresses = toAddresses;
this.ccAddresses = ccAddresses;
this.bccAddresses = bccAddresses;
this.subject = subject;
this.body = body;
}
public Address[] getTo() {
return toAddresses;
}
public Address[] getCc() {
return ccAddresses;
}
public Address[] getBcc() {
return bccAddresses;
}
public String getSubject() {
return subject;
}
public String getBody() {
return body;
}
static class CaseInsensitiveParamWrapper {
private final Uri uri;
public CaseInsensitiveParamWrapper(Uri uri) {
this.uri = uri;
}
public List<String> getQueryParameters(String key) {
List<String> params = new ArrayList<String>();
for (String paramName : uri.getQueryParameterNames()) {
if (paramName.equalsIgnoreCase(key)) {
params.addAll(uri.getQueryParameters(paramName));
}
}
return params;
}
}
}