Loading src/java/com/android/internal/telephony/DefaultPhoneNotifier.java +3 −1 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.telephony.Rlog; import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; import java.util.List; Loading Loading @@ -182,7 +183,8 @@ public class DefaultPhoneNotifier implements PhoneNotifier { if (mRegistry != null) { mRegistry.notifyDataConnectionForSubscriber(subId, PhoneConstantConversions.convertDataState(state), sender.isDataAllowed(), reason, sender.isDataAllowed(ApnSetting.getApnTypesBitmaskFromString(apnType)), reason, sender.getActiveApnHost(apnType), apnType, linkProperties, Loading src/java/com/android/internal/telephony/GsmCdmaCallTracker.java +10 −4 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.os.PersistableBundle; import android.os.Registrant; import android.os.RegistrantList; import android.os.SystemProperties; import android.telephony.AccessNetworkConstants.TransportType; import android.telephony.CarrierConfigManager; import android.telephony.CellLocation; import android.telephony.DisconnectCause; Loading Loading @@ -172,8 +173,9 @@ public class GsmCdmaCallTracker extends CallTracker { mCi.unregisterForCallWaitingInfo(this); // Prior to phone switch to GSM, if CDMA has any emergency call // data will be in disabled state, after switching to GSM enable data. if (mIsInEmergencyCall) { mPhone.mDcTracker.setInternalDataEnabled(true); if (mIsInEmergencyCall && mPhone.getDcTracker(TransportType.WWAN) != null) { mPhone.getDcTracker(TransportType.WWAN).setInternalDataEnabled(true); } } else { mConnections = new GsmCdmaConnection[MAX_CONNECTIONS_CDMA]; Loading Loading @@ -372,7 +374,9 @@ public class GsmCdmaCallTracker extends CallTracker { //CDMA public void setIsInEmergencyCall() { mIsInEmergencyCall = true; mPhone.mDcTracker.setInternalDataEnabled(false); if (mPhone.getDcTracker(TransportType.WWAN) != null) { mPhone.getDcTracker(TransportType.WWAN).setInternalDataEnabled(false); } mPhone.notifyEmergencyCallRegistrants(true); mPhone.sendEmergencyCallStateChange(true); } Loading Loading @@ -1628,7 +1632,9 @@ public class GsmCdmaCallTracker extends CallTracker { } if (!inEcm) { // Re-initiate data connection mPhone.mDcTracker.setInternalDataEnabled(true); if (mPhone.getDcTracker(TransportType.WWAN) != null) { mPhone.getDcTracker(TransportType.WWAN).setInternalDataEnabled(true); } mPhone.notifyEmergencyCallRegistrants(false); } mPhone.sendEmergencyCallStateChange(false); Loading src/java/com/android/internal/telephony/GsmCdmaPhone.java +50 −24 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ import android.preference.PreferenceManager; import android.provider.Settings; import android.provider.Telephony; import android.telecom.VideoProfile; import android.telephony.AccessNetworkConstants.TransportType; import android.telephony.CarrierConfigManager; import android.telephony.CellLocation; import android.telephony.ImsiEncryptionInfo; Loading @@ -66,6 +67,7 @@ import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.UssdResponse; import android.telephony.data.ApnSetting; import android.text.TextUtils; import android.util.Log; import android.util.Pair; Loading Loading @@ -227,7 +229,11 @@ public class GsmCdmaPhone extends Phone { mTransportManager = mTelephonyComponentFactory.makeTransportManager(this); mSST = mTelephonyComponentFactory.makeServiceStateTracker(this, this.mCi); // DcTracker uses SST so needs to be created after it is instantiated mDcTracker = mTelephonyComponentFactory.makeDcTracker(this); for (int transport : mTransportManager.getAvailableTransports()) { mDcTrackers.put(transport, mTelephonyComponentFactory.makeDcTracker(this, transport)); } mCarrierResolver = mTelephonyComponentFactory.makeCarrierResolver(this); mSST.registerForNetworkAttached(this, EVENT_REGISTERED_TO_NETWORK, null); Loading Loading @@ -523,7 +529,10 @@ public class GsmCdmaPhone extends Phone { ret = PhoneConstants.DataState.DISCONNECTED; } else { /* mSST.gprsState == ServiceState.STATE_IN_SERVICE */ switch (mDcTracker.getState(apnType)) { int currentTransport = mTransportManager.getCurrentTransport( ApnSetting.getApnTypesBitmaskFromString(apnType)); if (getDcTracker(currentTransport) != null) { switch (getDcTracker(currentTransport).getState(apnType)) { case CONNECTED: case DISCONNECTING: if (mCT.mState != PhoneConstants.State.IDLE Loading @@ -540,6 +549,7 @@ public class GsmCdmaPhone extends Phone { ret = PhoneConstants.DataState.DISCONNECTED; } } } logd("getDataConnectionState apnType=" + apnType + " ret=" + ret); return ret; Loading @@ -549,8 +559,9 @@ public class GsmCdmaPhone extends Phone { public DataActivityState getDataActivityState() { DataActivityState ret = DataActivityState.NONE; if (mSST.getCurrentDataConnectionState() == ServiceState.STATE_IN_SERVICE) { switch (mDcTracker.getActivity()) { if (mSST.getCurrentDataConnectionState() == ServiceState.STATE_IN_SERVICE && getDcTracker(TransportType.WWAN) != null) { switch (getDcTracker(TransportType.WWAN).getActivity()) { case DATAIN: ret = DataActivityState.DATAIN; break; Loading Loading @@ -2036,12 +2047,17 @@ public class GsmCdmaPhone extends Phone { @Override public boolean getDataRoamingEnabled() { return mDcTracker.getDataRoamingEnabled(); if (getDcTracker(TransportType.WWAN) != null) { return getDcTracker(TransportType.WWAN).getDataRoamingEnabled(); } return false; } @Override public void setDataRoamingEnabled(boolean enable) { mDcTracker.setDataRoamingEnabledByUser(enable); if (getDcTracker(TransportType.WWAN) != null) { getDcTracker(TransportType.WWAN).setDataRoamingEnabledByUser(enable); } } @Override Loading Loading @@ -2086,17 +2102,25 @@ public class GsmCdmaPhone extends Phone { @Override public boolean isUserDataEnabled() { return mDcTracker.isUserDataEnabled(); if (getDcTracker(TransportType.WWAN) != null) { return getDcTracker(TransportType.WWAN).isUserDataEnabled(); } return false; } @Override public boolean isDataEnabled() { return mDcTracker.isDataEnabled(); if (getDcTracker(TransportType.WWAN) != null) { return getDcTracker(TransportType.WWAN).isDataEnabled(); } return false; } @Override public void setUserDataEnabled(boolean enable) { mDcTracker.setUserDataEnabled(enable); if (getDcTracker(TransportType.WWAN) != null) { getDcTracker(TransportType.WWAN).setUserDataEnabled(enable); } } /** Loading Loading @@ -3065,7 +3089,9 @@ public class GsmCdmaPhone extends Phone { // send an Intent sendEmergencyCallbackModeChange(); // Re-initiate data connection mDcTracker.setInternalDataEnabled(true); if (getDcTracker(TransportType.WWAN) != null) { getDcTracker(TransportType.WWAN).setInternalDataEnabled(true); } notifyEmergencyCallRegistrants(false); } } Loading src/java/com/android/internal/telephony/NetworkRegistrationManager.java +6 −5 Original line number Diff line number Diff line Loading @@ -127,7 +127,8 @@ public class NetworkRegistrationManager { private class NetworkServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { logd("service connected."); logd("service " + name + " for transport " + TransportType.toString(mTransportType) + " is now connected."); mServiceBinder = (INetworkService.Stub) service; mDeathRecipient = new RegManagerDeathRecipient(name); try { Loading @@ -144,7 +145,8 @@ public class NetworkRegistrationManager { @Override public void onServiceDisconnected(ComponentName name) { logd("onServiceDisconnected " + name); logd("service " + name + " for transport " + TransportType.toString(mTransportType) + " is now disconnected."); if (mServiceBinder != null) { mServiceBinder.unlinkToDeath(mDeathRecipient, 0); } Loading Loading @@ -180,6 +182,8 @@ public class NetworkRegistrationManager { try { // We bind this as a foreground service because it is operating directly on the SIM, // and we do not want it subjected to power-savings restrictions while doing so. logd("Trying to bind " + getPackageName() + " for transport " + TransportType.toString(mTransportType)); return mPhone.getContext().bindService(intent, new NetworkServiceConnection(), Context.BIND_AUTO_CREATE); } catch (SecurityException e) { Loading Loading @@ -219,9 +223,6 @@ public class NetworkRegistrationManager { packageName = b.getString(carrierConfig, packageName); } logd("Binding to packageName " + packageName + " for transport type" + mTransportType); return packageName; } Loading src/java/com/android/internal/telephony/Phone.java +167 −66 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.internal.telephony; import android.annotation.Nullable; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; Loading @@ -40,6 +41,7 @@ import android.preference.PreferenceManager; import android.provider.Settings; import android.service.carrier.CarrierIdentifier; import android.telecom.VideoProfile; import android.telephony.AccessNetworkConstants.TransportType; import android.telephony.CarrierConfigManager; import android.telephony.CellInfo; import android.telephony.CellLocation; Loading @@ -53,8 +55,11 @@ import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; import android.telephony.data.ApnSetting.ApnType; import android.telephony.ims.stub.ImsRegistrationImplBase; import android.text.TextUtils; import android.util.SparseArray; import com.android.ims.ImsCall; import com.android.ims.ImsConfig; Loading @@ -77,6 +82,7 @@ import com.android.internal.telephony.uicc.UsimServiceTable; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Locale; Loading Loading @@ -160,6 +166,7 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { protected static final int EVENT_GET_CALL_FORWARD_DONE = 13; protected static final int EVENT_CALL_RING = 14; private static final int EVENT_CALL_RING_CONTINUE = 15; private static final int EVENT_ALL_DATA_DISCONNECTED = 16; // Used to intercept the carrier selection calls so that // we can save the values. Loading Loading @@ -251,7 +258,11 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { public CommandsInterface mCi; protected int mVmCount = 0; private boolean mDnsCheckDisabled; public DcTracker mDcTracker; // Data connection trackers. For each transport type (e.g. WWAN, WLAN), there will be a // corresponding DcTracker. The WWAN DcTracker is for cellular data connections while // WLAN DcTracker is for IWLAN data connection. For IWLAN legacy mode, only one (WWAN) DcTracker // will be created. protected final SparseArray<DcTracker> mDcTrackers = new SparseArray<>(); /* Used for dispatching signals to configured carrier apps */ protected CarrierSignalAgent mCarrierSignalAgent; /* Used for dispatching carrier action from carrier apps */ Loading Loading @@ -307,47 +318,35 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { public static final String EXTRA_KEY_ALERT_SHOW = "alertShow"; public static final String EXTRA_KEY_NOTIFICATION_MESSAGE = "notificationMessage"; private final RegistrantList mPreciseCallStateRegistrants = new RegistrantList(); private final RegistrantList mPreciseCallStateRegistrants = new RegistrantList(); private final RegistrantList mHandoverRegistrants = new RegistrantList(); private final RegistrantList mHandoverRegistrants = new RegistrantList(); private final RegistrantList mNewRingingConnectionRegistrants = new RegistrantList(); private final RegistrantList mNewRingingConnectionRegistrants = new RegistrantList(); private final RegistrantList mIncomingRingRegistrants = new RegistrantList(); private final RegistrantList mIncomingRingRegistrants = new RegistrantList(); protected final RegistrantList mDisconnectRegistrants = new RegistrantList(); protected final RegistrantList mDisconnectRegistrants = new RegistrantList(); private final RegistrantList mServiceStateRegistrants = new RegistrantList(); private final RegistrantList mServiceStateRegistrants = new RegistrantList(); protected final RegistrantList mMmiCompleteRegistrants = new RegistrantList(); protected final RegistrantList mMmiCompleteRegistrants = new RegistrantList(); protected final RegistrantList mMmiRegistrants = new RegistrantList(); protected final RegistrantList mMmiRegistrants = new RegistrantList(); protected final RegistrantList mUnknownConnectionRegistrants = new RegistrantList(); protected final RegistrantList mUnknownConnectionRegistrants = new RegistrantList(); protected final RegistrantList mSuppServiceFailedRegistrants = new RegistrantList(); protected final RegistrantList mSuppServiceFailedRegistrants = new RegistrantList(); protected final RegistrantList mRadioOffOrNotAvailableRegistrants = new RegistrantList(); protected final RegistrantList mRadioOffOrNotAvailableRegistrants = new RegistrantList(); protected final RegistrantList mSimRecordsLoadedRegistrants = new RegistrantList(); protected final RegistrantList mSimRecordsLoadedRegistrants = new RegistrantList(); private final RegistrantList mVideoCapabilityChangedRegistrants = new RegistrantList(); private final RegistrantList mVideoCapabilityChangedRegistrants = new RegistrantList(); protected final RegistrantList mEmergencyCallToggledRegistrants = new RegistrantList(); protected final RegistrantList mEmergencyCallToggledRegistrants = new RegistrantList(); private final RegistrantList mAllDataDisconnectedRegistrants = new RegistrantList(); private final RegistrantList mCellInfoRegistrants = new RegistrantList(); Loading Loading @@ -713,6 +712,12 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { onCheckForNetworkSelectionModeAutomatic(msg); break; } case EVENT_ALL_DATA_DISCONNECTED: if (areAllDataDisconnected()) { mAllDataDisconnectedRegistrants.notifyRegistrants(); } break; default: throw new RuntimeException("unexpected event not handled"); } Loading Loading @@ -2189,8 +2194,11 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { public void notifyDataConnection(String reason) { String types[] = getActiveApnTypes(); if (types != null) { for (String apnType : types) { mNotifier.notifyDataConnection(this, reason, apnType, getDataConnectionState(apnType)); mNotifier.notifyDataConnection(this, reason, apnType, getDataConnectionState(apnType)); } } } Loading Loading @@ -2820,15 +2828,24 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { /** * Returns an array of string identifiers for the APN types serviced by the * currently active. * @return The string array will always return at least one entry, Phone.APN_TYPE_DEFAULT. * TODO: Revisit if we always should return at least one entry. * * @return The string array of APN types. Return null if no active APN types. */ @Nullable public String[] getActiveApnTypes() { if (mDcTracker == null) { return null; if (mTransportManager != null) { List<String> typesList = new ArrayList<>(); for (int transportType : mTransportManager.getAvailableTransports()) { if (getDcTracker(transportType) != null) { typesList.addAll(Arrays.asList( getDcTracker(transportType).getActiveApnTypes())); } } return mDcTracker.getActiveApnTypes(); return typesList.toArray(new String[typesList.size()]); } return null; } /** Loading @@ -2836,7 +2853,10 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { * @return true if there is a matching DUN APN. */ public boolean hasMatchedTetherApnSetting() { return mDcTracker.hasMatchedTetherApnSetting(); if (getDcTracker(TransportType.WWAN) != null) { return getDcTracker(TransportType.WWAN).hasMatchedTetherApnSetting(); } return false; } /** Loading @@ -2844,40 +2864,71 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { * @return type as a string or null if none. */ public String getActiveApnHost(String apnType) { return mDcTracker.getActiveApnString(apnType); if (mTransportManager != null) { int transportType = mTransportManager.getCurrentTransport( ApnSetting.getApnTypesBitmaskFromString(apnType)); if (getDcTracker(transportType) != null) { return getDcTracker(transportType).getActiveApnString(apnType); } } return null; } /** * Return the LinkProperties for the named apn or null if not available */ public LinkProperties getLinkProperties(String apnType) { return mDcTracker.getLinkProperties(apnType); if (mTransportManager != null) { int transport = mTransportManager.getCurrentTransport( ApnSetting.getApnTypesBitmaskFromString(apnType)); if (getDcTracker(transport) != null) { return getDcTracker(transport).getLinkProperties(apnType); } } return null; } /** * Return the NetworkCapabilities */ public NetworkCapabilities getNetworkCapabilities(String apnType) { return mDcTracker.getNetworkCapabilities(apnType); if (mTransportManager != null) { int transportType = mTransportManager.getCurrentTransport( ApnSetting.getApnTypesBitmaskFromString(apnType)); if (getDcTracker(transportType) != null) { return getDcTracker(transportType).getNetworkCapabilities(apnType); } } return null; } /** * Report on whether data connectivity is allowed. * Report on whether data connectivity is allowed for given APN type. * * @param apnType APN type * * @return True if data is allowed to be established. */ public boolean isDataAllowed() { return ((mDcTracker != null) && (mDcTracker.isDataAllowed(null))); public boolean isDataAllowed(@ApnType int apnType) { return isDataAllowed(apnType, null); } /** * Report on whether data connectivity is allowed. * * @param apnType APN type * @param reasons The reasons that data can/can't be established. This is an output param. * @return True if data is allowed to be established */ public boolean isDataAllowed(DataConnectionReasons reasons) { return ((mDcTracker != null) && (mDcTracker.isDataAllowed(reasons))); public boolean isDataAllowed(@ApnType int apnType, DataConnectionReasons reasons) { if (mTransportManager != null) { int transport = mTransportManager.getCurrentTransport(apnType); if (getDcTracker(transport) != null) { return getDcTracker(transport).isDataAllowed(reasons); } } return false; } Loading Loading @@ -3067,7 +3118,15 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { * @param apnType the apnType, "ims" for IMS APN, "emergency" for EMERGENCY APN */ public String[] getPcscfAddress(String apnType) { return mDcTracker.getPcscfAddress(apnType); if (mTransportManager != null) { int transportType = mTransportManager.getCurrentTransport( ApnSetting.getApnTypesBitmaskFromString(apnType)); if (getDcTracker(transportType) != null) { return getDcTracker(transportType).getPcscfAddress(apnType); } } return null; } /** Loading Loading @@ -3606,31 +3665,59 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { } public void updateDataConnectionTracker() { mDcTracker.update(); if (mTransportManager != null) { for (int transport : mTransportManager.getAvailableTransports()) { if (getDcTracker(transport) != null) { getDcTracker(transport).update(); } } } public void setInternalDataEnabled(boolean enable, Message onCompleteMsg) { mDcTracker.setInternalDataEnabled(enable, onCompleteMsg); } public boolean updateCurrentCarrierInProvider() { return false; } public void registerForAllDataDisconnected(Handler h, int what, Object obj) { mDcTracker.registerForAllDataDisconnected(h, what, obj); /** * @return True if all data connections are disconnected. */ public boolean areAllDataDisconnected() { if (mTransportManager != null) { for (int transport : mTransportManager.getAvailableTransports()) { if (getDcTracker(transport) != null && !getDcTracker(transport).isDisconnected()) { return false; } } } return true; } public void registerForAllDataDisconnected(Handler h, int what) { mAllDataDisconnectedRegistrants.addUnique(h, what, null); if (mTransportManager != null) { for (int transport : mTransportManager.getAvailableTransports()) { if (getDcTracker(transport) != null && !getDcTracker(transport).isDisconnected()) { getDcTracker(transport).registerForAllDataDisconnected( this, EVENT_ALL_DATA_DISCONNECTED); } } } } public void unregisterForAllDataDisconnected(Handler h) { mDcTracker.unregisterForAllDataDisconnected(h); mAllDataDisconnectedRegistrants.remove(h); } public void registerForDataEnabledChanged(Handler h, int what, Object obj) { mDcTracker.registerForDataEnabledChanged(h, what, obj); if (getDcTracker(TransportType.WWAN) != null) { getDcTracker(TransportType.WWAN).registerForDataEnabledChanged(h, what, obj); } } public void unregisterForDataEnabledChanged(Handler h) { mDcTracker.unregisterForDataEnabledChanged(h); if (getDcTracker(TransportType.WWAN) != null) { getDcTracker(TransportType.WWAN).unregisterForDataEnabledChanged(h); } } public IccSmsInterfaceManager getIccSmsInterfaceManager(){ Loading Loading @@ -3708,7 +3795,13 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { * @param enabled True if enabling the data, otherwise disabling. */ public void setPolicyDataEnabled(boolean enabled) { mDcTracker.setPolicyDataEnabled(enabled); if (mTransportManager != null) { for (int transport : mTransportManager.getAvailableTransports()) { if (getDcTracker(transport) != null) { getDcTracker(transport).setPolicyDataEnabled(enabled); } } } } /** Loading Loading @@ -3745,12 +3838,21 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { String gid2, String pnn, String spn) { } /** * Get data connection tracker based on the transport type * * @param transportType Transport type defined in AccessNetworkConstants.TransportType * @return The data connection tracker. Null if not found. */ public @Nullable DcTracker getDcTracker(int transportType) { return mDcTrackers.get(transportType); } public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("Phone: subId=" + getSubId()); pw.println(" mPhoneId=" + mPhoneId); pw.println(" mCi=" + mCi); pw.println(" mDnsCheckDisabled=" + mDnsCheckDisabled); pw.println(" mDcTracker=" + mDcTracker); pw.println(" mDoesRilSendMultipleCallRing=" + mDoesRilSendMultipleCallRing); pw.println(" mCallRingContinueToken=" + mCallRingContinueToken); pw.println(" mCallRingDelay=" + mCallRingDelay); Loading Loading @@ -3794,16 +3896,15 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { pw.println("++++++++++++++++++++++++++++++++"); } if (mDcTracker != null) { try { mDcTracker.dump(fd, pw, args); } catch (Exception e) { e.printStackTrace(); } if (mTransportManager != null) { for (int transport : mTransportManager.getAvailableTransports()) { if (getDcTracker(transport) != null) { getDcTracker(transport).dump(fd, pw, args); pw.flush(); pw.println("++++++++++++++++++++++++++++++++"); } } } if (getServiceStateTracker() != null) { try { Loading Loading
src/java/com/android/internal/telephony/DefaultPhoneNotifier.java +3 −1 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.telephony.Rlog; import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; import java.util.List; Loading Loading @@ -182,7 +183,8 @@ public class DefaultPhoneNotifier implements PhoneNotifier { if (mRegistry != null) { mRegistry.notifyDataConnectionForSubscriber(subId, PhoneConstantConversions.convertDataState(state), sender.isDataAllowed(), reason, sender.isDataAllowed(ApnSetting.getApnTypesBitmaskFromString(apnType)), reason, sender.getActiveApnHost(apnType), apnType, linkProperties, Loading
src/java/com/android/internal/telephony/GsmCdmaCallTracker.java +10 −4 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.os.PersistableBundle; import android.os.Registrant; import android.os.RegistrantList; import android.os.SystemProperties; import android.telephony.AccessNetworkConstants.TransportType; import android.telephony.CarrierConfigManager; import android.telephony.CellLocation; import android.telephony.DisconnectCause; Loading Loading @@ -172,8 +173,9 @@ public class GsmCdmaCallTracker extends CallTracker { mCi.unregisterForCallWaitingInfo(this); // Prior to phone switch to GSM, if CDMA has any emergency call // data will be in disabled state, after switching to GSM enable data. if (mIsInEmergencyCall) { mPhone.mDcTracker.setInternalDataEnabled(true); if (mIsInEmergencyCall && mPhone.getDcTracker(TransportType.WWAN) != null) { mPhone.getDcTracker(TransportType.WWAN).setInternalDataEnabled(true); } } else { mConnections = new GsmCdmaConnection[MAX_CONNECTIONS_CDMA]; Loading Loading @@ -372,7 +374,9 @@ public class GsmCdmaCallTracker extends CallTracker { //CDMA public void setIsInEmergencyCall() { mIsInEmergencyCall = true; mPhone.mDcTracker.setInternalDataEnabled(false); if (mPhone.getDcTracker(TransportType.WWAN) != null) { mPhone.getDcTracker(TransportType.WWAN).setInternalDataEnabled(false); } mPhone.notifyEmergencyCallRegistrants(true); mPhone.sendEmergencyCallStateChange(true); } Loading Loading @@ -1628,7 +1632,9 @@ public class GsmCdmaCallTracker extends CallTracker { } if (!inEcm) { // Re-initiate data connection mPhone.mDcTracker.setInternalDataEnabled(true); if (mPhone.getDcTracker(TransportType.WWAN) != null) { mPhone.getDcTracker(TransportType.WWAN).setInternalDataEnabled(true); } mPhone.notifyEmergencyCallRegistrants(false); } mPhone.sendEmergencyCallStateChange(false); Loading
src/java/com/android/internal/telephony/GsmCdmaPhone.java +50 −24 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ import android.preference.PreferenceManager; import android.provider.Settings; import android.provider.Telephony; import android.telecom.VideoProfile; import android.telephony.AccessNetworkConstants.TransportType; import android.telephony.CarrierConfigManager; import android.telephony.CellLocation; import android.telephony.ImsiEncryptionInfo; Loading @@ -66,6 +67,7 @@ import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.UssdResponse; import android.telephony.data.ApnSetting; import android.text.TextUtils; import android.util.Log; import android.util.Pair; Loading Loading @@ -227,7 +229,11 @@ public class GsmCdmaPhone extends Phone { mTransportManager = mTelephonyComponentFactory.makeTransportManager(this); mSST = mTelephonyComponentFactory.makeServiceStateTracker(this, this.mCi); // DcTracker uses SST so needs to be created after it is instantiated mDcTracker = mTelephonyComponentFactory.makeDcTracker(this); for (int transport : mTransportManager.getAvailableTransports()) { mDcTrackers.put(transport, mTelephonyComponentFactory.makeDcTracker(this, transport)); } mCarrierResolver = mTelephonyComponentFactory.makeCarrierResolver(this); mSST.registerForNetworkAttached(this, EVENT_REGISTERED_TO_NETWORK, null); Loading Loading @@ -523,7 +529,10 @@ public class GsmCdmaPhone extends Phone { ret = PhoneConstants.DataState.DISCONNECTED; } else { /* mSST.gprsState == ServiceState.STATE_IN_SERVICE */ switch (mDcTracker.getState(apnType)) { int currentTransport = mTransportManager.getCurrentTransport( ApnSetting.getApnTypesBitmaskFromString(apnType)); if (getDcTracker(currentTransport) != null) { switch (getDcTracker(currentTransport).getState(apnType)) { case CONNECTED: case DISCONNECTING: if (mCT.mState != PhoneConstants.State.IDLE Loading @@ -540,6 +549,7 @@ public class GsmCdmaPhone extends Phone { ret = PhoneConstants.DataState.DISCONNECTED; } } } logd("getDataConnectionState apnType=" + apnType + " ret=" + ret); return ret; Loading @@ -549,8 +559,9 @@ public class GsmCdmaPhone extends Phone { public DataActivityState getDataActivityState() { DataActivityState ret = DataActivityState.NONE; if (mSST.getCurrentDataConnectionState() == ServiceState.STATE_IN_SERVICE) { switch (mDcTracker.getActivity()) { if (mSST.getCurrentDataConnectionState() == ServiceState.STATE_IN_SERVICE && getDcTracker(TransportType.WWAN) != null) { switch (getDcTracker(TransportType.WWAN).getActivity()) { case DATAIN: ret = DataActivityState.DATAIN; break; Loading Loading @@ -2036,12 +2047,17 @@ public class GsmCdmaPhone extends Phone { @Override public boolean getDataRoamingEnabled() { return mDcTracker.getDataRoamingEnabled(); if (getDcTracker(TransportType.WWAN) != null) { return getDcTracker(TransportType.WWAN).getDataRoamingEnabled(); } return false; } @Override public void setDataRoamingEnabled(boolean enable) { mDcTracker.setDataRoamingEnabledByUser(enable); if (getDcTracker(TransportType.WWAN) != null) { getDcTracker(TransportType.WWAN).setDataRoamingEnabledByUser(enable); } } @Override Loading Loading @@ -2086,17 +2102,25 @@ public class GsmCdmaPhone extends Phone { @Override public boolean isUserDataEnabled() { return mDcTracker.isUserDataEnabled(); if (getDcTracker(TransportType.WWAN) != null) { return getDcTracker(TransportType.WWAN).isUserDataEnabled(); } return false; } @Override public boolean isDataEnabled() { return mDcTracker.isDataEnabled(); if (getDcTracker(TransportType.WWAN) != null) { return getDcTracker(TransportType.WWAN).isDataEnabled(); } return false; } @Override public void setUserDataEnabled(boolean enable) { mDcTracker.setUserDataEnabled(enable); if (getDcTracker(TransportType.WWAN) != null) { getDcTracker(TransportType.WWAN).setUserDataEnabled(enable); } } /** Loading Loading @@ -3065,7 +3089,9 @@ public class GsmCdmaPhone extends Phone { // send an Intent sendEmergencyCallbackModeChange(); // Re-initiate data connection mDcTracker.setInternalDataEnabled(true); if (getDcTracker(TransportType.WWAN) != null) { getDcTracker(TransportType.WWAN).setInternalDataEnabled(true); } notifyEmergencyCallRegistrants(false); } } Loading
src/java/com/android/internal/telephony/NetworkRegistrationManager.java +6 −5 Original line number Diff line number Diff line Loading @@ -127,7 +127,8 @@ public class NetworkRegistrationManager { private class NetworkServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { logd("service connected."); logd("service " + name + " for transport " + TransportType.toString(mTransportType) + " is now connected."); mServiceBinder = (INetworkService.Stub) service; mDeathRecipient = new RegManagerDeathRecipient(name); try { Loading @@ -144,7 +145,8 @@ public class NetworkRegistrationManager { @Override public void onServiceDisconnected(ComponentName name) { logd("onServiceDisconnected " + name); logd("service " + name + " for transport " + TransportType.toString(mTransportType) + " is now disconnected."); if (mServiceBinder != null) { mServiceBinder.unlinkToDeath(mDeathRecipient, 0); } Loading Loading @@ -180,6 +182,8 @@ public class NetworkRegistrationManager { try { // We bind this as a foreground service because it is operating directly on the SIM, // and we do not want it subjected to power-savings restrictions while doing so. logd("Trying to bind " + getPackageName() + " for transport " + TransportType.toString(mTransportType)); return mPhone.getContext().bindService(intent, new NetworkServiceConnection(), Context.BIND_AUTO_CREATE); } catch (SecurityException e) { Loading Loading @@ -219,9 +223,6 @@ public class NetworkRegistrationManager { packageName = b.getString(carrierConfig, packageName); } logd("Binding to packageName " + packageName + " for transport type" + mTransportType); return packageName; } Loading
src/java/com/android/internal/telephony/Phone.java +167 −66 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.internal.telephony; import android.annotation.Nullable; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; Loading @@ -40,6 +41,7 @@ import android.preference.PreferenceManager; import android.provider.Settings; import android.service.carrier.CarrierIdentifier; import android.telecom.VideoProfile; import android.telephony.AccessNetworkConstants.TransportType; import android.telephony.CarrierConfigManager; import android.telephony.CellInfo; import android.telephony.CellLocation; Loading @@ -53,8 +55,11 @@ import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.data.ApnSetting; import android.telephony.data.ApnSetting.ApnType; import android.telephony.ims.stub.ImsRegistrationImplBase; import android.text.TextUtils; import android.util.SparseArray; import com.android.ims.ImsCall; import com.android.ims.ImsConfig; Loading @@ -77,6 +82,7 @@ import com.android.internal.telephony.uicc.UsimServiceTable; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Locale; Loading Loading @@ -160,6 +166,7 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { protected static final int EVENT_GET_CALL_FORWARD_DONE = 13; protected static final int EVENT_CALL_RING = 14; private static final int EVENT_CALL_RING_CONTINUE = 15; private static final int EVENT_ALL_DATA_DISCONNECTED = 16; // Used to intercept the carrier selection calls so that // we can save the values. Loading Loading @@ -251,7 +258,11 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { public CommandsInterface mCi; protected int mVmCount = 0; private boolean mDnsCheckDisabled; public DcTracker mDcTracker; // Data connection trackers. For each transport type (e.g. WWAN, WLAN), there will be a // corresponding DcTracker. The WWAN DcTracker is for cellular data connections while // WLAN DcTracker is for IWLAN data connection. For IWLAN legacy mode, only one (WWAN) DcTracker // will be created. protected final SparseArray<DcTracker> mDcTrackers = new SparseArray<>(); /* Used for dispatching signals to configured carrier apps */ protected CarrierSignalAgent mCarrierSignalAgent; /* Used for dispatching carrier action from carrier apps */ Loading Loading @@ -307,47 +318,35 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { public static final String EXTRA_KEY_ALERT_SHOW = "alertShow"; public static final String EXTRA_KEY_NOTIFICATION_MESSAGE = "notificationMessage"; private final RegistrantList mPreciseCallStateRegistrants = new RegistrantList(); private final RegistrantList mPreciseCallStateRegistrants = new RegistrantList(); private final RegistrantList mHandoverRegistrants = new RegistrantList(); private final RegistrantList mHandoverRegistrants = new RegistrantList(); private final RegistrantList mNewRingingConnectionRegistrants = new RegistrantList(); private final RegistrantList mNewRingingConnectionRegistrants = new RegistrantList(); private final RegistrantList mIncomingRingRegistrants = new RegistrantList(); private final RegistrantList mIncomingRingRegistrants = new RegistrantList(); protected final RegistrantList mDisconnectRegistrants = new RegistrantList(); protected final RegistrantList mDisconnectRegistrants = new RegistrantList(); private final RegistrantList mServiceStateRegistrants = new RegistrantList(); private final RegistrantList mServiceStateRegistrants = new RegistrantList(); protected final RegistrantList mMmiCompleteRegistrants = new RegistrantList(); protected final RegistrantList mMmiCompleteRegistrants = new RegistrantList(); protected final RegistrantList mMmiRegistrants = new RegistrantList(); protected final RegistrantList mMmiRegistrants = new RegistrantList(); protected final RegistrantList mUnknownConnectionRegistrants = new RegistrantList(); protected final RegistrantList mUnknownConnectionRegistrants = new RegistrantList(); protected final RegistrantList mSuppServiceFailedRegistrants = new RegistrantList(); protected final RegistrantList mSuppServiceFailedRegistrants = new RegistrantList(); protected final RegistrantList mRadioOffOrNotAvailableRegistrants = new RegistrantList(); protected final RegistrantList mRadioOffOrNotAvailableRegistrants = new RegistrantList(); protected final RegistrantList mSimRecordsLoadedRegistrants = new RegistrantList(); protected final RegistrantList mSimRecordsLoadedRegistrants = new RegistrantList(); private final RegistrantList mVideoCapabilityChangedRegistrants = new RegistrantList(); private final RegistrantList mVideoCapabilityChangedRegistrants = new RegistrantList(); protected final RegistrantList mEmergencyCallToggledRegistrants = new RegistrantList(); protected final RegistrantList mEmergencyCallToggledRegistrants = new RegistrantList(); private final RegistrantList mAllDataDisconnectedRegistrants = new RegistrantList(); private final RegistrantList mCellInfoRegistrants = new RegistrantList(); Loading Loading @@ -713,6 +712,12 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { onCheckForNetworkSelectionModeAutomatic(msg); break; } case EVENT_ALL_DATA_DISCONNECTED: if (areAllDataDisconnected()) { mAllDataDisconnectedRegistrants.notifyRegistrants(); } break; default: throw new RuntimeException("unexpected event not handled"); } Loading Loading @@ -2189,8 +2194,11 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { public void notifyDataConnection(String reason) { String types[] = getActiveApnTypes(); if (types != null) { for (String apnType : types) { mNotifier.notifyDataConnection(this, reason, apnType, getDataConnectionState(apnType)); mNotifier.notifyDataConnection(this, reason, apnType, getDataConnectionState(apnType)); } } } Loading Loading @@ -2820,15 +2828,24 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { /** * Returns an array of string identifiers for the APN types serviced by the * currently active. * @return The string array will always return at least one entry, Phone.APN_TYPE_DEFAULT. * TODO: Revisit if we always should return at least one entry. * * @return The string array of APN types. Return null if no active APN types. */ @Nullable public String[] getActiveApnTypes() { if (mDcTracker == null) { return null; if (mTransportManager != null) { List<String> typesList = new ArrayList<>(); for (int transportType : mTransportManager.getAvailableTransports()) { if (getDcTracker(transportType) != null) { typesList.addAll(Arrays.asList( getDcTracker(transportType).getActiveApnTypes())); } } return mDcTracker.getActiveApnTypes(); return typesList.toArray(new String[typesList.size()]); } return null; } /** Loading @@ -2836,7 +2853,10 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { * @return true if there is a matching DUN APN. */ public boolean hasMatchedTetherApnSetting() { return mDcTracker.hasMatchedTetherApnSetting(); if (getDcTracker(TransportType.WWAN) != null) { return getDcTracker(TransportType.WWAN).hasMatchedTetherApnSetting(); } return false; } /** Loading @@ -2844,40 +2864,71 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { * @return type as a string or null if none. */ public String getActiveApnHost(String apnType) { return mDcTracker.getActiveApnString(apnType); if (mTransportManager != null) { int transportType = mTransportManager.getCurrentTransport( ApnSetting.getApnTypesBitmaskFromString(apnType)); if (getDcTracker(transportType) != null) { return getDcTracker(transportType).getActiveApnString(apnType); } } return null; } /** * Return the LinkProperties for the named apn or null if not available */ public LinkProperties getLinkProperties(String apnType) { return mDcTracker.getLinkProperties(apnType); if (mTransportManager != null) { int transport = mTransportManager.getCurrentTransport( ApnSetting.getApnTypesBitmaskFromString(apnType)); if (getDcTracker(transport) != null) { return getDcTracker(transport).getLinkProperties(apnType); } } return null; } /** * Return the NetworkCapabilities */ public NetworkCapabilities getNetworkCapabilities(String apnType) { return mDcTracker.getNetworkCapabilities(apnType); if (mTransportManager != null) { int transportType = mTransportManager.getCurrentTransport( ApnSetting.getApnTypesBitmaskFromString(apnType)); if (getDcTracker(transportType) != null) { return getDcTracker(transportType).getNetworkCapabilities(apnType); } } return null; } /** * Report on whether data connectivity is allowed. * Report on whether data connectivity is allowed for given APN type. * * @param apnType APN type * * @return True if data is allowed to be established. */ public boolean isDataAllowed() { return ((mDcTracker != null) && (mDcTracker.isDataAllowed(null))); public boolean isDataAllowed(@ApnType int apnType) { return isDataAllowed(apnType, null); } /** * Report on whether data connectivity is allowed. * * @param apnType APN type * @param reasons The reasons that data can/can't be established. This is an output param. * @return True if data is allowed to be established */ public boolean isDataAllowed(DataConnectionReasons reasons) { return ((mDcTracker != null) && (mDcTracker.isDataAllowed(reasons))); public boolean isDataAllowed(@ApnType int apnType, DataConnectionReasons reasons) { if (mTransportManager != null) { int transport = mTransportManager.getCurrentTransport(apnType); if (getDcTracker(transport) != null) { return getDcTracker(transport).isDataAllowed(reasons); } } return false; } Loading Loading @@ -3067,7 +3118,15 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { * @param apnType the apnType, "ims" for IMS APN, "emergency" for EMERGENCY APN */ public String[] getPcscfAddress(String apnType) { return mDcTracker.getPcscfAddress(apnType); if (mTransportManager != null) { int transportType = mTransportManager.getCurrentTransport( ApnSetting.getApnTypesBitmaskFromString(apnType)); if (getDcTracker(transportType) != null) { return getDcTracker(transportType).getPcscfAddress(apnType); } } return null; } /** Loading Loading @@ -3606,31 +3665,59 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { } public void updateDataConnectionTracker() { mDcTracker.update(); if (mTransportManager != null) { for (int transport : mTransportManager.getAvailableTransports()) { if (getDcTracker(transport) != null) { getDcTracker(transport).update(); } } } public void setInternalDataEnabled(boolean enable, Message onCompleteMsg) { mDcTracker.setInternalDataEnabled(enable, onCompleteMsg); } public boolean updateCurrentCarrierInProvider() { return false; } public void registerForAllDataDisconnected(Handler h, int what, Object obj) { mDcTracker.registerForAllDataDisconnected(h, what, obj); /** * @return True if all data connections are disconnected. */ public boolean areAllDataDisconnected() { if (mTransportManager != null) { for (int transport : mTransportManager.getAvailableTransports()) { if (getDcTracker(transport) != null && !getDcTracker(transport).isDisconnected()) { return false; } } } return true; } public void registerForAllDataDisconnected(Handler h, int what) { mAllDataDisconnectedRegistrants.addUnique(h, what, null); if (mTransportManager != null) { for (int transport : mTransportManager.getAvailableTransports()) { if (getDcTracker(transport) != null && !getDcTracker(transport).isDisconnected()) { getDcTracker(transport).registerForAllDataDisconnected( this, EVENT_ALL_DATA_DISCONNECTED); } } } } public void unregisterForAllDataDisconnected(Handler h) { mDcTracker.unregisterForAllDataDisconnected(h); mAllDataDisconnectedRegistrants.remove(h); } public void registerForDataEnabledChanged(Handler h, int what, Object obj) { mDcTracker.registerForDataEnabledChanged(h, what, obj); if (getDcTracker(TransportType.WWAN) != null) { getDcTracker(TransportType.WWAN).registerForDataEnabledChanged(h, what, obj); } } public void unregisterForDataEnabledChanged(Handler h) { mDcTracker.unregisterForDataEnabledChanged(h); if (getDcTracker(TransportType.WWAN) != null) { getDcTracker(TransportType.WWAN).unregisterForDataEnabledChanged(h); } } public IccSmsInterfaceManager getIccSmsInterfaceManager(){ Loading Loading @@ -3708,7 +3795,13 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { * @param enabled True if enabling the data, otherwise disabling. */ public void setPolicyDataEnabled(boolean enabled) { mDcTracker.setPolicyDataEnabled(enabled); if (mTransportManager != null) { for (int transport : mTransportManager.getAvailableTransports()) { if (getDcTracker(transport) != null) { getDcTracker(transport).setPolicyDataEnabled(enabled); } } } } /** Loading Loading @@ -3745,12 +3838,21 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { String gid2, String pnn, String spn) { } /** * Get data connection tracker based on the transport type * * @param transportType Transport type defined in AccessNetworkConstants.TransportType * @return The data connection tracker. Null if not found. */ public @Nullable DcTracker getDcTracker(int transportType) { return mDcTrackers.get(transportType); } public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("Phone: subId=" + getSubId()); pw.println(" mPhoneId=" + mPhoneId); pw.println(" mCi=" + mCi); pw.println(" mDnsCheckDisabled=" + mDnsCheckDisabled); pw.println(" mDcTracker=" + mDcTracker); pw.println(" mDoesRilSendMultipleCallRing=" + mDoesRilSendMultipleCallRing); pw.println(" mCallRingContinueToken=" + mCallRingContinueToken); pw.println(" mCallRingDelay=" + mCallRingDelay); Loading Loading @@ -3794,16 +3896,15 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { pw.println("++++++++++++++++++++++++++++++++"); } if (mDcTracker != null) { try { mDcTracker.dump(fd, pw, args); } catch (Exception e) { e.printStackTrace(); } if (mTransportManager != null) { for (int transport : mTransportManager.getAvailableTransports()) { if (getDcTracker(transport) != null) { getDcTracker(transport).dump(fd, pw, args); pw.flush(); pw.println("++++++++++++++++++++++++++++++++"); } } } if (getServiceStateTracker() != null) { try { Loading