Fix nascent timer never get removed

By design, the nascent timer will be removed after a network
satisfied first request. However, this never happens.
Because the mInactive is false when that happens, so isNascent
is never true.

Furthermore, when removing a nascent timer, the inactivity
state can never be updated since no condition in the
updateInactivityState will be met to update the state correctly.

Thus, update inactive state accordingly when adding/removing the
nascent timer.

Test: TH
Bug: 184227264
Merged-In: I3c2563d4ae4e3715d0c6270344ba8f7ef067872f
Merged-In: I4c1521b6e0ef68ac489771a2ab6b09ef3e381577
Change-Id: I4c1521b6e0ef68ac489771a2ab6b09ef3e381577
  (cherry-picked from ag/14060609)
This commit is contained in:
junyulai
2021-03-26 00:40:48 +08:00
committed by Junyu Lai
parent c81d4c3c7e
commit 36c02987c6
2 changed files with 11 additions and 4 deletions

View File

@@ -7851,6 +7851,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// all networks except in the case of an underlying network for a VCN. // all networks except in the case of an underlying network for a VCN.
if (newSatisfier.isNascent()) { if (newSatisfier.isNascent()) {
newSatisfier.unlingerRequest(NetworkRequest.REQUEST_ID_NONE); newSatisfier.unlingerRequest(NetworkRequest.REQUEST_ID_NONE);
newSatisfier.unsetInactive();
} }
// if newSatisfier is not null, then newRequest may not be null. // if newSatisfier is not null, then newRequest may not be null.
@@ -8355,6 +8356,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// But it will be removed as soon as the network satisfies a request for the first time. // But it will be removed as soon as the network satisfies a request for the first time.
networkAgent.lingerRequest(NetworkRequest.REQUEST_ID_NONE, networkAgent.lingerRequest(NetworkRequest.REQUEST_ID_NONE,
SystemClock.elapsedRealtime(), mNascentDelayMs); SystemClock.elapsedRealtime(), mNascentDelayMs);
networkAgent.setInactive();
// Consider network even though it is not yet validated. // Consider network even though it is not yet validated.
rematchAllNetworksAndRequests(); rematchAllNetworksAndRequests();

View File

@@ -4567,9 +4567,8 @@ public class ConnectivityServiceTest {
expectNoRequestChanged(testFactory); expectNoRequestChanged(testFactory);
testFactory.assertRequestCountEquals(0); testFactory.assertRequestCountEquals(0);
assertFalse(testFactory.getMyStartRequested()); assertFalse(testFactory.getMyStartRequested());
// ... and cell data to be torn down after nascent network timeout. // ... and cell data to be torn down immediately since it is no longer nascent.
cellNetworkCallback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent, cellNetworkCallback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent);
mService.mNascentDelayMs + TEST_CALLBACK_TIMEOUT_MS);
waitForIdle(); waitForIdle();
assertLength(1, mCm.getAllNetworks()); assertLength(1, mCm.getAllNetworks());
} finally { } finally {
@@ -11874,6 +11873,11 @@ public class ConnectivityServiceTest {
internetFactory.expectRequestRemove(); internetFactory.expectRequestRemove();
internetFactory.assertRequestCountEquals(0); internetFactory.assertRequestCountEquals(0);
// Create a request that holds the upcoming wifi network.
final TestNetworkCallback wifiCallback = new TestNetworkCallback();
mCm.requestNetwork(new NetworkRequest.Builder().addTransportType(TRANSPORT_WIFI).build(),
wifiCallback);
// Now WiFi connects and it's unmetered, but it's weaker than cell. // Now WiFi connects and it's unmetered, but it's weaker than cell.
mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
mWiFiNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED); mWiFiNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED);
@@ -11882,7 +11886,7 @@ public class ConnectivityServiceTest {
mWiFiNetworkAgent.connect(true); mWiFiNetworkAgent.connect(true);
// The OEM_PAID preference prefers an unmetered network to an OEM_PAID network, so // The OEM_PAID preference prefers an unmetered network to an OEM_PAID network, so
// the oemPaidFactory can't beat this no matter how high its score. // the oemPaidFactory can't beat wifi no matter how high its score.
oemPaidFactory.expectRequestRemove(); oemPaidFactory.expectRequestRemove();
expectNoRequestChanged(internetFactory); expectNoRequestChanged(internetFactory);
@@ -11893,6 +11897,7 @@ public class ConnectivityServiceTest {
// unmetered network, so the oemPaidNetworkFactory still can't beat this. // unmetered network, so the oemPaidNetworkFactory still can't beat this.
expectNoRequestChanged(oemPaidFactory); expectNoRequestChanged(oemPaidFactory);
internetFactory.expectRequestAdd(); internetFactory.expectRequestAdd();
mCm.unregisterNetworkCallback(wifiCallback);
} }
/** /**