Skip to content

Commit

Permalink
fix(connectivity): getActiveNetworkInfo and NetworkInfo modern compli…
Browse files Browse the repository at this point in the history
  • Loading branch information
triniwiz authored and tarunama committed Sep 9, 2020
1 parent d69a3c4 commit f909960
Show file tree
Hide file tree
Showing 3 changed files with 175 additions and 15 deletions.
115 changes: 102 additions & 13 deletions nativescript-core/connectivity/connectivity.android.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import { getNativeApplication, android as androidApp } from "../application";

import { android as androidApp, getNativeApplication } from "../application";
export enum connectionType {
none = 0,
wifi = 1,
mobile = 2,
ethernet = 3,
bluetooth = 4
bluetooth = 4,
vpn = 5
}

const wifi = "wifi";
const mobile = "mobile";
const ethernet = "ethernet";
const bluetooth = "bluetooth";
const vpn = "vpn";

// Get Connection Type
function getConnectivityManager(): android.net.ConnectivityManager {
Expand All @@ -27,33 +28,74 @@ function getActiveNetworkInfo(): android.net.NetworkInfo {
return connectivityManager.getActiveNetworkInfo();
}

export function getConnectionType(): number {
let activeNetworkInfo = getActiveNetworkInfo();
if (!activeNetworkInfo || !activeNetworkInfo.isConnected()) {
function getNetworkCapabilities() {
const connectivityManager = getConnectivityManager() as any;
const network = connectivityManager.getActiveNetwork();
const capabilities = connectivityManager.getNetworkCapabilities(network);
if (capabilities == null) {
return connectionType.none;
}

let type = activeNetworkInfo.getTypeName().toLowerCase();
if (type.indexOf(wifi) !== -1) {
const NetworkCapabilities = (android as any).net.NetworkCapabilities;

if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
return connectionType.wifi;
}

if (type.indexOf(mobile) !== -1) {
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
return connectionType.mobile;
}

if (type.indexOf(ethernet) !== -1) {
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
return connectionType.ethernet;
}

if (type.indexOf(bluetooth) !== -1) {
if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH)) {
return connectionType.bluetooth;
}

if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
return connectionType.vpn;
}

return connectionType.none;
}

export function startMonitoring(connectionTypeChangedCallback: (newConnectionType: number) => void): void {
export function getConnectionType(): number {
if (android.os.Build.VERSION.SDK_INT >= 28) {
return getNetworkCapabilities();
} else {
let activeNetworkInfo = getActiveNetworkInfo();
if (!activeNetworkInfo || !activeNetworkInfo.isConnected()) {
return connectionType.none;
}

let type = activeNetworkInfo.getTypeName().toLowerCase();
if (type.indexOf(wifi) !== -1) {
return connectionType.wifi;
}

if (type.indexOf(mobile) !== -1) {
return connectionType.mobile;
}

if (type.indexOf(ethernet) !== -1) {
return connectionType.ethernet;
}

if (type.indexOf(bluetooth) !== -1) {
return connectionType.bluetooth;
}

if (type.indexOf(vpn) !== -1) {
return connectionType.vpn;
}
}

return connectionType.none;
}

function startMonitoringLegacy(connectionTypeChangedCallback) {
let onReceiveCallback = function onReceiveCallback(context: android.content.Context, intent: android.content.Intent) {
let newConnectionType = getConnectionType();
connectionTypeChangedCallback(newConnectionType);
Expand All @@ -62,6 +104,53 @@ export function startMonitoring(connectionTypeChangedCallback: (newConnectionTyp
androidApp.registerBroadcastReceiver(android.net.ConnectivityManager.CONNECTIVITY_ACTION, zoneCallback);
}

let callback;
let networkCallback;
let notifyCallback;
export function startMonitoring(connectionTypeChangedCallback: (newConnectionType: number) => void): void {
if (android.os.Build.VERSION.SDK_INT >= 28) {
const manager = getConnectivityManager() as any;
if (manager) {
notifyCallback = () => {
let newConnectionType = getConnectionType();
let zoneCallback = <any>zonedCallback(connectionTypeChangedCallback);
zoneCallback(newConnectionType);
};
const ConnectivityManager = (android as any).net.ConnectivityManager;
if (!networkCallback) {
networkCallback = ConnectivityManager.NetworkCallback.extend({
onAvailable(network) {
notifyCallback();
},
onCapabilitiesChanged(network, networkCapabilities) {
notifyCallback();
},
onLost(network) {
notifyCallback();
},
onUnavailable() {
notifyCallback();
}
});
}
callback = new networkCallback();
manager.registerDefaultNetworkCallback(callback);
}

} else {
startMonitoringLegacy(connectionTypeChangedCallback);
}
}

export function stopMonitoring(): void {
androidApp.unregisterBroadcastReceiver(android.net.ConnectivityManager.CONNECTIVITY_ACTION);
if (android.os.Build.VERSION.SDK_INT >= 28) {
const manager = getConnectivityManager() as any;
if (manager && callback) {
manager.unregisterNetworkCallback(callback);
notifyCallback = null;
callback = null;
}
} else {
androidApp.unregisterBroadcastReceiver(android.net.ConnectivityManager.CONNECTIVITY_ACTION);
}
}
9 changes: 7 additions & 2 deletions nativescript-core/connectivity/connectivity.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,14 @@ export enum connectionType {
ethernet = 3,

/**
* Denotes an bluetooth connection
* Denotes a bluetooth connection
*/
bluetooth = 4
bluetooth = 4,

/**
* Denotes a vpn connection
*/
vpn = 5
}

/**
Expand Down
66 changes: 66 additions & 0 deletions nativescript-core/connectivity/connectivity.ios.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ export enum connectionType {
none = 0,
wifi = 1,
mobile = 2,
ethernet = 3,
bluetooth = 4,
vpn = 5
}

// Get Connection Type
Expand Down Expand Up @@ -52,9 +55,71 @@ function _getConnectionTypeFromFlags(flags: number): number {
return connectionType.mobile;
}

const cfDict = CFNetworkCopySystemProxySettings();
const nsDict = cfDict.takeUnretainedValue();
const keys = nsDict.objectForKey("__SCOPED__");

if (isVPNConnected(keys)) {
return connectionType.vpn;
}

/*
TODO try improving with CBCentralManager since toggling bluetooth
with multiple connections fails to detect switch, require key added
to Info.plist.
*/
if (isBluetoothConnected(keys)) {
return connectionType.bluetooth;
}

return connectionType.wifi;
}

function isBluetoothConnected (keys) {
if (!keys) {
return false;
}
const allKeys = keys.allKeys;
const size = allKeys.count;
let isBlueTooth = false;
for (let i = 0; i < size; i++) {
const key = allKeys.objectAtIndex(i);
if (
key === "en4"
) {
isBlueTooth = true;
break;
}
}

return isBlueTooth;
}

function isVPNConnected(keys) {
if (!keys) {
return false;
}
const allKeys = keys.allKeys;
const size = allKeys.count;
let isVPN = false;
for (let i = 0; i < size; i++) {
const key = allKeys.objectAtIndex(i);
if (
key === "tap" ||
key === "tun" ||
key === "ppp" ||
key === "ipsec" ||
key === "ipsec0" ||
key === "utun1"
) {
isVPN = true;
break;
}
}

return isVPN;
}

export function getConnectionType(): number {
return _getConnectionType();
}
Expand All @@ -65,6 +130,7 @@ function _reachabilityCallback(target: any, flags: number, info: any) {
const newConnectionType = _getConnectionTypeFromFlags(flags);
_connectionTypeChangedCallback(newConnectionType);
}

}

const _reachabilityCallbackFunctionRef = new interop.FunctionReference(_reachabilityCallback);
Expand Down

0 comments on commit f909960

Please sign in to comment.