4package org.qtproject.qt.android.networkinformation;
6import android.annotation.SuppressLint;
8import android.net.ConnectivityManager;
9import android.net.ConnectivityManager.NetworkCallback;
10import android.net.NetworkRequest;
11import android.net.NetworkCapabilities;
15class QtAndroidNetworkInformation {
16 private static final String LOG_TAG =
"QtAndroidNetworkInformation";
22 private static QtNetworkInformationCallback m_callback =
null;
42 private static class QtNetworkInformationCallback
extends NetworkCallback {
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);
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);
116 private QtAndroidNetworkInformation() {
120 if (m_callback !=
null && m_callback.previousState !=
null)
121 return m_callback.previousState;
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) {
151 getConnectivityManager(
context).unregisterNetworkCallback(m_callback);
157 static ConnectivityManager getConnectivityManager(
final Context context) {
158 return (ConnectivityManager)
context.getSystemService(
Context.CONNECTIVITY_SERVICE);
static void transportMediumChanged(JNIEnv *env, jobject obj, jint enumValue)
static void genericInfoChanged(JNIEnv *env, jobject obj, jboolean captivePortal, jboolean metered)
static void networkConnectivityChanged(JNIEnv *env, jobject obj, jint enumValue)
static const QString context()
[vector_of_multirole_objects_0]
QNetworkAccessManager manager
[0]
QNetworkRequest request(url)
[0]