diff --git a/api/current.txt b/api/current.txt index 90dfcc83ae097..775491c55cbbb 100755 --- a/api/current.txt +++ b/api/current.txt @@ -43107,6 +43107,7 @@ package android.telephony { field public static final int DATA_CONNECTING = 1; // 0x1 field public static final int DATA_DISCONNECTED = 0; // 0x0 field public static final int DATA_SUSPENDED = 3; // 0x3 + field public static final int DATA_UNKNOWN = -1; // 0xffffffff field public static final java.lang.String EXTRA_CALL_VOICEMAIL_INTENT = "android.telephony.extra.CALL_VOICEMAIL_INTENT"; field public static final java.lang.String EXTRA_CARRIER_ID = "android.telephony.extra.CARRIER_ID"; field public static final java.lang.String EXTRA_CARRIER_NAME = "android.telephony.extra.CARRIER_NAME"; diff --git a/api/system-current.txt b/api/system-current.txt index fdb09d639360e..f9c6d50620a88 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5061,6 +5061,87 @@ package android.telephony { field public static final java.lang.String KEY_CARRIER_SETUP_APP_STRING = "carrier_setup_app_string"; } + public final class DataFailCause { + field public static final int ACTIVATION_REJECT_GGSN = 30; // 0x1e + field public static final int ACTIVATION_REJECT_UNSPECIFIED = 31; // 0x1f + field public static final int ACTIVE_PDP_CONTEXT_MAX_NUMBER_REACHED = 65; // 0x41 + field public static final int APN_TYPE_CONFLICT = 112; // 0x70 + field public static final int AUTH_FAILURE_ON_EMERGENCY_CALL = 122; // 0x7a + field public static final int COMPANION_IFACE_IN_USE = 118; // 0x76 + field public static final int CONDITIONAL_IE_ERROR = 100; // 0x64 + field public static final int EMERGENCY_IFACE_ONLY = 116; // 0x74 + field public static final int EMM_ACCESS_BARRED = 115; // 0x73 + field public static final int EMM_ACCESS_BARRED_INFINITE_RETRY = 121; // 0x79 + field public static final int ERROR_UNSPECIFIED = 65535; // 0xffff + field public static final int ESM_INFO_NOT_RECEIVED = 53; // 0x35 + field public static final int FEATURE_NOT_SUPP = 40; // 0x28 + field public static final int FILTER_SEMANTIC_ERROR = 44; // 0x2c + field public static final int FILTER_SYTAX_ERROR = 45; // 0x2d + field public static final int GPRS_REGISTRATION_FAIL = -2; // 0xfffffffe + field public static final int IFACE_AND_POL_FAMILY_MISMATCH = 120; // 0x78 + field public static final int IFACE_MISMATCH = 117; // 0x75 + field public static final int INSUFFICIENT_RESOURCES = 26; // 0x1a + field public static final int INTERNAL_CALL_PREEMPT_BY_HIGH_PRIO_APN = 114; // 0x72 + field public static final int INVALID_MANDATORY_INFO = 96; // 0x60 + field public static final int INVALID_PCSCF_ADDR = 113; // 0x71 + field public static final int INVALID_TRANSACTION_ID = 81; // 0x51 + field public static final int IP_ADDRESS_MISMATCH = 119; // 0x77 + field public static final int LLC_SNDCP = 25; // 0x19 + field public static final int LOST_CONNECTION = 65540; // 0x10004 + field public static final int MESSAGE_INCORRECT_SEMANTIC = 95; // 0x5f + field public static final int MESSAGE_TYPE_UNSUPPORTED = 97; // 0x61 + field public static final int MISSING_UNKNOWN_APN = 27; // 0x1b + field public static final int MSG_AND_PROTOCOL_STATE_UNCOMPATIBLE = 101; // 0x65 + field public static final int MSG_TYPE_NONCOMPATIBLE_STATE = 98; // 0x62 + field public static final int MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED = 55; // 0x37 + field public static final int NAS_SIGNALLING = 14; // 0xe + field public static final int NETWORK_FAILURE = 38; // 0x26 + field public static final int NONE = 0; // 0x0 + field public static final int NSAPI_IN_USE = 35; // 0x23 + field public static final int OEM_DCFAILCAUSE_1 = 4097; // 0x1001 + field public static final int OEM_DCFAILCAUSE_10 = 4106; // 0x100a + field public static final int OEM_DCFAILCAUSE_11 = 4107; // 0x100b + field public static final int OEM_DCFAILCAUSE_12 = 4108; // 0x100c + field public static final int OEM_DCFAILCAUSE_13 = 4109; // 0x100d + field public static final int OEM_DCFAILCAUSE_14 = 4110; // 0x100e + field public static final int OEM_DCFAILCAUSE_15 = 4111; // 0x100f + field public static final int OEM_DCFAILCAUSE_2 = 4098; // 0x1002 + field public static final int OEM_DCFAILCAUSE_3 = 4099; // 0x1003 + field public static final int OEM_DCFAILCAUSE_4 = 4100; // 0x1004 + field public static final int OEM_DCFAILCAUSE_5 = 4101; // 0x1005 + field public static final int OEM_DCFAILCAUSE_6 = 4102; // 0x1006 + field public static final int OEM_DCFAILCAUSE_7 = 4103; // 0x1007 + field public static final int OEM_DCFAILCAUSE_8 = 4104; // 0x1008 + field public static final int OEM_DCFAILCAUSE_9 = 4105; // 0x1009 + field public static final int ONLY_IPV4_ALLOWED = 50; // 0x32 + field public static final int ONLY_IPV6_ALLOWED = 51; // 0x33 + field public static final int ONLY_SINGLE_BEARER_ALLOWED = 52; // 0x34 + field public static final int OPERATOR_BARRED = 8; // 0x8 + field public static final int PDN_CONN_DOES_NOT_EXIST = 54; // 0x36 + field public static final int PDP_WITHOUT_ACTIVE_TFT = 46; // 0x2e + field public static final int PREF_RADIO_TECH_CHANGED = -4; // 0xfffffffc + field public static final int PROTOCOL_ERRORS = 111; // 0x6f + field public static final int QOS_NOT_ACCEPTED = 37; // 0x25 + field public static final int RADIO_NOT_AVAILABLE = 65537; // 0x10001 + field public static final int RADIO_POWER_OFF = -5; // 0xfffffffb + field public static final int REGISTRATION_FAIL = -1; // 0xffffffff + field public static final int REGULAR_DEACTIVATION = 36; // 0x24 + field public static final int SERVICE_OPTION_NOT_SUBSCRIBED = 33; // 0x21 + field public static final int SERVICE_OPTION_NOT_SUPPORTED = 32; // 0x20 + field public static final int SERVICE_OPTION_OUT_OF_ORDER = 34; // 0x22 + field public static final int SIGNAL_LOST = -3; // 0xfffffffd + field public static final int TETHERED_CALL_ACTIVE = -6; // 0xfffffffa + field public static final int TFT_SEMANTIC_ERROR = 41; // 0x29 + field public static final int TFT_SYTAX_ERROR = 42; // 0x2a + field public static final int UMTS_REACTIVATION_REQ = 39; // 0x27 + field public static final int UNKNOWN = 65536; // 0x10000 + field public static final int UNKNOWN_INFO_ELEMENT = 99; // 0x63 + field public static final int UNKNOWN_PDP_ADDRESS_TYPE = 28; // 0x1c + field public static final int UNKNOWN_PDP_CONTEXT = 43; // 0x2b + field public static final int UNSUPPORTED_APN_IN_CURRENT_PLMN = 66; // 0x42 + field public static final int USER_AUTHENTICATION = 29; // 0x1d + } + public class DisconnectCause { field public static final int ALREADY_DIALING = 72; // 0x48 field public static final int ANSWERED_ELSEWHERE = 52; // 0x34 @@ -5228,11 +5309,13 @@ package android.telephony { public class PhoneStateListener { method public void onCallDisconnectCauseChanged(int, int); method public void onPreciseCallStateChanged(android.telephony.PreciseCallState); + method public void onPreciseDataConnectionStateChanged(android.telephony.PreciseDataConnectionState); method public void onRadioPowerStateChanged(int); method public void onSrvccStateChanged(int); method public void onVoiceActivationStateChanged(int); field public static final int LISTEN_CALL_DISCONNECT_CAUSES = 33554432; // 0x2000000 field public static final int LISTEN_PRECISE_CALL_STATE = 2048; // 0x800 + field public static final int LISTEN_PRECISE_DATA_CONNECTION_STATE = 4096; // 0x1000 field public static final int LISTEN_RADIO_POWER_STATE_CHANGED = 8388608; // 0x800000 field public static final int LISTEN_SRVCC_STATE_CHANGED = 16384; // 0x4000 field public static final int LISTEN_VOICE_ACTIVATION_STATE = 131072; // 0x20000 @@ -5257,6 +5340,16 @@ package android.telephony { field public static final int PRECISE_CALL_STATE_WAITING = 6; // 0x6 } + public final class PreciseDataConnectionState implements android.os.Parcelable { + method public int describeContents(); + method public java.lang.String getDataConnectionApn(); + method public int getDataConnectionApnTypeBitMask(); + method public int getDataConnectionFailCause(); + method public int getDataConnectionState(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator CREATOR; + } + public class PreciseDisconnectCause { field public static final int ACCESS_CLASS_BLOCKED = 260; // 0x104 field public static final int ACCESS_INFORMATION_DISCARDED = 43; // 0x2b diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 6d10632a08cd7..566d837a2ba31 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -34,6 +34,7 @@ import android.os.RemoteException; import android.os.UserHandle; import android.telephony.CellInfo; import android.telephony.CellLocation; +import android.telephony.DataFailCause; import android.telephony.DisconnectCause; import android.telephony.LocationAccessPolicy; import android.telephony.PhoneCapability; @@ -47,6 +48,7 @@ import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; +import android.telephony.data.ApnSetting; import android.telephony.emergency.EmergencyNumber; import android.util.LocalLog; import android.util.StatsLog; @@ -1366,7 +1368,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { mDataConnectionNetworkType[phoneId] = networkType; } mPreciseDataConnectionState = new PreciseDataConnectionState(state, networkType, - apnType, apn, linkProperties, ""); + ApnSetting.getApnTypesBitmaskFromString(apnType), apn, + linkProperties, DataFailCause.NONE); for (Record r : mRecords) { if (r.matchPhoneStateListenerEvent( PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE)) { @@ -1384,7 +1387,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { broadcastDataConnectionStateChanged(state, isDataAllowed, apn, apnType, linkProperties, networkCapabilities, roaming, subId); broadcastPreciseDataConnectionStateChanged(state, networkType, apnType, apn, - linkProperties, ""); + linkProperties, DataFailCause.NONE); } public void notifyDataConnectionFailed(String apnType) { @@ -1403,7 +1406,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { synchronized (mRecords) { mPreciseDataConnectionState = new PreciseDataConnectionState( TelephonyManager.DATA_UNKNOWN,TelephonyManager.NETWORK_TYPE_UNKNOWN, - apnType, "", null, ""); + ApnSetting.getApnTypesBitmaskFromString(apnType), "", null, + DataFailCause.NONE); for (Record r : mRecords) { if (r.matchPhoneStateListenerEvent( PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE)) { @@ -1418,7 +1422,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } broadcastDataConnectionFailed(apnType, subId); broadcastPreciseDataConnectionStateChanged(TelephonyManager.DATA_UNKNOWN, - TelephonyManager.NETWORK_TYPE_UNKNOWN, apnType, "", null, ""); + TelephonyManager.NETWORK_TYPE_UNKNOWN, apnType, "", null, + DataFailCause.NONE); } public void notifyCellLocation(Bundle cellLocation) { @@ -1528,14 +1533,15 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } } - public void notifyPreciseDataConnectionFailed(String apnType, String apn, String failCause) { + public void notifyPreciseDataConnectionFailed(String apnType, + String apn, @DataFailCause.FailCause int failCause) { if (!checkNotifyPermission("notifyPreciseDataConnectionFailed()")) { return; } synchronized (mRecords) { mPreciseDataConnectionState = new PreciseDataConnectionState( TelephonyManager.DATA_UNKNOWN, TelephonyManager.NETWORK_TYPE_UNKNOWN, - apnType, apn, null, failCause); + ApnSetting.getApnTypesBitmaskFromString(apnType), apn, null, failCause); for (Record r : mRecords) { if (r.matchPhoneStateListenerEvent( PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE)) { @@ -1929,9 +1935,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } private void broadcastPreciseDataConnectionStateChanged(int state, int networkType, - String apnType, String apn, - LinkProperties linkProperties, - String failCause) { + String apnType, String apn, LinkProperties linkProperties, + @DataFailCause.FailCause int failCause) { Intent intent = new Intent(TelephonyManager.ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED); intent.putExtra(PhoneConstants.STATE_KEY, state); intent.putExtra(PhoneConstants.DATA_NETWORK_TYPE_KEY, networkType); @@ -1940,7 +1945,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { if (linkProperties != null) { intent.putExtra(PhoneConstants.DATA_LINK_PROPERTIES_KEY, linkProperties); } - if (failCause != null) intent.putExtra(PhoneConstants.DATA_FAILURE_CAUSE_KEY, failCause); + intent.putExtra(PhoneConstants.DATA_FAILURE_CAUSE_KEY, failCause); mContext.sendBroadcastAsUser(intent, UserHandle.ALL, android.Manifest.permission.READ_PRECISE_PHONE_STATE); diff --git a/telephony/java/android/telephony/DataFailCause.java b/telephony/java/android/telephony/DataFailCause.java index c53b37d8ae6a6..26ec6ded82244 100644 --- a/telephony/java/android/telephony/DataFailCause.java +++ b/telephony/java/android/telephony/DataFailCause.java @@ -17,6 +17,7 @@ package android.telephony; import android.annotation.IntDef; import android.annotation.NonNull; +import android.annotation.SystemApi; import android.content.Context; import android.os.PersistableBundle; @@ -34,6 +35,7 @@ import java.util.Set; * Returned as the reason for a data connection failure as defined by modem and some local errors. * @hide */ +@SystemApi public final class DataFailCause { /** There is no failure */ public static final int NONE = 0; @@ -101,8 +103,8 @@ public final class DataFailCause { public static final int PDN_CONN_DOES_NOT_EXIST = 0x36; /** Multiple connections to a same PDN is not allowed. */ public static final int MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED = 0x37; - /** Packet Data Protocol (PDP) */ - public static final int MAX_ACTIVE_PDP_CONTEXT_REACHED = 0x41; + /** Max number of Packet Data Protocol (PDP) context reached. */ + public static final int ACTIVE_PDP_CONTEXT_MAX_NUMBER_REACHED = 0x41; /** Unsupported APN in current public land mobile network (PLMN). */ public static final int UNSUPPORTED_APN_IN_CURRENT_PLMN = 0x42; /** Invalid transaction id. */ @@ -165,22 +167,36 @@ public final class DataFailCause { // Local errors generated by Vendor RIL // specified in ril.h + /** Data fail due to registration failure. */ public static final int REGISTRATION_FAIL = -1; + /** Data fail due to GPRS registration failure. */ public static final int GPRS_REGISTRATION_FAIL = -2; + /** Data call drop due to network/modem disconnect. */ public static final int SIGNAL_LOST = -3; /* no retry */ + /** + * Preferred technology has changed, must retry with parameters appropriate for new technology. + */ public static final int PREF_RADIO_TECH_CHANGED = -4; + /** data call was disconnected because radio was resetting, powered off. */ public static final int RADIO_POWER_OFF = -5; /* no retry */ + /** Data call was disconnected by modem because tethered. */ public static final int TETHERED_CALL_ACTIVE = -6; /* no retry */ + /** Data call fail due to unspecific errors. */ public static final int ERROR_UNSPECIFIED = 0xFFFF; // Errors generated by the Framework // specified here + /** Unknown data failure cause. */ public static final int UNKNOWN = 0x10000; + /** Data fail due to radio not unavailable. */ public static final int RADIO_NOT_AVAILABLE = 0x10001; /* no retry */ + /** @hide */ public static final int UNACCEPTABLE_NETWORK_PARAMETER = 0x10002; /* no retry */ + /** @hide */ public static final int CONNECTION_TO_DATACONNECTIONAC_BROKEN = 0x10003; + /** Data connection was lost. */ public static final int LOST_CONNECTION = 0x10004; - /** Data was reset by framework. */ + /** @hide */ public static final int RESET_BY_FRAMEWORK = 0x10005; /** @hide */ @@ -216,7 +232,7 @@ public final class DataFailCause { ESM_INFO_NOT_RECEIVED, PDN_CONN_DOES_NOT_EXIST, MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED, - MAX_ACTIVE_PDP_CONTEXT_REACHED, + ACTIVE_PDP_CONTEXT_MAX_NUMBER_REACHED, UNSUPPORTED_APN_IN_CURRENT_PLMN, INVALID_TRANSACTION_ID, MESSAGE_INCORRECT_SEMANTIC, @@ -308,8 +324,8 @@ public final class DataFailCause { sFailCauseMap.put(PDN_CONN_DOES_NOT_EXIST, "PDN_CONN_DOES_NOT_EXIST"); sFailCauseMap.put(MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED, "MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED"); - sFailCauseMap.put(MAX_ACTIVE_PDP_CONTEXT_REACHED, - "MAX_ACTIVE_PDP_CONTEXT_REACHED"); + sFailCauseMap.put(ACTIVE_PDP_CONTEXT_MAX_NUMBER_REACHED, + "ACTIVE_PDP_CONTEXT_MAX_NUMBER_REACHED"); sFailCauseMap.put(UNSUPPORTED_APN_IN_CURRENT_PLMN, "UNSUPPORTED_APN_IN_CURRENT_PLMN"); sFailCauseMap.put(INVALID_TRANSACTION_ID, "INVALID_TRANSACTION_ID"); @@ -369,6 +385,9 @@ public final class DataFailCause { sFailCauseMap.put(RESET_BY_FRAMEWORK, "RESET_BY_FRAMEWORK"); } + private DataFailCause() { + } + /** * Map of subId -> set of data call setup permanent failure for the carrier. */ @@ -382,6 +401,8 @@ public final class DataFailCause { * @param cause data disconnect cause * @param subId subscription index * @return true if the fail cause code needs platform to trigger a modem restart. + * + * @hide */ public static boolean isRadioRestartFailure(@NonNull Context context, @FailCause int cause, int subId) { @@ -410,6 +431,7 @@ public final class DataFailCause { return false; } + /** @hide */ public static boolean isPermanentFailure(@NonNull Context context, @FailCause int failCause, int subId) { synchronized (sPermanentFailureCache) { @@ -469,6 +491,7 @@ public final class DataFailCause { } } + /** @hide */ public static boolean isEventLoggable(@FailCause int dataFailCause) { return (dataFailCause == OPERATOR_BARRED) || (dataFailCause == INSUFFICIENT_RESOURCES) || (dataFailCause == UNKNOWN_PDP_ADDRESS_TYPE) @@ -488,11 +511,13 @@ public final class DataFailCause { || (dataFailCause == UNACCEPTABLE_NETWORK_PARAMETER); } + /** @hide */ public static String toString(@FailCause int dataFailCause) { int cause = getFailCause(dataFailCause); return (cause == UNKNOWN) ? "UNKNOWN(" + dataFailCause + ")" : sFailCauseMap.get(cause); } + /** @hide */ public static int getFailCause(@FailCause int failCause) { if (sFailCauseMap.containsKey(failCause)) { return failCause; diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java index 9317aa73ffc2b..e27b385963246 100644 --- a/telephony/java/android/telephony/PhoneStateListener.java +++ b/telephony/java/android/telephony/PhoneStateListener.java @@ -184,14 +184,17 @@ public class PhoneStateListener { public static final int LISTEN_PRECISE_CALL_STATE = 0x00000800; /** - * Listen for precise changes and fails on the data connection (cellular). + * Listen for {@link PreciseDataConnectionState} on the data connection (cellular). + * * {@more} * Requires Permission: {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE * READ_PRECISE_PHONE_STATE} * * @see #onPreciseDataConnectionStateChanged + * * @hide */ + @SystemApi public static final int LISTEN_PRECISE_DATA_CONNECTION_STATE = 0x00001000; /** @@ -564,10 +567,11 @@ public class PhoneStateListener { /** * Callback invoked when data connection state changes with precise information. + * @param dataConnectionState {@link PreciseDataConnectionState} * * @hide */ - @UnsupportedAppUsage + @SystemApi public void onPreciseDataConnectionStateChanged( PreciseDataConnectionState dataConnectionState) { // default implementation empty diff --git a/telephony/java/android/telephony/PreciseDataConnectionState.java b/telephony/java/android/telephony/PreciseDataConnectionState.java index 83738997a067b..57a18266259a8 100644 --- a/telephony/java/android/telephony/PreciseDataConnectionState.java +++ b/telephony/java/android/telephony/PreciseDataConnectionState.java @@ -16,10 +16,12 @@ package android.telephony; +import android.annotation.SystemApi; import android.annotation.UnsupportedAppUsage; import android.net.LinkProperties; import android.os.Parcel; import android.os.Parcelable; +import android.telephony.data.ApnSetting; import java.util.Objects; @@ -31,7 +33,7 @@ import java.util.Objects; *