• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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