10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2010 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony; 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1999c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog; 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Phone; 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Utilities that check if the phone supports specified capabilities. 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class TelephonyCapabilities { 270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final String LOG_TAG = "TelephonyCapabilities"; 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** This class is never instantiated. */ 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private TelephonyCapabilities() { 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Return true if the current phone supports ECM ("Emergency Callback 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Mode"), which is a feature where the device goes into a special 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * state for a short period of time after making an outgoing emergency 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * call. 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * (On current devices, that state lasts 5 minutes. It prevents data 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * usage by other apps, to avoid conflicts with any possible incoming 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * calls. It also puts up a notification in the status bar, showing a 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * countdown while ECM is active, and allowing the user to exit ECM.) 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Currently this is assumed to be true for CDMA phones, and false 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * otherwise. 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static boolean supportsEcm(Phone phone) { 4830b5eec903ba5c6db94f3116c4c9dc6b63ebcefdUma Maheswari Ramalingam Rlog.d(LOG_TAG, "supportsEcm: Phone type = " + phone.getPhoneType() + 4930b5eec903ba5c6db94f3116c4c9dc6b63ebcefdUma Maheswari Ramalingam " Ims Phone = " + phone.getImsPhone()); 5030b5eec903ba5c6db94f3116c4c9dc6b63ebcefdUma Maheswari Ramalingam return (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA || 5130b5eec903ba5c6db94f3116c4c9dc6b63ebcefdUma Maheswari Ramalingam phone.getImsPhone() != null); 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Return true if the current phone supports Over The Air Service 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Provisioning (OTASP) 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Currently this is assumed to be true for CDMA phones, and false 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * otherwise. 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * TODO: Watch out: this is also highly carrier-specific, since the 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * OTASP procedure is different from one carrier to the next, *and* the 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * different carriers may want very different onscreen UI as well. 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The procedure may even be different for different devices with the 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * same carrier. 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * So we eventually will need a much more flexible, pluggable design. 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * This method here is just a placeholder to reduce hardcoded 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * "if (CDMA)" checks sprinkled throughout the phone app. 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static boolean supportsOtasp(Phone phone) { 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA); 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 7626a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa * Return true if the current phone supports voice message count. 7726a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa * and the count is available 7826a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa * Both CDMA and GSM phones support voice message count 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static boolean supportsVoiceMessageCount(Phone phone) { 8126a4150cfb8cd317eb64994b9d9fd6109bd87ba7Sukanya Rajkhowa return (phone.getVoiceMessageCount() != -1); 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Return true if this phone allows the user to select which 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * network to use. 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Currently this is assumed to be true only on GSM phones. 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * TODO: Should CDMA phones allow this as well? 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static boolean supportsNetworkSelection(Phone phone) { 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_GSM); 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Returns a resource ID for a label to use when displaying the 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * "device id" of the current device. (This is currently used as the 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * title of the "device id" dialog.) 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * This is specific to the device's telephony technology: the device 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * id is called "IMEI" on GSM phones and "MEID" on CDMA phones. 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static int getDeviceIdLabel(Phone phone) { 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_GSM) { 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return com.android.internal.R.string.imei; 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else if (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) { 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return com.android.internal.R.string.meid; 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 11099c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.w(LOG_TAG, "getDeviceIdLabel: no known label for phone " 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + phone.getPhoneName()); 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return 0; 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Return true if the current phone supports the ability to explicitly 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * manage the state of a conference call (i.e. view the participants, 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * and hangup or separate individual callers.) 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The in-call screen's "Manage conference" UI is available only on 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * devices that support this feature. 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Currently this is assumed to be true on GSM phones and false otherwise. 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static boolean supportsConferenceCallManagement(Phone phone) { 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return ((phone.getPhoneType() == PhoneConstants.PHONE_TYPE_GSM) 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville || (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_SIP)); 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Return true if the current phone supports explicit "Hold" and 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * "Unhold" actions for an active call. (If so, the in-call UI will 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * provide onscreen "Hold" / "Unhold" buttons.) 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Currently this is assumed to be true on GSM phones and false 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * otherwise. (In particular, CDMA has no concept of "putting a call 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * on hold.") 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static boolean supportsHoldAndUnhold(Phone phone) { 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return ((phone.getPhoneType() == PhoneConstants.PHONE_TYPE_GSM) 142a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_SIP) 143a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville || (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_IMS)); 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Return true if the current phone supports distinct "Answer & Hold" 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * and "Answer & End" behaviors in the call-waiting scenario. If so, 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * the in-call UI may provide separate buttons or menu items for these 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * two actions. 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Currently this is assumed to be true on GSM phones and false 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * otherwise. (In particular, CDMA has no concept of explicitly 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * managing the background call, or "putting a call on hold.") 1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * TODO: It might be better to expose this capability in a more 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * generic form, like maybe "supportsExplicitMultipleLineManagement()" 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * rather than focusing specifically on call-waiting behavior. 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static boolean supportsAnswerAndHold(Phone phone) { 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return ((phone.getPhoneType() == PhoneConstants.PHONE_TYPE_GSM) 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville || (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_SIP)); 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Return true if phones with the given phone type support ADN 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * (Abbreviated Dialing Numbers). 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Currently this returns true when the phone type is GSM 170cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville * ({@link PhoneConstants#PHONE_TYPE_GSM}). 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * This is using int for an argument for letting apps outside 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Phone process access to it, while other methods in this class is 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * using Phone object. 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * TODO: Theoretically phones other than GSM may have the ADN capability. 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Consider having better check here, or have better capability as part 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * of public API, with which the argument should be replaced with 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * something more appropriate. 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static boolean supportsAdn(int phoneType) { 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return phoneType == PhoneConstants.PHONE_TYPE_GSM; 1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Returns true if the device can distinguish the phone's dialing state 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * (Call.State.DIALING/ALERTING) and connected state (Call.State.ACTIVE). 1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Currently this returns true for GSM phones as we cannot know when a CDMA 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * phone has transitioned from dialing/active to connected. 1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public static boolean canDistinguishDialingAndConnected(int phoneType) { 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return phoneType == PhoneConstants.PHONE_TYPE_GSM; 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 196