Loading src/java/com/android/internal/telephony/dataconnection/DataConnection.java +42 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static android.net.NetworkPolicyManager.OVERRIDE_UNMETERED; import android.annotation.IntDef; import android.annotation.Nullable; import android.app.PendingIntent; import android.content.Context; import android.net.ConnectivityManager; import android.net.KeepalivePacketData; import android.net.LinkAddress; Loading @@ -38,11 +39,13 @@ import android.net.SocketKeepalive; import android.net.StringNetworkSpecifier; import android.os.AsyncResult; import android.os.Message; import android.os.PersistableBundle; import android.os.SystemClock; import android.os.SystemProperties; import android.provider.Telephony; import android.telephony.AccessNetworkConstants; import android.telephony.AccessNetworkConstants.TransportType; import android.telephony.CarrierConfigManager; import android.telephony.DataFailCause; import android.telephony.NetworkRegistrationInfo; import android.telephony.Rlog; Loading @@ -50,6 +53,7 @@ import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; import android.telephony.data.ApnSetting.ApnType; import android.telephony.data.DataCallResponse; import android.telephony.data.DataProfile; import android.telephony.data.DataService; Loading Loading @@ -1958,6 +1962,12 @@ public class DataConnection extends StateMachine { log("Transfer network agent successfully."); mNetworkAgent = mHandoverSourceNetworkAgent; mNetworkAgent.acquireOwnership(DataConnection.this, mTransportType); // TODO: Should evaluate mDisabledApnTypeBitMask again after handover. We don't // do it now because connectivity service does not support dynamically removing // immutable capabilities. // Update the capability after handover mNetworkAgent.sendNetworkCapabilities(getNetworkCapabilities(), DataConnection.this); mNetworkAgent.sendLinkProperties(mLinkProperties, DataConnection.this); Loading @@ -1972,6 +1982,9 @@ public class DataConnection extends StateMachine { mPhone.getPhoneId()); final int factorySerialNumber = (null == factory) ? NetworkFactory.SerialNumber.NONE : factory.getSerialNumber(); mDisabledApnTypeBitMask |= getDisallowedApnTypes(); mNetworkAgent = DcNetworkAgent.createDcNetworkAgent(DataConnection.this, mPhone, mNetworkInfo, mScore, misc, factorySerialNumber, mTransportType); } Loading Loading @@ -2727,6 +2740,33 @@ public class DataConnection extends StateMachine { == NetworkRegistrationInfo.NR_STATE_CONNECTED; } /** * @return The disallowed APN types bitmask */ private @ApnType int getDisallowedApnTypes() { CarrierConfigManager configManager = (CarrierConfigManager) mPhone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE); int apnTypesBitmask = 0; if (configManager != null) { PersistableBundle bundle = configManager.getConfigForSubId(mSubId); if (bundle != null) { String key = (mTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) ? CarrierConfigManager.KEY_CARRIER_WWAN_DISALLOWED_APN_TYPES_STRING_ARRAY : CarrierConfigManager.KEY_CARRIER_WLAN_DISALLOWED_APN_TYPES_STRING_ARRAY; if (bundle.getStringArray(key) != null) { String disallowedApnTypesString = TextUtils.join(",", bundle.getStringArray(key)); if (!TextUtils.isEmpty(disallowedApnTypesString)) { apnTypesBitmask = ApnSetting.getApnTypesBitmaskFromString( disallowedApnTypesString); } } } } return apnTypesBitmask; } private void dumpToLog() { dump(null, new PrintWriter(new StringWriter(0)) { @Override Loading Loading @@ -2811,6 +2851,8 @@ public class DataConnection extends StateMachine { pw.println("mSubscriptionOverride=" + Integer.toHexString(mSubscriptionOverride)); pw.println("mRestrictedNetworkOverride=" + mRestrictedNetworkOverride); pw.println("mUnmeteredUseOnly=" + mUnmeteredUseOnly); pw.println("disallowedApnTypes=" + ApnSetting.getApnTypesStringFromBitmask(getDisallowedApnTypes())); pw.println("mInstanceNumber=" + mInstanceNumber); pw.println("mAc=" + mAc); pw.println("mScore=" + mScore); Loading tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataConnectionTest.java +23 −1 Original line number Diff line number Diff line Loading @@ -506,6 +506,12 @@ public class DataConnectionTest extends TelephonyTest { return (NetworkCapabilities) method.invoke(mDc); } private int getDisallowedApnTypes() throws Exception { Method method = DataConnection.class.getDeclaredMethod("getDisallowedApnTypes"); method.setAccessible(true); return (int) method.invoke(mDc); } @Test @SmallTest public void testNetworkCapability() throws Exception { Loading @@ -522,6 +528,10 @@ public class DataConnectionTest extends TelephonyTest { assertFalse("capabilities: " + getNetworkCapabilities(), getNetworkCapabilities() .hasCapability(NetworkCapabilities.NET_CAPABILITY_MMS)); mContextFixture.getCarrierConfigBundle().putStringArray( CarrierConfigManager.KEY_CARRIER_WWAN_DISALLOWED_APN_TYPES_STRING_ARRAY, new String[] {"supl"}); mDc.sendMessage(DataConnection.EVENT_DISCONNECT, mDcp); waitForMs(100); doReturn(mApn1).when(mApnContext).getApnSetting(); Loading @@ -532,7 +542,7 @@ public class DataConnectionTest extends TelephonyTest { .hasCapability(NetworkCapabilities.NET_CAPABILITY_DUN)); assertTrue("capabilities: " + getNetworkCapabilities(), getNetworkCapabilities() .hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)); assertTrue("capabilities: " + getNetworkCapabilities(), getNetworkCapabilities() assertFalse("capabilities: " + getNetworkCapabilities(), getNetworkCapabilities() .hasCapability(NetworkCapabilities.NET_CAPABILITY_SUPL)); } Loading Loading @@ -932,4 +942,16 @@ public class DataConnectionTest extends TelephonyTest { assertTrue(isUnmeteredUseOnly()); } @Test @SmallTest public void testGetDisallowedApnTypes() throws Exception { mContextFixture.getCarrierConfigBundle().putStringArray( CarrierConfigManager.KEY_CARRIER_WWAN_DISALLOWED_APN_TYPES_STRING_ARRAY, new String[] { "mms", "supl", "fota" }); testConnectEvent(); assertEquals(ApnSetting.TYPE_MMS | ApnSetting.TYPE_SUPL | ApnSetting.TYPE_FOTA, getDisallowedApnTypes()); } } Loading
src/java/com/android/internal/telephony/dataconnection/DataConnection.java +42 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static android.net.NetworkPolicyManager.OVERRIDE_UNMETERED; import android.annotation.IntDef; import android.annotation.Nullable; import android.app.PendingIntent; import android.content.Context; import android.net.ConnectivityManager; import android.net.KeepalivePacketData; import android.net.LinkAddress; Loading @@ -38,11 +39,13 @@ import android.net.SocketKeepalive; import android.net.StringNetworkSpecifier; import android.os.AsyncResult; import android.os.Message; import android.os.PersistableBundle; import android.os.SystemClock; import android.os.SystemProperties; import android.provider.Telephony; import android.telephony.AccessNetworkConstants; import android.telephony.AccessNetworkConstants.TransportType; import android.telephony.CarrierConfigManager; import android.telephony.DataFailCause; import android.telephony.NetworkRegistrationInfo; import android.telephony.Rlog; Loading @@ -50,6 +53,7 @@ import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; import android.telephony.data.ApnSetting.ApnType; import android.telephony.data.DataCallResponse; import android.telephony.data.DataProfile; import android.telephony.data.DataService; Loading Loading @@ -1958,6 +1962,12 @@ public class DataConnection extends StateMachine { log("Transfer network agent successfully."); mNetworkAgent = mHandoverSourceNetworkAgent; mNetworkAgent.acquireOwnership(DataConnection.this, mTransportType); // TODO: Should evaluate mDisabledApnTypeBitMask again after handover. We don't // do it now because connectivity service does not support dynamically removing // immutable capabilities. // Update the capability after handover mNetworkAgent.sendNetworkCapabilities(getNetworkCapabilities(), DataConnection.this); mNetworkAgent.sendLinkProperties(mLinkProperties, DataConnection.this); Loading @@ -1972,6 +1982,9 @@ public class DataConnection extends StateMachine { mPhone.getPhoneId()); final int factorySerialNumber = (null == factory) ? NetworkFactory.SerialNumber.NONE : factory.getSerialNumber(); mDisabledApnTypeBitMask |= getDisallowedApnTypes(); mNetworkAgent = DcNetworkAgent.createDcNetworkAgent(DataConnection.this, mPhone, mNetworkInfo, mScore, misc, factorySerialNumber, mTransportType); } Loading Loading @@ -2727,6 +2740,33 @@ public class DataConnection extends StateMachine { == NetworkRegistrationInfo.NR_STATE_CONNECTED; } /** * @return The disallowed APN types bitmask */ private @ApnType int getDisallowedApnTypes() { CarrierConfigManager configManager = (CarrierConfigManager) mPhone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE); int apnTypesBitmask = 0; if (configManager != null) { PersistableBundle bundle = configManager.getConfigForSubId(mSubId); if (bundle != null) { String key = (mTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) ? CarrierConfigManager.KEY_CARRIER_WWAN_DISALLOWED_APN_TYPES_STRING_ARRAY : CarrierConfigManager.KEY_CARRIER_WLAN_DISALLOWED_APN_TYPES_STRING_ARRAY; if (bundle.getStringArray(key) != null) { String disallowedApnTypesString = TextUtils.join(",", bundle.getStringArray(key)); if (!TextUtils.isEmpty(disallowedApnTypesString)) { apnTypesBitmask = ApnSetting.getApnTypesBitmaskFromString( disallowedApnTypesString); } } } } return apnTypesBitmask; } private void dumpToLog() { dump(null, new PrintWriter(new StringWriter(0)) { @Override Loading Loading @@ -2811,6 +2851,8 @@ public class DataConnection extends StateMachine { pw.println("mSubscriptionOverride=" + Integer.toHexString(mSubscriptionOverride)); pw.println("mRestrictedNetworkOverride=" + mRestrictedNetworkOverride); pw.println("mUnmeteredUseOnly=" + mUnmeteredUseOnly); pw.println("disallowedApnTypes=" + ApnSetting.getApnTypesStringFromBitmask(getDisallowedApnTypes())); pw.println("mInstanceNumber=" + mInstanceNumber); pw.println("mAc=" + mAc); pw.println("mScore=" + mScore); Loading
tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataConnectionTest.java +23 −1 Original line number Diff line number Diff line Loading @@ -506,6 +506,12 @@ public class DataConnectionTest extends TelephonyTest { return (NetworkCapabilities) method.invoke(mDc); } private int getDisallowedApnTypes() throws Exception { Method method = DataConnection.class.getDeclaredMethod("getDisallowedApnTypes"); method.setAccessible(true); return (int) method.invoke(mDc); } @Test @SmallTest public void testNetworkCapability() throws Exception { Loading @@ -522,6 +528,10 @@ public class DataConnectionTest extends TelephonyTest { assertFalse("capabilities: " + getNetworkCapabilities(), getNetworkCapabilities() .hasCapability(NetworkCapabilities.NET_CAPABILITY_MMS)); mContextFixture.getCarrierConfigBundle().putStringArray( CarrierConfigManager.KEY_CARRIER_WWAN_DISALLOWED_APN_TYPES_STRING_ARRAY, new String[] {"supl"}); mDc.sendMessage(DataConnection.EVENT_DISCONNECT, mDcp); waitForMs(100); doReturn(mApn1).when(mApnContext).getApnSetting(); Loading @@ -532,7 +542,7 @@ public class DataConnectionTest extends TelephonyTest { .hasCapability(NetworkCapabilities.NET_CAPABILITY_DUN)); assertTrue("capabilities: " + getNetworkCapabilities(), getNetworkCapabilities() .hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)); assertTrue("capabilities: " + getNetworkCapabilities(), getNetworkCapabilities() assertFalse("capabilities: " + getNetworkCapabilities(), getNetworkCapabilities() .hasCapability(NetworkCapabilities.NET_CAPABILITY_SUPL)); } Loading Loading @@ -932,4 +942,16 @@ public class DataConnectionTest extends TelephonyTest { assertTrue(isUnmeteredUseOnly()); } @Test @SmallTest public void testGetDisallowedApnTypes() throws Exception { mContextFixture.getCarrierConfigBundle().putStringArray( CarrierConfigManager.KEY_CARRIER_WWAN_DISALLOWED_APN_TYPES_STRING_ARRAY, new String[] { "mms", "supl", "fota" }); testConnectEvent(); assertEquals(ApnSetting.TYPE_MMS | ApnSetting.TYPE_SUPL | ApnSetting.TYPE_FOTA, getDisallowedApnTypes()); } }