/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.net; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.PendingIntent; import android.content.Context; import android.net.IpSecManager.UdpEncapsulationSocket; import android.net.SocketKeepalive.Callback; import android.os.Bundle; import android.os.Handler; import android.os.Messenger; import android.os.ParcelFileDescriptor; import android.os.PersistableBundle; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.util.List; import java.util.concurrent.Executor; import static android.os._Original_Build.VERSION_CODES.BASE; /** * Stub ConnectivityManager for layoutlib */ public class ConnectivityManager { @Deprecated public static final String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE"; public static final String ACTION_CAPTIVE_PORTAL_SIGN_IN = "android.net.conn.CAPTIVE_PORTAL"; @Deprecated public static final String EXTRA_NETWORK_INFO = "networkInfo"; @Deprecated public static final String EXTRA_NETWORK_TYPE = "networkType"; @Deprecated public static final String EXTRA_IS_FAILOVER = "isFailover"; @Deprecated public static final String EXTRA_OTHER_NETWORK_INFO = "otherNetwork"; public static final String EXTRA_NO_CONNECTIVITY = "noConnectivity"; public static final String EXTRA_REASON = "reason"; @Deprecated public static final String EXTRA_EXTRA_INFO = "extraInfo"; public static final String EXTRA_INET_CONDITION = "inetCondition"; public static final String EXTRA_CAPTIVE_PORTAL = "android.net.extra.CAPTIVE_PORTAL"; public static final String EXTRA_CAPTIVE_PORTAL_URL = "android.net.extra.CAPTIVE_PORTAL_URL"; public static final String EXTRA_CAPTIVE_PORTAL_PROBE_SPEC = "android.net.extra.CAPTIVE_PORTAL_PROBE_SPEC"; public static final String EXTRA_CAPTIVE_PORTAL_USER_AGENT = "android.net.extra.CAPTIVE_PORTAL_USER_AGENT"; public static final String ACTION_DATA_ACTIVITY_CHANGE = "android.net.conn.DATA_ACTIVITY_CHANGE"; public static final String EXTRA_DEVICE_TYPE = "deviceType"; public static final String EXTRA_IS_ACTIVE = "isActive"; public static final String EXTRA_REALTIME_NS = "tsNanos"; @Deprecated public static final String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED"; public static final String INET_CONDITION_ACTION = "android.net.conn.INET_CONDITION_ACTION"; public static final String ACTION_TETHER_STATE_CHANGED = TetheringManager.ACTION_TETHER_STATE_CHANGED; public static final String EXTRA_AVAILABLE_TETHER = TetheringManager.EXTRA_AVAILABLE_TETHER; public static final String EXTRA_ACTIVE_LOCAL_ONLY = TetheringManager.EXTRA_ACTIVE_LOCAL_ONLY; public static final String EXTRA_ACTIVE_TETHER = TetheringManager.EXTRA_ACTIVE_TETHER; public static final String EXTRA_ERRORED_TETHER = TetheringManager.EXTRA_ERRORED_TETHER; public static final String ACTION_CAPTIVE_PORTAL_TEST_COMPLETED = "android.net.conn.CAPTIVE_PORTAL_TEST_COMPLETED"; public static final String EXTRA_IS_CAPTIVE_PORTAL = "captivePortal"; public static final String ACTION_PROMPT_UNVALIDATED = "android.net.conn.PROMPT_UNVALIDATED"; public static final String ACTION_PROMPT_LOST_VALIDATION = "android.net.conn.PROMPT_LOST_VALIDATION"; public static final String ACTION_PROMPT_PARTIAL_CONNECTIVITY = "android.net.conn.PROMPT_PARTIAL_CONNECTIVITY"; public static final int TETHERING_INVALID = TetheringManager.TETHERING_INVALID; public static final int TETHERING_WIFI = TetheringManager.TETHERING_WIFI; public static final int TETHERING_USB = TetheringManager.TETHERING_USB; public static final int TETHERING_BLUETOOTH = TetheringManager.TETHERING_BLUETOOTH; public static final int TETHERING_WIFI_P2P = TetheringManager.TETHERING_WIFI_P2P; public static final int TYPE_NONE = -1; @Deprecated public static final int TYPE_MOBILE = 0; @Deprecated public static final int TYPE_WIFI = 1; @Deprecated public static final int TYPE_MOBILE_MMS = 2; @Deprecated public static final int TYPE_MOBILE_SUPL = 3; @Deprecated public static final int TYPE_MOBILE_DUN = 4; @Deprecated public static final int TYPE_MOBILE_HIPRI = 5; @Deprecated public static final int TYPE_WIMAX = 6; @Deprecated public static final int TYPE_BLUETOOTH = 7; @Deprecated public static final int TYPE_DUMMY = 8; @Deprecated public static final int TYPE_ETHERNET = 9; @Deprecated public static final int TYPE_MOBILE_FOTA = 10; @Deprecated public static final int TYPE_MOBILE_IMS = 11; @Deprecated public static final int TYPE_MOBILE_CBS = 12; @Deprecated public static final int TYPE_WIFI_P2P = 13; @Deprecated public static final int TYPE_MOBILE_IA = 14; @Deprecated public static final int TYPE_MOBILE_EMERGENCY = 15; @Deprecated public static final int TYPE_PROXY = 16; @Deprecated public static final int TYPE_VPN = 17; @Deprecated public static final int TYPE_TEST = 18; // TODO: Remove this once NetworkTypes are unused. @Deprecated public @interface LegacyNetworkType {} public static final int MAX_RADIO_TYPE = TYPE_TEST; public static final int MAX_NETWORK_TYPE = TYPE_TEST; @Deprecated public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI; public static final int REQUEST_ID_UNSET = 0; public static final int NETID_UNSET = 0; public static final String PRIVATE_DNS_MODE_OFF = "off"; public static final String PRIVATE_DNS_MODE_OPPORTUNISTIC = "opportunistic"; public static final String PRIVATE_DNS_MODE_PROVIDER_HOSTNAME = "hostname"; public static final String PRIVATE_DNS_DEFAULT_MODE_FALLBACK = PRIVATE_DNS_MODE_OPPORTUNISTIC; private static ConnectivityManager sInstance; @Deprecated public static boolean isNetworkTypeValid(int networkType) { return false; } @Deprecated public static String getNetworkTypeName(int type) { return null; } @Deprecated public static boolean isNetworkTypeMobile(int networkType) { return false; } @Deprecated public static boolean isNetworkTypeWifi(int networkType) { return false; } @Deprecated public void setNetworkPreference(int preference) { } @Deprecated public int getNetworkPreference() { return TYPE_NONE; } @Deprecated @Nullable public NetworkInfo getActiveNetworkInfo() { return null; } @Nullable public Network getActiveNetwork() { return null; } @Nullable public Network getActiveNetworkForUid(int uid) { return null; } public Network getActiveNetworkForUid(int uid, boolean ignoreBlocked) { return null; } public boolean isAlwaysOnVpnPackageSupportedForUser(int userId, @Nullable String vpnPackage) { return false; } public boolean setAlwaysOnVpnPackageForUser(int userId, @Nullable String vpnPackage, boolean lockdownEnabled, @Nullable List lockdownList) { return false; } public String getAlwaysOnVpnPackageForUser(int userId) { return null; } public boolean isVpnLockdownEnabled(int userId) { return false; } public List getVpnLockdownWhitelist(int userId) { return null; } public NetworkInfo getActiveNetworkInfoForUid(int uid) { return null; } public NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked) { return null; } @Deprecated @Nullable public NetworkInfo getNetworkInfo(int networkType) { return null; } @Deprecated @Nullable public NetworkInfo getNetworkInfo(@Nullable Network network) { return null; } public NetworkInfo getNetworkInfoForUid(Network network, int uid, boolean ignoreBlocked) { return null; } @Deprecated @NonNull public NetworkInfo[] getAllNetworkInfo() { return new NetworkInfo[0]; } @Deprecated public Network getNetworkForType(int networkType) { return null; } @NonNull public Network[] getAllNetworks() { return new Network[0]; } public NetworkCapabilities[] getDefaultNetworkCapabilitiesForUser(int userId) { return null; } public LinkProperties getActiveLinkProperties() { return null; } @Deprecated public LinkProperties getLinkProperties(int networkType) { return null; } @Nullable public LinkProperties getLinkProperties(@Nullable Network network) { return null; } @Nullable public NetworkCapabilities getNetworkCapabilities(@Nullable Network network) { return null; } @Deprecated public String getCaptivePortalServerUrl() { return null; } @Deprecated public int startUsingNetworkFeature(int networkType, String feature) { return -1; } @Deprecated public int stopUsingNetworkFeature(int networkType, String feature) { return -1; } public static NetworkCapabilities networkCapabilitiesForType(int type) { return null; } public static class PacketKeepaliveCallback { public PacketKeepaliveCallback() { } public void onStarted() {} public void onStopped() {} public void onError(int error) {} } public class PacketKeepalive { public static final int SUCCESS = 0; public static final int NO_KEEPALIVE = -1; public static final int BINDER_DIED = -10; public static final int ERROR_INVALID_NETWORK = -20; public static final int ERROR_INVALID_IP_ADDRESS = -21; public static final int ERROR_INVALID_PORT = -22; public static final int ERROR_INVALID_LENGTH = -23; public static final int ERROR_INVALID_INTERVAL = -24; public static final int ERROR_HARDWARE_UNSUPPORTED = -30; public static final int ERROR_HARDWARE_ERROR = -31; public static final int NATT_PORT = 4500; public static final int MIN_INTERVAL = 10; public void stop() {} } public PacketKeepalive startNattKeepalive( Network network, int intervalSeconds, PacketKeepaliveCallback callback, InetAddress srcAddr, int srcPort, InetAddress dstAddr) { return null; } public @NonNull SocketKeepalive createSocketKeepalive(@NonNull Network network, @NonNull UdpEncapsulationSocket socket, @NonNull InetAddress source, @NonNull InetAddress destination, @NonNull Executor executor, @NonNull Callback callback) { throw new UnsupportedOperationException( "createSocketKeepalive is not supported in layoutlib"); } public @NonNull SocketKeepalive createNattKeepalive(@NonNull Network network, @NonNull ParcelFileDescriptor pfd, @NonNull InetAddress source, @NonNull InetAddress destination, @NonNull Executor executor, @NonNull Callback callback) { throw new UnsupportedOperationException( "createSocketKeepalive is not supported in layoutlib"); } public @NonNull SocketKeepalive createSocketKeepalive(@NonNull Network network, @NonNull Socket socket, @NonNull Executor executor, @NonNull Callback callback) { throw new UnsupportedOperationException( "createSocketKeepalive is not supported in layoutlib"); } @Deprecated public boolean requestRouteToHost(int networkType, int hostAddress) { return false; } @Deprecated public boolean requestRouteToHostAddress(int networkType, InetAddress hostAddress) { return false; } @Deprecated public boolean getBackgroundDataSetting() { return false; } @Deprecated public void setBackgroundDataSetting(boolean allowBackgroundData) {} @Deprecated public boolean getMobileDataEnabled() { return false; } public interface OnNetworkActiveListener { void onNetworkActive(); } public void addDefaultNetworkActiveListener(final OnNetworkActiveListener l) {} public void removeDefaultNetworkActiveListener(@NonNull OnNetworkActiveListener l) {} public boolean isDefaultNetworkActive() { return false; } public ConnectivityManager(Context context, IConnectivityManager service) { sInstance = this; } public static ConnectivityManager from(Context context) { return new ConnectivityManager(context, null); } public NetworkRequest getDefaultRequest() { return null; } public static final void enforceChangePermission(Context context) {} @Deprecated static ConnectivityManager getInstanceOrNull() { return sInstance; } @Deprecated private static ConnectivityManager getInstance() { if (getInstanceOrNull() == null) { throw new IllegalStateException("No ConnectivityManager yet constructed"); } return getInstanceOrNull(); } @Deprecated public String[] getTetherableIfaces() { return null; } @Deprecated public String[] getTetheredIfaces() { return null; } @Deprecated public String[] getTetheringErroredIfaces() { return null; } @Deprecated public String[] getTetheredDhcpRanges() { throw new UnsupportedOperationException("getTetheredDhcpRanges is not supported"); } @Deprecated public int tether(String iface) { return 0; } @Deprecated public int untether(String iface) { return 0; } public boolean isTetheringSupported() { return false; } @Deprecated public static abstract class OnStartTetheringCallback { public void onTetheringStarted() {} public void onTetheringFailed() {} } @Deprecated public void startTethering(int type, boolean showProvisioningUi, final OnStartTetheringCallback callback) {} @Deprecated public void startTethering(int type, boolean showProvisioningUi, final OnStartTetheringCallback callback, Handler handler) {} @Deprecated public void stopTethering(int type) {} @Deprecated public abstract static class OnTetheringEventCallback { public void onUpstreamChanged(@Nullable Network network) {} } @Deprecated public void registerTetheringEventCallback( @NonNull Executor executor, @NonNull final OnTetheringEventCallback callback) {} @Deprecated public void unregisterTetheringEventCallback( @NonNull final OnTetheringEventCallback callback) {} @Deprecated public String[] getTetherableUsbRegexs() { return null; } @Deprecated public String[] getTetherableWifiRegexs() { return null; } @Deprecated public String[] getTetherableBluetoothRegexs() { return null; } @Deprecated public int setUsbTethering(boolean enable) { return 0; } @Deprecated public static final int TETHER_ERROR_NO_ERROR = TetheringManager.TETHER_ERROR_NO_ERROR; @Deprecated public static final int TETHER_ERROR_UNKNOWN_IFACE = TetheringManager.TETHER_ERROR_UNKNOWN_IFACE; @Deprecated public static final int TETHER_ERROR_SERVICE_UNAVAIL = TetheringManager.TETHER_ERROR_SERVICE_UNAVAIL; @Deprecated public static final int TETHER_ERROR_UNSUPPORTED = TetheringManager.TETHER_ERROR_UNSUPPORTED; @Deprecated public static final int TETHER_ERROR_UNAVAIL_IFACE = TetheringManager.TETHER_ERROR_UNAVAIL_IFACE; @Deprecated public static final int TETHER_ERROR_MASTER_ERROR = TetheringManager.TETHER_ERROR_INTERNAL_ERROR; @Deprecated public static final int TETHER_ERROR_TETHER_IFACE_ERROR = TetheringManager.TETHER_ERROR_TETHER_IFACE_ERROR; @Deprecated public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = TetheringManager.TETHER_ERROR_UNTETHER_IFACE_ERROR; @Deprecated public static final int TETHER_ERROR_ENABLE_NAT_ERROR = TetheringManager.TETHER_ERROR_ENABLE_FORWARDING_ERROR; @Deprecated public static final int TETHER_ERROR_DISABLE_NAT_ERROR = TetheringManager.TETHER_ERROR_DISABLE_FORWARDING_ERROR; @Deprecated public static final int TETHER_ERROR_IFACE_CFG_ERROR = TetheringManager.TETHER_ERROR_IFACE_CFG_ERROR; @Deprecated public static final int TETHER_ERROR_PROVISION_FAILED = TetheringManager.TETHER_ERROR_PROVISIONING_FAILED; @Deprecated public static final int TETHER_ERROR_DHCPSERVER_ERROR = TetheringManager.TETHER_ERROR_DHCPSERVER_ERROR; @Deprecated public static final int TETHER_ERROR_ENTITLEMENT_UNKONWN = TetheringManager.TETHER_ERROR_ENTITLEMENT_UNKNOWN; @Deprecated public int getLastTetherError(String iface) { return 0; } public @interface EntitlementResultCode { } @Deprecated public interface OnTetheringEntitlementResultListener { void onTetheringEntitlementResult(@EntitlementResultCode int resultCode); } @Deprecated public void getLatestTetheringEntitlementResult(int type, boolean showEntitlementUi, @NonNull Executor executor, @NonNull final OnTetheringEntitlementResultListener listener) {} public void reportInetCondition(int networkType, int percentage) {} @Deprecated public void reportBadNetwork(@Nullable Network network) {} public void reportNetworkConnectivity(@Nullable Network network, boolean hasConnectivity) {} public void setGlobalProxy(ProxyInfo p) {} public ProxyInfo getGlobalProxy() { return null; } public ProxyInfo getProxyForNetwork(Network network) { return null; } @Nullable public ProxyInfo getDefaultProxy() { return null; } @Deprecated public boolean isNetworkSupported(int networkType) { return false; } public boolean isActiveNetworkMetered() { return false; } public boolean updateLockdownVpn() { return false; } public int checkMobileProvisioning(int suggestedTimeOutMs) { return 0; } public String getMobileProvisioningUrl() { return null; } @Deprecated public void setProvisioningNotificationVisible(boolean visible, int networkType, String action) {} public void setAirplaneMode(boolean enable) {} public int registerNetworkFactory(Messenger messenger, String name) { return 0; } public void unregisterNetworkFactory(Messenger messenger) {} public int registerNetworkProvider(@NonNull NetworkProvider provider) { return 0; } public void unregisterNetworkProvider(@NonNull NetworkProvider provider) {} public void declareNetworkRequestUnfulfillable(@NonNull NetworkRequest request) {} public Network registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp, NetworkCapabilities nc, int score, NetworkAgentConfig config) { return null; } public Network registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp, NetworkCapabilities nc, int score, NetworkAgentConfig config, int providerId) { return null; } public static class NetworkCallback { public void onPreCheck(@NonNull Network network) {} public void onAvailable(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities, @NonNull LinkProperties linkProperties, boolean blocked) {} public void onAvailable(@NonNull Network network) {} public void onLosing(@NonNull Network network, int maxMsToLive) {} public void onLost(@NonNull Network network) {} public void onUnavailable() {} public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {} public void onLinkPropertiesChanged(@NonNull Network network, @NonNull LinkProperties linkProperties) {} public void onNetworkSuspended(@NonNull Network network) {} public void onNetworkResumed(@NonNull Network network) {} public void onBlockedStatusChanged(@NonNull Network network, boolean blocked) {} } public interface Errors { int TOO_MANY_REQUESTS = 1; } public static class TooManyRequestsException extends RuntimeException {} public static final int CALLBACK_PRECHECK = BASE + 1; public static final int CALLBACK_AVAILABLE = BASE + 2; public static final int CALLBACK_LOSING = BASE + 3; public static final int CALLBACK_LOST = BASE + 4; public static final int CALLBACK_UNAVAIL = BASE + 5; public static final int CALLBACK_CAP_CHANGED = BASE + 6; public static final int CALLBACK_IP_CHANGED = BASE + 7; private static final int EXPIRE_LEGACY_REQUEST = BASE + 8; public static final int CALLBACK_SUSPENDED = BASE + 9; public static final int CALLBACK_RESUMED = BASE + 10; public static final int CALLBACK_BLK_CHANGED = BASE + 11; public static String getCallbackName(int whichCallback) { switch (whichCallback) { case CALLBACK_PRECHECK: return "CALLBACK_PRECHECK"; case CALLBACK_AVAILABLE: return "CALLBACK_AVAILABLE"; case CALLBACK_LOSING: return "CALLBACK_LOSING"; case CALLBACK_LOST: return "CALLBACK_LOST"; case CALLBACK_UNAVAIL: return "CALLBACK_UNAVAIL"; case CALLBACK_CAP_CHANGED: return "CALLBACK_CAP_CHANGED"; case CALLBACK_IP_CHANGED: return "CALLBACK_IP_CHANGED"; case EXPIRE_LEGACY_REQUEST: return "EXPIRE_LEGACY_REQUEST"; case CALLBACK_SUSPENDED: return "CALLBACK_SUSPENDED"; case CALLBACK_RESUMED: return "CALLBACK_RESUMED"; case CALLBACK_BLK_CHANGED: return "CALLBACK_BLK_CHANGED"; default: return Integer.toString(whichCallback); } } public void requestNetwork(@NonNull NetworkRequest request, int timeoutMs, int legacyType, @NonNull Handler handler, @NonNull NetworkCallback networkCallback) {} public void requestNetwork(@NonNull NetworkRequest request, @NonNull NetworkCallback networkCallback) {} public void requestNetwork(@NonNull NetworkRequest request, @NonNull NetworkCallback networkCallback, @NonNull Handler handler) {} public void requestNetwork(@NonNull NetworkRequest request, @NonNull NetworkCallback networkCallback, int timeoutMs) {} public void requestNetwork(@NonNull NetworkRequest request, @NonNull NetworkCallback networkCallback, @NonNull Handler handler, int timeoutMs) {} public static final String EXTRA_NETWORK = "android.net.extra.NETWORK"; public static final String EXTRA_NETWORK_REQUEST = "android.net.extra.NETWORK_REQUEST"; public void requestNetwork(@NonNull NetworkRequest request, @NonNull PendingIntent operation) {} public void releaseNetworkRequest(@NonNull PendingIntent operation) {} public void registerNetworkCallback(@NonNull NetworkRequest request, @NonNull NetworkCallback networkCallback) {} public void registerNetworkCallback(@NonNull NetworkRequest request, @NonNull NetworkCallback networkCallback, @NonNull Handler handler) {} public void registerNetworkCallback(@NonNull NetworkRequest request, @NonNull PendingIntent operation) {} public void registerDefaultNetworkCallback(@NonNull NetworkCallback networkCallback) {} public void registerDefaultNetworkCallback(@NonNull NetworkCallback networkCallback, @NonNull Handler handler) {} public boolean requestBandwidthUpdate(@NonNull Network network) { return false; } public void unregisterNetworkCallback(@NonNull NetworkCallback networkCallback) {} public void unregisterNetworkCallback(@NonNull PendingIntent operation) {} public void setAcceptUnvalidated(Network network, boolean accept, boolean always) {} public void setAcceptPartialConnectivity(Network network, boolean accept, boolean always) {} public void setAvoidUnvalidated(Network network) {} public void startCaptivePortalApp(Network network) {} public void startCaptivePortalApp(@NonNull Network network, @NonNull Bundle appExtras) {} public boolean shouldAvoidBadWifi() { return false; } public static final int MULTIPATH_PREFERENCE_HANDOVER = 1 << 0; public static final int MULTIPATH_PREFERENCE_RELIABILITY = 1 << 1; public static final int MULTIPATH_PREFERENCE_PERFORMANCE = 1 << 2; public static final int MULTIPATH_PREFERENCE_UNMETERED = MULTIPATH_PREFERENCE_HANDOVER | MULTIPATH_PREFERENCE_RELIABILITY | MULTIPATH_PREFERENCE_PERFORMANCE; public @interface MultipathPreference { } public @MultipathPreference int getMultipathPreference(@Nullable Network network) { return 0; } public void factoryReset() {} public boolean bindProcessToNetwork(@Nullable Network network) { return false; } public static boolean setProcessDefaultNetwork(@Nullable Network network) { return false; } @Nullable public Network getBoundNetworkForProcess() { return null; } @Deprecated @Nullable public static Network getProcessDefaultNetwork() { return null; } @Deprecated public static boolean setProcessDefaultNetworkForHostResolution(Network network) { return false; } public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; public static final String ACTION_RESTRICT_BACKGROUND_CHANGED = "android.net.conn.RESTRICT_BACKGROUND_CHANGED"; public @interface RestrictBackgroundStatus { } public @RestrictBackgroundStatus int getRestrictBackgroundStatus() { return 0; } @Nullable public byte[] getNetworkWatchlistConfigHash() { return null; } public int getConnectionOwnerUid( int protocol, @NonNull InetSocketAddress local, @NonNull InetSocketAddress remote) { return 0; } public void simulateDataStall(int detectionMethod, long timestampMillis, @NonNull Network network, @NonNull PersistableBundle extras) {} }