1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.contacts.common.compat; 18 19 import android.net.Uri; 20 import android.support.annotation.Nullable; 21 import android.telecom.PhoneAccountHandle; 22 import android.telephony.TelephonyManager; 23 24 import com.android.contacts.common.ContactsUtils; 25 26 public class TelephonyManagerCompat { 27 public static final String TELEPHONY_MANAGER_CLASS = "android.telephony.TelephonyManager"; 28 29 /** 30 * @param telephonyManager The telephony manager instance to use for method calls. 31 * @return true if the current device is "voice capable". 32 * <p> 33 * "Voice capable" means that this device supports circuit-switched 34 * (i.e. voice) phone calls over the telephony network, and is allowed 35 * to display the in-call UI while a cellular voice call is active. 36 * This will be false on "data only" devices which can't make voice 37 * calls and don't support any in-call UI. 38 * <p> 39 * Note: the meaning of this flag is subtly different from the 40 * PackageManager.FEATURE_TELEPHONY system feature, which is available 41 * on any device with a telephony radio, even if the device is 42 * data-only. 43 */ 44 public static boolean isVoiceCapable(@Nullable TelephonyManager telephonyManager) { 45 if (telephonyManager == null) { 46 return false; 47 } 48 if (CompatUtils.isLollipopMr1Compatible() 49 || CompatUtils.isMethodAvailable(TELEPHONY_MANAGER_CLASS, "isVoiceCapable")) { 50 // isVoiceCapable was unhidden in L-MR1 51 return telephonyManager.isVoiceCapable(); 52 } 53 final int phoneType = telephonyManager.getPhoneType(); 54 return phoneType == TelephonyManager.PHONE_TYPE_CDMA || 55 phoneType == TelephonyManager.PHONE_TYPE_GSM; 56 } 57 58 /** 59 * Returns the number of phones available. 60 * Returns 1 for Single standby mode (Single SIM functionality) 61 * Returns 2 for Dual standby mode.(Dual SIM functionality) 62 * 63 * Returns 1 if the method or telephonyManager is not available. 64 * 65 * @param telephonyManager The telephony manager instance to use for method calls. 66 */ 67 public static int getPhoneCount(@Nullable TelephonyManager telephonyManager) { 68 if (telephonyManager == null) { 69 return 1; 70 } 71 if (CompatUtils.isMarshmallowCompatible() || CompatUtils 72 .isMethodAvailable(TELEPHONY_MANAGER_CLASS, "getPhoneCount")) { 73 return telephonyManager.getPhoneCount(); 74 } 75 return 1; 76 } 77 78 /** 79 * Returns the unique device ID of a subscription, for example, the IMEI for 80 * GSM and the MEID for CDMA phones. Return null if device ID is not available. 81 * 82 * <p>Requires Permission: 83 * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} 84 * 85 * @param telephonyManager The telephony manager instance to use for method calls. 86 * @param slotId of which deviceID is returned 87 */ 88 public static String getDeviceId(@Nullable TelephonyManager telephonyManager, int slotId) { 89 if (telephonyManager == null) { 90 return null; 91 } 92 if (CompatUtils.isMarshmallowCompatible() 93 || CompatUtils.isMethodAvailable(TELEPHONY_MANAGER_CLASS, 94 "getDeviceId", Integer.class)) { 95 return telephonyManager.getDeviceId(slotId); 96 } 97 return null; 98 } 99 100 /** 101 * Whether the phone supports TTY mode. 102 * 103 * @param telephonyManager The telephony manager instance to use for method calls. 104 * @return {@code true} if the device supports TTY mode, and {@code false} otherwise. 105 */ 106 107 public static boolean isTtyModeSupported(@Nullable TelephonyManager telephonyManager) { 108 if (telephonyManager == null) { 109 return false; 110 } 111 if (CompatUtils.isMarshmallowCompatible() 112 || CompatUtils.isMethodAvailable(TELEPHONY_MANAGER_CLASS, "isTtyModeSupported")) { 113 return telephonyManager.isTtyModeSupported(); 114 } 115 return false; 116 } 117 118 /** 119 * Whether the phone supports hearing aid compatibility. 120 * 121 * @param telephonyManager The telephony manager instance to use for method calls. 122 * @return {@code true} if the device supports hearing aid compatibility, and {@code false} 123 * otherwise. 124 */ 125 public static boolean isHearingAidCompatibilitySupported( 126 @Nullable TelephonyManager telephonyManager) { 127 if (telephonyManager == null) { 128 return false; 129 } 130 if (CompatUtils.isMarshmallowCompatible() 131 || CompatUtils.isMethodAvailable(TELEPHONY_MANAGER_CLASS, 132 "isHearingAidCompatibilitySupported")) { 133 return telephonyManager.isHearingAidCompatibilitySupported(); 134 } 135 return false; 136 } 137 138 /** 139 * Returns the URI for the per-account voicemail ringtone set in Phone settings. 140 * 141 * @param telephonyManager The telephony manager instance to use for method calls. 142 * @param accountHandle The handle for the {@link android.telecom.PhoneAccount} for which to 143 * retrieve the voicemail ringtone. 144 * @return The URI for the ringtone to play when receiving a voicemail from a specific 145 * PhoneAccount. 146 */ 147 @Nullable 148 public static Uri getVoicemailRingtoneUri(TelephonyManager telephonyManager, 149 PhoneAccountHandle accountHandle) { 150 if (!CompatUtils.isNCompatible()) { 151 return null; 152 } 153 return TelephonyManagerSdkCompat 154 .getVoicemailRingtoneUri(telephonyManager, accountHandle); 155 } 156 157 /** 158 * Returns whether vibration is set for voicemail notification in Phone settings. 159 * 160 * @param telephonyManager The telephony manager instance to use for method calls. 161 * @param accountHandle The handle for the {@link android.telecom.PhoneAccount} for which to 162 * retrieve the voicemail vibration setting. 163 * @return {@code true} if the vibration is set for this PhoneAccount, {@code false} otherwise. 164 */ 165 public static boolean isVoicemailVibrationEnabled(TelephonyManager telephonyManager, 166 PhoneAccountHandle accountHandle) { 167 if (!CompatUtils.isNCompatible()) { 168 return true; 169 } 170 return TelephonyManagerSdkCompat 171 .isVoicemailVibrationEnabled(telephonyManager, accountHandle); 172 } 173 } 174