Merge "Mobile data in quick setting still work if default data not set" into qt-dev

This commit is contained in:
Xiangyu/Malcolm Chen
2019-05-10 01:57:10 +00:00
committed by Android (Google) Code Review
2 changed files with 84 additions and 18 deletions

View File

@@ -42,6 +42,8 @@ import android.util.Log;
import android.util.Range; import android.util.Range;
import com.android.internal.R; import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.util.Iterator; import java.util.Iterator;
@@ -57,7 +59,6 @@ public class DataUsageController {
PERIOD_BUILDER, Locale.getDefault()); PERIOD_BUILDER, Locale.getDefault());
private final Context mContext; private final Context mContext;
private final TelephonyManager mTelephonyManager;
private final ConnectivityManager mConnectivityManager; private final ConnectivityManager mConnectivityManager;
private final INetworkStatsService mStatsService; private final INetworkStatsService mStatsService;
private final NetworkPolicyManager mPolicyManager; private final NetworkPolicyManager mPolicyManager;
@@ -70,7 +71,6 @@ public class DataUsageController {
public DataUsageController(Context context) { public DataUsageController(Context context) {
mContext = context; mContext = context;
mTelephonyManager = TelephonyManager.from(context);
mConnectivityManager = ConnectivityManager.from(context); mConnectivityManager = ConnectivityManager.from(context);
mStatsService = INetworkStatsService.Stub.asInterface( mStatsService = INetworkStatsService.Stub.asInterface(
ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
@@ -115,7 +115,8 @@ public class DataUsageController {
return warn("no subscriber id"); return warn("no subscriber id");
} }
NetworkTemplate template = NetworkTemplate.buildTemplateMobileAll(subscriberId); NetworkTemplate template = NetworkTemplate.buildTemplateMobileAll(subscriberId);
template = NetworkTemplate.normalize(template, mTelephonyManager.getMergedSubscriberIds()); template = NetworkTemplate.normalize(template, getTelephonyManager()
.getMergedSubscriberIds());
return getDataUsageInfo(template); return getDataUsageInfo(template);
} }
@@ -212,9 +213,29 @@ public class DataUsageController {
.append(']').toString(); .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) { public void setMobileDataEnabled(boolean enabled) {
Log.d(TAG, "setMobileDataEnabled: enabled=" + enabled); Log.d(TAG, "setMobileDataEnabled: enabled=" + enabled);
mTelephonyManager.setDataEnabled(enabled); getTelephonyManager().setDataEnabled(enabled);
if (mCallback != null) { if (mCallback != null) {
mCallback.onMobileDataEnabled(enabled); mCallback.onMobileDataEnabled(enabled);
} }
@@ -223,11 +244,11 @@ public class DataUsageController {
public boolean isMobileDataSupported() { public boolean isMobileDataSupported() {
// require both supported network and ready SIM // require both supported network and ready SIM
return mConnectivityManager.isNetworkSupported(TYPE_MOBILE) return mConnectivityManager.isNetworkSupported(TYPE_MOBILE)
&& mTelephonyManager.getSimState() == SIM_STATE_READY; && getTelephonyManager().getSimState() == SIM_STATE_READY;
} }
public boolean isMobileDataEnabled() { public boolean isMobileDataEnabled() {
return mTelephonyManager.getDataEnabled(); return getTelephonyManager().isDataEnabled();
} }
static int getNetworkType(NetworkTemplate networkTemplate) { static int getNetworkType(NetworkTemplate networkTemplate) {
@@ -250,12 +271,7 @@ public class DataUsageController {
} }
private String getActiveSubscriberId() { private String getActiveSubscriberId() {
final TelephonyManager tele = TelephonyManager.from(mContext); final String actualSubscriberId = getTelephonyManager().getSubscriberId();
int subscriptionId = mSubscriptionId;
if (subscriptionId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
subscriptionId = SubscriptionManager.getDefaultDataSubscriptionId();
}
final String actualSubscriberId = tele.getSubscriberId(subscriptionId);
return actualSubscriberId; return actualSubscriberId;
} }

View File

@@ -36,6 +36,7 @@ import android.net.INetworkStatsSession;
import android.net.NetworkStatsHistory; import android.net.NetworkStatsHistory;
import android.net.NetworkTemplate; import android.net.NetworkTemplate;
import android.os.RemoteException; import android.os.RemoteException;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.text.format.DateUtils; import android.text.format.DateUtils;
@@ -57,26 +58,31 @@ public class DataUsageControllerTest {
@Mock @Mock
private TelephonyManager mTelephonyManager; private TelephonyManager mTelephonyManager;
@Mock @Mock
private SubscriptionManager mSubscriptionManager;
@Mock
private NetworkStatsManager mNetworkStatsManager; private NetworkStatsManager mNetworkStatsManager;
@Mock @Mock
private Context mContext; private Context mContext;
private DataUsageController mController; private DataUsageController mController;
private NetworkStatsHistory mNetworkStatsHistory; private NetworkStatsHistory mNetworkStatsHistory;
private final int mDefaultSubscriptionId = 1234;
@Before @Before
public void setUp() throws RemoteException { public void setUp() throws RemoteException {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager);
when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).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); when(mContext.getSystemService(NetworkStatsManager.class)).thenReturn(mNetworkStatsManager);
mController = new DataUsageController(mContext); mController = new DataUsageController(mContext);
mNetworkStatsHistory = spy( mNetworkStatsHistory = spy(
new NetworkStatsHistory(DateUtils.DAY_IN_MILLIS /* bucketDuration */)); new NetworkStatsHistory(DateUtils.DAY_IN_MILLIS /* bucketDuration */));
doReturn(mNetworkStatsHistory) doReturn(mNetworkStatsHistory)
.when(mSession).getHistoryForNetwork(any(NetworkTemplate.class), anyInt()); .when(mSession).getHistoryForNetwork(any(NetworkTemplate.class), anyInt());
final int defaultSubscriptionId = 1234; ShadowSubscriptionManager.setDefaultDataSubscriptionId(mDefaultSubscriptionId);
ShadowSubscriptionManager.setDefaultDataSubscriptionId(defaultSubscriptionId); doReturn(SUB_ID).when(mTelephonyManager).getSubscriberId();
doReturn(SUB_ID).when(mTelephonyManager).getSubscriberId(eq(defaultSubscriptionId));
} }
@Test @Test
@@ -130,19 +136,63 @@ public class DataUsageControllerTest {
final NetworkStats.Bucket nonDefaultSubscriberBucket = mock(NetworkStats.Bucket.class); final NetworkStats.Bucket nonDefaultSubscriberBucket = mock(NetworkStats.Bucket.class);
when(nonDefaultSubscriberBucket.getRxBytes()).thenReturn(nonDefaultSubRx); when(nonDefaultSubscriberBucket.getRxBytes()).thenReturn(nonDefaultSubRx);
when(nonDefaultSubscriberBucket.getTxBytes()).thenReturn(nonDefaultSubTx); when(nonDefaultSubscriberBucket.getTxBytes()).thenReturn(nonDefaultSubTx);
final int explictSubscriptionId = 55; final int explicitSubscriptionId = 55;
final String subscriberId2 = "Test Subscriber 2"; final String subscriberId2 = "Test Subscriber 2";
when(mNetworkStatsManager.querySummaryForDevice(eq(ConnectivityManager.TYPE_MOBILE), when(mNetworkStatsManager.querySummaryForDevice(eq(ConnectivityManager.TYPE_MOBILE),
eq(subscriberId2), eq(0L)/* startTime */, anyLong() /* endTime */)).thenReturn( eq(subscriberId2), eq(0L)/* startTime */, anyLong() /* endTime */)).thenReturn(
nonDefaultSubscriberBucket); 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 // 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. // the data back for that subscription and *not* the default one.
mController.setSubscriptionId(explictSubscriptionId); mController.setSubscriptionId(explicitSubscriptionId);
assertThat(mController.getHistoricalUsageLevel( assertThat(mController.getHistoricalUsageLevel(
NetworkTemplate.buildTemplateMobileAll(subscriberId2))).isEqualTo( NetworkTemplate.buildTemplateMobileAll(subscriberId2))).isEqualTo(
nonDefaultSubRx + nonDefaultSubTx); 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);
} }
} }