Skip to content
This repository was archived by the owner on Dec 29, 2025. It is now read-only.

Commit 1d2db48

Browse files
authored
Create NetworkObserver.java
1 parent 94811bb commit 1d2db48

File tree

1 file changed

+143
-0
lines changed

1 file changed

+143
-0
lines changed
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
package com.xbox.httpclient;
2+
3+
import android.content.Context;
4+
import android.net.*;
5+
import android.os.Build;
6+
import org.jetbrains.annotations.NotNull;
7+
8+
import java.util.LinkedHashMap;
9+
import java.util.Map;
10+
11+
/**
12+
* 09.09.2025
13+
*
14+
* @author <a href="https://github.com/timscriptov">timscriptov</a>
15+
*/
16+
public class NetworkObserver {
17+
private static final String CONNECTIVITY_SERVICE = "connectivity";
18+
19+
private static String s_lastCapabilities = "";
20+
private static String s_lastLinkProperties = "";
21+
22+
private static final ConnectivityManager.NetworkCallback s_networkChangedCallback = new ConnectivityManager.NetworkCallback() {
23+
@Override
24+
public void onAvailable(Network network) {
25+
logNetworkStatus(network, "is available");
26+
}
27+
28+
@Override
29+
public void onLost(Network network) {
30+
logNetworkStatus(network, "was lost");
31+
}
32+
33+
@Override
34+
public void onUnavailable() {
35+
NetworkObserver.Log("No networks were available");
36+
}
37+
38+
@Override
39+
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
40+
handleCapabilitiesChange(network, networkCapabilities);
41+
}
42+
43+
@Override
44+
public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
45+
handleLinkPropertiesChange(network, linkProperties);
46+
}
47+
48+
private void handleCapabilitiesChange(Network network, NetworkCapabilities networkCapabilities) {
49+
final String capabilities = NetworkDetails.checkNetworkCapabilities(networkCapabilities);
50+
if (!capabilities.equals(s_lastCapabilities)) {
51+
s_lastCapabilities = capabilities;
52+
logNetworkStatus(network, "has capabilities: " + s_lastCapabilities);
53+
}
54+
}
55+
56+
private void handleLinkPropertiesChange(Network network, LinkProperties linkProperties) {
57+
final String linkProps = NetworkDetails.checkLinkProperties(linkProperties);
58+
if (!linkProps.equals(s_lastLinkProperties)) {
59+
s_lastLinkProperties = linkProps;
60+
logNetworkStatus(network, "has link properties: " + s_lastLinkProperties);
61+
}
62+
}
63+
64+
private void logNetworkStatus(@NotNull Network network, String status) {
65+
NetworkObserver.Log("Network ID " + network.hashCode() + " " + status);
66+
}
67+
};
68+
69+
private static native void Log(String message);
70+
71+
public static void Initialize(Context context) {
72+
final ConnectivityManager connectivityManager = getConnectivityManager(context);
73+
final NetworkRequest networkRequest = buildNetworkRequest();
74+
connectivityManager.registerNetworkCallback(networkRequest, s_networkChangedCallback);
75+
}
76+
77+
public static void Cleanup(Context context) {
78+
final ConnectivityManager connectivityManager = getConnectivityManager(context);
79+
connectivityManager.unregisterNetworkCallback(s_networkChangedCallback);
80+
}
81+
82+
private static ConnectivityManager getConnectivityManager(@NotNull Context context) {
83+
return (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE);
84+
}
85+
86+
private static NetworkRequest buildNetworkRequest() {
87+
return new NetworkRequest.Builder()
88+
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
89+
.build();
90+
}
91+
92+
static class NetworkDetails {
93+
@NotNull
94+
public static String getNetworkDetails(Network network, @NotNull ConnectivityManager connectivityManager) {
95+
final NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
96+
final LinkProperties linkProperties = connectivityManager.getLinkProperties(network);
97+
98+
return String.format("Network %d:%n Capabilities: %s%n Link properties: %s",
99+
network.hashCode(),
100+
capabilities != null ? checkNetworkCapabilities(capabilities) : "Got null capabilities",
101+
linkProperties != null ? checkLinkProperties(linkProperties) : "Got null link properties");
102+
}
103+
104+
@NotNull
105+
public static String checkNetworkCapabilities(@NotNull NetworkCapabilities networkCapabilities) {
106+
Map<String, Boolean> capabilitiesMap = new LinkedHashMap<>();
107+
108+
capabilitiesMap.put("isWifi", networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI));
109+
capabilitiesMap.put("isBluetooth", networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH));
110+
capabilitiesMap.put("isCellular", networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR));
111+
capabilitiesMap.put("isVpn", networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN));
112+
capabilitiesMap.put("isEthernet", networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET));
113+
capabilitiesMap.put("shouldHaveInternet", networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET));
114+
capabilitiesMap.put("isNotVpn", networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN));
115+
capabilitiesMap.put("internetWasValidated", networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED));
116+
117+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
118+
capabilitiesMap.put("isNotSuspended", networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED));
119+
}
120+
121+
return joinMap(capabilitiesMap);
122+
}
123+
124+
@NotNull
125+
public static String checkLinkProperties(@NotNull LinkProperties linkProperties) {
126+
Map<String, Boolean> linkPropsMap = new LinkedHashMap<>();
127+
linkPropsMap.put("hasProxy", linkProperties.getHttpProxy() != null);
128+
return joinMap(linkPropsMap);
129+
}
130+
131+
@NotNull
132+
private static String joinMap(@NotNull Map<String, Boolean> map) {
133+
StringBuilder result = new StringBuilder();
134+
for (Map.Entry<String, Boolean> entry : map.entrySet()) {
135+
if (result.length() > 0) { // Changed from isEmpty() to length() > 0
136+
result.append(", ");
137+
}
138+
result.append(entry.getKey()).append(": ").append(entry.getValue());
139+
}
140+
return result.toString();
141+
}
142+
}
143+
}

0 commit comments

Comments
 (0)