[Settings] DataUsage crash when no SIM inserted

Check for null pointer when looking up subcription id.

Bug: 148175728
Test: m RunSettingsRoboTests -j ROBOTEST_FILTER=DataUsageUtilsTest
Change-Id: Icc1314d262f1af686134dcf6a0b187adfc3eb4df
Merged-In: I4e893fc7de4a3292b3949860ebb59fbe52ac1a8f
This commit is contained in:
Bonian Chen
2020-01-24 11:18:44 +08:00
parent b189ffb318
commit f550fc2181

View File

@@ -66,7 +66,7 @@ public final class DataUsageUtils extends com.android.settingslib.net.DataUsageU
return SystemProperties.get(DataUsageUtils.TEST_RADIOS_PROP).contains(ETHERNET); return SystemProperties.get(DataUsageUtils.TEST_RADIOS_PROP).contains(ETHERNET);
} }
final ConnectivityManager conn = ConnectivityManager.from(context); final ConnectivityManager conn = context.getSystemService(ConnectivityManager.class);
if (!conn.isNetworkSupported(ConnectivityManager.TYPE_ETHERNET)) { if (!conn.isNetworkSupported(ConnectivityManager.TYPE_ETHERNET)) {
return false; return false;
} }
@@ -93,7 +93,8 @@ public final class DataUsageUtils extends com.android.settingslib.net.DataUsageU
* TODO: This is the opposite to Utils.isWifiOnly(), it should be refactored into 1 method. * TODO: This is the opposite to Utils.isWifiOnly(), it should be refactored into 1 method.
*/ */
public static boolean hasMobileData(Context context) { public static boolean hasMobileData(Context context) {
ConnectivityManager connectivityManager = ConnectivityManager.from(context); final ConnectivityManager connectivityManager =
context.getSystemService(ConnectivityManager.class);
return connectivityManager != null && connectivityManager return connectivityManager != null && connectivityManager
.isNetworkSupported(ConnectivityManager.TYPE_MOBILE); .isNetworkSupported(ConnectivityManager.TYPE_MOBILE);
} }
@@ -106,7 +107,8 @@ public final class DataUsageUtils extends com.android.settingslib.net.DataUsageU
return SystemProperties.get(DataUsageUtils.TEST_RADIOS_PROP).contains("mobile"); return SystemProperties.get(DataUsageUtils.TEST_RADIOS_PROP).contains("mobile");
} }
final List<SubscriptionInfo> subInfoList = final List<SubscriptionInfo> subInfoList =
SubscriptionManager.from(context).getActiveSubscriptionInfoList(); context.getSystemService(SubscriptionManager.class)
.getActiveSubscriptionInfoList();
// No activated Subscriptions // No activated Subscriptions
if (subInfoList == null) { if (subInfoList == null) {
if (LOGD) { if (LOGD) {
@@ -123,7 +125,7 @@ public final class DataUsageUtils extends com.android.settingslib.net.DataUsageU
Log.d(TAG, "hasReadyMobileRadio: subInfo=" + subInfo); Log.d(TAG, "hasReadyMobileRadio: subInfo=" + subInfo);
} }
} }
final ConnectivityManager conn = ConnectivityManager.from(context); final ConnectivityManager conn = context.getSystemService(ConnectivityManager.class);
final boolean retVal = conn.isNetworkSupported(TYPE_MOBILE) && isReady; final boolean retVal = conn.isNetworkSupported(TYPE_MOBILE) && isReady;
if (LOGD) { if (LOGD) {
Log.d(TAG, "hasReadyMobileRadio:" Log.d(TAG, "hasReadyMobileRadio:"
@@ -142,7 +144,8 @@ public final class DataUsageUtils extends com.android.settingslib.net.DataUsageU
return SystemProperties.get(TEST_RADIOS_PROP).contains("wifi"); return SystemProperties.get(TEST_RADIOS_PROP).contains("wifi");
} }
final ConnectivityManager connectivityManager = ConnectivityManager.from(context); final ConnectivityManager connectivityManager =
context.getSystemService(ConnectivityManager.class);
return connectivityManager != null && connectivityManager.isNetworkSupported(TYPE_WIFI); return connectivityManager != null && connectivityManager.isNetworkSupported(TYPE_WIFI);
} }
@@ -159,19 +162,25 @@ public final class DataUsageUtils extends com.android.settingslib.net.DataUsageU
* SubscriptionManager#INVALID_SUBSCRIPTION_ID * SubscriptionManager#INVALID_SUBSCRIPTION_ID
*/ */
public static int getDefaultSubscriptionId(Context context) { public static int getDefaultSubscriptionId(Context context) {
SubscriptionManager subManager = SubscriptionManager.from(context); final SubscriptionManager subscriptionMgr =
if (subManager == null) { context.getSystemService(SubscriptionManager.class);
// default data subscription is first choice
final int dataSubId = subscriptionMgr.getDefaultDataSubscriptionId();
if (SubscriptionManager.isValidSubscriptionId(dataSubId)) {
return dataSubId;
}
// any active subscription is second choice
List<SubscriptionInfo> subList = subscriptionMgr.getActiveSubscriptionInfoList();
if ((subList == null) || (subList.size() <= 0)) {
// any subscription is third choice
subList = subscriptionMgr.getAvailableSubscriptionInfoList();
}
if ((subList == null) || (subList.size() <= 0)) {
return SubscriptionManager.INVALID_SUBSCRIPTION_ID; return SubscriptionManager.INVALID_SUBSCRIPTION_ID;
} }
SubscriptionInfo subscriptionInfo = subManager.getDefaultDataSubscriptionInfo(); return subList.get(0).getSubscriptionId();
if (subscriptionInfo == null) {
List<SubscriptionInfo> list = subManager.getAllSubscriptionInfoList();
if (list.size() == 0) {
return SubscriptionManager.INVALID_SUBSCRIPTION_ID;
}
subscriptionInfo = list.get(0);
}
return subscriptionInfo.getSubscriptionId();
} }
/** /**
@@ -179,7 +188,7 @@ public final class DataUsageUtils extends com.android.settingslib.net.DataUsageU
* ethernet template if both mobile data and Wifi are not available. * ethernet template if both mobile data and Wifi are not available.
*/ */
public static NetworkTemplate getDefaultTemplate(Context context, int defaultSubId) { public static NetworkTemplate getDefaultTemplate(Context context, int defaultSubId) {
if (hasMobileData(context) && defaultSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { if (SubscriptionManager.isValidSubscriptionId(defaultSubId) && hasMobileData(context)) {
return getMobileTemplate(context, defaultSubId); return getMobileTemplate(context, defaultSubId);
} else if (hasWifiRadio(context)) { } else if (hasWifiRadio(context)) {
return NetworkTemplate.buildTemplateWifiWildcard(); return NetworkTemplate.buildTemplateWifiWildcard();