diff --git a/meson.build b/meson.build index 3fdca679..ccb36b55 100644 --- a/meson.build +++ b/meson.build @@ -103,6 +103,7 @@ libtranslationlayer_so = shared_library('translation_layer_main', [ 'src/api-impl-jni/graphics/android_graphics_drawable_DrawableContainer.c', 'src/api-impl-jni/location/android_location_LocationManager.c', 'src/api-impl-jni/media/android_media_MediaCodec.c', + 'src/api-impl-jni/net/android_net_ConnectivityManager.c', 'src/api-impl-jni/sensors/android_hardware_SensorManager.c', 'src/api-impl-jni/util.c', 'src/api-impl-jni/views/AndroidLayout.c', diff --git a/src/api-impl-jni/generated_headers/android_net_ConnectivityManager.h b/src/api-impl-jni/generated_headers/android_net_ConnectivityManager.h new file mode 100644 index 00000000..48905689 --- /dev/null +++ b/src/api-impl-jni/generated_headers/android_net_ConnectivityManager.h @@ -0,0 +1,37 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class android_net_ConnectivityManager */ + +#ifndef _Included_android_net_ConnectivityManager +#define _Included_android_net_ConnectivityManager +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: android_net_ConnectivityManager + * Method: registerNetworkCallback + * Signature: (Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager/NetworkCallback;)V + */ +JNIEXPORT void JNICALL Java_android_net_ConnectivityManager_registerNetworkCallback + (JNIEnv *, jobject, jobject, jobject); + +/* + * Class: android_net_ConnectivityManager + * Method: isActiveNetworkMetered + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_android_net_ConnectivityManager_isActiveNetworkMetered + (JNIEnv *, jobject); + +/* + * Class: android_net_ConnectivityManager + * Method: nativeGetNetworkAvailable + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_android_net_ConnectivityManager_nativeGetNetworkAvailable + (JNIEnv *, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/api-impl-jni/net/android_net_ConnectivityManager.c b/src/api-impl-jni/net/android_net_ConnectivityManager.c new file mode 100644 index 00000000..1b965a6d --- /dev/null +++ b/src/api-impl-jni/net/android_net_ConnectivityManager.c @@ -0,0 +1,35 @@ +#include + +#include "../defines.h" +#include "../util.h" + +#include "../generated_headers/android_net_ConnectivityManager.h" + +JNIEXPORT jboolean JNICALL Java_android_net_ConnectivityManager_isActiveNetworkMetered(JNIEnv *env, jobject this) +{ + return g_network_monitor_get_network_metered(g_network_monitor_get_default()); +} + +JNIEXPORT jboolean JNICALL Java_android_net_ConnectivityManager_nativeGetNetworkAvailable(JNIEnv *env, jobject this) +{ + return g_network_monitor_get_network_available(g_network_monitor_get_default()); +} + +static void on_network_changed(GNetworkMonitor* self, gboolean network_available, jobject callback) +{ + JNIEnv *env = get_jni_env(); + jmethodID method; + if (network_available) { + method = _METHOD(_CLASS(callback), "onAvailable", "(Landroid/net/Network;)V"); + } else { + method = _METHOD(_CLASS(callback), "onLost", "(Landroid/net/Network;)V"); + } + (*env)->CallVoidMethod(env, callback, method, NULL); + if ((*env)->ExceptionCheck(env)) + (*env)->ExceptionDescribe(env); +} + +JNIEXPORT void JNICALL Java_android_net_ConnectivityManager_registerNetworkCallback(JNIEnv *env, jobject this, jobject request, jobject callback) +{ + g_signal_connect(g_network_monitor_get_default(), "network-changed", G_CALLBACK(on_network_changed), _REF(callback)); +} diff --git a/src/api-impl/android/net/ConnectivityManager.java b/src/api-impl/android/net/ConnectivityManager.java index 6590c679..a9108567 100644 --- a/src/api-impl/android/net/ConnectivityManager.java +++ b/src/api-impl/android/net/ConnectivityManager.java @@ -1,20 +1,25 @@ package android.net; +class Network {} + public class ConnectivityManager { - public class NetworkCallback {} + public class NetworkCallback { + public void onAvailable(Network network) {} + public void onLost(Network network) {} + } public NetworkInfo getNetworkInfo(int networkType) { return null; // this means the network type is not supported, which should make properly coded apps cease any attempts to use network-related APIs } public NetworkInfo getActiveNetworkInfo() { - return new NetworkInfo(); + return new NetworkInfo(nativeGetNetworkAvailable()); } - public void registerNetworkCallback(NetworkRequest request, NetworkCallback callback) {} + public native void registerNetworkCallback(NetworkRequest request, NetworkCallback callback); - public boolean isActiveNetworkMetered() { - return false; - } + public native boolean isActiveNetworkMetered(); + + protected native boolean nativeGetNetworkAvailable(); } diff --git a/src/api-impl/android/net/NetworkInfo.java b/src/api-impl/android/net/NetworkInfo.java index 97f40026..c850be1d 100644 --- a/src/api-impl/android/net/NetworkInfo.java +++ b/src/api-impl/android/net/NetworkInfo.java @@ -10,15 +10,21 @@ public class NetworkInfo { UNKNOWN } + private State state = State.DISCONNECTED; + + public NetworkInfo(boolean available) { + state = available ? State.CONNECTED : State.DISCONNECTED; + } + public NetworkInfo.State getState() { - return State.DISCONNECTED; + return state; } public int getType() { - return 0x8; // where did you even get a NetworkInfo object... there is no network + return 0x8; // TYPE_DUMMY } public boolean isConnected() { - return true; + return state == State.CONNECTED; } }