Loading packages/Connectivity/framework/api/system-current.txt +8 −0 Original line number Diff line number Diff line Loading @@ -216,6 +216,7 @@ package android.net { method public void markConnected(); method public void onAddKeepalivePacketFilter(int, @NonNull android.net.KeepalivePacketData); method public void onAutomaticReconnectDisabled(); method public void onBandwidthUpdateRequested(); method public void onNetworkUnwanted(); method public void onQosCallbackRegistered(int, @NonNull android.net.QosFilter); method public void onQosCallbackUnregistered(int); Loading @@ -233,6 +234,7 @@ package android.net { method public final void sendQosSessionAvailable(int, int, @NonNull android.telephony.data.EpsBearerQosSessionAttributes); method public final void sendQosSessionLost(int, int); method public final void sendSocketKeepaliveEvent(int, int); method @Deprecated public void setLegacySubtype(int, @NonNull String); method public final void setUnderlyingNetworks(@Nullable java.util.List<android.net.Network>); method public void unregister(); field public static final int VALIDATION_STATUS_NOT_VALID = 2; // 0x2 Loading @@ -253,7 +255,12 @@ package android.net { public static final class NetworkAgentConfig.Builder { ctor public NetworkAgentConfig.Builder(); method @NonNull public android.net.NetworkAgentConfig build(); method @NonNull public android.net.NetworkAgentConfig.Builder disableNat64Detection(); method @NonNull public android.net.NetworkAgentConfig.Builder disableProvisioningNotification(); method @NonNull public android.net.NetworkAgentConfig.Builder setExplicitlySelected(boolean); method @NonNull public android.net.NetworkAgentConfig.Builder setLegacyExtraInfo(@NonNull String); method @NonNull public android.net.NetworkAgentConfig.Builder setLegacySubType(int); method @NonNull public android.net.NetworkAgentConfig.Builder setLegacySubTypeName(@NonNull String); method @NonNull public android.net.NetworkAgentConfig.Builder setLegacyType(int); method @NonNull public android.net.NetworkAgentConfig.Builder setLegacyTypeName(@NonNull String); method @NonNull public android.net.NetworkAgentConfig.Builder setPartialConnectivityAcceptable(boolean); Loading Loading @@ -388,6 +395,7 @@ package android.net { } public abstract class SocketKeepalive implements java.lang.AutoCloseable { field public static final int ERROR_NO_SUCH_SLOT = -33; // 0xffffffdf field public static final int SUCCESS = 0; // 0x0 } Loading packages/Connectivity/framework/src/android/net/NetworkAgent.java +4 −3 Original line number Diff line number Diff line Loading @@ -362,9 +362,8 @@ public abstract class NetworkAgent { public static final int CMD_UNREGISTER_QOS_CALLBACK = BASE + 21; private static NetworkInfo getLegacyNetworkInfo(final NetworkAgentConfig config) { // The subtype can be changed with (TODO) setLegacySubtype, but it starts // with 0 (TelephonyManager.NETWORK_TYPE_UNKNOWN) and an empty description. final NetworkInfo ni = new NetworkInfo(config.legacyType, 0, config.legacyTypeName, ""); final NetworkInfo ni = new NetworkInfo(config.legacyType, config.legacySubType, config.legacyTypeName, config.legacySubTypeName); ni.setIsAvailable(true); ni.setDetailedState(NetworkInfo.DetailedState.CONNECTING, null /* reason */, config.getLegacyExtraInfo()); Loading Loading @@ -829,6 +828,7 @@ public abstract class NetworkAgent { * @hide */ @Deprecated @SystemApi public void setLegacySubtype(final int legacySubtype, @NonNull final String legacySubtypeName) { mNetworkInfo.setSubtype(legacySubtype, legacySubtypeName); queueOrSendNetworkInfo(mNetworkInfo); Loading Loading @@ -962,6 +962,7 @@ public abstract class NetworkAgent { * shall try to overwrite this method and produce a bandwidth update if capable. * @hide */ @SystemApi public void onBandwidthUpdateRequested() { pollLceData(); } Loading packages/Connectivity/framework/src/android/net/NetworkAgentConfig.java +42 −3 Original line number Diff line number Diff line Loading @@ -164,6 +164,12 @@ public final class NetworkAgentConfig implements Parcelable { return legacyType; } /** * The legacy Sub type of this network agent, or TYPE_NONE if unset. * @hide */ public int legacySubType = ConnectivityManager.TYPE_NONE; /** * Set to true if the PRIVATE_DNS_BROKEN notification has shown for this network. * Reset this bit when private DNS mode is changed from strict mode to opportunistic/off mode. Loading @@ -189,6 +195,13 @@ public final class NetworkAgentConfig implements Parcelable { return legacyTypeName; } /** * The name of the legacy Sub network type. It's a free-form string. * @hide */ @NonNull public String legacySubTypeName = ""; /** * The legacy extra info of the agent. The extra info should only be : * <ul> Loading Loading @@ -225,6 +238,8 @@ public final class NetworkAgentConfig implements Parcelable { skip464xlat = nac.skip464xlat; legacyType = nac.legacyType; legacyTypeName = nac.legacyTypeName; legacySubType = nac.legacySubType; legacySubTypeName = nac.legacySubTypeName; mLegacyExtraInfo = nac.mLegacyExtraInfo; } } Loading Loading @@ -290,7 +305,6 @@ public final class NetworkAgentConfig implements Parcelable { * and reduce idle traffic on networks that are known to be IPv6-only without a NAT64. * * @return this builder, to facilitate chaining. * @hide */ @NonNull public Builder disableNat64Detection() { Loading @@ -303,7 +317,6 @@ public final class NetworkAgentConfig implements Parcelable { * perform its own carrier-specific provisioning procedure. * * @return this builder, to facilitate chaining. * @hide */ @NonNull public Builder disableProvisioningNotification() { Loading @@ -323,6 +336,18 @@ public final class NetworkAgentConfig implements Parcelable { return this; } /** * Sets the legacy sub-type for this network. * * @param legacySubType the type * @return this builder, to facilitate chaining. */ @NonNull public Builder setLegacySubType(final int legacySubType) { mConfig.legacySubType = legacySubType; return this; } /** * Sets the name of the legacy type of the agent. It's a free-form string used in logging. * @param legacyTypeName the name Loading @@ -334,11 +359,21 @@ public final class NetworkAgentConfig implements Parcelable { return this; } /** * Sets the name of the legacy Sub-type of the agent. It's a free-form string. * @param legacySubTypeName the name * @return this builder, to facilitate chaining. */ @NonNull public Builder setLegacySubTypeName(@NonNull String legacySubTypeName) { mConfig.legacySubTypeName = legacySubTypeName; return this; } /** * Sets the legacy extra info of the agent. * @param legacyExtraInfo the legacy extra info. * @return this builder, to facilitate chaining. * @hide */ @NonNull public Builder setLegacyExtraInfo(@NonNull String legacyExtraInfo) { Loading Loading @@ -412,6 +447,8 @@ public final class NetworkAgentConfig implements Parcelable { out.writeInt(skip464xlat ? 1 : 0); out.writeInt(legacyType); out.writeString(legacyTypeName); out.writeInt(legacySubType); out.writeString(legacySubTypeName); out.writeString(mLegacyExtraInfo); } Loading @@ -429,6 +466,8 @@ public final class NetworkAgentConfig implements Parcelable { networkAgentConfig.skip464xlat = in.readInt() != 0; networkAgentConfig.legacyType = in.readInt(); networkAgentConfig.legacyTypeName = in.readString(); networkAgentConfig.legacySubType = in.readInt(); networkAgentConfig.legacySubTypeName = in.readString(); networkAgentConfig.mLegacyExtraInfo = in.readString(); return networkAgentConfig; } Loading packages/Connectivity/framework/src/android/net/SocketKeepalive.java +65 −19 Original line number Diff line number Diff line Loading @@ -55,36 +55,68 @@ public abstract class SocketKeepalive implements AutoCloseable { static final String TAG = "SocketKeepalive"; /** * No errors. * Success. It indicates there is no error. * @hide */ @SystemApi public static final int SUCCESS = 0; /** @hide */ /** * No keepalive. This should only be internally as it indicates There is no keepalive. * It should not propagate to applications. * @hide */ public static final int NO_KEEPALIVE = -1; /** @hide */ /** * Data received. * @hide */ public static final int DATA_RECEIVED = -2; /** @hide */ /** * The binder died. * @hide */ public static final int BINDER_DIED = -10; /** The specified {@code Network} is not connected. */ /** * The invalid network. It indicates the specified {@code Network} is not connected. */ public static final int ERROR_INVALID_NETWORK = -20; /** The specified IP addresses are invalid. For example, the specified source IP address is * not configured on the specified {@code Network}. */ /** * The invalid IP addresses. Indicates the specified IP addresses are invalid. * For example, the specified source IP address is not configured on the * specified {@code Network}. */ public static final int ERROR_INVALID_IP_ADDRESS = -21; /** The requested port is invalid. */ /** * The port is invalid. */ public static final int ERROR_INVALID_PORT = -22; /** The packet length is invalid (e.g., too long). */ /** * The length is invalid (e.g. too long). */ public static final int ERROR_INVALID_LENGTH = -23; /** The packet transmission interval is invalid (e.g., too short). */ /** * The interval is invalid (e.g. too short). */ public static final int ERROR_INVALID_INTERVAL = -24; /** The target socket is invalid. */ /** * The socket is invalid. */ public static final int ERROR_INVALID_SOCKET = -25; /** The target socket is not idle. */ /** * The socket is not idle. */ public static final int ERROR_SOCKET_NOT_IDLE = -26; /** * The stop reason is uninitialized. This should only be internally used as initial state * of stop reason, instead of propagating to application. Loading @@ -92,15 +124,29 @@ public abstract class SocketKeepalive implements AutoCloseable { */ public static final int ERROR_STOP_REASON_UNINITIALIZED = -27; /** The device does not support this request. */ /** * The request is unsupported. */ public static final int ERROR_UNSUPPORTED = -30; /** @hide TODO: delete when telephony code has been updated. */ public static final int ERROR_HARDWARE_UNSUPPORTED = ERROR_UNSUPPORTED; /** The hardware returned an error. */ /** * There was a hardware error. */ public static final int ERROR_HARDWARE_ERROR = -31; /** The limitation of resource is reached. */ /** * Resources are insufficient (e.g. all hardware slots are in use). */ public static final int ERROR_INSUFFICIENT_RESOURCES = -32; /** * There was no such slot. This should only be internally as it indicates * a programming error in the system server. It should not propagate to * applications. * @hide */ @SystemApi public static final int ERROR_NO_SUCH_SLOT = -33; /** @hide */ @Retention(RetentionPolicy.SOURCE) Loading @@ -111,7 +157,8 @@ public abstract class SocketKeepalive implements AutoCloseable { ERROR_INVALID_LENGTH, ERROR_INVALID_INTERVAL, ERROR_INVALID_SOCKET, ERROR_SOCKET_NOT_IDLE ERROR_SOCKET_NOT_IDLE, ERROR_NO_SUCH_SLOT }) public @interface ErrorCode {} Loading @@ -122,7 +169,6 @@ public abstract class SocketKeepalive implements AutoCloseable { ERROR_INVALID_LENGTH, ERROR_UNSUPPORTED, ERROR_INSUFFICIENT_RESOURCES, ERROR_HARDWARE_UNSUPPORTED }) public @interface KeepaliveEvent {} Loading services/core/java/com/android/server/connectivity/KeepaliveTracker.java +3 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static android.net.SocketKeepalive.ERROR_INVALID_INTERVAL; import static android.net.SocketKeepalive.ERROR_INVALID_IP_ADDRESS; import static android.net.SocketKeepalive.ERROR_INVALID_NETWORK; import static android.net.SocketKeepalive.ERROR_INVALID_SOCKET; import static android.net.SocketKeepalive.ERROR_NO_SUCH_SLOT; import static android.net.SocketKeepalive.ERROR_STOP_REASON_UNINITIALIZED; import static android.net.SocketKeepalive.ERROR_UNSUPPORTED; import static android.net.SocketKeepalive.MAX_INTERVAL_SEC; Loading Loading @@ -528,6 +529,8 @@ public class KeepaliveTracker { } } else if (reason == ERROR_STOP_REASON_UNINITIALIZED) { throw new IllegalStateException("Unexpected stop reason: " + reason); } else if (reason == ERROR_NO_SUCH_SLOT) { throw new IllegalStateException("No such slot: " + reason); } else { notifyErrorCallback(ki.mCallback, reason); } Loading Loading
packages/Connectivity/framework/api/system-current.txt +8 −0 Original line number Diff line number Diff line Loading @@ -216,6 +216,7 @@ package android.net { method public void markConnected(); method public void onAddKeepalivePacketFilter(int, @NonNull android.net.KeepalivePacketData); method public void onAutomaticReconnectDisabled(); method public void onBandwidthUpdateRequested(); method public void onNetworkUnwanted(); method public void onQosCallbackRegistered(int, @NonNull android.net.QosFilter); method public void onQosCallbackUnregistered(int); Loading @@ -233,6 +234,7 @@ package android.net { method public final void sendQosSessionAvailable(int, int, @NonNull android.telephony.data.EpsBearerQosSessionAttributes); method public final void sendQosSessionLost(int, int); method public final void sendSocketKeepaliveEvent(int, int); method @Deprecated public void setLegacySubtype(int, @NonNull String); method public final void setUnderlyingNetworks(@Nullable java.util.List<android.net.Network>); method public void unregister(); field public static final int VALIDATION_STATUS_NOT_VALID = 2; // 0x2 Loading @@ -253,7 +255,12 @@ package android.net { public static final class NetworkAgentConfig.Builder { ctor public NetworkAgentConfig.Builder(); method @NonNull public android.net.NetworkAgentConfig build(); method @NonNull public android.net.NetworkAgentConfig.Builder disableNat64Detection(); method @NonNull public android.net.NetworkAgentConfig.Builder disableProvisioningNotification(); method @NonNull public android.net.NetworkAgentConfig.Builder setExplicitlySelected(boolean); method @NonNull public android.net.NetworkAgentConfig.Builder setLegacyExtraInfo(@NonNull String); method @NonNull public android.net.NetworkAgentConfig.Builder setLegacySubType(int); method @NonNull public android.net.NetworkAgentConfig.Builder setLegacySubTypeName(@NonNull String); method @NonNull public android.net.NetworkAgentConfig.Builder setLegacyType(int); method @NonNull public android.net.NetworkAgentConfig.Builder setLegacyTypeName(@NonNull String); method @NonNull public android.net.NetworkAgentConfig.Builder setPartialConnectivityAcceptable(boolean); Loading Loading @@ -388,6 +395,7 @@ package android.net { } public abstract class SocketKeepalive implements java.lang.AutoCloseable { field public static final int ERROR_NO_SUCH_SLOT = -33; // 0xffffffdf field public static final int SUCCESS = 0; // 0x0 } Loading
packages/Connectivity/framework/src/android/net/NetworkAgent.java +4 −3 Original line number Diff line number Diff line Loading @@ -362,9 +362,8 @@ public abstract class NetworkAgent { public static final int CMD_UNREGISTER_QOS_CALLBACK = BASE + 21; private static NetworkInfo getLegacyNetworkInfo(final NetworkAgentConfig config) { // The subtype can be changed with (TODO) setLegacySubtype, but it starts // with 0 (TelephonyManager.NETWORK_TYPE_UNKNOWN) and an empty description. final NetworkInfo ni = new NetworkInfo(config.legacyType, 0, config.legacyTypeName, ""); final NetworkInfo ni = new NetworkInfo(config.legacyType, config.legacySubType, config.legacyTypeName, config.legacySubTypeName); ni.setIsAvailable(true); ni.setDetailedState(NetworkInfo.DetailedState.CONNECTING, null /* reason */, config.getLegacyExtraInfo()); Loading Loading @@ -829,6 +828,7 @@ public abstract class NetworkAgent { * @hide */ @Deprecated @SystemApi public void setLegacySubtype(final int legacySubtype, @NonNull final String legacySubtypeName) { mNetworkInfo.setSubtype(legacySubtype, legacySubtypeName); queueOrSendNetworkInfo(mNetworkInfo); Loading Loading @@ -962,6 +962,7 @@ public abstract class NetworkAgent { * shall try to overwrite this method and produce a bandwidth update if capable. * @hide */ @SystemApi public void onBandwidthUpdateRequested() { pollLceData(); } Loading
packages/Connectivity/framework/src/android/net/NetworkAgentConfig.java +42 −3 Original line number Diff line number Diff line Loading @@ -164,6 +164,12 @@ public final class NetworkAgentConfig implements Parcelable { return legacyType; } /** * The legacy Sub type of this network agent, or TYPE_NONE if unset. * @hide */ public int legacySubType = ConnectivityManager.TYPE_NONE; /** * Set to true if the PRIVATE_DNS_BROKEN notification has shown for this network. * Reset this bit when private DNS mode is changed from strict mode to opportunistic/off mode. Loading @@ -189,6 +195,13 @@ public final class NetworkAgentConfig implements Parcelable { return legacyTypeName; } /** * The name of the legacy Sub network type. It's a free-form string. * @hide */ @NonNull public String legacySubTypeName = ""; /** * The legacy extra info of the agent. The extra info should only be : * <ul> Loading Loading @@ -225,6 +238,8 @@ public final class NetworkAgentConfig implements Parcelable { skip464xlat = nac.skip464xlat; legacyType = nac.legacyType; legacyTypeName = nac.legacyTypeName; legacySubType = nac.legacySubType; legacySubTypeName = nac.legacySubTypeName; mLegacyExtraInfo = nac.mLegacyExtraInfo; } } Loading Loading @@ -290,7 +305,6 @@ public final class NetworkAgentConfig implements Parcelable { * and reduce idle traffic on networks that are known to be IPv6-only without a NAT64. * * @return this builder, to facilitate chaining. * @hide */ @NonNull public Builder disableNat64Detection() { Loading @@ -303,7 +317,6 @@ public final class NetworkAgentConfig implements Parcelable { * perform its own carrier-specific provisioning procedure. * * @return this builder, to facilitate chaining. * @hide */ @NonNull public Builder disableProvisioningNotification() { Loading @@ -323,6 +336,18 @@ public final class NetworkAgentConfig implements Parcelable { return this; } /** * Sets the legacy sub-type for this network. * * @param legacySubType the type * @return this builder, to facilitate chaining. */ @NonNull public Builder setLegacySubType(final int legacySubType) { mConfig.legacySubType = legacySubType; return this; } /** * Sets the name of the legacy type of the agent. It's a free-form string used in logging. * @param legacyTypeName the name Loading @@ -334,11 +359,21 @@ public final class NetworkAgentConfig implements Parcelable { return this; } /** * Sets the name of the legacy Sub-type of the agent. It's a free-form string. * @param legacySubTypeName the name * @return this builder, to facilitate chaining. */ @NonNull public Builder setLegacySubTypeName(@NonNull String legacySubTypeName) { mConfig.legacySubTypeName = legacySubTypeName; return this; } /** * Sets the legacy extra info of the agent. * @param legacyExtraInfo the legacy extra info. * @return this builder, to facilitate chaining. * @hide */ @NonNull public Builder setLegacyExtraInfo(@NonNull String legacyExtraInfo) { Loading Loading @@ -412,6 +447,8 @@ public final class NetworkAgentConfig implements Parcelable { out.writeInt(skip464xlat ? 1 : 0); out.writeInt(legacyType); out.writeString(legacyTypeName); out.writeInt(legacySubType); out.writeString(legacySubTypeName); out.writeString(mLegacyExtraInfo); } Loading @@ -429,6 +466,8 @@ public final class NetworkAgentConfig implements Parcelable { networkAgentConfig.skip464xlat = in.readInt() != 0; networkAgentConfig.legacyType = in.readInt(); networkAgentConfig.legacyTypeName = in.readString(); networkAgentConfig.legacySubType = in.readInt(); networkAgentConfig.legacySubTypeName = in.readString(); networkAgentConfig.mLegacyExtraInfo = in.readString(); return networkAgentConfig; } Loading
packages/Connectivity/framework/src/android/net/SocketKeepalive.java +65 −19 Original line number Diff line number Diff line Loading @@ -55,36 +55,68 @@ public abstract class SocketKeepalive implements AutoCloseable { static final String TAG = "SocketKeepalive"; /** * No errors. * Success. It indicates there is no error. * @hide */ @SystemApi public static final int SUCCESS = 0; /** @hide */ /** * No keepalive. This should only be internally as it indicates There is no keepalive. * It should not propagate to applications. * @hide */ public static final int NO_KEEPALIVE = -1; /** @hide */ /** * Data received. * @hide */ public static final int DATA_RECEIVED = -2; /** @hide */ /** * The binder died. * @hide */ public static final int BINDER_DIED = -10; /** The specified {@code Network} is not connected. */ /** * The invalid network. It indicates the specified {@code Network} is not connected. */ public static final int ERROR_INVALID_NETWORK = -20; /** The specified IP addresses are invalid. For example, the specified source IP address is * not configured on the specified {@code Network}. */ /** * The invalid IP addresses. Indicates the specified IP addresses are invalid. * For example, the specified source IP address is not configured on the * specified {@code Network}. */ public static final int ERROR_INVALID_IP_ADDRESS = -21; /** The requested port is invalid. */ /** * The port is invalid. */ public static final int ERROR_INVALID_PORT = -22; /** The packet length is invalid (e.g., too long). */ /** * The length is invalid (e.g. too long). */ public static final int ERROR_INVALID_LENGTH = -23; /** The packet transmission interval is invalid (e.g., too short). */ /** * The interval is invalid (e.g. too short). */ public static final int ERROR_INVALID_INTERVAL = -24; /** The target socket is invalid. */ /** * The socket is invalid. */ public static final int ERROR_INVALID_SOCKET = -25; /** The target socket is not idle. */ /** * The socket is not idle. */ public static final int ERROR_SOCKET_NOT_IDLE = -26; /** * The stop reason is uninitialized. This should only be internally used as initial state * of stop reason, instead of propagating to application. Loading @@ -92,15 +124,29 @@ public abstract class SocketKeepalive implements AutoCloseable { */ public static final int ERROR_STOP_REASON_UNINITIALIZED = -27; /** The device does not support this request. */ /** * The request is unsupported. */ public static final int ERROR_UNSUPPORTED = -30; /** @hide TODO: delete when telephony code has been updated. */ public static final int ERROR_HARDWARE_UNSUPPORTED = ERROR_UNSUPPORTED; /** The hardware returned an error. */ /** * There was a hardware error. */ public static final int ERROR_HARDWARE_ERROR = -31; /** The limitation of resource is reached. */ /** * Resources are insufficient (e.g. all hardware slots are in use). */ public static final int ERROR_INSUFFICIENT_RESOURCES = -32; /** * There was no such slot. This should only be internally as it indicates * a programming error in the system server. It should not propagate to * applications. * @hide */ @SystemApi public static final int ERROR_NO_SUCH_SLOT = -33; /** @hide */ @Retention(RetentionPolicy.SOURCE) Loading @@ -111,7 +157,8 @@ public abstract class SocketKeepalive implements AutoCloseable { ERROR_INVALID_LENGTH, ERROR_INVALID_INTERVAL, ERROR_INVALID_SOCKET, ERROR_SOCKET_NOT_IDLE ERROR_SOCKET_NOT_IDLE, ERROR_NO_SUCH_SLOT }) public @interface ErrorCode {} Loading @@ -122,7 +169,6 @@ public abstract class SocketKeepalive implements AutoCloseable { ERROR_INVALID_LENGTH, ERROR_UNSUPPORTED, ERROR_INSUFFICIENT_RESOURCES, ERROR_HARDWARE_UNSUPPORTED }) public @interface KeepaliveEvent {} Loading
services/core/java/com/android/server/connectivity/KeepaliveTracker.java +3 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static android.net.SocketKeepalive.ERROR_INVALID_INTERVAL; import static android.net.SocketKeepalive.ERROR_INVALID_IP_ADDRESS; import static android.net.SocketKeepalive.ERROR_INVALID_NETWORK; import static android.net.SocketKeepalive.ERROR_INVALID_SOCKET; import static android.net.SocketKeepalive.ERROR_NO_SUCH_SLOT; import static android.net.SocketKeepalive.ERROR_STOP_REASON_UNINITIALIZED; import static android.net.SocketKeepalive.ERROR_UNSUPPORTED; import static android.net.SocketKeepalive.MAX_INTERVAL_SEC; Loading Loading @@ -528,6 +529,8 @@ public class KeepaliveTracker { } } else if (reason == ERROR_STOP_REASON_UNINITIALIZED) { throw new IllegalStateException("Unexpected stop reason: " + reason); } else if (reason == ERROR_NO_SUCH_SLOT) { throw new IllegalStateException("No such slot: " + reason); } else { notifyErrorCallback(ki.mCallback, reason); } Loading