Immediately tear down VCN network when entering Airplane Mode

This change immediately tears down the VCN network if all underlying
networks are lost, and the device is in airplane mode. This ensures
consistency where other components may not understand the lingering
behavior of the VCN network

Bug: 207014742
Test: atest FrameworksVcnTests
Change-Id: Ib05f0c4255e847eed7d8623b35c5a7dfedd920d6
This commit is contained in:
Benedict Wong
2021-12-02 05:30:19 +00:00
parent 8e054179ea
commit c0e108a497
2 changed files with 34 additions and 1 deletions

View File

@@ -77,6 +77,7 @@ import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.os.Process;
import android.os.SystemClock;
import android.provider.Settings;
import android.util.ArraySet;
import android.util.Slog;
@@ -788,8 +789,19 @@ public class VcnGatewayConnection extends StateMachine {
// TODO(b/179091925): Move the delayed-message handling to BaseState
// If underlying is null, all underlying networks have been lost. Disconnect VCN after a
// timeout.
// timeout (or immediately if in airplane mode, since the device user has indicated that
// the radios should all be turned off).
if (underlying == null) {
if (mDeps.isAirplaneModeOn(mVcnContext)) {
sendMessageAndAcquireWakeLock(
EVENT_UNDERLYING_NETWORK_CHANGED,
TOKEN_ALL,
new EventUnderlyingNetworkChangedInfo(null));
sendDisconnectRequestedAndAcquireWakelock(
DISCONNECT_REASON_UNDERLYING_NETWORK_LOST, false /* shouldQuit */);
return;
}
setDisconnectRequestAlarm();
} else {
// Received a new Network so any previous alarm is irrelevant - cancel + clear it,
@@ -2424,6 +2436,12 @@ public class VcnGatewayConnection extends StateMachine {
validationStatusCallback);
}
/** Checks if airplane mode is enabled. */
public boolean isAirplaneModeOn(@NonNull VcnContext vcnContext) {
return Settings.Global.getInt(vcnContext.getContext().getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
}
/** Gets the elapsed real time since boot, in millis. */
public long getElapsedRealTime() {
return SystemClock.elapsedRealtime();

View File

@@ -118,6 +118,8 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection
@Test
public void testNullNetworkDoesNotTriggerDisconnect() throws Exception {
doReturn(false).when(mDeps).isAirplaneModeOn(any());
mGatewayConnection
.getUnderlyingNetworkControllerCallback()
.onSelectedUnderlyingNetworkChanged(null);
@@ -128,6 +130,19 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection
verifyDisconnectRequestAlarmAndGetCallback(false /* expectCanceled */);
}
@Test
public void testNullNetworkAirplaneModeDisconnects() throws Exception {
doReturn(true).when(mDeps).isAirplaneModeOn(any());
mGatewayConnection
.getUnderlyingNetworkControllerCallback()
.onSelectedUnderlyingNetworkChanged(null);
mTestLooper.dispatchAll();
assertEquals(mGatewayConnection.mDisconnectingState, mGatewayConnection.getCurrentState());
verify(mIkeSession).kill();
}
@Test
public void testNewNetworkTriggersMigration() throws Exception {
mGatewayConnection