Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
QtAndroidNetworkInformation.java
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4package org.qtproject.qt.android.networkinformation;
5
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;
14
16 private static final String LOG_TAG = "QtAndroidNetworkInformation";
17
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);
21
22 private static QtNetworkInformationCallback m_callback = null;
23 private static final Object m_lock = new Object();
24
25 // Keep synchronized with AndroidConnectivity in androidconnectivitymanager.h
29
30 // Keep synchronized with AndroidTransport in androidconnectivitymanager.h
41
42 private static class QtNetworkInformationCallback extends NetworkCallback {
43 public AndroidConnectivity previousState = null;
44 public Transport previousTransport = null;
45
46 QtNetworkInformationCallback() {
47 }
48
49 @Override
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;
56 else
57 s = AndroidConnectivity.Unknown; // = we _may_ have Internet access
58
59 final Transport transport = getTransport(capabilities);
60 if (transport == Transport.Unknown) // If we don't have any transport media: override
61 s = AndroidConnectivity.Unknown;
62
63 setState(s);
64 setTransportMedium(transport);
65
66 final boolean captive
67 = capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
68 final boolean metered
69 = !capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
70 genericInfoChanged(captive, metered);
71 }
72
73 private Transport getTransport(NetworkCapabilities capabilities)
74 {
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)) {
84 // Build.VERSION_CODES.O
85 return Transport.WiFiAware;
86 } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_LOWPAN)) {
87 // Build.VERSION_CODES.O_MR1
88 return Transport.LoWPAN;
89 }/* else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_USB)) {
90 // Build.VERSION_CODES.S
91 return Transport.Usb;
92 }*/ // @todo: Uncomment once we can use SDK 31
93 return Transport.Unknown;
94 }
95
96 private void setState(AndroidConnectivity s) {
97 if (previousState != s) {
98 previousState = s;
99 networkConnectivityChanged(s.ordinal());
100 }
101 }
102
103 private void setTransportMedium(Transport t) {
104 if (previousTransport != t) {
105 previousTransport = t;
106 transportMediumChanged(t.ordinal());
107 }
108 }
109
110 @Override
111 public void onLost(Network network) {
112 setState(AndroidConnectivity.Disconnected);
113 }
114 }
115
116 private QtAndroidNetworkInformation() {
117 }
118
119 public static AndroidConnectivity state() {
120 if (m_callback != null && m_callback.previousState != null)
121 return m_callback.previousState;
123 }
124
125 @SuppressLint("MissingPermission")
126 public static void registerReceiver(final Context context) {
127 synchronized (m_lock) {
128 if (m_callback == null) {
129 ConnectivityManager manager = getConnectivityManager(context);
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);
138 }
139 NetworkRequest request = builder.build();
140
141 // Can't use registerDefaultNetworkCallback because it doesn't let us know when
142 // the network disconnects!
143 manager.registerNetworkCallback(request, m_callback);
144 }
145 }
146 }
147
148 public static void unregisterReceiver(final Context context) {
149 synchronized (m_lock) {
150 if (m_callback != null) {
151 getConnectivityManager(context).unregisterNetworkCallback(m_callback);
152 m_callback = null;
153 }
154 }
155 }
156
157 public static ConnectivityManager getConnectivityManager(final Context context) {
158 return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
159 }
160}
Definition main.cpp:8
static void * context
GLdouble s
[6]
Definition qopenglext.h:235
GLdouble GLdouble t
Definition qopenglext.h:243
QNetworkAccessManager manager
QNetworkRequest request(url)