/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settingslib.net; import android.content.Context; import android.net.NetworkTemplate; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.Log; import com.android.internal.util.ArrayUtils; import java.util.List; /** * Utils class for data usage */ public class DataUsageUtils { private static final String TAG = "DataUsageUtils"; /** * Return mobile NetworkTemplate based on {@code subId} */ public static NetworkTemplate getMobileTemplate(Context context, int subId) { final TelephonyManager telephonyManager = context.getSystemService(TelephonyManager.class); final int mobileDefaultSubId = telephonyManager.getSubscriptionId(); final SubscriptionManager subscriptionManager = context.getSystemService(SubscriptionManager.class); final List subInfoList = subscriptionManager.getAvailableSubscriptionInfoList(); if (subInfoList == null) { Log.i(TAG, "Subscription is not inited: " + subId); return getMobileTemplateForSubId(telephonyManager, mobileDefaultSubId); } for (SubscriptionInfo subInfo : subInfoList) { if ((subInfo != null) && (subInfo.getSubscriptionId() == subId)) { return getNormalizedMobileTemplate(telephonyManager, subId); } } Log.i(TAG, "Subscription is not active: " + subId); return getMobileTemplateForSubId(telephonyManager, mobileDefaultSubId); } private static NetworkTemplate getNormalizedMobileTemplate( TelephonyManager telephonyManager, int subId) { final NetworkTemplate mobileTemplate = getMobileTemplateForSubId(telephonyManager, subId); final String[] mergedSubscriberIds = telephonyManager .createForSubscriptionId(subId).getMergedImsisFromGroup(); if (ArrayUtils.isEmpty(mergedSubscriberIds)) { Log.i(TAG, "mergedSubscriberIds is null."); return mobileTemplate; } return NetworkTemplate.normalize(mobileTemplate, mergedSubscriberIds); } private static NetworkTemplate getMobileTemplateForSubId( TelephonyManager telephonyManager, int subId) { // The null subscriberId means that no any mobile/carrier network will be matched. // Using old API: buildTemplateMobileAll for the null subscriberId to avoid NPE. String subscriberId = telephonyManager.getSubscriberId(subId); return subscriberId != null ? NetworkTemplate.buildTemplateCarrierMetered(subscriberId) : NetworkTemplate.buildTemplateMobileAll(subscriberId); } }