/*
This file is part of Project MAXS.
MAXS and its modules is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
MAXS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with MAXS. If not, see <http://www.gnu.org/licenses/>.
*/
package org.projectmaxs.shared.global.messagecontent;
import java.util.List;
import java.util.regex.Pattern;
import org.projectmaxs.shared.global.util.ParcelUtil;
import android.os.Parcel;
import android.os.Parcelable;
import android.provider.ContactsContract;
public class ContactNumber extends AbstractElement {
private static final Pattern numberPattern = Pattern.compile("\\+?\\d+");
final String mNumber;
final NumberType mNumberType;
final boolean mSuperPrimary;
final String mLabel;
public ContactNumber(String number) {
if (!isNumber(number)) throw new IllegalArgumentException("Not a number: " + number);
mNumber = cleanNumber(number);
mNumberType = NumberType.UNKOWN;
mSuperPrimary = false;
mLabel = null;
}
public ContactNumber(NumberType type, String number) {
if (!isNumber(number)) throw new IllegalArgumentException("Not a number: " + number);
mNumber = cleanNumber(number);
mNumberType = type;
mSuperPrimary = false;
mLabel = null;
}
public ContactNumber(String number, int type, String label, boolean superPrimary) {
if (!isNumber(number)) throw new IllegalArgumentException("Not a number: " + number);
mNumber = cleanNumber(number);
mNumberType = fromInt(type);
mLabel = label;
mSuperPrimary = superPrimary;
}
private ContactNumber(Parcel in) {
mNumberType = in.readParcelable(NumberType.class.getClassLoader());
mNumber = in.readString();
mSuperPrimary = ParcelUtil.readBool(in);
mLabel = in.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(mNumberType, flags);
dest.writeString(mNumber);
ParcelUtil.writeBool(dest, mSuperPrimary);
dest.writeString(mLabel);
}
public static final Creator<ContactNumber> CREATOR = new Creator<ContactNumber>() {
@Override
public ContactNumber createFromParcel(Parcel source) {
return new ContactNumber(source);
}
@Override
public ContactNumber[] newArray(int size) {
return new ContactNumber[size];
}
};
public String getNumber() {
return mNumber;
}
public NumberType getType() {
return mNumberType;
}
public String getLabel() {
return mLabel;
}
public static enum NumberType implements Parcelable {
MOBILE, HOME, WORK, UNKOWN, OTHER;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(ordinal());
}
public static final Creator<NumberType> CREATOR = new Creator<NumberType>() {
@Override
public NumberType createFromParcel(Parcel source) {
return NumberType.values()[source.readInt()];
}
@Override
public NumberType[] newArray(int size) {
return new NumberType[size];
}
};
}
@Override
public String toString() {
return "ContactNumber number=" + mNumber + " type=" + mNumberType + " primary="
+ mSuperPrimary;
}
/**
*
* Tries to find the best matching number
*
* @param numbers
* @param numberType
* type to be searched for, can be null
*
* @return the best number, or null if none found
*/
public static ContactNumber getBest(List<ContactNumber> numbers, NumberType numberType) {
if (numbers.isEmpty()) return null;
if (numbers.size() == 1) return numbers.get(0);
if (numberType != null) {
ContactNumber firstMatchingType = null;
for (ContactNumber number : numbers) {
if (number.getType() == numberType) {
if (firstMatchingType == null) firstMatchingType = number;
if (number.mSuperPrimary) return number;
}
}
if (firstMatchingType != null) return firstMatchingType;
}
for (ContactNumber number : numbers)
if (number.mSuperPrimary) return number;
return numbers.get(0);
}
public static String cleanNumber(String number) {
// @formatter:off
return number
.replace("(", "")
.replace(")", "")
.replace("-", "")
.replace(".", "")
.replace("/", "")
.replace("#", "")
.replaceAll("\\s+", "")
;
// @formatter:on
}
public static boolean isNumber(String s) {
return numberPattern.matcher(cleanNumber(s)).matches();
}
public static NumberType fromInt(int i) {
switch (i) {
case ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
return NumberType.HOME;
case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE:
return NumberType.MOBILE;
case ContactsContract.CommonDataKinds.Phone.TYPE_WORK:
return NumberType.WORK;
case ContactsContract.CommonDataKinds.Phone.TYPE_OTHER:
return NumberType.OTHER;
default:
return NumberType.UNKOWN;
}
}
}