summaryrefslogtreecommitdiff
path: root/app/src/main/java/se/leap/bitmaskclient/eip
diff options
context:
space:
mode:
authorcyBerta <cyberta@riseup.net>2021-03-22 18:49:19 +0100
committercyberta <cyberta@riseup.net>2021-04-22 22:53:01 +0200
commitff5188d7de1df36c5d71d309a08d290560e9d337 (patch)
treed4f3aa7ccfc8a41ad38a6c9a21413aa33f49f537 /app/src/main/java/se/leap/bitmaskclient/eip
parent95174abcb87af9d07465cda5c23cc35e1987b6d9 (diff)
initial draft for gateway selection on Android
Diffstat (limited to 'app/src/main/java/se/leap/bitmaskclient/eip')
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/eip/Gateway.java22
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/eip/GatewaysManager.java41
2 files changed, 60 insertions, 3 deletions
diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/Gateway.java b/app/src/main/java/se/leap/bitmaskclient/eip/Gateway.java
index 763b5449..78b33355 100644
--- a/app/src/main/java/se/leap/bitmaskclient/eip/Gateway.java
+++ b/app/src/main/java/se/leap/bitmaskclient/eip/Gateway.java
@@ -35,12 +35,14 @@ import de.blinkt.openvpn.core.ConfigParser;
import de.blinkt.openvpn.core.connection.Connection;
import se.leap.bitmaskclient.base.utils.PreferenceHelper;
+import static se.leap.bitmaskclient.base.models.Constants.FULLNESS;
import static se.leap.bitmaskclient.base.models.Constants.HOST;
import static se.leap.bitmaskclient.base.models.Constants.IP_ADDRESS;
import static se.leap.bitmaskclient.base.models.Constants.LOCATION;
import static se.leap.bitmaskclient.base.models.Constants.LOCATIONS;
import static se.leap.bitmaskclient.base.models.Constants.NAME;
import static se.leap.bitmaskclient.base.models.Constants.OPENVPN_CONFIGURATION;
+import static se.leap.bitmaskclient.base.models.Constants.OVERLOAD;
import static se.leap.bitmaskclient.base.models.Constants.TIMEZONE;
import static se.leap.bitmaskclient.base.models.Constants.VERSION;
@@ -146,6 +148,26 @@ public class Gateway {
}
}
+ public boolean hasLoadInfo() {
+ return load != null;
+ }
+
+ public double getFullness() {
+ try {
+ return load.getDouble(FULLNESS);
+ } catch (JSONException | NullPointerException e) {
+ return 0;
+ }
+ }
+
+ public boolean isOverloaded() {
+ try {
+ return load.getBoolean(OVERLOAD);
+ } catch (JSONException | NullPointerException e) {
+ return false;
+ }
+ }
+
/**
* Create and attach the VpnProfile to our gateway object
*/
diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/GatewaysManager.java b/app/src/main/java/se/leap/bitmaskclient/eip/GatewaysManager.java
index b06e894e..5f6910bf 100644
--- a/app/src/main/java/se/leap/bitmaskclient/eip/GatewaysManager.java
+++ b/app/src/main/java/se/leap/bitmaskclient/eip/GatewaysManager.java
@@ -30,6 +30,8 @@ import org.json.JSONObject;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
@@ -37,8 +39,10 @@ import de.blinkt.openvpn.VpnProfile;
import de.blinkt.openvpn.core.ConfigParser;
import de.blinkt.openvpn.core.VpnStatus;
import de.blinkt.openvpn.core.connection.Connection;
+import se.leap.bitmaskclient.base.models.Location;
import se.leap.bitmaskclient.base.models.Provider;
import se.leap.bitmaskclient.base.models.ProviderObservable;
+import se.leap.bitmaskclient.base.utils.PreferenceHelper;
import static de.blinkt.openvpn.core.connection.Connection.TransportType.OBFS4;
import static de.blinkt.openvpn.core.connection.Connection.TransportType.OPENVPN;
@@ -72,15 +76,46 @@ public class GatewaysManager {
* @return the n closest Gateway
*/
public Gateway select(int nClosest) {
- Connection.TransportType transportType = getUsePluggableTransports(context) ? OBFS4 : OPENVPN;
String selectedCity = getPreferredCity(context);
+ return select(nClosest, selectedCity);
+ }
+
+ public Gateway select(int nClosest, String city) {
+ Connection.TransportType transportType = getUsePluggableTransports(context) ? OBFS4 : OPENVPN;
if (presortedList.size() > 0) {
- return getGatewayFromPresortedList(nClosest, transportType, selectedCity);
+ return getGatewayFromPresortedList(nClosest, transportType, city);
}
- return getGatewayFromTimezoneCalculation(nClosest, transportType, selectedCity);
+ return getGatewayFromTimezoneCalculation(nClosest, transportType, city);
}
+ public List<Location> getGatewayLocations() {
+ String selectedCity = PreferenceHelper.getPreferredCity(context);
+ HashMap<String, Integer> locationNames = new HashMap<>();
+ ArrayList<Location> locations = new ArrayList<>();
+ int n = 0;
+ Gateway gateway;
+ while ((gateway = select(n, null)) != null) {
+ if (!locationNames.containsKey(gateway.getName())) {
+ locationNames.put(gateway.getName(), locations.size());
+ Location location = new Location(
+ gateway.getName(),
+ gateway.getFullness(),
+ 1,
+ gateway.getName().equals(selectedCity));
+ locations.add(location);
+ } else {
+ int index = locationNames.get(gateway.getName());
+ Location location = locations.get(index);
+ location.averageLoad = (location.numberOfGateways * location.averageLoad + gateway.getFullness()) / (location.numberOfGateways + 1);
+ location.numberOfGateways += 1;
+ locations.set(index, location);
+ }
+ n++;
+ }
+
+ return locations;
+ }
private Gateway getGatewayFromTimezoneCalculation(int nClosest, Connection.TransportType transportType, @Nullable String city) {
List<Gateway> list = new ArrayList<>(gateways.values());