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)