1 /* 2 * Copyright (C) 2021 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.imsserviceentitlement.utils; 18 19 import android.content.Context; 20 import android.net.ConnectivityManager; 21 import android.net.NetworkInfo; 22 import android.os.PersistableBundle; 23 import android.telephony.CarrierConfigManager; 24 import android.telephony.SubscriptionInfo; 25 import android.telephony.SubscriptionManager; 26 import android.telephony.TelephonyManager; 27 import android.util.Log; 28 29 import com.google.common.collect.ImmutableSet; 30 31 import java.util.List; 32 33 /** This class implements Telephony helper methods. */ 34 public class TelephonyUtils { 35 public static final String TAG = "IMSSE-TelephonyUtils"; 36 37 private final ConnectivityManager mConnectivityManager; 38 private final TelephonyManager mTelephonyManager; 39 TelephonyUtils(Context context)40 public TelephonyUtils(Context context) { 41 this(context, SubscriptionManager.INVALID_SUBSCRIPTION_ID); 42 } 43 TelephonyUtils(Context context, int subId)44 public TelephonyUtils(Context context, int subId) { 45 if (SubscriptionManager.isValidSubscriptionId(subId)) { 46 mTelephonyManager = 47 context.getSystemService(TelephonyManager.class).createForSubscriptionId(subId); 48 } else { 49 mTelephonyManager = context.getSystemService(TelephonyManager.class); 50 } 51 mConnectivityManager = context.getSystemService(ConnectivityManager.class); 52 } 53 54 /** Returns device timestamp in milliseconds. */ getTimeStamp()55 public long getTimeStamp() { 56 return System.currentTimeMillis(); 57 } 58 59 /** Returns device uptime in milliseconds. */ getUptimeMillis()60 public long getUptimeMillis() { 61 return android.os.SystemClock.uptimeMillis(); 62 } 63 64 /** Returns {@code true} if network is connected (cellular or WiFi). */ isNetworkConnected()65 public boolean isNetworkConnected() { 66 NetworkInfo activeNetwork = mConnectivityManager.getActiveNetworkInfo(); 67 return activeNetwork != null && activeNetwork.isConnected(); 68 } 69 70 /** Returns carrier ID. */ getCarrierId()71 public int getCarrierId() { 72 return mTelephonyManager.getSimCarrierId(); 73 } 74 75 /** Returns fine-grained carrier ID. */ getSpecificCarrierId()76 public int getSpecificCarrierId() { 77 return mTelephonyManager.getSimSpecificCarrierId(); 78 } 79 80 /** Returns SIM card application state. */ getSimApplicationState()81 public int getSimApplicationState() { 82 return mTelephonyManager.getSimApplicationState(); 83 } 84 85 /** 86 * Returns {@code true} if the {@code subId} still point to a actived SIM; {@code false} 87 * otherwise. 88 */ isActivedSubId(Context context, int subId)89 public static boolean isActivedSubId(Context context, int subId) { 90 SubscriptionManager subscriptionManager = 91 (SubscriptionManager) context.getSystemService( 92 Context.TELEPHONY_SUBSCRIPTION_SERVICE); 93 SubscriptionInfo subInfo = subscriptionManager.getActiveSubscriptionInfo(subId); 94 return subInfo != null; 95 } 96 97 /** 98 * Returns the slot index for the actived {@code subId}; {@link 99 * SubscriptionManager#INVALID_SIM_SLOT_INDEX} otherwise. 100 */ getSlotId(Context context, int subId)101 public static int getSlotId(Context context, int subId) { 102 SubscriptionManager subscriptionManager = 103 (SubscriptionManager) context.getSystemService( 104 Context.TELEPHONY_SUBSCRIPTION_SERVICE); 105 SubscriptionInfo subInfo = subscriptionManager.getActiveSubscriptionInfo(subId); 106 if (subInfo != null) { 107 return subInfo.getSimSlotIndex(); 108 } 109 Log.d(TAG, "Can't find actived subscription for " + subId); 110 return SubscriptionManager.INVALID_SIM_SLOT_INDEX; 111 } 112 113 /** Returns carrier config for the {@code subId}. */ getConfigForSubId(Context context, int subId)114 private static PersistableBundle getConfigForSubId(Context context, int subId) { 115 CarrierConfigManager carrierConfigManager = 116 context.getSystemService(CarrierConfigManager.class); 117 PersistableBundle carrierConfig = carrierConfigManager.getConfigForSubId(subId); 118 if (carrierConfig == null) { 119 Log.d(TAG, "getDefaultConfig"); 120 carrierConfig = CarrierConfigManager.getDefaultConfig(); 121 } 122 return carrierConfig; 123 } 124 125 /** 126 * Returns FCM sender id for the {@code subId} or a default empty string if it is not available. 127 */ getFcmSenderId(Context context, int subId)128 public static String getFcmSenderId(Context context, int subId) { 129 return getConfigForSubId(context, subId).getString( 130 CarrierConfigManager.ImsServiceEntitlement.KEY_FCM_SENDER_ID_STRING, 131 "" 132 ); 133 } 134 135 /** 136 * Returns entitlement server url for the {@code subId} or 137 * a default empty string if it is not available. 138 */ getEntitlementServerUrl(Context context, int subId)139 public static String getEntitlementServerUrl(Context context, int subId) { 140 return getConfigForSubId(context, subId).getString( 141 CarrierConfigManager.ImsServiceEntitlement.KEY_ENTITLEMENT_SERVER_URL_STRING, 142 "" 143 ); 144 } 145 146 /** 147 * Returns true if app needs to do IMS (VoLTE/VoWiFi/SMSoIP) provisioning in the background 148 * or false if it doesn't need to do. 149 */ isImsProvisioningRequired(Context context, int subId)150 public static boolean isImsProvisioningRequired(Context context, int subId) { 151 return getConfigForSubId(context, subId).getBoolean( 152 CarrierConfigManager.ImsServiceEntitlement.KEY_IMS_PROVISIONING_BOOL, 153 false 154 ); 155 } 156 157 /** Returns SubIds which support FCM. */ getSubIdsWithFcmSupported(Context context)158 public static ImmutableSet<Integer> getSubIdsWithFcmSupported(Context context) { 159 SubscriptionManager subscriptionManager = 160 context.getSystemService(SubscriptionManager.class); 161 List<SubscriptionInfo> infos = subscriptionManager.getActiveSubscriptionInfoList(); 162 if (infos == null) { 163 return ImmutableSet.of(); 164 } 165 166 ImmutableSet.Builder<Integer> builder = ImmutableSet.builder(); 167 for (SubscriptionInfo info : infos) { 168 int subId = info.getSubscriptionId(); 169 if (isFcmPushNotificationSupported(context, subId)) { 170 builder.add(subId); 171 } 172 } 173 return builder.build(); 174 } 175 isFcmPushNotificationSupported(Context context, int subId)176 private static boolean isFcmPushNotificationSupported(Context context, int subId) { 177 return !TelephonyUtils.getFcmSenderId(context, subId).isEmpty(); 178 } 179 } 180