From f550fc218151415632bcc43a7f5e924c2acebe99 Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Fri, 24 Jan 2020 11:18:44 +0800 Subject: [PATCH] [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 --- .../settings/datausage/DataUsageUtils.java | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/src/com/android/settings/datausage/DataUsageUtils.java b/src/com/android/settings/datausage/DataUsageUtils.java index ef3e7b68d2a..433d1eda855 100644 --- a/src/com/android/settings/datausage/DataUsageUtils.java +++ b/src/com/android/settings/datausage/DataUsageUtils.java @@ -66,7 +66,7 @@ public final class DataUsageUtils extends com.android.settingslib.net.DataUsageU 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)) { 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. */ public static boolean hasMobileData(Context context) { - ConnectivityManager connectivityManager = ConnectivityManager.from(context); + final ConnectivityManager connectivityManager = + context.getSystemService(ConnectivityManager.class); return connectivityManager != null && connectivityManager .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"); } final List subInfoList = - SubscriptionManager.from(context).getActiveSubscriptionInfoList(); + context.getSystemService(SubscriptionManager.class) + .getActiveSubscriptionInfoList(); // No activated Subscriptions if (subInfoList == null) { if (LOGD) { @@ -123,7 +125,7 @@ public final class DataUsageUtils extends com.android.settingslib.net.DataUsageU 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; if (LOGD) { 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"); } - final ConnectivityManager connectivityManager = ConnectivityManager.from(context); + final ConnectivityManager connectivityManager = + context.getSystemService(ConnectivityManager.class); 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 */ public static int getDefaultSubscriptionId(Context context) { - SubscriptionManager subManager = SubscriptionManager.from(context); - if (subManager == null) { + final SubscriptionManager subscriptionMgr = + 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 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; } - SubscriptionInfo subscriptionInfo = subManager.getDefaultDataSubscriptionInfo(); - if (subscriptionInfo == null) { - List list = subManager.getAllSubscriptionInfoList(); - if (list.size() == 0) { - return SubscriptionManager.INVALID_SUBSCRIPTION_ID; - } - subscriptionInfo = list.get(0); - } - return subscriptionInfo.getSubscriptionId(); + return subList.get(0).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. */ 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); } else if (hasWifiRadio(context)) { return NetworkTemplate.buildTemplateWifiWildcard();