4package org.qtproject.qt.android.networkinformation;
6import android.annotation.SuppressLint;
7import android.content.Context;
8import android.net.ConnectivityManager;
9import android.net.ConnectivityManager.NetworkCallback;
10import android.net.NetworkRequest;
11import android.net.NetworkCapabilities;
12import android.net.Network;
13import android.os.Build;
16 private static final String LOG_TAG =
"QtAndroidNetworkInformation";
18 private static native
void networkConnectivityChanged(
int connectivity);
19 private static native
void genericInfoChanged(
boolean captivePortal,
boolean metered);
20 private static native
void transportMediumChanged(
int transportMedium);
22 private static QtNetworkInformationCallback m_callback =
null;
26 enum AndroidConnectivity {
27 Connected,
Unknown, Disconnected
42 private static class QtNetworkInformationCallback
extends NetworkCallback {
43 public AndroidConnectivity previousState =
null;
44 public Transport previousTransport =
null;
46 QtNetworkInformationCallback() {
50 public void onCapabilitiesChanged(Network network, NetworkCapabilities capabilities) {
51 AndroidConnectivity
s;
52 if (!capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET))
53 s = AndroidConnectivity.Disconnected;
54 else if (capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED))
55 s = AndroidConnectivity.Connected;
57 s = AndroidConnectivity.Unknown;
59 final Transport transport = getTransport(capabilities);
60 if (transport == Transport.Unknown)
61 s = AndroidConnectivity.Unknown;
64 setTransportMedium(transport);
67 = capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
69 = !capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
70 genericInfoChanged(captive, metered);
73 private Transport getTransport(NetworkCapabilities capabilities)
75 if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
76 return Transport.WiFi;
77 }
else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
78 return Transport.Cellular;
79 }
else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH)) {
80 return Transport.Bluetooth;
81 }
else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
82 return Transport.Ethernet;
83 }
else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI_AWARE)) {
85 return Transport.WiFiAware;
86 }
else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_LOWPAN)) {
88 return Transport.LoWPAN;
93 return Transport.Unknown;
96 private void setState(AndroidConnectivity
s) {
97 if (previousState !=
s) {
99 networkConnectivityChanged(
s.ordinal());
103 private void setTransportMedium(Transport
t) {
104 if (previousTransport !=
t) {
105 previousTransport =
t;
106 transportMediumChanged(
t.ordinal());
111 public void onLost(Network network) {
112 setState(AndroidConnectivity.Disconnected);
119 public static AndroidConnectivity
state() {
120 if (m_callback !=
null && m_callback.previousState !=
null)
121 return m_callback.previousState;
122 return AndroidConnectivity.Unknown;
125 @SuppressLint(
"MissingPermission")
127 synchronized (m_lock) {
128 if (m_callback ==
null) {
130 m_callback =
new QtNetworkInformationCallback();
131 NetworkRequest.Builder builder =
new NetworkRequest.Builder();
132 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
133 builder = builder.clearCapabilities();
134 builder = builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
135 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
136 builder = builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED);
137 builder = builder.addCapability(NetworkCapabilities.NET_CAPABILITY_FOREGROUND);
139 NetworkRequest
request = builder.build();
149 synchronized (m_lock) {
150 if (m_callback !=
null) {
158 return (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
QNetworkAccessManager manager
QNetworkRequest request(url)