summaryrefslogtreecommitdiff
path: root/src/de/blinkt/openvpn/core/DeviceStateReceiver.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/blinkt/openvpn/core/DeviceStateReceiver.java')
-rw-r--r--src/de/blinkt/openvpn/core/DeviceStateReceiver.java143
1 files changed, 92 insertions, 51 deletions
diff --git a/src/de/blinkt/openvpn/core/DeviceStateReceiver.java b/src/de/blinkt/openvpn/core/DeviceStateReceiver.java
index d5029b07..ecdf5c55 100644
--- a/src/de/blinkt/openvpn/core/DeviceStateReceiver.java
+++ b/src/de/blinkt/openvpn/core/DeviceStateReceiver.java
@@ -13,9 +13,11 @@ import de.blinkt.openvpn.core.OpenVPN.ByteCountListener;
import java.util.LinkedList;
+import static de.blinkt.openvpn.core.OpenVPNManagement.pauseReason;
+
public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountListener {
- private int lastNetwork=-1;
- private OpenVPNManagement mManangement;
+ private int lastNetwork = -1;
+ private OpenVPNManagement mManagement;
// Window time in s
private final int TRAFFIC_WINDOW = 60;
@@ -23,10 +25,11 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
private final long TRAFFIC_LIMIT = 64 * 1024;
- connectState network= connectState.DISCONNECTED;
+ connectState network = connectState.DISCONNECTED;
connectState screen = connectState.SHOULDBECONNECTED;
+ connectState userpause = connectState.SHOULDBECONNECTED;
- private String lastStateMsg=null;
+ private String lastStateMsg = null;
enum connectState {
SHOULDBECONNECTED,
@@ -35,8 +38,7 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
}
static class Datapoint {
- private Datapoint(long t, long d)
- {
+ private Datapoint(long t, long d) {
timestamp = t;
data = d;
}
@@ -49,34 +51,49 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
@Override
public void updateByteCount(long in, long out, long diffin, long diffout) {
- if (screen!=connectState.PENDINGDISCONNECT)
+ if (screen != connectState.PENDINGDISCONNECT)
return;
long total = diffin + diffout;
- trafficdata.add(new Datapoint(System.currentTimeMillis(),total));
+ trafficdata.add(new Datapoint(System.currentTimeMillis(), total));
- while(trafficdata.getFirst().timestamp <= (System.currentTimeMillis() - TRAFFIC_WINDOW*1000)) {
+ while (trafficdata.getFirst().timestamp <= (System.currentTimeMillis() - TRAFFIC_WINDOW * 1000)) {
trafficdata.removeFirst();
}
long windowtraffic = 0;
- for (Datapoint dp: trafficdata)
+ for (Datapoint dp : trafficdata)
windowtraffic += dp.data;
- if(windowtraffic < TRAFFIC_LIMIT) {
- screen = connectState.DISCONNECTED;
- OpenVPN.logInfo(R.string.screenoff_pause,
- OpenVpnService.humanReadableByteCount(TRAFFIC_LIMIT, false), TRAFFIC_WINDOW);
+ if (windowtraffic < TRAFFIC_LIMIT) {
+ screen = connectState.DISCONNECTED;
+ OpenVPN.logInfo(R.string.screenoff_pause,
+ OpenVpnService.humanReadableByteCount(TRAFFIC_LIMIT, false), TRAFFIC_WINDOW);
- mManangement.pause();
- }
+ mManagement.pause(getPauseReason());
+ }
}
+ public void userPause(boolean pause) {
+ if (pause) {
+ userpause = connectState.DISCONNECTED;
+ // Check if we should disconnect
+ mManagement.pause(getPauseReason());
+ } else {
+ boolean wereConnected = shouldBeConnected();
+ userpause = connectState.SHOULDBECONNECTED;
+ if (shouldBeConnected() && !wereConnected)
+ mManagement.resume();
+ else
+ // Update the reason why we currently paused
+ mManagement.pause(getPauseReason());
+ }
+ }
public DeviceStateReceiver(OpenVPNManagement magnagement) {
super();
- mManangement = magnagement;
+ mManagement = magnagement;
}
@@ -85,31 +102,36 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
- if(ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
+ if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
networkStateChange(context);
} else if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
- boolean screenoff = prefs.getBoolean("screenoff", false);
+ boolean screenOff = prefs.getBoolean("screenoff", false);
- if(screenoff) {
- if(!ProfileManager.getLastConnectedVpn().mPersistTun)
+ if (screenOff) {
+ if (!ProfileManager.getLastConnectedVpn().mPersistTun)
OpenVPN.logError(R.string.screen_nopersistenttun);
screen = connectState.PENDINGDISCONNECT;
fillTrafficData();
- if (network == connectState.DISCONNECTED)
+ if (network == connectState.DISCONNECTED || userpause == connectState.DISCONNECTED)
screen = connectState.DISCONNECTED;
}
} else if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {
// Network was disabled because screen off
- if (screen == connectState.DISCONNECTED && network == connectState.SHOULDBECONNECTED) {
- mManangement.resume();
-
- }
+ boolean connected = shouldBeConnected();
screen = connectState.SHOULDBECONNECTED;
+ /* should be connected has changed because the screen is on now, connect the VPN */
+ if (shouldBeConnected() != connected)
+ mManagement.resume();
+ else
+ /*Update the reason why we are still paused */
+ mManagement.pause(getPauseReason());
+
}
}
+
private void fillTrafficData() {
trafficdata.add(new Datapoint(System.currentTimeMillis(), TRAFFIC_LIMIT));
}
@@ -122,18 +144,18 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
String netstatestring;
- if(networkInfo==null) {
+ if (networkInfo == null) {
netstatestring = "not connected";
- } else {
+ } else {
String subtype = networkInfo.getSubtypeName();
- if(subtype==null)
+ if (subtype == null)
subtype = "";
String extrainfo = networkInfo.getExtraInfo();
- if(extrainfo==null)
- extrainfo="";
+ if (extrainfo == null)
+ extrainfo = "";
/*
- if(networkInfo.getType()==android.net.ConnectivityManager.TYPE_WIFI) {
+ if(networkInfo.getType()==android.net.ConnectivityManager.TYPE_WIFI) {
WifiManager wifiMgr = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiinfo = wifiMgr.getConnectionInfo();
extrainfo+=wifiinfo.getBSSID();
@@ -142,52 +164,71 @@ public class DeviceStateReceiver extends BroadcastReceiver implements ByteCountL
}*/
-
- netstatestring = String.format("%2$s %4$s to %1$s %3$s",networkInfo.getTypeName(),
- networkInfo.getDetailedState(),extrainfo,subtype );
+ netstatestring = String.format("%2$s %4$s to %1$s %3$s", networkInfo.getTypeName(),
+ networkInfo.getDetailedState(), extrainfo, subtype);
}
- if(networkInfo!=null && networkInfo.getState() == State.CONNECTED) {
+ if (networkInfo != null && networkInfo.getState() == State.CONNECTED) {
int newnet = networkInfo.getType();
network = connectState.SHOULDBECONNECTED;
- if(sendusr1 && lastNetwork!=newnet) {
+ if (sendusr1 && lastNetwork != newnet) {
if (screen == connectState.PENDINGDISCONNECT)
screen = connectState.DISCONNECTED;
- if (lastNetwork==-1){
- if (screen == connectState.SHOULDBECONNECTED)
- mManangement.resume();
- }else{
- if (screen == connectState.SHOULDBECONNECTED)
- mManangement.reconnect();
+ if (shouldBeConnected()) {
+ if (lastNetwork == -1) {
+ mManagement.resume();
+ } else {
+ mManagement.reconnect();
+ }
}
lastNetwork = newnet;
}
- } else if (networkInfo==null) {
+ } else if (networkInfo == null) {
// Not connected, stop openvpn, set last connected network to no network
- lastNetwork=-1;
- if(sendusr1) {
- mManangement.pause();
+ lastNetwork = -1;
+ if (sendusr1) {
network = connectState.DISCONNECTED;
- // Set screen state to be disconnected if it want to disconnect
+ // Set screen state to be disconnected if disconnect pending
if (screen == connectState.PENDINGDISCONNECT)
screen = connectState.DISCONNECTED;
+
+ mManagement.pause(getPauseReason());
}
}
- if(!netstatestring.equals(lastStateMsg))
+ if (!netstatestring.equals(lastStateMsg))
OpenVPN.logInfo(R.string.netstatus, netstatestring);
- lastStateMsg=netstatestring;
+ lastStateMsg = netstatestring;
+
+ }
+
+ public boolean isUserPaused() {
+ return userpause == connectState.DISCONNECTED;
+ }
+
+ private boolean shouldBeConnected() {
+ return (screen == connectState.SHOULDBECONNECTED && userpause == connectState.SHOULDBECONNECTED &&
+ network == connectState.SHOULDBECONNECTED);
+ }
+
+ private pauseReason getPauseReason() {
+ if (userpause == connectState.DISCONNECTED)
+ return pauseReason.userPause;
+
+ if (screen == connectState.DISCONNECTED)
+ return pauseReason.screenOff;
+ return pauseReason.noNetwork;
}
private NetworkInfo getCurrentNetworkInfo(Context context) {
- ConnectivityManager conn = (ConnectivityManager)
+ ConnectivityManager conn = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
return conn.getActiveNetworkInfo();