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:
@@ -77,6 +77,7 @@ import android.os.PowerManager;
|
|||||||
import android.os.PowerManager.WakeLock;
|
import android.os.PowerManager.WakeLock;
|
||||||
import android.os.Process;
|
import android.os.Process;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
|
import android.provider.Settings;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
|
|
||||||
@@ -788,8 +789,19 @@ public class VcnGatewayConnection extends StateMachine {
|
|||||||
// TODO(b/179091925): Move the delayed-message handling to BaseState
|
// TODO(b/179091925): Move the delayed-message handling to BaseState
|
||||||
|
|
||||||
// If underlying is null, all underlying networks have been lost. Disconnect VCN after a
|
// 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 (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();
|
setDisconnectRequestAlarm();
|
||||||
} else {
|
} else {
|
||||||
// Received a new Network so any previous alarm is irrelevant - cancel + clear it,
|
// Received a new Network so any previous alarm is irrelevant - cancel + clear it,
|
||||||
@@ -2424,6 +2436,12 @@ public class VcnGatewayConnection extends StateMachine {
|
|||||||
validationStatusCallback);
|
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. */
|
/** Gets the elapsed real time since boot, in millis. */
|
||||||
public long getElapsedRealTime() {
|
public long getElapsedRealTime() {
|
||||||
return SystemClock.elapsedRealtime();
|
return SystemClock.elapsedRealtime();
|
||||||
|
|||||||
@@ -118,6 +118,8 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNullNetworkDoesNotTriggerDisconnect() throws Exception {
|
public void testNullNetworkDoesNotTriggerDisconnect() throws Exception {
|
||||||
|
doReturn(false).when(mDeps).isAirplaneModeOn(any());
|
||||||
|
|
||||||
mGatewayConnection
|
mGatewayConnection
|
||||||
.getUnderlyingNetworkControllerCallback()
|
.getUnderlyingNetworkControllerCallback()
|
||||||
.onSelectedUnderlyingNetworkChanged(null);
|
.onSelectedUnderlyingNetworkChanged(null);
|
||||||
@@ -128,6 +130,19 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection
|
|||||||
verifyDisconnectRequestAlarmAndGetCallback(false /* expectCanceled */);
|
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
|
@Test
|
||||||
public void testNewNetworkTriggersMigration() throws Exception {
|
public void testNewNetworkTriggersMigration() throws Exception {
|
||||||
mGatewayConnection
|
mGatewayConnection
|
||||||
|
|||||||
Reference in New Issue
Block a user