Loading src/java/com/android/internal/telephony/NetworkTypeController.java +70 −16 Original line number Original line Diff line number Diff line Loading @@ -27,15 +27,19 @@ import android.telephony.AccessNetworkConstants; import android.telephony.Annotation; import android.telephony.Annotation; import android.telephony.CarrierConfigManager; import android.telephony.CarrierConfigManager; import android.telephony.NetworkRegistrationInfo; import android.telephony.NetworkRegistrationInfo; import android.telephony.PcoData; import android.telephony.PhysicalChannelConfig; import android.telephony.PhysicalChannelConfig; import android.telephony.ServiceState; import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager; import android.telephony.TelephonyDisplayInfo; import android.telephony.TelephonyDisplayInfo; import android.telephony.TelephonyManager; import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; import android.text.TextUtils; import android.text.TextUtils; import com.android.internal.telephony.dataconnection.DataConnection; import com.android.internal.telephony.dataconnection.DcController; import com.android.internal.telephony.dataconnection.DcController; import com.android.internal.telephony.dataconnection.DcController.PhysicalLinkState; import com.android.internal.telephony.dataconnection.DcController.PhysicalLinkState; import com.android.internal.telephony.dataconnection.DcTracker; import com.android.internal.telephony.util.ArrayUtils; import com.android.internal.telephony.util.ArrayUtils; import com.android.internal.util.IState; import com.android.internal.util.IState; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.IndentingPrintWriter; Loading Loading @@ -93,8 +97,9 @@ public class NetworkTypeController extends StateMachine { private static final int EVENT_PREFERRED_NETWORK_MODE_CHANGED = 11; private static final int EVENT_PREFERRED_NETWORK_MODE_CHANGED = 11; private static final int EVENT_INITIALIZE = 12; private static final int EVENT_INITIALIZE = 12; private static final int EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED = 13; private static final int EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED = 13; private static final int EVENT_PCO_DATA_CHANGED = 14; private static final String[] sEvents = new String[EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED + 1]; private static final String[] sEvents = new String[EVENT_PCO_DATA_CHANGED + 1]; static { static { sEvents[EVENT_UPDATE] = "EVENT_UPDATE"; sEvents[EVENT_UPDATE] = "EVENT_UPDATE"; sEvents[EVENT_QUIT] = "EVENT_QUIT"; sEvents[EVENT_QUIT] = "EVENT_QUIT"; Loading @@ -111,6 +116,7 @@ public class NetworkTypeController extends StateMachine { sEvents[EVENT_PREFERRED_NETWORK_MODE_CHANGED] = "EVENT_PREFERRED_NETWORK_MODE_CHANGED"; sEvents[EVENT_PREFERRED_NETWORK_MODE_CHANGED] = "EVENT_PREFERRED_NETWORK_MODE_CHANGED"; sEvents[EVENT_INITIALIZE] = "EVENT_INITIALIZE"; sEvents[EVENT_INITIALIZE] = "EVENT_INITIALIZE"; sEvents[EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED] = "EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED"; sEvents[EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED] = "EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED"; sEvents[EVENT_PCO_DATA_CHANGED] = "EVENT_PCO_DATA_CHANGED"; } } private final Phone mPhone; private final Phone mPhone; Loading Loading @@ -142,6 +148,8 @@ public class NetworkTypeController extends StateMachine { private String mPreviousState; private String mPreviousState; private @PhysicalLinkState int mPhysicalLinkState; private @PhysicalLinkState int mPhysicalLinkState; private boolean mIsPhysicalChannelConfig16Supported; private boolean mIsPhysicalChannelConfig16Supported; private Boolean mIsNrAdvancedAllowedByPco = false; private int mNrAdvancedCapablePcoId = 0; /** /** * NetworkTypeController constructor. * NetworkTypeController constructor. Loading Loading @@ -208,6 +216,7 @@ public class NetworkTypeController extends StateMachine { IntentFilter filter = new IntentFilter(); IntentFilter filter = new IntentFilter(); filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone); mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone); mPhone.mCi.registerForPcoData(getHandler(), EVENT_PCO_DATA_CHANGED, null); } } private void unRegisterForAllEvents() { private void unRegisterForAllEvents() { Loading @@ -219,6 +228,7 @@ public class NetworkTypeController extends StateMachine { mPhone.getServiceStateTracker().unregisterForNrFrequencyChanged(getHandler()); mPhone.getServiceStateTracker().unregisterForNrFrequencyChanged(getHandler()); mPhone.getDeviceStateMonitor().unregisterForPhysicalChannelConfigNotifChanged(getHandler()); mPhone.getDeviceStateMonitor().unregisterForPhysicalChannelConfigNotifChanged(getHandler()); mPhone.getContext().unregisterReceiver(mIntentReceiver); mPhone.getContext().unregisterReceiver(mIntentReceiver); mPhone.mCi.unregisterForPcoData(getHandler()); } } private void parseCarrierConfigs() { private void parseCarrierConfigs() { Loading Loading @@ -267,6 +277,8 @@ public class NetworkTypeController extends StateMachine { mLtePlusThresholdBandwidth); mLtePlusThresholdBandwidth); mAdditionalNrAdvancedBandsList = b.getIntArray( mAdditionalNrAdvancedBandsList = b.getIntArray( CarrierConfigManager.KEY_ADDITIONAL_NR_ADVANCED_BANDS_INT_ARRAY); CarrierConfigManager.KEY_ADDITIONAL_NR_ADVANCED_BANDS_INT_ARRAY); mNrAdvancedCapablePcoId = b.getInt( CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT); } } } } createTimerRules(nrIconConfiguration, overrideTimerRule, overrideSecondaryTimerRule); createTimerRules(nrIconConfiguration, overrideTimerRule, overrideSecondaryTimerRule); Loading Loading @@ -486,6 +498,7 @@ public class NetworkTypeController extends StateMachine { case EVENT_DATA_RAT_CHANGED: case EVENT_DATA_RAT_CHANGED: case EVENT_NR_STATE_CHANGED: case EVENT_NR_STATE_CHANGED: case EVENT_NR_FREQUENCY_CHANGED: case EVENT_NR_FREQUENCY_CHANGED: case EVENT_PCO_DATA_CHANGED: // ignored // ignored break; break; case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED: case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED: Loading Loading @@ -841,24 +854,15 @@ public class NetworkTypeController extends StateMachine { transitionWithTimerTo(mLegacyState); transitionWithTimerTo(mLegacyState); } } break; break; case EVENT_PCO_DATA_CHANGED: handlePcoData((AsyncResult) msg.obj); break; case EVENT_NR_FREQUENCY_CHANGED: case EVENT_NR_FREQUENCY_CHANGED: case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED: case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED: if (mIsPhysicalChannelConfig16Supported) { if (mIsPhysicalChannelConfig16Supported) { mPhysicalLinkState = getPhysicalLinkStateFromPhysicalChannelConfig(); mPhysicalLinkState = getPhysicalLinkStateFromPhysicalChannelConfig(); } } if (!isNrConnected()) { updateNrAdvancedState(); log("NR state changed. Sending EVENT_NR_STATE_CHANGED"); sendMessage(EVENT_NR_STATE_CHANGED); break; } if (!isNrAdvanced()) { // STATE_CONNECTED_NR_ADVANCED -> STATE_CONNECTED transitionWithTimerTo(mNrConnectedState); } else { // STATE_CONNECTED -> STATE_CONNECTED_NR_ADVANCED transitionTo(mNrConnectedState); } mIsNrAdvanced = isNrAdvanced(); break; break; case EVENT_PHYSICAL_LINK_STATE_CHANGED: case EVENT_PHYSICAL_LINK_STATE_CHANGED: AsyncResult ar = (AsyncResult) msg.obj; AsyncResult ar = (AsyncResult) msg.obj; Loading @@ -881,6 +885,47 @@ public class NetworkTypeController extends StateMachine { public String getName() { public String getName() { return mIsNrAdvanced ? STATE_CONNECTED_NR_ADVANCED : STATE_CONNECTED; return mIsNrAdvanced ? STATE_CONNECTED_NR_ADVANCED : STATE_CONNECTED; } } private void updateNrAdvancedState() { if (!isNrConnected()) { log("NR state changed. Sending EVENT_NR_STATE_CHANGED"); sendMessage(EVENT_NR_STATE_CHANGED); return; } if (!isNrAdvanced()) { // STATE_CONNECTED_NR_ADVANCED -> STATE_CONNECTED transitionWithTimerTo(mNrConnectedState); } else { // STATE_CONNECTED -> STATE_CONNECTED_NR_ADVANCED transitionTo(mNrConnectedState); } mIsNrAdvanced = isNrAdvanced(); } private void handlePcoData(AsyncResult ar) { if (ar.exception != null) { loge("PCO_DATA exception: " + ar.exception); return; } PcoData pcodata = (PcoData) ar.result; if (pcodata == null) { return; } log("EVENT_PCO_DATA_CHANGED: pco data: " + pcodata); DcTracker dcTracker = mPhone.getDcTracker( AccessNetworkConstants.TRANSPORT_TYPE_WWAN); DataConnection dc = dcTracker != null ? dcTracker.getDataConnectionByContextId(pcodata.cid) : null; ApnSetting apnSettings = dc != null ? dc.getApnSetting() : null; if (apnSettings != null && apnSettings.canHandleType(ApnSetting.TYPE_DEFAULT) && mNrAdvancedCapablePcoId > 0 && pcodata.pcoId == mNrAdvancedCapablePcoId ) { log("EVENT_PCO_DATA_CHANGED: Nr Advanced is allowed by PCO."); mIsNrAdvancedAllowedByPco = pcodata.contents[0] == 1; updateNrAdvancedState(); } } } } private final NrConnectedState mNrConnectedState = new NrConnectedState(); private final NrConnectedState mNrConnectedState = new NrConnectedState(); Loading Loading @@ -1084,7 +1129,7 @@ public class NetworkTypeController extends StateMachine { } } private boolean isNrAdvanced() { private boolean isNrAdvanced() { return isNrMmwave() || isAdditionalNrAdvancedBand(); return isNrAdvancedCapable() && (isNrMmwave() || isAdditionalNrAdvancedBand()); } } private boolean isNrMmwave() { private boolean isNrMmwave() { Loading @@ -1108,6 +1153,13 @@ public class NetworkTypeController extends StateMachine { return false; return false; } } private boolean isNrAdvancedCapable() { if (mNrAdvancedCapablePcoId > 0) { return mIsNrAdvancedAllowedByPco; } return true; } private boolean isLte(int rat) { private boolean isLte(int rat) { return rat == TelephonyManager.NETWORK_TYPE_LTE return rat == TelephonyManager.NETWORK_TYPE_LTE || rat == TelephonyManager.NETWORK_TYPE_LTE_CA; || rat == TelephonyManager.NETWORK_TYPE_LTE_CA; Loading Loading @@ -1156,7 +1208,8 @@ public class NetworkTypeController extends StateMachine { + ", mIsSecondaryTimerActive=" + mIsSecondaryTimerActive + ", mIsSecondaryTimerActive=" + mIsSecondaryTimerActive + ", mPrimaryTimerState=" + mPrimaryTimerState + ", mPrimaryTimerState=" + mPrimaryTimerState + ", mSecondaryTimerState=" + mSecondaryTimerState + ", mSecondaryTimerState=" + mSecondaryTimerState + ", mPreviousState=" + mPreviousState; + ", mPreviousState=" + mPreviousState + ", misNrAdvanced=" + isNrAdvanced(); } } @Override @Override Loading @@ -1181,6 +1234,7 @@ public class NetworkTypeController extends StateMachine { pw.println("mPhysicalLinkState=" + mPhysicalLinkState); pw.println("mPhysicalLinkState=" + mPhysicalLinkState); pw.println("mAdditionalNrAdvancedBandsList=" pw.println("mAdditionalNrAdvancedBandsList=" + Arrays.toString(mAdditionalNrAdvancedBandsList)); + Arrays.toString(mAdditionalNrAdvancedBandsList)); pw.println("mNrAdvancedCapablePcoId=" + mNrAdvancedCapablePcoId); pw.decreaseIndent(); pw.decreaseIndent(); pw.flush(); pw.flush(); } } Loading src/java/com/android/internal/telephony/dataconnection/DataConnection.java +4 −1 Original line number Original line Diff line number Diff line Loading @@ -537,7 +537,10 @@ public class DataConnection extends StateMachine { return mCid; return mCid; } } ApnSetting getApnSetting() { /** * @return DataConnection's ApnSetting. */ public ApnSetting getApnSetting() { return mApnSetting; return mApnSetting; } } Loading tests/telephonytests/src/com/android/internal/telephony/NetworkTypeControllerTest.java +96 −0 Original line number Original line Diff line number Diff line Loading @@ -29,14 +29,17 @@ import android.os.Looper; import android.os.PersistableBundle; import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; import android.telephony.CarrierConfigManager; import android.telephony.NetworkRegistrationInfo; import android.telephony.NetworkRegistrationInfo; import android.telephony.PcoData; import android.telephony.PhysicalChannelConfig; import android.telephony.PhysicalChannelConfig; import android.telephony.RadioAccessFamily; import android.telephony.RadioAccessFamily; import android.telephony.ServiceState; import android.telephony.ServiceState; import android.telephony.TelephonyDisplayInfo; import android.telephony.TelephonyDisplayInfo; import android.telephony.TelephonyManager; import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper; import com.android.internal.telephony.dataconnection.DataConnection; import com.android.internal.telephony.dataconnection.DcController; import com.android.internal.telephony.dataconnection.DcController; import com.android.internal.util.IState; import com.android.internal.util.IState; import com.android.internal.util.StateMachine; import com.android.internal.util.StateMachine; Loading @@ -45,6 +48,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Before; import org.junit.Test; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runner.RunWith; import org.mockito.Mock; import java.lang.reflect.Method; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.ArrayList; Loading @@ -66,9 +70,14 @@ public class NetworkTypeControllerTest extends TelephonyTest { private static final int EVENT_PREFERRED_NETWORK_MODE_CHANGED = 11; private static final int EVENT_PREFERRED_NETWORK_MODE_CHANGED = 11; private static final int EVENT_INITIALIZE = 12; private static final int EVENT_INITIALIZE = 12; private static final int EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED = 13; private static final int EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED = 13; private static final int EVENT_PCO_DATA_CHANGED = 14; private NetworkTypeController mNetworkTypeController; private NetworkTypeController mNetworkTypeController; private PersistableBundle mBundle; private PersistableBundle mBundle; @Mock DataConnection mDataConnection; @Mock ApnSetting mApnSetting; private IState getCurrentState() throws Exception { private IState getCurrentState() throws Exception { Method method = StateMachine.class.getDeclaredMethod("getCurrentState"); Method method = StateMachine.class.getDeclaredMethod("getCurrentState"); Loading Loading @@ -390,6 +399,93 @@ public class NetworkTypeControllerTest extends TelephonyTest { assertEquals("connected", getCurrentState().getName()); assertEquals("connected", getCurrentState().getName()); } } @Test public void testTransitionToCurrentStateNrConnectedWithNrAdvancedCapable() throws Exception { assertEquals("DefaultState", getCurrentState().getName()); doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType(); doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState(); doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange(); mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0); broadcastCarrierConfigs(); mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE); processAllMessages(); assertEquals("connected_mmwave", getCurrentState().getName()); } @Test public void testTransitionToCurrentStateNrConnectedWithPcoAndNoNrAdvancedCapable() throws Exception { assertEquals("DefaultState", getCurrentState().getName()); doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType(); doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState(); doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange(); mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03); broadcastCarrierConfigs(); int cid = 1; byte[] contents = new byte[]{0}; doReturn(mDataConnection).when(mDcTracker).getDataConnectionByContextId(cid); doReturn(mApnSetting).when(mDataConnection).getApnSetting(); doReturn(true).when(mApnSetting).canHandleType(ApnSetting.TYPE_DEFAULT); mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03); broadcastCarrierConfigs(); mNetworkTypeController.sendMessage(EVENT_PCO_DATA_CHANGED, new AsyncResult(null, new PcoData(cid, "", 0xff03, contents), null)); mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE); processAllMessages(); assertEquals("connected", getCurrentState().getName()); } @Test public void testTransitionToCurrentStateNrConnectedWithWrongPcoAndNoNrAdvancedCapable() throws Exception { assertEquals("DefaultState", getCurrentState().getName()); doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType(); doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState(); doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange(); mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03); broadcastCarrierConfigs(); int cid = 1; byte[] contents = new byte[]{1}; doReturn(mDataConnection).when(mDcTracker).getDataConnectionByContextId(cid); doReturn(mApnSetting).when(mDataConnection).getApnSetting(); doReturn(true).when(mApnSetting).canHandleType(ApnSetting.TYPE_DEFAULT); mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF00); broadcastCarrierConfigs(); mNetworkTypeController.sendMessage(EVENT_PCO_DATA_CHANGED, new AsyncResult(null, new PcoData(cid, "", 0xff03, contents), null)); mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE); processAllMessages(); assertEquals("connected", getCurrentState().getName()); } @Test public void testTransitionToCurrentStateNrConnectedWithNrAdvancedCapableAndPco() throws Exception { assertEquals("DefaultState", getCurrentState().getName()); doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType(); doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState(); doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange(); int cid = 1; byte[] contents = new byte[]{1}; doReturn(mDataConnection).when(mDcTracker).getDataConnectionByContextId(cid); doReturn(mApnSetting).when(mDataConnection).getApnSetting(); doReturn(true).when(mApnSetting).canHandleType(ApnSetting.TYPE_DEFAULT); mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03); broadcastCarrierConfigs(); mNetworkTypeController.sendMessage(EVENT_PCO_DATA_CHANGED, new AsyncResult(null, new PcoData(cid, "", 0xff03, contents), null)); mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE); processAllMessages(); assertEquals("connected_mmwave", getCurrentState().getName()); } @Test @Test public void testEventDataRatChanged() throws Exception { public void testEventDataRatChanged() throws Exception { testTransitionToCurrentStateLegacy(); testTransitionToCurrentStateLegacy(); Loading Loading
src/java/com/android/internal/telephony/NetworkTypeController.java +70 −16 Original line number Original line Diff line number Diff line Loading @@ -27,15 +27,19 @@ import android.telephony.AccessNetworkConstants; import android.telephony.Annotation; import android.telephony.Annotation; import android.telephony.CarrierConfigManager; import android.telephony.CarrierConfigManager; import android.telephony.NetworkRegistrationInfo; import android.telephony.NetworkRegistrationInfo; import android.telephony.PcoData; import android.telephony.PhysicalChannelConfig; import android.telephony.PhysicalChannelConfig; import android.telephony.ServiceState; import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager; import android.telephony.TelephonyDisplayInfo; import android.telephony.TelephonyDisplayInfo; import android.telephony.TelephonyManager; import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; import android.text.TextUtils; import android.text.TextUtils; import com.android.internal.telephony.dataconnection.DataConnection; import com.android.internal.telephony.dataconnection.DcController; import com.android.internal.telephony.dataconnection.DcController; import com.android.internal.telephony.dataconnection.DcController.PhysicalLinkState; import com.android.internal.telephony.dataconnection.DcController.PhysicalLinkState; import com.android.internal.telephony.dataconnection.DcTracker; import com.android.internal.telephony.util.ArrayUtils; import com.android.internal.telephony.util.ArrayUtils; import com.android.internal.util.IState; import com.android.internal.util.IState; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.IndentingPrintWriter; Loading Loading @@ -93,8 +97,9 @@ public class NetworkTypeController extends StateMachine { private static final int EVENT_PREFERRED_NETWORK_MODE_CHANGED = 11; private static final int EVENT_PREFERRED_NETWORK_MODE_CHANGED = 11; private static final int EVENT_INITIALIZE = 12; private static final int EVENT_INITIALIZE = 12; private static final int EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED = 13; private static final int EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED = 13; private static final int EVENT_PCO_DATA_CHANGED = 14; private static final String[] sEvents = new String[EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED + 1]; private static final String[] sEvents = new String[EVENT_PCO_DATA_CHANGED + 1]; static { static { sEvents[EVENT_UPDATE] = "EVENT_UPDATE"; sEvents[EVENT_UPDATE] = "EVENT_UPDATE"; sEvents[EVENT_QUIT] = "EVENT_QUIT"; sEvents[EVENT_QUIT] = "EVENT_QUIT"; Loading @@ -111,6 +116,7 @@ public class NetworkTypeController extends StateMachine { sEvents[EVENT_PREFERRED_NETWORK_MODE_CHANGED] = "EVENT_PREFERRED_NETWORK_MODE_CHANGED"; sEvents[EVENT_PREFERRED_NETWORK_MODE_CHANGED] = "EVENT_PREFERRED_NETWORK_MODE_CHANGED"; sEvents[EVENT_INITIALIZE] = "EVENT_INITIALIZE"; sEvents[EVENT_INITIALIZE] = "EVENT_INITIALIZE"; sEvents[EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED] = "EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED"; sEvents[EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED] = "EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED"; sEvents[EVENT_PCO_DATA_CHANGED] = "EVENT_PCO_DATA_CHANGED"; } } private final Phone mPhone; private final Phone mPhone; Loading Loading @@ -142,6 +148,8 @@ public class NetworkTypeController extends StateMachine { private String mPreviousState; private String mPreviousState; private @PhysicalLinkState int mPhysicalLinkState; private @PhysicalLinkState int mPhysicalLinkState; private boolean mIsPhysicalChannelConfig16Supported; private boolean mIsPhysicalChannelConfig16Supported; private Boolean mIsNrAdvancedAllowedByPco = false; private int mNrAdvancedCapablePcoId = 0; /** /** * NetworkTypeController constructor. * NetworkTypeController constructor. Loading Loading @@ -208,6 +216,7 @@ public class NetworkTypeController extends StateMachine { IntentFilter filter = new IntentFilter(); IntentFilter filter = new IntentFilter(); filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone); mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone); mPhone.mCi.registerForPcoData(getHandler(), EVENT_PCO_DATA_CHANGED, null); } } private void unRegisterForAllEvents() { private void unRegisterForAllEvents() { Loading @@ -219,6 +228,7 @@ public class NetworkTypeController extends StateMachine { mPhone.getServiceStateTracker().unregisterForNrFrequencyChanged(getHandler()); mPhone.getServiceStateTracker().unregisterForNrFrequencyChanged(getHandler()); mPhone.getDeviceStateMonitor().unregisterForPhysicalChannelConfigNotifChanged(getHandler()); mPhone.getDeviceStateMonitor().unregisterForPhysicalChannelConfigNotifChanged(getHandler()); mPhone.getContext().unregisterReceiver(mIntentReceiver); mPhone.getContext().unregisterReceiver(mIntentReceiver); mPhone.mCi.unregisterForPcoData(getHandler()); } } private void parseCarrierConfigs() { private void parseCarrierConfigs() { Loading Loading @@ -267,6 +277,8 @@ public class NetworkTypeController extends StateMachine { mLtePlusThresholdBandwidth); mLtePlusThresholdBandwidth); mAdditionalNrAdvancedBandsList = b.getIntArray( mAdditionalNrAdvancedBandsList = b.getIntArray( CarrierConfigManager.KEY_ADDITIONAL_NR_ADVANCED_BANDS_INT_ARRAY); CarrierConfigManager.KEY_ADDITIONAL_NR_ADVANCED_BANDS_INT_ARRAY); mNrAdvancedCapablePcoId = b.getInt( CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT); } } } } createTimerRules(nrIconConfiguration, overrideTimerRule, overrideSecondaryTimerRule); createTimerRules(nrIconConfiguration, overrideTimerRule, overrideSecondaryTimerRule); Loading Loading @@ -486,6 +498,7 @@ public class NetworkTypeController extends StateMachine { case EVENT_DATA_RAT_CHANGED: case EVENT_DATA_RAT_CHANGED: case EVENT_NR_STATE_CHANGED: case EVENT_NR_STATE_CHANGED: case EVENT_NR_FREQUENCY_CHANGED: case EVENT_NR_FREQUENCY_CHANGED: case EVENT_PCO_DATA_CHANGED: // ignored // ignored break; break; case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED: case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED: Loading Loading @@ -841,24 +854,15 @@ public class NetworkTypeController extends StateMachine { transitionWithTimerTo(mLegacyState); transitionWithTimerTo(mLegacyState); } } break; break; case EVENT_PCO_DATA_CHANGED: handlePcoData((AsyncResult) msg.obj); break; case EVENT_NR_FREQUENCY_CHANGED: case EVENT_NR_FREQUENCY_CHANGED: case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED: case EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED: if (mIsPhysicalChannelConfig16Supported) { if (mIsPhysicalChannelConfig16Supported) { mPhysicalLinkState = getPhysicalLinkStateFromPhysicalChannelConfig(); mPhysicalLinkState = getPhysicalLinkStateFromPhysicalChannelConfig(); } } if (!isNrConnected()) { updateNrAdvancedState(); log("NR state changed. Sending EVENT_NR_STATE_CHANGED"); sendMessage(EVENT_NR_STATE_CHANGED); break; } if (!isNrAdvanced()) { // STATE_CONNECTED_NR_ADVANCED -> STATE_CONNECTED transitionWithTimerTo(mNrConnectedState); } else { // STATE_CONNECTED -> STATE_CONNECTED_NR_ADVANCED transitionTo(mNrConnectedState); } mIsNrAdvanced = isNrAdvanced(); break; break; case EVENT_PHYSICAL_LINK_STATE_CHANGED: case EVENT_PHYSICAL_LINK_STATE_CHANGED: AsyncResult ar = (AsyncResult) msg.obj; AsyncResult ar = (AsyncResult) msg.obj; Loading @@ -881,6 +885,47 @@ public class NetworkTypeController extends StateMachine { public String getName() { public String getName() { return mIsNrAdvanced ? STATE_CONNECTED_NR_ADVANCED : STATE_CONNECTED; return mIsNrAdvanced ? STATE_CONNECTED_NR_ADVANCED : STATE_CONNECTED; } } private void updateNrAdvancedState() { if (!isNrConnected()) { log("NR state changed. Sending EVENT_NR_STATE_CHANGED"); sendMessage(EVENT_NR_STATE_CHANGED); return; } if (!isNrAdvanced()) { // STATE_CONNECTED_NR_ADVANCED -> STATE_CONNECTED transitionWithTimerTo(mNrConnectedState); } else { // STATE_CONNECTED -> STATE_CONNECTED_NR_ADVANCED transitionTo(mNrConnectedState); } mIsNrAdvanced = isNrAdvanced(); } private void handlePcoData(AsyncResult ar) { if (ar.exception != null) { loge("PCO_DATA exception: " + ar.exception); return; } PcoData pcodata = (PcoData) ar.result; if (pcodata == null) { return; } log("EVENT_PCO_DATA_CHANGED: pco data: " + pcodata); DcTracker dcTracker = mPhone.getDcTracker( AccessNetworkConstants.TRANSPORT_TYPE_WWAN); DataConnection dc = dcTracker != null ? dcTracker.getDataConnectionByContextId(pcodata.cid) : null; ApnSetting apnSettings = dc != null ? dc.getApnSetting() : null; if (apnSettings != null && apnSettings.canHandleType(ApnSetting.TYPE_DEFAULT) && mNrAdvancedCapablePcoId > 0 && pcodata.pcoId == mNrAdvancedCapablePcoId ) { log("EVENT_PCO_DATA_CHANGED: Nr Advanced is allowed by PCO."); mIsNrAdvancedAllowedByPco = pcodata.contents[0] == 1; updateNrAdvancedState(); } } } } private final NrConnectedState mNrConnectedState = new NrConnectedState(); private final NrConnectedState mNrConnectedState = new NrConnectedState(); Loading Loading @@ -1084,7 +1129,7 @@ public class NetworkTypeController extends StateMachine { } } private boolean isNrAdvanced() { private boolean isNrAdvanced() { return isNrMmwave() || isAdditionalNrAdvancedBand(); return isNrAdvancedCapable() && (isNrMmwave() || isAdditionalNrAdvancedBand()); } } private boolean isNrMmwave() { private boolean isNrMmwave() { Loading @@ -1108,6 +1153,13 @@ public class NetworkTypeController extends StateMachine { return false; return false; } } private boolean isNrAdvancedCapable() { if (mNrAdvancedCapablePcoId > 0) { return mIsNrAdvancedAllowedByPco; } return true; } private boolean isLte(int rat) { private boolean isLte(int rat) { return rat == TelephonyManager.NETWORK_TYPE_LTE return rat == TelephonyManager.NETWORK_TYPE_LTE || rat == TelephonyManager.NETWORK_TYPE_LTE_CA; || rat == TelephonyManager.NETWORK_TYPE_LTE_CA; Loading Loading @@ -1156,7 +1208,8 @@ public class NetworkTypeController extends StateMachine { + ", mIsSecondaryTimerActive=" + mIsSecondaryTimerActive + ", mIsSecondaryTimerActive=" + mIsSecondaryTimerActive + ", mPrimaryTimerState=" + mPrimaryTimerState + ", mPrimaryTimerState=" + mPrimaryTimerState + ", mSecondaryTimerState=" + mSecondaryTimerState + ", mSecondaryTimerState=" + mSecondaryTimerState + ", mPreviousState=" + mPreviousState; + ", mPreviousState=" + mPreviousState + ", misNrAdvanced=" + isNrAdvanced(); } } @Override @Override Loading @@ -1181,6 +1234,7 @@ public class NetworkTypeController extends StateMachine { pw.println("mPhysicalLinkState=" + mPhysicalLinkState); pw.println("mPhysicalLinkState=" + mPhysicalLinkState); pw.println("mAdditionalNrAdvancedBandsList=" pw.println("mAdditionalNrAdvancedBandsList=" + Arrays.toString(mAdditionalNrAdvancedBandsList)); + Arrays.toString(mAdditionalNrAdvancedBandsList)); pw.println("mNrAdvancedCapablePcoId=" + mNrAdvancedCapablePcoId); pw.decreaseIndent(); pw.decreaseIndent(); pw.flush(); pw.flush(); } } Loading
src/java/com/android/internal/telephony/dataconnection/DataConnection.java +4 −1 Original line number Original line Diff line number Diff line Loading @@ -537,7 +537,10 @@ public class DataConnection extends StateMachine { return mCid; return mCid; } } ApnSetting getApnSetting() { /** * @return DataConnection's ApnSetting. */ public ApnSetting getApnSetting() { return mApnSetting; return mApnSetting; } } Loading
tests/telephonytests/src/com/android/internal/telephony/NetworkTypeControllerTest.java +96 −0 Original line number Original line Diff line number Diff line Loading @@ -29,14 +29,17 @@ import android.os.Looper; import android.os.PersistableBundle; import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; import android.telephony.CarrierConfigManager; import android.telephony.NetworkRegistrationInfo; import android.telephony.NetworkRegistrationInfo; import android.telephony.PcoData; import android.telephony.PhysicalChannelConfig; import android.telephony.PhysicalChannelConfig; import android.telephony.RadioAccessFamily; import android.telephony.RadioAccessFamily; import android.telephony.ServiceState; import android.telephony.ServiceState; import android.telephony.TelephonyDisplayInfo; import android.telephony.TelephonyDisplayInfo; import android.telephony.TelephonyManager; import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper; import com.android.internal.telephony.dataconnection.DataConnection; import com.android.internal.telephony.dataconnection.DcController; import com.android.internal.telephony.dataconnection.DcController; import com.android.internal.util.IState; import com.android.internal.util.IState; import com.android.internal.util.StateMachine; import com.android.internal.util.StateMachine; Loading @@ -45,6 +48,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Before; import org.junit.Test; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runner.RunWith; import org.mockito.Mock; import java.lang.reflect.Method; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.ArrayList; Loading @@ -66,9 +70,14 @@ public class NetworkTypeControllerTest extends TelephonyTest { private static final int EVENT_PREFERRED_NETWORK_MODE_CHANGED = 11; private static final int EVENT_PREFERRED_NETWORK_MODE_CHANGED = 11; private static final int EVENT_INITIALIZE = 12; private static final int EVENT_INITIALIZE = 12; private static final int EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED = 13; private static final int EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED = 13; private static final int EVENT_PCO_DATA_CHANGED = 14; private NetworkTypeController mNetworkTypeController; private NetworkTypeController mNetworkTypeController; private PersistableBundle mBundle; private PersistableBundle mBundle; @Mock DataConnection mDataConnection; @Mock ApnSetting mApnSetting; private IState getCurrentState() throws Exception { private IState getCurrentState() throws Exception { Method method = StateMachine.class.getDeclaredMethod("getCurrentState"); Method method = StateMachine.class.getDeclaredMethod("getCurrentState"); Loading Loading @@ -390,6 +399,93 @@ public class NetworkTypeControllerTest extends TelephonyTest { assertEquals("connected", getCurrentState().getName()); assertEquals("connected", getCurrentState().getName()); } } @Test public void testTransitionToCurrentStateNrConnectedWithNrAdvancedCapable() throws Exception { assertEquals("DefaultState", getCurrentState().getName()); doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType(); doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState(); doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange(); mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0); broadcastCarrierConfigs(); mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE); processAllMessages(); assertEquals("connected_mmwave", getCurrentState().getName()); } @Test public void testTransitionToCurrentStateNrConnectedWithPcoAndNoNrAdvancedCapable() throws Exception { assertEquals("DefaultState", getCurrentState().getName()); doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType(); doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState(); doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange(); mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03); broadcastCarrierConfigs(); int cid = 1; byte[] contents = new byte[]{0}; doReturn(mDataConnection).when(mDcTracker).getDataConnectionByContextId(cid); doReturn(mApnSetting).when(mDataConnection).getApnSetting(); doReturn(true).when(mApnSetting).canHandleType(ApnSetting.TYPE_DEFAULT); mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03); broadcastCarrierConfigs(); mNetworkTypeController.sendMessage(EVENT_PCO_DATA_CHANGED, new AsyncResult(null, new PcoData(cid, "", 0xff03, contents), null)); mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE); processAllMessages(); assertEquals("connected", getCurrentState().getName()); } @Test public void testTransitionToCurrentStateNrConnectedWithWrongPcoAndNoNrAdvancedCapable() throws Exception { assertEquals("DefaultState", getCurrentState().getName()); doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType(); doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState(); doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange(); mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03); broadcastCarrierConfigs(); int cid = 1; byte[] contents = new byte[]{1}; doReturn(mDataConnection).when(mDcTracker).getDataConnectionByContextId(cid); doReturn(mApnSetting).when(mDataConnection).getApnSetting(); doReturn(true).when(mApnSetting).canHandleType(ApnSetting.TYPE_DEFAULT); mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF00); broadcastCarrierConfigs(); mNetworkTypeController.sendMessage(EVENT_PCO_DATA_CHANGED, new AsyncResult(null, new PcoData(cid, "", 0xff03, contents), null)); mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE); processAllMessages(); assertEquals("connected", getCurrentState().getName()); } @Test public void testTransitionToCurrentStateNrConnectedWithNrAdvancedCapableAndPco() throws Exception { assertEquals("DefaultState", getCurrentState().getName()); doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType(); doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState(); doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange(); int cid = 1; byte[] contents = new byte[]{1}; doReturn(mDataConnection).when(mDcTracker).getDataConnectionByContextId(cid); doReturn(mApnSetting).when(mDataConnection).getApnSetting(); doReturn(true).when(mApnSetting).canHandleType(ApnSetting.TYPE_DEFAULT); mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT, 0xFF03); broadcastCarrierConfigs(); mNetworkTypeController.sendMessage(EVENT_PCO_DATA_CHANGED, new AsyncResult(null, new PcoData(cid, "", 0xff03, contents), null)); mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE); processAllMessages(); assertEquals("connected_mmwave", getCurrentState().getName()); } @Test @Test public void testEventDataRatChanged() throws Exception { public void testEventDataRatChanged() throws Exception { testTransitionToCurrentStateLegacy(); testTransitionToCurrentStateLegacy(); Loading