From 180642560ef5c8a0139dcd50c1a7fa949c0c20f4 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Sun, 23 Jun 2013 15:09:09 +0200 Subject: Implement expandable notifications for 4.1 --- .../blinkt/openvpn/core/DeviceStateReceiver.java | 143 +++++++++++++-------- 1 file changed, 92 insertions(+), 51 deletions(-) (limited to 'src/de/blinkt/openvpn/core/DeviceStateReceiver.java') 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(); -- cgit v1.2.3