Loading src/java/com/android/internal/telephony/NetworkTypeController.java +40 −12 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.content.IntentFilter; import android.os.AsyncResult; import android.os.Message; import android.os.PersistableBundle; import android.os.PowerManager; import android.telephony.AccessNetworkConstants; import android.telephony.Annotation; import android.telephony.CarrierConfigManager; Loading Loading @@ -101,8 +102,9 @@ public class NetworkTypeController extends StateMachine { private static final int EVENT_PCO_DATA_CHANGED = 14; private static final int EVENT_BANDWIDTH_CHANGED = 15; private static final int EVENT_UPDATE_NR_ADVANCED_STATE = 16; private static final int EVENT_DEVICE_IDLE_MODE_CHANGED = 17; private static final String[] sEvents = new String[EVENT_UPDATE_NR_ADVANCED_STATE + 1]; private static final String[] sEvents = new String[EVENT_DEVICE_IDLE_MODE_CHANGED + 1]; static { sEvents[EVENT_UPDATE] = "EVENT_UPDATE"; sEvents[EVENT_QUIT] = "EVENT_QUIT"; Loading @@ -122,6 +124,7 @@ public class NetworkTypeController extends StateMachine { sEvents[EVENT_PCO_DATA_CHANGED] = "EVENT_PCO_DATA_CHANGED"; sEvents[EVENT_BANDWIDTH_CHANGED] = "EVENT_BANDWIDTH_CHANGED"; sEvents[EVENT_UPDATE_NR_ADVANCED_STATE] = "EVENT_UPDATE_NR_ADVANCED_STATE"; sEvents[EVENT_DEVICE_IDLE_MODE_CHANGED] = "EVENT_DEVICE_IDLE_MODE_CHANGED"; } private final Phone mPhone; Loading @@ -129,13 +132,19 @@ public class NetworkTypeController extends StateMachine { private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED) && intent.getIntExtra(SubscriptionManager.EXTRA_SLOT_INDEX, switch (intent.getAction()) { case CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED: if (intent.getIntExtra(SubscriptionManager.EXTRA_SLOT_INDEX, SubscriptionManager.INVALID_PHONE_INDEX) == mPhone.getPhoneId() && !intent.getBooleanExtra(CarrierConfigManager.EXTRA_REBROADCAST_ON_UNLOCK, false)) { && !intent.getBooleanExtra( CarrierConfigManager.EXTRA_REBROADCAST_ON_UNLOCK, false)) { sendMessage(EVENT_CARRIER_CONFIG_CHANGED); } break; case PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED: sendMessage(EVENT_DEVICE_IDLE_MODE_CHANGED); break; } } }; Loading @@ -154,10 +163,11 @@ public class NetworkTypeController extends StateMachine { private String mPreviousState; private @LinkStatus int mPhysicalLinkStatus; private boolean mIsPhysicalChannelConfig16Supported; private Boolean mIsNrAdvancedAllowedByPco = false; private boolean mIsNrAdvancedAllowedByPco = false; private int mNrAdvancedCapablePcoId = 0; private boolean mIsUsingUserDataForRrcDetection = false; private boolean mEnableNrAdvancedWhileRoaming = true; private boolean mIsDeviceIdleMode = false; /** * NetworkTypeController constructor. Loading Loading @@ -220,6 +230,7 @@ public class NetworkTypeController extends StateMachine { EVENT_PHYSICAL_CHANNEL_CONFIG_NOTIF_CHANGED, null); IntentFilter filter = new IntentFilter(); filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); filter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED); mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone); if (!mPhone.isUsingNewDataStack()) { mPhone.mCi.registerForPcoData(getHandler(), EVENT_PCO_DATA_CHANGED, null); Loading Loading @@ -594,6 +605,17 @@ public class NetworkTypeController extends StateMachine { resetAllTimers(); transitionTo(mLegacyState); break; case EVENT_DEVICE_IDLE_MODE_CHANGED: PowerManager pm = mPhone.getContext().getSystemService(PowerManager.class); mIsDeviceIdleMode = pm.isDeviceIdleMode(); if (DBG) { log("mIsDeviceIdleMode changed to: " + mIsDeviceIdleMode); } if (mIsDeviceIdleMode) { resetAllTimers(); } transitionToCurrentState(); break; default: throw new RuntimeException("Received invalid event: " + msg.what); } Loading Loading @@ -992,13 +1014,13 @@ public class NetworkTypeController extends StateMachine { private void transitionWithTimerTo(IState destState) { String destName = destState.getName(); OverrideTimerRule rule = mOverrideTimerRules.get(mPreviousState); if (rule != null && rule.getTimer(destName) > 0) { if (!mIsDeviceIdleMode && rule != null && rule.getTimer(destName) > 0) { if (DBG) log("Primary timer started for state: " + mPreviousState); mPrimaryTimerState = mPreviousState; mPreviousState = getCurrentState().getName(); mIsPrimaryTimerActive = true; sendMessageDelayed(EVENT_PRIMARY_TIMER_EXPIRED, destState, rule.getTimer(destName) * 1000); rule.getTimer(destName) * 1000L); } transitionTo(destState); } Loading @@ -1006,13 +1028,13 @@ public class NetworkTypeController extends StateMachine { private void transitionWithSecondaryTimerTo(IState destState) { String currentName = getCurrentState().getName(); OverrideTimerRule rule = mOverrideTimerRules.get(mPrimaryTimerState); if (rule != null && rule.getSecondaryTimer(currentName) > 0) { if (!mIsDeviceIdleMode && rule != null && rule.getSecondaryTimer(currentName) > 0) { if (DBG) log("Secondary timer started for state: " + currentName); mSecondaryTimerState = currentName; mPreviousState = currentName; mIsSecondaryTimerActive = true; sendMessageDelayed(EVENT_SECONDARY_TIMER_EXPIRED, destState, rule.getSecondaryTimer(currentName) * 1000); rule.getSecondaryTimer(currentName) * 1000L); } mIsPrimaryTimerActive = false; transitionTo(getCurrentState()); Loading Loading @@ -1315,13 +1337,19 @@ public class NetworkTypeController extends StateMachine { pw.println("mIsTimerRestEnabledForLegacyStateRRCIdle=" + mIsTimerResetEnabledForLegacyStateRRCIdle); pw.println("mLtePlusThresholdBandwidth=" + mLtePlusThresholdBandwidth); pw.println("mNrAdvancedThresholdBandwidth=" + mNrAdvancedThresholdBandwidth); pw.println("mPrimaryTimerState=" + mPrimaryTimerState); pw.println("mSecondaryTimerState=" + mSecondaryTimerState); pw.println("mPreviousState=" + mPreviousState); pw.println("mPhysicalLinkStatus=" + mPhysicalLinkStatus); pw.println("mAdditionalNrAdvancedBandsList=" + Arrays.toString(mAdditionalNrAdvancedBandsList)); pw.println("mIsPhysicalChannelConfig16Supported=" + mIsPhysicalChannelConfig16Supported); pw.println("mIsNrAdvancedAllowedByPco=" + mIsNrAdvancedAllowedByPco); pw.println("mNrAdvancedCapablePcoId=" + mNrAdvancedCapablePcoId); pw.println("mIsUsingUserDataForRrcDetection=" + mIsUsingUserDataForRrcDetection); pw.println("mEnableNrAdvancedWhileRoaming=" + mEnableNrAdvancedWhileRoaming); pw.println("mIsDeviceIdleMode=" + mIsDeviceIdleMode); pw.decreaseIndent(); pw.flush(); } Loading tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java +3 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.IInterface; import android.os.PersistableBundle; import android.os.PowerManager; import android.os.PowerWhitelistManager; import android.os.SystemConfigManager; import android.os.UserHandle; Loading Loading @@ -346,6 +347,8 @@ public class ContextFixture implements TestFixture<Context> { return Context.TELEPHONY_REGISTRY_SERVICE; } else if (serviceClass == NetworkPolicyManager.class) { return Context.NETWORK_POLICY_SERVICE; } else if (serviceClass == PowerManager.class) { return Context.POWER_SERVICE; } return super.getSystemServiceName(serviceClass); } Loading tests/telephonytests/src/com/android/internal/telephony/NetworkTypeControllerTest.java +34 −0 Original line number Diff line number Diff line Loading @@ -23,11 +23,15 @@ import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import android.content.Context; import android.content.Intent; import android.os.AsyncResult; import android.os.Handler; import android.os.IPowerManager; import android.os.IThermalService; import android.os.Looper; import android.os.PersistableBundle; import android.os.PowerManager; import android.telephony.CarrierConfigManager; import android.telephony.NetworkRegistrationInfo; import android.telephony.PcoData; Loading Loading @@ -884,6 +888,36 @@ public class NetworkTypeControllerTest extends TelephonyTest { assertFalse(mNetworkTypeController.is5GHysteresisActive()); } @Test public void testPrimaryTimerDeviceIdleMode() throws Exception { doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType(); doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState(); mBundle.putString(CarrierConfigManager.KEY_5G_ICON_DISPLAY_GRACE_PERIOD_STRING, "connected_mmwave,any,10;connected,any,10;not_restricted_rrc_con,any,10"); broadcastCarrierConfigs(); IPowerManager powerManager = mock(IPowerManager.class); PowerManager pm = new PowerManager(mContext, powerManager, mock(IThermalService.class), new Handler(Looper.myLooper())); doReturn(pm).when(mContext).getSystemService(Context.POWER_SERVICE); doReturn(true).when(powerManager).isDeviceIdleMode(); mNetworkTypeController.sendMessage(17 /*EVENT_DEVICE_IDLE_MODE_CHANGED*/); assertEquals("connected", getCurrentState().getName()); assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA, mNetworkTypeController.getOverrideNetworkType()); // should not trigger timer doReturn(NetworkRegistrationInfo.NR_STATE_NONE).when(mServiceState).getNrState(); mNetworkTypeController.sendMessage(EVENT_NR_STATE_CHANGED); processAllMessages(); assertEquals("legacy", getCurrentState().getName()); assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE, mNetworkTypeController.getOverrideNetworkType()); assertFalse(mNetworkTypeController.is5GHysteresisActive()); } @Test public void testPrimaryTimerReset() throws Exception { doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType(); Loading Loading
src/java/com/android/internal/telephony/NetworkTypeController.java +40 −12 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.content.IntentFilter; import android.os.AsyncResult; import android.os.Message; import android.os.PersistableBundle; import android.os.PowerManager; import android.telephony.AccessNetworkConstants; import android.telephony.Annotation; import android.telephony.CarrierConfigManager; Loading Loading @@ -101,8 +102,9 @@ public class NetworkTypeController extends StateMachine { private static final int EVENT_PCO_DATA_CHANGED = 14; private static final int EVENT_BANDWIDTH_CHANGED = 15; private static final int EVENT_UPDATE_NR_ADVANCED_STATE = 16; private static final int EVENT_DEVICE_IDLE_MODE_CHANGED = 17; private static final String[] sEvents = new String[EVENT_UPDATE_NR_ADVANCED_STATE + 1]; private static final String[] sEvents = new String[EVENT_DEVICE_IDLE_MODE_CHANGED + 1]; static { sEvents[EVENT_UPDATE] = "EVENT_UPDATE"; sEvents[EVENT_QUIT] = "EVENT_QUIT"; Loading @@ -122,6 +124,7 @@ public class NetworkTypeController extends StateMachine { sEvents[EVENT_PCO_DATA_CHANGED] = "EVENT_PCO_DATA_CHANGED"; sEvents[EVENT_BANDWIDTH_CHANGED] = "EVENT_BANDWIDTH_CHANGED"; sEvents[EVENT_UPDATE_NR_ADVANCED_STATE] = "EVENT_UPDATE_NR_ADVANCED_STATE"; sEvents[EVENT_DEVICE_IDLE_MODE_CHANGED] = "EVENT_DEVICE_IDLE_MODE_CHANGED"; } private final Phone mPhone; Loading @@ -129,13 +132,19 @@ public class NetworkTypeController extends StateMachine { private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED) && intent.getIntExtra(SubscriptionManager.EXTRA_SLOT_INDEX, switch (intent.getAction()) { case CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED: if (intent.getIntExtra(SubscriptionManager.EXTRA_SLOT_INDEX, SubscriptionManager.INVALID_PHONE_INDEX) == mPhone.getPhoneId() && !intent.getBooleanExtra(CarrierConfigManager.EXTRA_REBROADCAST_ON_UNLOCK, false)) { && !intent.getBooleanExtra( CarrierConfigManager.EXTRA_REBROADCAST_ON_UNLOCK, false)) { sendMessage(EVENT_CARRIER_CONFIG_CHANGED); } break; case PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED: sendMessage(EVENT_DEVICE_IDLE_MODE_CHANGED); break; } } }; Loading @@ -154,10 +163,11 @@ public class NetworkTypeController extends StateMachine { private String mPreviousState; private @LinkStatus int mPhysicalLinkStatus; private boolean mIsPhysicalChannelConfig16Supported; private Boolean mIsNrAdvancedAllowedByPco = false; private boolean mIsNrAdvancedAllowedByPco = false; private int mNrAdvancedCapablePcoId = 0; private boolean mIsUsingUserDataForRrcDetection = false; private boolean mEnableNrAdvancedWhileRoaming = true; private boolean mIsDeviceIdleMode = false; /** * NetworkTypeController constructor. Loading Loading @@ -220,6 +230,7 @@ public class NetworkTypeController extends StateMachine { EVENT_PHYSICAL_CHANNEL_CONFIG_NOTIF_CHANGED, null); IntentFilter filter = new IntentFilter(); filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); filter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED); mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone); if (!mPhone.isUsingNewDataStack()) { mPhone.mCi.registerForPcoData(getHandler(), EVENT_PCO_DATA_CHANGED, null); Loading Loading @@ -594,6 +605,17 @@ public class NetworkTypeController extends StateMachine { resetAllTimers(); transitionTo(mLegacyState); break; case EVENT_DEVICE_IDLE_MODE_CHANGED: PowerManager pm = mPhone.getContext().getSystemService(PowerManager.class); mIsDeviceIdleMode = pm.isDeviceIdleMode(); if (DBG) { log("mIsDeviceIdleMode changed to: " + mIsDeviceIdleMode); } if (mIsDeviceIdleMode) { resetAllTimers(); } transitionToCurrentState(); break; default: throw new RuntimeException("Received invalid event: " + msg.what); } Loading Loading @@ -992,13 +1014,13 @@ public class NetworkTypeController extends StateMachine { private void transitionWithTimerTo(IState destState) { String destName = destState.getName(); OverrideTimerRule rule = mOverrideTimerRules.get(mPreviousState); if (rule != null && rule.getTimer(destName) > 0) { if (!mIsDeviceIdleMode && rule != null && rule.getTimer(destName) > 0) { if (DBG) log("Primary timer started for state: " + mPreviousState); mPrimaryTimerState = mPreviousState; mPreviousState = getCurrentState().getName(); mIsPrimaryTimerActive = true; sendMessageDelayed(EVENT_PRIMARY_TIMER_EXPIRED, destState, rule.getTimer(destName) * 1000); rule.getTimer(destName) * 1000L); } transitionTo(destState); } Loading @@ -1006,13 +1028,13 @@ public class NetworkTypeController extends StateMachine { private void transitionWithSecondaryTimerTo(IState destState) { String currentName = getCurrentState().getName(); OverrideTimerRule rule = mOverrideTimerRules.get(mPrimaryTimerState); if (rule != null && rule.getSecondaryTimer(currentName) > 0) { if (!mIsDeviceIdleMode && rule != null && rule.getSecondaryTimer(currentName) > 0) { if (DBG) log("Secondary timer started for state: " + currentName); mSecondaryTimerState = currentName; mPreviousState = currentName; mIsSecondaryTimerActive = true; sendMessageDelayed(EVENT_SECONDARY_TIMER_EXPIRED, destState, rule.getSecondaryTimer(currentName) * 1000); rule.getSecondaryTimer(currentName) * 1000L); } mIsPrimaryTimerActive = false; transitionTo(getCurrentState()); Loading Loading @@ -1315,13 +1337,19 @@ public class NetworkTypeController extends StateMachine { pw.println("mIsTimerRestEnabledForLegacyStateRRCIdle=" + mIsTimerResetEnabledForLegacyStateRRCIdle); pw.println("mLtePlusThresholdBandwidth=" + mLtePlusThresholdBandwidth); pw.println("mNrAdvancedThresholdBandwidth=" + mNrAdvancedThresholdBandwidth); pw.println("mPrimaryTimerState=" + mPrimaryTimerState); pw.println("mSecondaryTimerState=" + mSecondaryTimerState); pw.println("mPreviousState=" + mPreviousState); pw.println("mPhysicalLinkStatus=" + mPhysicalLinkStatus); pw.println("mAdditionalNrAdvancedBandsList=" + Arrays.toString(mAdditionalNrAdvancedBandsList)); pw.println("mIsPhysicalChannelConfig16Supported=" + mIsPhysicalChannelConfig16Supported); pw.println("mIsNrAdvancedAllowedByPco=" + mIsNrAdvancedAllowedByPco); pw.println("mNrAdvancedCapablePcoId=" + mNrAdvancedCapablePcoId); pw.println("mIsUsingUserDataForRrcDetection=" + mIsUsingUserDataForRrcDetection); pw.println("mEnableNrAdvancedWhileRoaming=" + mEnableNrAdvancedWhileRoaming); pw.println("mIsDeviceIdleMode=" + mIsDeviceIdleMode); pw.decreaseIndent(); pw.flush(); } Loading
tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java +3 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.IInterface; import android.os.PersistableBundle; import android.os.PowerManager; import android.os.PowerWhitelistManager; import android.os.SystemConfigManager; import android.os.UserHandle; Loading Loading @@ -346,6 +347,8 @@ public class ContextFixture implements TestFixture<Context> { return Context.TELEPHONY_REGISTRY_SERVICE; } else if (serviceClass == NetworkPolicyManager.class) { return Context.NETWORK_POLICY_SERVICE; } else if (serviceClass == PowerManager.class) { return Context.POWER_SERVICE; } return super.getSystemServiceName(serviceClass); } Loading
tests/telephonytests/src/com/android/internal/telephony/NetworkTypeControllerTest.java +34 −0 Original line number Diff line number Diff line Loading @@ -23,11 +23,15 @@ import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import android.content.Context; import android.content.Intent; import android.os.AsyncResult; import android.os.Handler; import android.os.IPowerManager; import android.os.IThermalService; import android.os.Looper; import android.os.PersistableBundle; import android.os.PowerManager; import android.telephony.CarrierConfigManager; import android.telephony.NetworkRegistrationInfo; import android.telephony.PcoData; Loading Loading @@ -884,6 +888,36 @@ public class NetworkTypeControllerTest extends TelephonyTest { assertFalse(mNetworkTypeController.is5GHysteresisActive()); } @Test public void testPrimaryTimerDeviceIdleMode() throws Exception { doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType(); doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState(); mBundle.putString(CarrierConfigManager.KEY_5G_ICON_DISPLAY_GRACE_PERIOD_STRING, "connected_mmwave,any,10;connected,any,10;not_restricted_rrc_con,any,10"); broadcastCarrierConfigs(); IPowerManager powerManager = mock(IPowerManager.class); PowerManager pm = new PowerManager(mContext, powerManager, mock(IThermalService.class), new Handler(Looper.myLooper())); doReturn(pm).when(mContext).getSystemService(Context.POWER_SERVICE); doReturn(true).when(powerManager).isDeviceIdleMode(); mNetworkTypeController.sendMessage(17 /*EVENT_DEVICE_IDLE_MODE_CHANGED*/); assertEquals("connected", getCurrentState().getName()); assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA, mNetworkTypeController.getOverrideNetworkType()); // should not trigger timer doReturn(NetworkRegistrationInfo.NR_STATE_NONE).when(mServiceState).getNrState(); mNetworkTypeController.sendMessage(EVENT_NR_STATE_CHANGED); processAllMessages(); assertEquals("legacy", getCurrentState().getName()); assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE, mNetworkTypeController.getOverrideNetworkType()); assertFalse(mNetworkTypeController.is5GHysteresisActive()); } @Test public void testPrimaryTimerReset() throws Exception { doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType(); Loading