blob: 5214c901051af919e1184630b565f303d743b481 [file] [log] [blame]
/**
* 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();
}
}