1/* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16package com.android.mail; 17 18import android.text.Html; 19import android.text.util.Rfc822Token; 20import android.text.util.Rfc822Tokenizer; 21import com.android.mail.utils.LogTag; 22import com.android.mail.utils.LogUtils; 23 24import java.util.regex.Matcher; 25import java.util.regex.Pattern; 26 27/** 28 * Class representing a single email address. Thread-safe, immutable value class suitable for 29 * caching. 30 * TODO(pwestbro): move to provider 31 */ 32public class EmailAddress { 33 public static final String LOG_TAG = LogTag.getLogTag(); 34 35 private final String mName; 36 37 private final String mAddress; 38 39 private static final Matcher sEmailMatcher = 40 Pattern.compile("\\\"?([^\"<]*?)\\\"?\\s*<(.*)>").matcher(""); 41 42 private EmailAddress(String name, String address) { 43 mName = name; 44 mAddress = address; 45 } 46 47 public String getName() { 48 return mName; 49 } 50 51 /** 52 * @return either the parsed out e-mail address, or the full raw address if it is not in 53 * an expected format. This is not guaranteed to be HTML safe. 54 */ 55 public String getAddress() { 56 return mAddress; 57 } 58 59 // TODO (pwestbro): move to provider 60 public static synchronized EmailAddress getEmailAddress(String rawAddress) { 61 String name, address; 62 if (rawAddress == null) { 63 LogUtils.e(LOG_TAG, "null rawAddress in EmailAddress#getEmailAddress"); 64 rawAddress = ""; 65 } 66 Matcher m = sEmailMatcher.reset(rawAddress); 67 if (m.matches()) { 68 name = m.group(1); 69 address = m.group(2); 70 if (name == null) { 71 name = ""; 72 } else { 73 name = Html.fromHtml(name.trim()).toString(); 74 } 75 if (address == null) { 76 address = ""; 77 } else { 78 address = Html.fromHtml(address).toString(); 79 } 80 } else { 81 // Try and tokenize the string 82 final Rfc822Token[] tokens = Rfc822Tokenizer.tokenize(rawAddress); 83 if (tokens.length > 0) { 84 final String tokenizedName = tokens[0].getName(); 85 name = tokenizedName != null ? Html.fromHtml(tokenizedName.trim()).toString() : ""; 86 address = Html.fromHtml(tokens[0].getAddress()).toString(); 87 } else { 88 name = ""; 89 address = Html.fromHtml(rawAddress).toString(); 90 } 91 } 92 return new EmailAddress(name, address); 93 } 94}