| /** |
| * Copyright (c) 2011, Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.mail.utils; |
| |
| import android.content.res.Resources; |
| import android.text.TextUtils; |
| |
| import com.android.mail.R; |
| import com.android.mail.providers.Account; |
| import com.android.mail.providers.AccountObserver; |
| import com.android.mail.ui.AccountController; |
| |
| import java.util.regex.Pattern; |
| |
| /** |
| * A veiled email address is where we don't want to display the email address, because the address |
| * might be throw-away, or temporary. For these veiled addresses, we want to display some alternate |
| * information. To find if an email address is veiled, call the method |
| * {@link #isVeiledAddress(String)} |
| */ |
| public final class VeiledAddressMatcher{ |
| /** |
| * Resource for the regex pattern that specifies a veiled addresses. |
| */ |
| private static final int VEILED_RESOURCE = R.string.veiled_address; |
| |
| /** |
| * Resource that specifies whether veiled address matching is enabled. |
| */ |
| private static final int VEILED_MATCHING_ENABLED = R.bool.veiled_address_enabled; |
| |
| /** |
| * Similar to {@link #VEILED_ALTERNATE_TEXT} except this is for addresses where we don't have |
| * the name corresponding to the veiled address. Since we don't show the address, we should |
| * indicate that the recipient is unknown to us. |
| */ |
| public static final int VEILED_ALTERNATE_TEXT_UNKNOWN_PERSON = |
| R.string.veiled_alternate_text_unknown_person; |
| |
| /** |
| * When we show a veiled address, we should show an alternate string rather than the email |
| * address. This is the resource that specifies the alternate string. |
| */ |
| public static final int VEILED_ALTERNATE_TEXT = R.string.veiled_alternate_text; |
| |
| /** |
| * A summary string (short-string) for an unknown veiled recipient. |
| */ |
| public static final int VEILED_SUMMARY_UNKNOWN = R.string.veiled_summary_unknown_person; |
| |
| /** |
| * Private object that does the actual matching. |
| */ |
| private Pattern mMatcher = null; |
| |
| /** |
| * True if veiled address matching is enabled, false otherwise. |
| */ |
| protected boolean mVeiledMatchingEnabled = false; |
| |
| /** |
| * The hash code of the last profile pattern retrieved . This allows us to avoid recompiling the |
| * patterns when nothing has changed. |
| */ |
| private int mProfilePatternLastHash = -1; |
| |
| private final AccountObserver mObserver = new AccountObserver() { |
| @Override |
| public void onChanged(Account newAccount) { |
| loadPattern(newAccount.settings.veiledAddressPattern); |
| } |
| }; |
| |
| /** |
| * Make instantiation impossible. |
| */ |
| private VeiledAddressMatcher() { |
| // Do nothing. |
| } |
| |
| /** |
| * Loads the regular expression that corresponds to veiled addresses. It is safe to call this |
| * method repeatedly with the same pattern. If the pattern has not changed, little extra work |
| * is done. |
| * @param pattern |
| */ |
| private final void loadPattern(String pattern) { |
| if (!TextUtils.isEmpty(pattern)) { |
| final int hashCode = pattern.hashCode(); |
| if (hashCode != mProfilePatternLastHash) { |
| mProfilePatternLastHash = hashCode; |
| mMatcher = Pattern.compile(pattern); |
| // Since we have a non-empty pattern now, enable pattern matching. |
| mVeiledMatchingEnabled = true; |
| } |
| } |
| } |
| |
| /** |
| * Default constructor |
| * @return |
| */ |
| public static final VeiledAddressMatcher newInstance(Resources resources) { |
| final VeiledAddressMatcher instance = new VeiledAddressMatcher(); |
| instance.mVeiledMatchingEnabled = resources.getBoolean(VEILED_MATCHING_ENABLED); |
| if (instance.mVeiledMatchingEnabled) { |
| instance.loadPattern(resources.getString(VEILED_RESOURCE)); |
| } |
| return instance; |
| } |
| |
| /** |
| * Initialize the object to listen for account changes. Without this, we cannot obtain updated |
| * values of the veiled address pattern and the value is read once from resources. |
| * @param controller |
| */ |
| public final void initialize(AccountController controller) { |
| mObserver.initialize(controller); |
| } |
| |
| /** |
| * Returns true if the given email address is a throw-away (or veiled) address. Such addresses |
| * are created using special server-side logic for the purpose of keeping the real address of |
| * the user hidden. |
| * @param address |
| * @return true if the address is veiled, false otherwise. |
| */ |
| public final boolean isVeiledAddress (String address) { |
| if (!mVeiledMatchingEnabled || mMatcher == null) { |
| // Veiled address matching is explicitly disabled: Match nothing. |
| return false; |
| } |
| return mMatcher.matcher(address).matches(); |
| } |
| } |