aboutsummaryrefslogtreecommitdiffstats
path: root/src/frontends/android/app/src/main/java/org/strongswan/android/logic/NetworkManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontends/android/app/src/main/java/org/strongswan/android/logic/NetworkManager.java')
-rw-r--r--src/frontends/android/app/src/main/java/org/strongswan/android/logic/NetworkManager.java63
1 files changed, 60 insertions, 3 deletions
diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/NetworkManager.java b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/NetworkManager.java
index ebe1d0080..878a9dd73 100644
--- a/src/frontends/android/app/src/main/java/org/strongswan/android/logic/NetworkManager.java
+++ b/src/frontends/android/app/src/main/java/org/strongswan/android/logic/NetworkManager.java
@@ -22,10 +22,14 @@ import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
-public class NetworkManager extends BroadcastReceiver
+import java.util.LinkedList;
+
+public class NetworkManager extends BroadcastReceiver implements Runnable
{
private final Context mContext;
- private boolean mRegistered;
+ private volatile boolean mRegistered;
+ private Thread mEventNotifier;
+ private LinkedList<Boolean> mEvents = new LinkedList<>();
public NetworkManager(Context context)
{
@@ -34,12 +38,30 @@ public class NetworkManager extends BroadcastReceiver
public void Register()
{
+ mEvents.clear();
+ mRegistered = true;
+ mEventNotifier = new Thread(this);
+ mEventNotifier.start();
mContext.registerReceiver(this, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
public void Unregister()
{
mContext.unregisterReceiver(this);
+ mRegistered = false;
+ synchronized (this)
+ {
+ notifyAll();
+ }
+ try
+ {
+ mEventNotifier.join();
+ mEventNotifier = null;
+ }
+ catch (InterruptedException e)
+ {
+ e.printStackTrace();
+ }
}
public boolean isConnected()
@@ -56,7 +78,42 @@ public class NetworkManager extends BroadcastReceiver
@Override
public void onReceive(Context context, Intent intent)
{
- networkChanged(!isConnected());
+ synchronized (this)
+ {
+ mEvents.addLast(isConnected());
+ notifyAll();
+ }
+ }
+
+ @Override
+ public void run()
+ {
+ while (mRegistered)
+ {
+ boolean connected;
+
+ synchronized (this)
+ {
+ try
+ {
+ while (mRegistered && mEvents.isEmpty())
+ {
+ wait();
+ }
+ }
+ catch (InterruptedException ex)
+ {
+ break;
+ }
+ if (!mRegistered)
+ {
+ break;
+ }
+ connected = mEvents.removeFirst();
+ }
+ /* call the native parts without holding the lock */
+ networkChanged(!connected);
+ }
}
/**