blob: ff2d202d2bc9c469c1d734c8d1813fb3706100a7 [file] [log] [blame]
/*
* Copyright (C) 2012 The Android Open Source Project
*
* 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.contacts.util;
import static android.provider.ContactsContract.CommonDataKinds.Phone;
import android.content.res.Resources;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.TtsSpan;
import android.util.Patterns;
import androidx.annotation.Nullable;
import com.android.contacts.R;
import com.android.contacts.compat.PhoneNumberUtilsCompat;
import com.android.contacts.preference.ContactsPreferences;
/**
* Methods for handling various contact data labels.
*/
public class ContactDisplayUtils {
private static final String TAG = ContactDisplayUtils.class.getSimpleName();
/**
* Checks if the given data type is a custom type.
*
* @param type Phone data type.
* @return {@literal true} if the type is custom. {@literal false} if not.
*/
public static boolean isCustomPhoneType(Integer type) {
return type == Phone.TYPE_CUSTOM || type == Phone.TYPE_ASSISTANT;
}
/**
* Find a label for calling.
*
* @param type The type of number.
* @return An appropriate string label.
*/
public static int getPhoneLabelResourceId(Integer type) {
if (type == null) return R.string.call_other;
switch (type) {
case Phone.TYPE_HOME:
return R.string.call_home;
case Phone.TYPE_MOBILE:
return R.string.call_mobile;
case Phone.TYPE_WORK:
return R.string.call_work;
case Phone.TYPE_FAX_WORK:
return R.string.call_fax_work;
case Phone.TYPE_FAX_HOME:
return R.string.call_fax_home;
case Phone.TYPE_PAGER:
return R.string.call_pager;
case Phone.TYPE_OTHER:
return R.string.call_other;
case Phone.TYPE_CALLBACK:
return R.string.call_callback;
case Phone.TYPE_CAR:
return R.string.call_car;
case Phone.TYPE_COMPANY_MAIN:
return R.string.call_company_main;
case Phone.TYPE_ISDN:
return R.string.call_isdn;
case Phone.TYPE_MAIN:
return R.string.call_main;
case Phone.TYPE_OTHER_FAX:
return R.string.call_other_fax;
case Phone.TYPE_RADIO:
return R.string.call_radio;
case Phone.TYPE_TELEX:
return R.string.call_telex;
case Phone.TYPE_TTY_TDD:
return R.string.call_tty_tdd;
case Phone.TYPE_WORK_MOBILE:
return R.string.call_work_mobile;
case Phone.TYPE_WORK_PAGER:
return R.string.call_work_pager;
case Phone.TYPE_ASSISTANT:
return R.string.call_assistant;
case Phone.TYPE_MMS:
return R.string.call_mms;
default:
return R.string.call_custom;
}
}
/**
* Find a label for sending an sms.
*
* @param type The type of number.
* @return An appropriate string label.
*/
public static int getSmsLabelResourceId(Integer type) {
if (type == null) return R.string.sms_other;
switch (type) {
case Phone.TYPE_HOME:
return R.string.sms_home;
case Phone.TYPE_MOBILE:
return R.string.sms_mobile;
case Phone.TYPE_WORK:
return R.string.sms_work;
case Phone.TYPE_FAX_WORK:
return R.string.sms_fax_work;
case Phone.TYPE_FAX_HOME:
return R.string.sms_fax_home;
case Phone.TYPE_PAGER:
return R.string.sms_pager;
case Phone.TYPE_OTHER:
return R.string.sms_other;
case Phone.TYPE_CALLBACK:
return R.string.sms_callback;
case Phone.TYPE_CAR:
return R.string.sms_car;
case Phone.TYPE_COMPANY_MAIN:
return R.string.sms_company_main;
case Phone.TYPE_ISDN:
return R.string.sms_isdn;
case Phone.TYPE_MAIN:
return R.string.sms_main;
case Phone.TYPE_OTHER_FAX:
return R.string.sms_other_fax;
case Phone.TYPE_RADIO:
return R.string.sms_radio;
case Phone.TYPE_TELEX:
return R.string.sms_telex;
case Phone.TYPE_TTY_TDD:
return R.string.sms_tty_tdd;
case Phone.TYPE_WORK_MOBILE:
return R.string.sms_work_mobile;
case Phone.TYPE_WORK_PAGER:
return R.string.sms_work_pager;
case Phone.TYPE_ASSISTANT:
return R.string.sms_assistant;
case Phone.TYPE_MMS:
return R.string.sms_mms;
default:
return R.string.sms_custom;
}
}
/**
* Whether the given text could be a phone number.
*
* Note this will miss many things that are legitimate phone numbers, for example,
* phone numbers with letters.
*/
public static boolean isPossiblePhoneNumber(CharSequence text) {
return text == null ? false : Patterns.PHONE.matcher(text.toString()).matches();
}
/**
* Returns a Spannable for the given message with a telephone {@link TtsSpan} set for
* the given phone number text wherever it is found within the message.
*/
public static Spannable getTelephoneTtsSpannable(String message, String phoneNumber) {
if (message == null) {
return null;
}
final Spannable spannable = new SpannableString(message);
int start = phoneNumber == null ? -1 : message.indexOf(phoneNumber);
while (start >= 0) {
final int end = start + phoneNumber.length();
final TtsSpan ttsSpan = PhoneNumberUtilsCompat.createTtsSpan(phoneNumber);
spannable.setSpan(ttsSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // this is consistenly done in a misleading way..
start = message.indexOf(phoneNumber, end);
}
return spannable;
}
/**
* Retrieves a string from a string template that takes 1 phone number as argument,
* span the number with a telephone {@link TtsSpan}, and return the spanned string.
*
* @param resources to retrieve the string from
* @param stringId ID of the string
* @param number to pass in the template
* @return CharSequence with the phone number wrapped in a TtsSpan
*/
public static CharSequence getTtsSpannedPhoneNumber(Resources resources,
int stringId, String number){
String msg = resources.getString(stringId, number);
return ContactDisplayUtils.getTelephoneTtsSpannable(msg, number);
}
/**
* Returns either namePrimary or nameAlternative based on the {@link ContactsPreferences}.
* Defaults to the name that is non-null.
*
* @param namePrimary the primary name.
* @param nameAlternative the alternative name.
* @param contactsPreferences the ContactsPreferences used to determine the preferred
* display name.
* @return namePrimary or nameAlternative depending on the value of displayOrderPreference.
*/
public static String getPreferredDisplayName(String namePrimary, String nameAlternative,
@Nullable ContactsPreferences contactsPreferences) {
if (contactsPreferences == null) {
return namePrimary != null ? namePrimary : nameAlternative;
}
if (contactsPreferences.getDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY) {
return namePrimary;
}
if (contactsPreferences.getDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE
&& !TextUtils.isEmpty(nameAlternative)) {
return nameAlternative;
}
return namePrimary;
}
/**
* Returns either namePrimary or nameAlternative based on the {@link ContactsPreferences}.
* Defaults to the name that is non-null.
*
* @param namePrimary the primary name.
* @param nameAlternative the alternative name.
* @param contactsPreferences the ContactsPreferences used to determine the preferred sort
* order.
* @return namePrimary or nameAlternative depending on the value of displayOrderPreference.
*/
public static String getPreferredSortName(String namePrimary, String nameAlternative,
@Nullable ContactsPreferences contactsPreferences) {
if (contactsPreferences == null) {
return namePrimary != null ? namePrimary : nameAlternative;
}
if (contactsPreferences.getSortOrder() == ContactsPreferences.SORT_ORDER_PRIMARY) {
return namePrimary;
}
if (contactsPreferences.getSortOrder() == ContactsPreferences.SORT_ORDER_ALTERNATIVE &&
!TextUtils.isEmpty(nameAlternative)) {
return nameAlternative;
}
return namePrimary;
}
}