1 /* 2 * Copyright 2013 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.phone; 18 19 import android.content.Context; 20 import android.net.ConnectivityManager; 21 import android.net.NetworkInfo; 22 import android.telephony.CarrierConfigManager; 23 import android.telephony.SubscriptionManager; 24 import android.util.Log; 25 26 import com.android.ims.ImsConfig; 27 import com.android.ims.ImsManager; 28 29 public class ImsUtil { 30 private static final String LOG_TAG = ImsUtil.class.getSimpleName(); 31 private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2); 32 33 private static boolean sImsPhoneSupported = false; 34 ImsUtil()35 private ImsUtil() { 36 } 37 38 static { 39 PhoneGlobals app = PhoneGlobals.getInstance(); 40 sImsPhoneSupported = true; 41 } 42 43 /** 44 * @return {@code true} if this device supports voice calls using the built-in SIP stack. 45 */ isImsPhoneSupported()46 static boolean isImsPhoneSupported() { 47 return sImsPhoneSupported; 48 49 } 50 51 /** 52 * @return {@code true} if WFC is supported by the platform and has been enabled by the user. 53 */ isWfcEnabled(Context context)54 public static boolean isWfcEnabled(Context context) { 55 return isWfcEnabled(context, SubscriptionManager.getDefaultVoicePhoneId()); 56 } 57 58 /** 59 * @return {@code true} if WFC is supported per Slot and has been enabled by the user. 60 */ isWfcEnabled(Context context, int phoneId)61 public static boolean isWfcEnabled(Context context, int phoneId) { 62 ImsManager imsManager = ImsManager.getInstance(context, phoneId); 63 boolean isEnabledByPlatform = imsManager.isWfcEnabledByPlatform(); 64 boolean isEnabledByUser = imsManager.isWfcEnabledByUser(); 65 if (DBG) Log.d(LOG_TAG, "isWfcEnabled :: isEnabledByPlatform=" + isEnabledByPlatform 66 + " phoneId=" + phoneId); 67 if (DBG) Log.d(LOG_TAG, "isWfcEnabled :: isEnabledByUser=" + isEnabledByUser 68 + " phoneId=" + phoneId); 69 return isEnabledByPlatform && isEnabledByUser; 70 } 71 72 /** 73 * @return {@code true} if the device is configured to use "Wi-Fi only" mode. If WFC is not 74 * enabled, this will return {@code false}. 75 */ isWfcModeWifiOnly(Context context)76 public static boolean isWfcModeWifiOnly(Context context) { 77 return isWfcModeWifiOnly(context, SubscriptionManager.getDefaultVoicePhoneId()); 78 } 79 80 /** 81 * @return {@code true} if the Slot is configured to use "Wi-Fi only" mode. If WFC is not 82 * enabled, this will return {@code false}. 83 */ isWfcModeWifiOnly(Context context, int phoneId)84 public static boolean isWfcModeWifiOnly(Context context, int phoneId) { 85 ImsManager imsManager = ImsManager.getInstance(context, phoneId); 86 boolean isWifiOnlyMode = 87 imsManager.getWfcMode() == ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY; 88 if (DBG) Log.d(LOG_TAG, "isWfcModeWifiOnly :: isWifiOnlyMode" + isWifiOnlyMode 89 + " phoneId=" + phoneId); 90 return isWfcEnabled(context, phoneId) && isWifiOnlyMode; 91 } 92 93 /** 94 * When a call cannot be placed, determines if the use of WFC should be promoted, per the 95 * carrier config. Use of WFC is promoted to the user if the device is connected to a WIFI 96 * network, WFC is disabled but provisioned, and the carrier config indicates that the 97 * features should be promoted. 98 * 99 * @return {@code true} if use of WFC should be promoted, {@code false} otherwise. 100 */ shouldPromoteWfc(Context context)101 public static boolean shouldPromoteWfc(Context context) { 102 return shouldPromoteWfc(context, SubscriptionManager.getDefaultVoicePhoneId()); 103 } 104 105 /** 106 * When a call cannot be placed, determines if the use of WFC should be promoted, per the 107 * carrier config of the slot. Use of WFC is promoted to the user if the device is 108 * connected to a WIFI network, WFC is disabled but provisioned, and the carrier config 109 * indicates that the features should be promoted. 110 * 111 * @return {@code true} if use of WFC should be promoted, {@code false} otherwise. 112 */ shouldPromoteWfc(Context context, int phoneId)113 public static boolean shouldPromoteWfc(Context context, int phoneId) { 114 CarrierConfigManager cfgManager = (CarrierConfigManager) context 115 .getSystemService(Context.CARRIER_CONFIG_SERVICE); 116 if (cfgManager == null || !cfgManager.getConfigForSubId(getSubId(phoneId)) 117 .getBoolean(CarrierConfigManager.KEY_CARRIER_PROMOTE_WFC_ON_CALL_FAIL_BOOL)) { 118 return false; 119 } 120 121 if (!getDefaultImsManagerInstance(context).isWfcProvisionedOnDevice()) { 122 return false; 123 } 124 125 ConnectivityManager cm = 126 (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 127 if (cm != null) { 128 NetworkInfo ni = cm.getActiveNetworkInfo(); 129 if (ni != null && ni.isConnected()) { 130 return ni.getType() == ConnectivityManager.TYPE_WIFI && !isWfcEnabled(context, 131 phoneId); 132 } 133 } 134 return false; 135 } 136 getDefaultImsManagerInstance(Context context)137 private static ImsManager getDefaultImsManagerInstance(Context context) { 138 return ImsManager.getInstance(context, SubscriptionManager.getDefaultVoicePhoneId()); 139 } 140 getSubId(int phoneId)141 private static int getSubId(int phoneId) { 142 final int[] subIds = SubscriptionManager.getSubId(phoneId); 143 int subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; 144 if (subIds != null && subIds.length >= 1) { 145 subId = subIds[0]; 146 } 147 return subId; 148 } 149 } 150