summaryrefslogtreecommitdiff
path: root/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderManager.java')
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderManager.java113
1 files changed, 29 insertions, 84 deletions
diff --git a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderManager.java b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderManager.java
index 39f117ea..9eacae5d 100644
--- a/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderManager.java
+++ b/app/src/main/java/se/leap/bitmaskclient/providersetup/ProviderManager.java
@@ -3,15 +3,11 @@ package se.leap.bitmaskclient.providersetup;
import static se.leap.bitmaskclient.base.models.Constants.EXT_JSON;
import static se.leap.bitmaskclient.base.models.Constants.EXT_PEM;
import static se.leap.bitmaskclient.base.models.Constants.URLS;
-import static se.leap.bitmaskclient.base.models.Provider.DOMAIN;
import static se.leap.bitmaskclient.base.models.Provider.GEOIP_URL;
import static se.leap.bitmaskclient.base.models.Provider.MAIN_URL;
import static se.leap.bitmaskclient.base.models.Provider.MOTD_URL;
import static se.leap.bitmaskclient.base.models.Provider.PROVIDER_API_IP;
import static se.leap.bitmaskclient.base.models.Provider.PROVIDER_IP;
-import static se.leap.bitmaskclient.base.utils.FileHelper.createFile;
-import static se.leap.bitmaskclient.base.utils.FileHelper.persistFile;
-import static se.leap.bitmaskclient.base.utils.InputStreamHelper.getInputStreamFrom;
import static se.leap.bitmaskclient.base.utils.InputStreamHelper.inputStreamToJson;
import static se.leap.bitmaskclient.base.utils.InputStreamHelper.loadInputStreamAsString;
@@ -21,18 +17,18 @@ import androidx.annotation.VisibleForTesting;
import org.json.JSONObject;
-import java.io.File;
-import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import se.leap.bitmaskclient.base.models.Provider;
+import se.leap.bitmaskclient.base.utils.PreferenceHelper;
/**
* Created by parmegv on 4/12/14.
@@ -40,18 +36,17 @@ import se.leap.bitmaskclient.base.models.Provider;
public class ProviderManager {
private final AssetManager assetsManager;
- private File externalFilesDir;
private Set<Provider> defaultProviders;
- private Set<Provider> customProviders;
+ // key: MainURL String, value: Provider
+ private HashMap<String, Provider> customProviders;
private Set<String> defaultProviderURLs;
- private Set<String> customProviderURLs;
private static ProviderManager instance;
private boolean addDummyEntry = false;
- public static ProviderManager getInstance(AssetManager assetsManager, File externalFilesDir) {
+ public static ProviderManager getInstance(AssetManager assetsManager) {
if (instance == null)
- instance = new ProviderManager(assetsManager, externalFilesDir);
+ instance = new ProviderManager(assetsManager);
return instance;
}
@@ -65,10 +60,10 @@ public class ProviderManager {
this.addDummyEntry = addDummyEntry;
}
- private ProviderManager(AssetManager assetManager, File externalFilesDir) {
+ private ProviderManager(AssetManager assetManager) {
this.assetsManager = assetManager;
addDefaultProviders(assetManager);
- addCustomProviders(externalFilesDir);
+ addCustomProviders();
}
private void addDefaultProviders(AssetManager assetManager) {
@@ -122,29 +117,8 @@ public class ProviderManager {
}
- private void addCustomProviders(File externalFilesDir) {
- this.externalFilesDir = externalFilesDir;
- customProviders = externalFilesDir != null && externalFilesDir.isDirectory() ?
- customProvidersFromFiles(externalFilesDir.list()) :
- new HashSet<>();
- customProviderURLs = getProviderUrlSetFromProviderSet(customProviders);
- }
-
- private Set<Provider> customProvidersFromFiles(String[] files) {
- Set<Provider> providers = new HashSet<>();
- try {
- for (String file : files) {
- InputStream inputStream = getInputStreamFrom(externalFilesDir.getAbsolutePath() + "/" + file);
- JSONObject providerConfig = inputStreamToJson(inputStream);
- String mainUrl = providerConfig.optString(MAIN_URL);
- String domain = providerConfig.optString(DOMAIN);
- providers.add(Provider.createCustomProvider(mainUrl, domain));
- }
- } catch (FileNotFoundException | NullPointerException e) {
- e.printStackTrace();
- }
-
- return providers;
+ private void addCustomProviders() {
+ customProviders = PreferenceHelper.getCustomProviders();
}
public List<Provider> providers() {
@@ -155,7 +129,7 @@ public class ProviderManager {
List<Provider> allProviders = new ArrayList<>();
allProviders.addAll(defaultProviders);
if(customProviders != null)
- allProviders.addAll(customProviders);
+ allProviders.addAll(customProviders.values());
if (addEmptyProvider) {
//add an option to add a custom provider
allProviders.add(new Provider());
@@ -177,16 +151,19 @@ public class ProviderManager {
}
public boolean add(Provider element) {
- return element != null &&
- !defaultProviderURLs.contains(element.getMainUrl().toString()) &&
- customProviders.add(element) &&
- customProviderURLs.add(element.getMainUrl().toString());
+ boolean addElement = element != null &&
+ !defaultProviderURLs.contains(element.getMainUrlString()) &&
+ !customProviders.containsKey(element.getMainUrlString());
+ if (addElement) {
+ customProviders.put(element.getMainUrlString(), element);
+ return true;
+ }
+ return false;
}
public boolean remove(Object element) {
return element instanceof Provider &&
- customProviders.remove(element) &&
- customProviderURLs.remove(((Provider) element).getMainUrl().toString());
+ customProviders.remove(((Provider) element).getMainUrlString()) != null;
}
public boolean addAll(Collection<? extends Provider> elements) {
@@ -194,9 +171,11 @@ public class ProviderManager {
boolean addedAll = true;
while (iterator.hasNext()) {
Provider p = (Provider) iterator.next();
- addedAll = customProviders.add(p) &&
- customProviderURLs.add(p.getMainUrl().toString()) &&
- addedAll;
+ boolean containsKey = customProviders.containsKey(p.getMainUrlString());
+ if (!containsKey) {
+ customProviders.put(p.getMainUrlString(), p);
+ }
+ addedAll = !containsKey && addedAll;
}
return addedAll;
}
@@ -204,15 +183,8 @@ public class ProviderManager {
public boolean removeAll(Collection<?> elements) {
Iterator iterator = elements.iterator();
boolean removedAll = true;
- try {
- while (iterator.hasNext()) {
- Provider p = (Provider) iterator.next();
- removedAll = ((defaultProviders.remove(p) && defaultProviderURLs.remove(p.getMainUrl().toString())) ||
- (customProviders.remove(p) && customProviderURLs.remove(p.getMainUrl().toString()))) &&
- removedAll;
- }
- } catch (ClassCastException e) {
- return false;
+ while (iterator.hasNext()) {
+ removedAll = remove(iterator.next()) && removedAll;
}
return removedAll;
@@ -221,37 +193,10 @@ public class ProviderManager {
public void clear() {
defaultProviders.clear();
customProviders.clear();
- customProviderURLs.clear();
defaultProviderURLs.clear();
}
- public void saveCustomProvidersToFile() {
- try {
- deleteLegacyCustomProviders();
-
- for (Provider provider : customProviders) {
- File providerFile = createFile(externalFilesDir, provider.getName() + EXT_JSON);
- if (!providerFile.exists()) {
- persistFile(providerFile, provider.toJson().toString());
- }
- }
- } catch (IOException | SecurityException e) {
- e.printStackTrace();
- }
- }
-
- /**
- * Deletes persisted custom providers from from internal storage that are not in customProviders list anymore
- */
- private void deleteLegacyCustomProviders() throws IOException, SecurityException {
- Set<Provider> persistedCustomProviders = externalFilesDir != null && externalFilesDir.isDirectory() ?
- customProvidersFromFiles(externalFilesDir.list()) : new HashSet<Provider>();
- persistedCustomProviders.removeAll(customProviders);
- for (Provider providerToDelete : persistedCustomProviders) {
- File providerFile = createFile(externalFilesDir, providerToDelete.getName() + EXT_JSON);
- if (providerFile.exists()) {
- providerFile.delete();
- }
- }
+ public void saveCustomProviders() {
+ PreferenceHelper.setCustomProviders(new HashSet<>(customProviders.values()));
}
}