private static final int PROVISION_REQUEST = 0;
private static final String TAG = "TetherProvisioningAct";
private static final String EXTRA_TETHER_TYPE = "TETHER_TYPE";
+ private static final String EXTRA_SUBID = "subId";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
private ResultReceiver mResultReceiver;
mResultReceiver = (ResultReceiver)getIntent().getParcelableExtra(
ConnectivityManager.EXTRA_PROVISION_CALLBACK);
- int tetherType = getIntent().getIntExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE,
+ final int tetherType = getIntent().getIntExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE,
ConnectivityManager.TETHERING_INVALID);
+
+ final int tetherSubId = getIntent().getIntExtra(EXTRA_SUBID,
+ SubscriptionManager.INVALID_SUBSCRIPTION_ID);
final int subId = SubscriptionManager.getDefaultDataSubscriptionId();
+ if (tetherSubId != subId) {
+ Log.e(TAG, "This Provisioning request is outdated, current subId: " + subId);
+ return;
+ }
final Resources res = Utils.getResourcesForSubId(this, subId);
final String[] provisionApp = res.getStringArray(
com.android.internal.R.array.config_mobile_hotspot_provision_app);
- Intent intent = new Intent(Intent.ACTION_MAIN);
+ final Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClassName(provisionApp[0], provisionApp[1]);
intent.putExtra(EXTRA_TETHER_TYPE, tetherType);
if (DEBUG) {
@VisibleForTesting
public static final String EXTRA_RESULT = "EntitlementResult";
+ @VisibleForTesting
+ public static final String EXTRA_SUBID = "subId";
// Activity results to match the activity provision protocol.
// Default to something not ok.
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
+ if (intent.hasExtra(EXTRA_SUBID)) {
+ final int tetherSubId = intent.getIntExtra(EXTRA_SUBID,
+ SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ final int subId = getTetherServiceWrapper().getDefaultDataSubscriptionId();
+ if (tetherSubId != subId) {
+ Log.e(TAG, "This Provisioning request is outdated, current subId: " + subId);
+ if (!mInProvisionCheck) {
+ stopSelf();
+ }
+ return START_NOT_STICKY;
+ }
+ }
if (intent.hasExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE)) {
int type = intent.getIntExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE,
ConnectivityManager.TETHERING_INVALID);
assertEquals(TetherService.class.getName(), pi.getIntent().getComponent().getClassName());
}
+ public void testIgnoreOutdatedRequest() {
+ Intent intent = new Intent();
+ intent.putExtra(EXTRA_ADD_TETHER_TYPE, TETHERING_WIFI);
+ intent.putExtra(EXTRA_RUN_PROVISION, true);
+ intent.putExtra(EXTRA_PROVISION_CALLBACK, mResultReceiver);
+ intent.putExtra(TetherService.EXTRA_SUBID, 1 /* Tested subId number */);
+ startService(intent);
+
+ SystemClock.sleep(PROVISION_TIMEOUT);
+ assertEquals(TETHERING_INVALID, mLastTetherRequestType);
+ assertTrue(mWrapper.isAppInactive(ENTITLEMENT_PACKAGE_NAME));
+ assertTrue(mWrapper.isAppInactive(FAKE_PACKAGE_NAME));
+ }
+
private void runProvisioningForType(int type) {
Intent intent = new Intent();
intent.putExtra(EXTRA_ADD_TETHER_TYPE, type);
intent.putExtra(EXTRA_RUN_PROVISION, true);
intent.putExtra(EXTRA_PROVISION_CALLBACK, mResultReceiver);
+ intent.putExtra(TetherService.EXTRA_SUBID, INVALID_SUBSCRIPTION_ID);
startService(intent);
}
long startTime = SystemClock.uptimeMillis();
while (true) {
if (mLastTetherRequestType == expectedType) {
- mLastTetherRequestType = -1;
+ mLastTetherRequestType = TETHERING_INVALID;
return true;
}
if ((SystemClock.uptimeMillis() - startTime) > PROVISION_TIMEOUT) {