Loading packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java +28 −12 Original line number Diff line number Diff line Loading @@ -42,6 +42,8 @@ import android.util.Log; import android.util.Range; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import java.time.ZonedDateTime; import java.util.Iterator; Loading @@ -57,7 +59,6 @@ public class DataUsageController { PERIOD_BUILDER, Locale.getDefault()); private final Context mContext; private final TelephonyManager mTelephonyManager; private final ConnectivityManager mConnectivityManager; private final INetworkStatsService mStatsService; private final NetworkPolicyManager mPolicyManager; Loading @@ -70,7 +71,6 @@ public class DataUsageController { public DataUsageController(Context context) { mContext = context; mTelephonyManager = TelephonyManager.from(context); mConnectivityManager = ConnectivityManager.from(context); mStatsService = INetworkStatsService.Stub.asInterface( ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); Loading Loading @@ -115,7 +115,8 @@ public class DataUsageController { return warn("no subscriber id"); } NetworkTemplate template = NetworkTemplate.buildTemplateMobileAll(subscriberId); template = NetworkTemplate.normalize(template, mTelephonyManager.getMergedSubscriberIds()); template = NetworkTemplate.normalize(template, getTelephonyManager() .getMergedSubscriberIds()); return getDataUsageInfo(template); } Loading Loading @@ -212,9 +213,29 @@ public class DataUsageController { .append(']').toString(); } @VisibleForTesting public TelephonyManager getTelephonyManager() { int subscriptionId = mSubscriptionId; // If mSubscriptionId is invalid, get default data sub. if (!SubscriptionManager.isValidSubscriptionId(subscriptionId)) { subscriptionId = SubscriptionManager.getDefaultDataSubscriptionId(); } // If data sub is also invalid, get any active sub. if (!SubscriptionManager.isValidSubscriptionId(subscriptionId)) { int[] activeSubIds = SubscriptionManager.from(mContext).getActiveSubscriptionIdList(); if (!ArrayUtils.isEmpty(activeSubIds)) { subscriptionId = activeSubIds[0]; } } return TelephonyManager.from(mContext).createForSubscriptionId(subscriptionId); } public void setMobileDataEnabled(boolean enabled) { Log.d(TAG, "setMobileDataEnabled: enabled=" + enabled); mTelephonyManager.setDataEnabled(enabled); getTelephonyManager().setDataEnabled(enabled); if (mCallback != null) { mCallback.onMobileDataEnabled(enabled); } Loading @@ -223,11 +244,11 @@ public class DataUsageController { public boolean isMobileDataSupported() { // require both supported network and ready SIM return mConnectivityManager.isNetworkSupported(TYPE_MOBILE) && mTelephonyManager.getSimState() == SIM_STATE_READY; && getTelephonyManager().getSimState() == SIM_STATE_READY; } public boolean isMobileDataEnabled() { return mTelephonyManager.getDataEnabled(); return getTelephonyManager().isDataEnabled(); } static int getNetworkType(NetworkTemplate networkTemplate) { Loading @@ -250,12 +271,7 @@ public class DataUsageController { } private String getActiveSubscriberId() { final TelephonyManager tele = TelephonyManager.from(mContext); int subscriptionId = mSubscriptionId; if (subscriptionId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { subscriptionId = SubscriptionManager.getDefaultDataSubscriptionId(); } final String actualSubscriberId = tele.getSubscriberId(subscriptionId); final String actualSubscriberId = getTelephonyManager().getSubscriberId(); return actualSubscriberId; } Loading packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java +56 −6 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import android.net.INetworkStatsSession; import android.net.NetworkStatsHistory; import android.net.NetworkTemplate; import android.os.RemoteException; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.text.format.DateUtils; Loading @@ -57,26 +58,31 @@ public class DataUsageControllerTest { @Mock private TelephonyManager mTelephonyManager; @Mock private SubscriptionManager mSubscriptionManager; @Mock private NetworkStatsManager mNetworkStatsManager; @Mock private Context mContext; private DataUsageController mController; private NetworkStatsHistory mNetworkStatsHistory; private final int mDefaultSubscriptionId = 1234; @Before public void setUp() throws RemoteException { MockitoAnnotations.initMocks(this); when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager); when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager); when(mContext.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE)) .thenReturn(mSubscriptionManager); when(mContext.getSystemService(NetworkStatsManager.class)).thenReturn(mNetworkStatsManager); mController = new DataUsageController(mContext); mNetworkStatsHistory = spy( new NetworkStatsHistory(DateUtils.DAY_IN_MILLIS /* bucketDuration */)); doReturn(mNetworkStatsHistory) .when(mSession).getHistoryForNetwork(any(NetworkTemplate.class), anyInt()); final int defaultSubscriptionId = 1234; ShadowSubscriptionManager.setDefaultDataSubscriptionId(defaultSubscriptionId); doReturn(SUB_ID).when(mTelephonyManager).getSubscriberId(eq(defaultSubscriptionId)); ShadowSubscriptionManager.setDefaultDataSubscriptionId(mDefaultSubscriptionId); doReturn(SUB_ID).when(mTelephonyManager).getSubscriberId(); } @Test Loading Loading @@ -130,19 +136,63 @@ public class DataUsageControllerTest { final NetworkStats.Bucket nonDefaultSubscriberBucket = mock(NetworkStats.Bucket.class); when(nonDefaultSubscriberBucket.getRxBytes()).thenReturn(nonDefaultSubRx); when(nonDefaultSubscriberBucket.getTxBytes()).thenReturn(nonDefaultSubTx); final int explictSubscriptionId = 55; final int explicitSubscriptionId = 55; final String subscriberId2 = "Test Subscriber 2"; when(mNetworkStatsManager.querySummaryForDevice(eq(ConnectivityManager.TYPE_MOBILE), eq(subscriberId2), eq(0L)/* startTime */, anyLong() /* endTime */)).thenReturn( nonDefaultSubscriberBucket); doReturn(subscriberId2).when(mTelephonyManager).getSubscriberId(explictSubscriptionId); doReturn(subscriberId2).when(mTelephonyManager).getSubscriberId(); // Now verify that when we're asking for stats on the non-default subscription, we get // the data back for that subscription and *not* the default one. mController.setSubscriptionId(explictSubscriptionId); mController.setSubscriptionId(explicitSubscriptionId); assertThat(mController.getHistoricalUsageLevel( NetworkTemplate.buildTemplateMobileAll(subscriberId2))).isEqualTo( nonDefaultSubRx + nonDefaultSubTx); verify(mTelephonyManager).createForSubscriptionId(explicitSubscriptionId); } @Test public void getTelephonyManager_shouldCreateWithExplicitSubId() throws Exception { int explicitSubId = 1; TelephonyManager tmForSub1 = new TelephonyManager(mContext, explicitSubId); when(mTelephonyManager.createForSubscriptionId(eq(explicitSubId))).thenReturn(tmForSub1); // Set a specific subId. mController.setSubscriptionId(explicitSubId); assertThat(mController.getTelephonyManager()).isEqualTo(tmForSub1); verify(mTelephonyManager).createForSubscriptionId(eq(explicitSubId)); } @Test public void getTelephonyManager_noExplicitSubId_shouldCreateWithDefaultDataSubId() throws Exception { TelephonyManager tmForDefaultSub = new TelephonyManager(mContext, mDefaultSubscriptionId); when(mTelephonyManager.createForSubscriptionId(mDefaultSubscriptionId)) .thenReturn(tmForDefaultSub); // No subId is set. It should use default data sub. assertThat(mController.getTelephonyManager()).isEqualTo(tmForDefaultSub); verify(mTelephonyManager).createForSubscriptionId(mDefaultSubscriptionId); } @Test public void getTelephonyManager_noExplicitSubIdOrDefaultSub_shouldCreateWithActiveSub() throws Exception { int activeSubId = 2; ShadowSubscriptionManager.setDefaultDataSubscriptionId( SubscriptionManager.INVALID_SUBSCRIPTION_ID); when(mSubscriptionManager.getActiveSubscriptionIdList()) .thenReturn(new int[] {activeSubId}); TelephonyManager tmForActiveSub = new TelephonyManager(mContext, activeSubId); when(mTelephonyManager.createForSubscriptionId(activeSubId)) .thenReturn(tmForActiveSub); // No subId is set, default data subId is also not set. So should use the only active subId. assertThat(mController.getTelephonyManager()).isEqualTo(tmForActiveSub); verify(mTelephonyManager).createForSubscriptionId(activeSubId); } } Loading
packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java +28 −12 Original line number Diff line number Diff line Loading @@ -42,6 +42,8 @@ import android.util.Log; import android.util.Range; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import java.time.ZonedDateTime; import java.util.Iterator; Loading @@ -57,7 +59,6 @@ public class DataUsageController { PERIOD_BUILDER, Locale.getDefault()); private final Context mContext; private final TelephonyManager mTelephonyManager; private final ConnectivityManager mConnectivityManager; private final INetworkStatsService mStatsService; private final NetworkPolicyManager mPolicyManager; Loading @@ -70,7 +71,6 @@ public class DataUsageController { public DataUsageController(Context context) { mContext = context; mTelephonyManager = TelephonyManager.from(context); mConnectivityManager = ConnectivityManager.from(context); mStatsService = INetworkStatsService.Stub.asInterface( ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); Loading Loading @@ -115,7 +115,8 @@ public class DataUsageController { return warn("no subscriber id"); } NetworkTemplate template = NetworkTemplate.buildTemplateMobileAll(subscriberId); template = NetworkTemplate.normalize(template, mTelephonyManager.getMergedSubscriberIds()); template = NetworkTemplate.normalize(template, getTelephonyManager() .getMergedSubscriberIds()); return getDataUsageInfo(template); } Loading Loading @@ -212,9 +213,29 @@ public class DataUsageController { .append(']').toString(); } @VisibleForTesting public TelephonyManager getTelephonyManager() { int subscriptionId = mSubscriptionId; // If mSubscriptionId is invalid, get default data sub. if (!SubscriptionManager.isValidSubscriptionId(subscriptionId)) { subscriptionId = SubscriptionManager.getDefaultDataSubscriptionId(); } // If data sub is also invalid, get any active sub. if (!SubscriptionManager.isValidSubscriptionId(subscriptionId)) { int[] activeSubIds = SubscriptionManager.from(mContext).getActiveSubscriptionIdList(); if (!ArrayUtils.isEmpty(activeSubIds)) { subscriptionId = activeSubIds[0]; } } return TelephonyManager.from(mContext).createForSubscriptionId(subscriptionId); } public void setMobileDataEnabled(boolean enabled) { Log.d(TAG, "setMobileDataEnabled: enabled=" + enabled); mTelephonyManager.setDataEnabled(enabled); getTelephonyManager().setDataEnabled(enabled); if (mCallback != null) { mCallback.onMobileDataEnabled(enabled); } Loading @@ -223,11 +244,11 @@ public class DataUsageController { public boolean isMobileDataSupported() { // require both supported network and ready SIM return mConnectivityManager.isNetworkSupported(TYPE_MOBILE) && mTelephonyManager.getSimState() == SIM_STATE_READY; && getTelephonyManager().getSimState() == SIM_STATE_READY; } public boolean isMobileDataEnabled() { return mTelephonyManager.getDataEnabled(); return getTelephonyManager().isDataEnabled(); } static int getNetworkType(NetworkTemplate networkTemplate) { Loading @@ -250,12 +271,7 @@ public class DataUsageController { } private String getActiveSubscriberId() { final TelephonyManager tele = TelephonyManager.from(mContext); int subscriptionId = mSubscriptionId; if (subscriptionId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { subscriptionId = SubscriptionManager.getDefaultDataSubscriptionId(); } final String actualSubscriberId = tele.getSubscriberId(subscriptionId); final String actualSubscriberId = getTelephonyManager().getSubscriberId(); return actualSubscriberId; } Loading
packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java +56 −6 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ import android.net.INetworkStatsSession; import android.net.NetworkStatsHistory; import android.net.NetworkTemplate; import android.os.RemoteException; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.text.format.DateUtils; Loading @@ -57,26 +58,31 @@ public class DataUsageControllerTest { @Mock private TelephonyManager mTelephonyManager; @Mock private SubscriptionManager mSubscriptionManager; @Mock private NetworkStatsManager mNetworkStatsManager; @Mock private Context mContext; private DataUsageController mController; private NetworkStatsHistory mNetworkStatsHistory; private final int mDefaultSubscriptionId = 1234; @Before public void setUp() throws RemoteException { MockitoAnnotations.initMocks(this); when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager); when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager); when(mContext.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE)) .thenReturn(mSubscriptionManager); when(mContext.getSystemService(NetworkStatsManager.class)).thenReturn(mNetworkStatsManager); mController = new DataUsageController(mContext); mNetworkStatsHistory = spy( new NetworkStatsHistory(DateUtils.DAY_IN_MILLIS /* bucketDuration */)); doReturn(mNetworkStatsHistory) .when(mSession).getHistoryForNetwork(any(NetworkTemplate.class), anyInt()); final int defaultSubscriptionId = 1234; ShadowSubscriptionManager.setDefaultDataSubscriptionId(defaultSubscriptionId); doReturn(SUB_ID).when(mTelephonyManager).getSubscriberId(eq(defaultSubscriptionId)); ShadowSubscriptionManager.setDefaultDataSubscriptionId(mDefaultSubscriptionId); doReturn(SUB_ID).when(mTelephonyManager).getSubscriberId(); } @Test Loading Loading @@ -130,19 +136,63 @@ public class DataUsageControllerTest { final NetworkStats.Bucket nonDefaultSubscriberBucket = mock(NetworkStats.Bucket.class); when(nonDefaultSubscriberBucket.getRxBytes()).thenReturn(nonDefaultSubRx); when(nonDefaultSubscriberBucket.getTxBytes()).thenReturn(nonDefaultSubTx); final int explictSubscriptionId = 55; final int explicitSubscriptionId = 55; final String subscriberId2 = "Test Subscriber 2"; when(mNetworkStatsManager.querySummaryForDevice(eq(ConnectivityManager.TYPE_MOBILE), eq(subscriberId2), eq(0L)/* startTime */, anyLong() /* endTime */)).thenReturn( nonDefaultSubscriberBucket); doReturn(subscriberId2).when(mTelephonyManager).getSubscriberId(explictSubscriptionId); doReturn(subscriberId2).when(mTelephonyManager).getSubscriberId(); // Now verify that when we're asking for stats on the non-default subscription, we get // the data back for that subscription and *not* the default one. mController.setSubscriptionId(explictSubscriptionId); mController.setSubscriptionId(explicitSubscriptionId); assertThat(mController.getHistoricalUsageLevel( NetworkTemplate.buildTemplateMobileAll(subscriberId2))).isEqualTo( nonDefaultSubRx + nonDefaultSubTx); verify(mTelephonyManager).createForSubscriptionId(explicitSubscriptionId); } @Test public void getTelephonyManager_shouldCreateWithExplicitSubId() throws Exception { int explicitSubId = 1; TelephonyManager tmForSub1 = new TelephonyManager(mContext, explicitSubId); when(mTelephonyManager.createForSubscriptionId(eq(explicitSubId))).thenReturn(tmForSub1); // Set a specific subId. mController.setSubscriptionId(explicitSubId); assertThat(mController.getTelephonyManager()).isEqualTo(tmForSub1); verify(mTelephonyManager).createForSubscriptionId(eq(explicitSubId)); } @Test public void getTelephonyManager_noExplicitSubId_shouldCreateWithDefaultDataSubId() throws Exception { TelephonyManager tmForDefaultSub = new TelephonyManager(mContext, mDefaultSubscriptionId); when(mTelephonyManager.createForSubscriptionId(mDefaultSubscriptionId)) .thenReturn(tmForDefaultSub); // No subId is set. It should use default data sub. assertThat(mController.getTelephonyManager()).isEqualTo(tmForDefaultSub); verify(mTelephonyManager).createForSubscriptionId(mDefaultSubscriptionId); } @Test public void getTelephonyManager_noExplicitSubIdOrDefaultSub_shouldCreateWithActiveSub() throws Exception { int activeSubId = 2; ShadowSubscriptionManager.setDefaultDataSubscriptionId( SubscriptionManager.INVALID_SUBSCRIPTION_ID); when(mSubscriptionManager.getActiveSubscriptionIdList()) .thenReturn(new int[] {activeSubId}); TelephonyManager tmForActiveSub = new TelephonyManager(mContext, activeSubId); when(mTelephonyManager.createForSubscriptionId(activeSubId)) .thenReturn(tmForActiveSub); // No subId is set, default data subId is also not set. So should use the only active subId. assertThat(mController.getTelephonyManager()).isEqualTo(tmForActiveSub); verify(mTelephonyManager).createForSubscriptionId(activeSubId); } }