summaryrefslogtreecommitdiff
path: root/app/src
diff options
context:
space:
mode:
authorcyberta <cyberta@riseup.net>2018-08-31 08:31:16 -0700
committercyberta <cyberta@riseup.net>2018-08-31 08:31:16 -0700
commitda7781289337938cae83a767257737ae1da3b8e0 (patch)
treece96ffdbe51ae8c77764f9e364288e90582d6ad7 /app/src
parent62d335bc2b72c4301539602fa04164365d780707 (diff)
parent71eb3340558026be31b65ed2ad469c84f8f46bdd (diff)
Merge branch '#8896_skip_onboarding' into 'master'
#8896 skip onboarding See merge request leap/bitmask_android!80
Diffstat (limited to 'app/src')
-rw-r--r--app/src/custom/assets/riseup.net.json37
-rw-r--r--app/src/custom/assets/riseup.net.pem32
-rw-r--r--app/src/insecure/java/se/leap/bitmaskclient/ProviderListActivity.java5
-rw-r--r--app/src/main/AndroidManifest.xml10
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/ConfigWizardBaseActivity.java16
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/Constants.java2
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/CustomProviderSetupActivity.java121
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/EipFragment.java23
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/MainActivity.java1
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/ProviderApiManagerBase.java1
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/ProviderApiSetupBroadcastReceiver.java63
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java264
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/ProviderSetupBaseActivity.java235
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/ProviderSetupFailedDialog.java2
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/ProviderSetupInterface.java24
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/StartActivity.java8
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/TLSCompatSocketFactory.java2
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java12
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/utils/ConfigHelper.java10
-rw-r--r--app/src/main/res/layout-sw600dp-port/a_custom_provider_setup.xml48
-rw-r--r--app/src/main/res/layout-xlarge/a_custom_provider_setup.xml48
-rw-r--r--app/src/main/res/layout/a_custom_provider_setup.xml30
-rw-r--r--app/src/main/res/layout/a_custom_provider_setup_tablet_linear_layout.xml33
-rw-r--r--app/src/normal/assets/calyx.net.json37
-rw-r--r--app/src/normal/assets/calyx.net.pem31
-rw-r--r--app/src/normal/assets/demo.bitmask.net.json42
-rw-r--r--app/src/normal/assets/demo.bitmask.net.pem32
-rw-r--r--app/src/normal/assets/riseup.net.json37
-rw-r--r--app/src/normal/assets/riseup.net.pem32
-rw-r--r--app/src/normal/assets/urls/calyx.net.url3
-rw-r--r--app/src/normal/assets/urls/demo.bitmask.net.url3
-rw-r--r--app/src/normal/assets/urls/riseup.net.url3
-rw-r--r--app/src/production/java/se/leap/bitmaskclient/ProviderListActivity.java8
33 files changed, 997 insertions, 258 deletions
diff --git a/app/src/custom/assets/riseup.net.json b/app/src/custom/assets/riseup.net.json
new file mode 100644
index 00000000..82290ecd
--- /dev/null
+++ b/app/src/custom/assets/riseup.net.json
@@ -0,0 +1,37 @@
+{
+ "api_uri": "https://api.black.riseup.net:443",
+ "api_version": "1",
+ "ca_cert_fingerprint": "SHA256: a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494",
+ "ca_cert_uri": "https://black.riseup.net/ca.crt",
+ "default_language": "en",
+ "description": {
+ "en": "Riseup is a non-profit collective in Seattle that provides online communication tools for people and groups working toward liberatory social change."
+ },
+ "domain": "riseup.net",
+ "enrollment_policy": "open",
+ "languages": [
+ "en"
+ ],
+ "name": {
+ "en": "Riseup Networks"
+ },
+ "service": {
+ "allow_anonymous": true,
+ "allow_free": true,
+ "allow_limited_bandwidth": false,
+ "allow_paid": false,
+ "allow_registration": true,
+ "allow_unlimited_bandwidth": true,
+ "bandwidth_limit": 102400,
+ "default_service_level": 1,
+ "levels": {
+ "1": {
+ "description": "Please donate.",
+ "name": "free"
+ }
+ }
+ },
+ "services": [
+ "openvpn"
+ ]
+} \ No newline at end of file
diff --git a/app/src/custom/assets/riseup.net.pem b/app/src/custom/assets/riseup.net.pem
new file mode 100644
index 00000000..c890aff4
--- /dev/null
+++ b/app/src/custom/assets/riseup.net.pem
@@ -0,0 +1,32 @@
+-----BEGIN CERTIFICATE-----
+MIIFjTCCA3WgAwIBAgIBATANBgkqhkiG9w0BAQ0FADBZMRgwFgYDVQQKDA9SaXNl
+dXAgTmV0d29ya3MxGzAZBgNVBAsMEmh0dHBzOi8vcmlzZXVwLm5ldDEgMB4GA1UE
+AwwXUmlzZXVwIE5ldHdvcmtzIFJvb3QgQ0EwHhcNMTQwNDI4MDAwMDAwWhcNMjQw
+NDI4MDAwMDAwWjBZMRgwFgYDVQQKDA9SaXNldXAgTmV0d29ya3MxGzAZBgNVBAsM
+Emh0dHBzOi8vcmlzZXVwLm5ldDEgMB4GA1UEAwwXUmlzZXVwIE5ldHdvcmtzIFJv
+b3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC76J4ciMJ8Sg0m
+TP7DF2DT9zNe0Csk4myoMFC57rfJeqsAlJCv1XMzBmXrw8wq/9z7XHv6n/0sWU7a
+7cF2hLR33ktjwODlx7vorU39/lXLndo492ZBhXQtG1INMShyv+nlmzO6GT7ESfNE
+LliFitEzwIegpMqxCIHXFuobGSCWF4N0qLHkq/SYUMoOJ96O3hmPSl1kFDRMtWXY
+iw1SEKjUvpyDJpVs3NGxeLCaA7bAWhDY5s5Yb2fA1o8ICAqhowurowJpW7n5ZuLK
+5VNTlNy6nZpkjt1QycYvNycffyPOFm/Q/RKDlvnorJIrihPkyniV3YY5cGgP+Qkx
+HUOT0uLA6LHtzfiyaOqkXwc4b0ZcQD5Vbf6Prd20Ppt6ei0zazkUPwxld3hgyw58
+m/4UIjG3PInWTNf293GngK2Bnz8Qx9e/6TueMSAn/3JBLem56E0WtmbLVjvko+LF
+PM5xA+m0BmuSJtrD1MUCXMhqYTtiOvgLBlUm5zkNxALzG+cXB28k6XikXt6MRG7q
+hzIPG38zwkooM55yy5i1YfcIi5NjMH6A+t4IJxxwb67MSb6UFOwg5kFokdONZcwj
+shczHdG9gLKSBIvrKa03Nd3W2dF9hMbRu//STcQxOailDBQCnXXfAATj9pYzdY4k
+ha8VCAREGAKTDAex9oXf1yRuktES4QIDAQABo2AwXjAdBgNVHQ4EFgQUC4tdmLVu
+f9hwfK4AGliaet5KkcgwDgYDVR0PAQH/BAQDAgIEMAwGA1UdEwQFMAMBAf8wHwYD
+VR0jBBgwFoAUC4tdmLVuf9hwfK4AGliaet5KkcgwDQYJKoZIhvcNAQENBQADggIB
+AGzL+GRnYu99zFoy0bXJKOGCF5XUXP/3gIXPRDqQf5g7Cu/jYMID9dB3No4Zmf7v
+qHjiSXiS8jx1j/6/Luk6PpFbT7QYm4QLs1f4BlfZOti2KE8r7KRDPIecUsUXW6P/
+3GJAVYH/+7OjA39za9AieM7+H5BELGccGrM5wfl7JeEz8in+V2ZWDzHQO4hMkiTQ
+4ZckuaL201F68YpiItBNnJ9N5nHr1MRiGyApHmLXY/wvlrOpclh95qn+lG6/2jk7
+3AmihLOKYMlPwPakJg4PYczm3icFLgTpjV5sq2md9bRyAg3oPGfAuWHmKj2Ikqch
+Td5CHKGxEEWbGUWEMP0s1A/JHWiCbDigc4Cfxhy56CWG4q0tYtnc2GMw8OAUO6Wf
+Xu5pYKNkzKSEtT/MrNJt44tTZWbKV/Pi/N2Fx36my7TgTUj7g3xcE9eF4JV2H/sg
+tsK3pwE0FEqGnT4qMFbixQmc8bGyuakr23wjMvfO7eZUxBuWYR2SkcP26sozF9PF
+tGhbZHQVGZUTVPyvwahMUEhbPGVerOW0IYpxkm0x/eaWdTc4vPpf/rIlgbAjarnJ
+UN9SaWRlWKSdP4haujnzCoJbM7dU9bjvlGZNyXEekgeT0W2qFeGGp+yyUWw8tNsp
+0BuC1b7uW/bBn/xKm319wXVDvBgZgcktMolak39V7DVO
+-----END CERTIFICATE----- \ No newline at end of file
diff --git a/app/src/insecure/java/se/leap/bitmaskclient/ProviderListActivity.java b/app/src/insecure/java/se/leap/bitmaskclient/ProviderListActivity.java
index 3190d651..9107e641 100644
--- a/app/src/insecure/java/se/leap/bitmaskclient/ProviderListActivity.java
+++ b/app/src/insecure/java/se/leap/bitmaskclient/ProviderListActivity.java
@@ -27,6 +27,7 @@ import java.net.URL;
import se.leap.bitmaskclient.ProviderListContent.ProviderItem;
import static se.leap.bitmaskclient.ProviderAPI.SET_UP_PROVIDER;
+import static se.leap.bitmaskclient.ProviderSetupInterface.ProviderConfigState.SETTING_UP_PROVIDER;
/**
* Activity that builds and shows the list of known available providers.
@@ -56,7 +57,7 @@ public class ProviderListActivity extends ProviderListBaseActivity {
* @param danger_on tells if HTTPS client should bypass certificate errors
*/
public void setUpProvider(boolean danger_on) {
- configState.setAction(SETTING_UP_PROVIDER);
+ providerConfigState = SETTING_UP_PROVIDER;
Bundle parameters = new Bundle();
parameters.putBoolean(ProviderItem.DANGER_ON, danger_on);
@@ -69,7 +70,7 @@ public class ProviderListActivity extends ProviderListBaseActivity {
*/
@Override
public void retrySetUpProvider(@NonNull Provider provider) {
- configState.setAction(SETTING_UP_PROVIDER);
+ providerConfigState = SETTING_UP_PROVIDER;
ProviderAPICommand.execute(this, SET_UP_PROVIDER, provider);
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b1131850..66f36256 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -15,10 +15,8 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="se.leap.bitmaskclient"
- android:versionCode="134"
- android:versionName="0.9.8" >
-
+ package="se.leap.bitmaskclient">
+ <!-- package is overwritten in build.gradle -->
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="27" />
@@ -94,6 +92,10 @@
android:label="@string/configuration_wizard_title" />
<activity
+ android:name=".CustomProviderSetupActivity"
+ android:label="@string/setup_provider" />
+
+ <activity
android:name=".AddProviderActivity"
android:label="@string/add_provider" />
diff --git a/app/src/main/java/se/leap/bitmaskclient/ConfigWizardBaseActivity.java b/app/src/main/java/se/leap/bitmaskclient/ConfigWizardBaseActivity.java
index 227c8cf4..7aa50add 100644
--- a/app/src/main/java/se/leap/bitmaskclient/ConfigWizardBaseActivity.java
+++ b/app/src/main/java/se/leap/bitmaskclient/ConfigWizardBaseActivity.java
@@ -12,7 +12,6 @@ import android.support.constraint.ConstraintLayout;
import android.support.constraint.Guideline;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.AppCompatTextView;
-import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
@@ -72,6 +71,8 @@ public abstract class ConfigWizardBaseActivity extends ButterKnifeActivity {
protected Provider provider;
protected boolean isCompactLayout = false;
+ protected boolean isActivityShowing;
+
private float defaultGuidelineTopPercentage;
private float defaultGuidelineBottomPercentage;
@@ -79,7 +80,6 @@ public abstract class ConfigWizardBaseActivity extends ButterKnifeActivity {
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
preferences = getSharedPreferences(SHARED_PREFERENCES, MODE_PRIVATE);
-
provider = getIntent().getParcelableExtra(PROVIDER_KEY);
}
@@ -135,6 +135,18 @@ public abstract class ConfigWizardBaseActivity extends ButterKnifeActivity {
}
}
+ @Override
+ protected void onPause() {
+ super.onPause();
+ isActivityShowing = false;
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ isActivityShowing = true;
+ }
+
protected void restoreState(Bundle savedInstanceState) {
if (savedInstanceState != null && savedInstanceState.containsKey(PROVIDER_KEY)) {
provider = savedInstanceState.getParcelable(PROVIDER_KEY);
diff --git a/app/src/main/java/se/leap/bitmaskclient/Constants.java b/app/src/main/java/se/leap/bitmaskclient/Constants.java
index 2efc2c1f..15bec955 100644
--- a/app/src/main/java/se/leap/bitmaskclient/Constants.java
+++ b/app/src/main/java/se/leap/bitmaskclient/Constants.java
@@ -30,6 +30,8 @@ public interface Constants {
String APP_ACTION_QUIT = "quit";
String APP_ACTION_CONFIGURE_ALWAYS_ON_PROFILE = "configure always-on profile";
+ String DEFAULT_BITMASK = "normal";
+ String CUSTOM_BITMASK = "custom";
//////////////////////////////////////////////
diff --git a/app/src/main/java/se/leap/bitmaskclient/CustomProviderSetupActivity.java b/app/src/main/java/se/leap/bitmaskclient/CustomProviderSetupActivity.java
new file mode 100644
index 00000000..3763f506
--- /dev/null
+++ b/app/src/main/java/se/leap/bitmaskclient/CustomProviderSetupActivity.java
@@ -0,0 +1,121 @@
+/**
+ * Copyright (c) 2018 LEAP Encryption Access Project and contributers
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package se.leap.bitmaskclient;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import static se.leap.bitmaskclient.Constants.REQUEST_CODE_CONFIGURE_LEAP;
+import static se.leap.bitmaskclient.ProviderAPI.SET_UP_PROVIDER;
+import static se.leap.bitmaskclient.ProviderSetupInterface.ProviderConfigState.SETTING_UP_PROVIDER;
+import static se.leap.bitmaskclient.utils.ConfigHelper.preferAnonymousUsage;
+
+/**
+ * Created by cyberta on 17.08.18.
+ */
+
+public class CustomProviderSetupActivity extends ProviderSetupBaseActivity {
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setUpInitialUI();
+ restoreState(savedInstanceState);
+ setProvider(new Provider(BuildConfig.customProviderUrl));
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ if (getConfigState() == ProviderConfigState.PROVIDER_NOT_SET) {
+ showProgressBar();
+ setupProvider();
+ }
+ }
+
+ private void setUpInitialUI() {
+ setContentView(R.layout.a_custom_provider_setup);
+ setProviderHeaderText(R.string.setup_provider);
+ hideProgressBar();
+ }
+
+ private void setupProvider() {
+ setProviderConfigState(SETTING_UP_PROVIDER);
+ ProviderAPICommand.execute(this, SET_UP_PROVIDER, getProvider());
+ }
+
+ // ------- ProviderSetupInterface ---v
+ @Override
+ public void handleProviderSetUp(Provider provider) {
+ setProvider(provider);
+ if (provider.allowsAnonymous()) {
+ downloadVpnCertificate();
+ } else {
+ showProviderDetails();
+ }
+ }
+
+ @Override
+ public void handleCorrectlyDownloadedCertificate(Provider provider) {
+ if (preferAnonymousUsage()) {
+ finishWithSetupWithProvider(provider);
+ } else {
+ this.provider = provider;
+ showProviderDetails();
+ }
+ }
+
+ // ------- DownloadFailedDialogInterface ---v
+ @Override
+ public void retrySetUpProvider(@NonNull Provider provider) {
+ setupProvider();
+ showProgressBar();
+ }
+
+ @Override
+ public void cancelSettingUpProvider() {
+ super.cancelSettingUpProvider();
+ finish();
+ }
+
+ @Override
+ public void addAndSelectNewProvider(String url) {
+ // ignore
+ }
+
+ private void finishWithSetupWithProvider(Provider provider) {
+ Intent intent = new Intent();
+ intent.putExtra(Provider.KEY, provider);
+ setResult(RESULT_OK, intent);
+ finish();
+ }
+
+ @Override
+ public void onReceiveResult(int resultCode, Bundle resultData) {
+
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode == REQUEST_CODE_CONFIGURE_LEAP) {
+ setResult(resultCode, data);
+ finish();
+ }
+ }
+}
diff --git a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java
index a168059f..fb4f16c7 100644
--- a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java
@@ -58,14 +58,17 @@ import se.leap.bitmaskclient.views.VpnStateImage;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static de.blinkt.openvpn.core.ConnectionStatus.LEVEL_NONETWORK;
+import static se.leap.bitmaskclient.Constants.DEFAULT_BITMASK;
import static se.leap.bitmaskclient.Constants.EIP_RESTART_ON_BOOT;
import static se.leap.bitmaskclient.Constants.PROVIDER_KEY;
+import static se.leap.bitmaskclient.Constants.REQUEST_CODE_CONFIGURE_LEAP;
import static se.leap.bitmaskclient.Constants.REQUEST_CODE_LOG_IN;
import static se.leap.bitmaskclient.Constants.REQUEST_CODE_SWITCH_PROVIDER;
import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES;
import static se.leap.bitmaskclient.ProviderAPI.UPDATE_INVALID_VPN_CERTIFICATE;
import static se.leap.bitmaskclient.ProviderAPI.USER_MESSAGE;
import static se.leap.bitmaskclient.R.string.vpn_certificate_user_message;
+import static se.leap.bitmaskclient.utils.ConfigHelper.isDefaultBitmask;
public class EipFragment extends Fragment implements Observer {
@@ -113,18 +116,30 @@ public class EipFragment extends Fragment implements Observer {
if (arguments != null) {
provider = arguments.getParcelable(PROVIDER_KEY);
if (provider == null) {
- activity.startActivityForResult(new Intent(activity, ProviderListActivity.class), REQUEST_CODE_SWITCH_PROVIDER);
+ handleNoProvider(activity);
} else {
Log.d(TAG, provider.getName() + " configured as provider");
}
} else {
- Log.e(TAG, "no provider given - starting ProviderListActivity");
- activity.startActivityForResult(new Intent(activity, ProviderListActivity.class), REQUEST_CODE_SWITCH_PROVIDER);
+ handleNoProvider(activity);
}
}
}
- @Override
+ private void handleNoProvider(Activity activity) {
+ if (isDefaultBitmask()) {
+ activity.startActivityForResult(new Intent(activity, ProviderListActivity.class), REQUEST_CODE_SWITCH_PROVIDER);
+ } else {
+ Log.e(TAG, "no provider given - try to reconfigure custom provider");
+ startActivityForResult(new Intent(activity, CustomProviderSetupActivity.class), REQUEST_CODE_CONFIGURE_LEAP);
+
+ }
+
+ }
+
+
+
+ @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
openVpnConnection = new EipFragmentServiceConnection();
diff --git a/app/src/main/java/se/leap/bitmaskclient/MainActivity.java b/app/src/main/java/se/leap/bitmaskclient/MainActivity.java
index c44e8a3e..84c7c16a 100644
--- a/app/src/main/java/se/leap/bitmaskclient/MainActivity.java
+++ b/app/src/main/java/se/leap/bitmaskclient/MainActivity.java
@@ -190,6 +190,7 @@ public class MainActivity extends AppCompatActivity {
EipCommand.stopVPN(this);
break;
case REQUEST_CODE_CONFIGURE_LEAP:
+ Log.d(TAG, "REQUEST_CODE_CONFIGURE_LEAP - onActivityResult - MainActivity");
break;
case REQUEST_CODE_LOG_IN:
EipCommand.startVPN(this, true);
diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderApiManagerBase.java b/app/src/main/java/se/leap/bitmaskclient/ProviderApiManagerBase.java
index 8f3acf1d..113b07f5 100644
--- a/app/src/main/java/se/leap/bitmaskclient/ProviderApiManagerBase.java
+++ b/app/src/main/java/se/leap/bitmaskclient/ProviderApiManagerBase.java
@@ -145,6 +145,7 @@ public abstract class ProviderApiManagerBase {
Provider provider = command.getParcelableExtra(PROVIDER_KEY);
if (provider == null) {
+ //TODO: consider returning error back e.g. NO_PROVIDER
Log.e(TAG, action +" called without provider!");
return;
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderApiSetupBroadcastReceiver.java b/app/src/main/java/se/leap/bitmaskclient/ProviderApiSetupBroadcastReceiver.java
new file mode 100644
index 00000000..6ae44013
--- /dev/null
+++ b/app/src/main/java/se/leap/bitmaskclient/ProviderApiSetupBroadcastReceiver.java
@@ -0,0 +1,63 @@
+package se.leap.bitmaskclient;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+import se.leap.bitmaskclient.ProviderSetupInterface.ProviderConfigState;
+
+/**
+ * Broadcast receiver that handles callback intents of ProviderApi during provider setup.
+ * It is used by CustomProviderSetupActivity for custom branded apps and ProviderListActivity
+ * for 'normal' Bitmask.
+ *
+ * Created by cyberta on 17.08.18.
+ */
+
+public class ProviderApiSetupBroadcastReceiver extends BroadcastReceiver {
+ private final ProviderSetupInterface setupInterface;
+
+ public ProviderApiSetupBroadcastReceiver(ProviderSetupInterface setupInterface) {
+ this.setupInterface = setupInterface;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.d(ProviderListBaseActivity.TAG, "received Broadcast");
+
+ String action = intent.getAction();
+ if (action == null || !action.equalsIgnoreCase(Constants.BROADCAST_PROVIDER_API_EVENT)) {
+ return;
+ }
+
+ if (setupInterface.getConfigState() != null &&
+ setupInterface.getConfigState() == ProviderConfigState.SETTING_UP_PROVIDER) {
+ int resultCode = intent.getIntExtra(Constants.BROADCAST_RESULT_CODE, ProviderListBaseActivity.RESULT_CANCELED);
+ Log.d(ProviderListBaseActivity.TAG, "Broadcast resultCode: " + Integer.toString(resultCode));
+
+ Bundle resultData = intent.getParcelableExtra(Constants.BROADCAST_RESULT_KEY);
+ Provider handledProvider = resultData.getParcelable(Constants.PROVIDER_KEY);
+
+ if (handledProvider != null && setupInterface.getProvider() != null &&
+ handledProvider.getDomain().equalsIgnoreCase(setupInterface.getProvider().getDomain())) {
+ switch (resultCode) {
+ case ProviderAPI.PROVIDER_OK:
+ setupInterface.handleProviderSetUp(handledProvider);
+ break;
+ case ProviderAPI.PROVIDER_NOK:
+ setupInterface.handleProviderSetupFailed(resultData);
+ break;
+ case ProviderAPI.CORRECTLY_DOWNLOADED_VPN_CERTIFICATE:
+ setupInterface.handleCorrectlyDownloadedCertificate(handledProvider);
+ break;
+ case ProviderAPI.INCORRECTLY_DOWNLOADED_VPN_CERTIFICATE:
+ setupInterface.handleIncorrectlyDownloadedCertificate();
+ break;
+ }
+ }
+ }
+ }
+
+} \ No newline at end of file
diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java b/app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java
index cc8aceec..a29d4b61 100644
--- a/app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java
+++ b/app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java
@@ -17,8 +17,6 @@
package se.leap.bitmaskclient;
-import android.content.BroadcastReceiver;
-import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
@@ -48,19 +46,17 @@ import butterknife.OnItemClick;
import se.leap.bitmaskclient.fragments.AboutFragment;
import static se.leap.bitmaskclient.Constants.BROADCAST_PROVIDER_API_EVENT;
-import static se.leap.bitmaskclient.Constants.BROADCAST_RESULT_CODE;
-import static se.leap.bitmaskclient.Constants.BROADCAST_RESULT_KEY;
import static se.leap.bitmaskclient.Constants.PROVIDER_KEY;
import static se.leap.bitmaskclient.Constants.REQUEST_CODE_ADD_PROVIDER;
import static se.leap.bitmaskclient.Constants.REQUEST_CODE_CONFIGURE_LEAP;
-import static se.leap.bitmaskclient.ProviderAPI.CORRECTLY_DOWNLOADED_VPN_CERTIFICATE;
-import static se.leap.bitmaskclient.ProviderAPI.DOWNLOAD_VPN_CERTIFICATE;
import static se.leap.bitmaskclient.ProviderAPI.ERRORS;
-import static se.leap.bitmaskclient.ProviderAPI.INCORRECTLY_DOWNLOADED_VPN_CERTIFICATE;
-import static se.leap.bitmaskclient.ProviderAPI.PROVIDER_NOK;
-import static se.leap.bitmaskclient.ProviderAPI.PROVIDER_OK;
import static se.leap.bitmaskclient.ProviderAPI.PROVIDER_SET_UP;
import static se.leap.bitmaskclient.ProviderAPI.UPDATE_PROVIDER_DETAILS;
+import static se.leap.bitmaskclient.ProviderSetupInterface.ProviderConfigState.PENDING_SHOW_FAILED_DIALOG;
+import static se.leap.bitmaskclient.ProviderSetupInterface.ProviderConfigState.PROVIDER_NOT_SET;
+import static se.leap.bitmaskclient.ProviderSetupInterface.ProviderConfigState.SETTING_UP_PROVIDER;
+import static se.leap.bitmaskclient.ProviderSetupInterface.ProviderConfigState.SHOWING_PROVIDER_DETAILS;
+import static se.leap.bitmaskclient.ProviderSetupInterface.ProviderConfigState.SHOW_FAILED_DIALOG;
/**
* abstract base Activity that builds and shows the list of known available providers.
@@ -73,38 +69,24 @@ import static se.leap.bitmaskclient.ProviderAPI.UPDATE_PROVIDER_DETAILS;
* @author cyberta
*/
-public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity
- implements ProviderSetupFailedDialog.DownloadFailedDialogInterface, ProviderAPIResultReceiver.Receiver {
+public abstract class ProviderListBaseActivity extends ProviderSetupBaseActivity {
@InjectView(R.id.provider_list)
protected ListView providerListView;
@Inject
protected ProviderListAdapter adapter;
- private ProviderManager providerManager;
- protected Intent configState = new Intent(PROVIDER_NOT_SET);
-
final public static String TAG = ProviderListActivity.class.getSimpleName();
-
- final private static String ACTIVITY_STATE = "ACTIVITY STATE";
-
- final protected static String PROVIDER_NOT_SET = "PROVIDER NOT SET";
- final protected static String SETTING_UP_PROVIDER = "PROVIDER GETS SET";
- final private static String SHOWING_PROVIDER_DETAILS = "SHOWING PROVIDER DETAILS";
- final private static String PENDING_SHOW_FAILED_DIALOG = "SHOW FAILED DIALOG PENDING";
- final private static String SHOW_FAILED_DIALOG = "SHOW FAILED DIALOG";
- final private static String REASON_TO_FAIL = "REASON TO FAIL";
- final protected static String SERVICES_RETRIEVED = "SERVICES RETRIEVED";
final protected static String EXTRAS_KEY_INVALID_URL = "INVALID_URL";
- public ProviderAPIResultReceiver providerAPIResultReceiver;
- private ProviderAPIBroadcastReceiver providerAPIBroadcastReceiver;
- private FragmentManagerEnhanced fragmentManager;
-
- private boolean isActivityShowing;
- private String reasonToFail;
- private boolean testNewURL;
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setUpInitialUI();
+ initProviderList();
+ restoreState(savedInstanceState);
+ }
public abstract void retrySetUpProvider(@NonNull Provider provider);
@@ -114,59 +96,10 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity
List<Renderer<Provider>> prototypes = new ArrayList<>();
prototypes.add(new ProviderRenderer(this));
ProviderRendererBuilder providerRendererBuilder = new ProviderRendererBuilder(prototypes);
- adapter = new ProviderListAdapter(getLayoutInflater(), providerRendererBuilder, providerManager);
+ adapter = new ProviderListAdapter(getLayoutInflater(), providerRendererBuilder, getProviderManager());
providerListView.setAdapter(adapter);
}
- @Override
- public void onSaveInstanceState(@NotNull Bundle outState) {
- outState.putString(ACTIVITY_STATE, configState.getAction());
- outState.putString(REASON_TO_FAIL, reasonToFail);
-
- super.onSaveInstanceState(outState);
- }
-
- protected void restoreState(Bundle savedInstanceState) {
- super.restoreState(savedInstanceState);
- if (savedInstanceState == null) {
- return;
- }
- configState.setAction(savedInstanceState.getString(ACTIVITY_STATE, PROVIDER_NOT_SET));
- if (savedInstanceState.containsKey(REASON_TO_FAIL)) {
- reasonToFail = savedInstanceState.getString(REASON_TO_FAIL);
- }
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- fragmentManager = new FragmentManagerEnhanced(getSupportFragmentManager());
- providerManager = ProviderManager.getInstance(getAssets(), getExternalFilesDir(null));
-
- setUpInitialUI();
- initProviderList();
- restoreState(savedInstanceState);
- }
-
- @Override
- protected void onResume() {
- Log.d(TAG, "resuming with ConfigState: " + configState.getAction());
- super.onResume();
- setUpProviderAPIResultReceiver();
- isActivityShowing = true;
- if (SETTING_UP_PROVIDER.equals(configState.getAction())) {
- showProgressBar();
- checkProviderSetUp();
- } else if (PENDING_SHOW_FAILED_DIALOG.equals(configState.getAction())) {
- showProgressBar();
- showDownloadFailedDialog();
- } else if (SHOW_FAILED_DIALOG.equals(configState.getAction())) {
- showProgressBar();
- } else if (SHOWING_PROVIDER_DETAILS.equals(configState.getAction())) {
- cancelSettingUpProvider();
- }
- }
-
private void setUpInitialUI() {
setContentView(R.layout.a_provider_list);
setProviderHeaderText(R.string.setup_provider);
@@ -174,20 +107,6 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity
}
@Override
- protected void onPause() {
- super.onPause();
- isActivityShowing = false;
- if (providerAPIBroadcastReceiver != null)
- LocalBroadcastManager.getInstance(this).unregisterReceiver(providerAPIBroadcastReceiver);
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- providerAPIResultReceiver = null;
- }
-
- @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_CONFIGURE_LEAP) {
if (resultCode == RESULT_OK) {
@@ -220,58 +139,42 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity
showProgressBar();
}
-
- private void setUpProviderAPIResultReceiver() {
- providerAPIResultReceiver = new ProviderAPIResultReceiver(new Handler(), this);
- providerAPIBroadcastReceiver = new ProviderAPIBroadcastReceiver();
-
- IntentFilter updateIntentFilter = new IntentFilter(BROADCAST_PROVIDER_API_EVENT);
- updateIntentFilter.addCategory(Intent.CATEGORY_DEFAULT);
- LocalBroadcastManager.getInstance(this).registerReceiver(providerAPIBroadcastReceiver, updateIntentFilter);
- }
-
- void handleProviderSetUp(Provider handledProvider) {
+ // ------- ProviderSetupInterface ---v
+ @Override
+ public void handleProviderSetUp(Provider handledProvider) {
this.provider = handledProvider;
adapter.add(provider);
adapter.saveProviders();
if (provider.allowsAnonymous()) {
- configState.putExtra(SERVICES_RETRIEVED, true);
+ //FIXME: providerApiBroadcastReceiver.getConfigState().putExtra(SERVICES_RETRIEVED, true); DEAD CODE???
downloadVpnCertificate();
} else {
showProviderDetails();
}
}
- void handleProviderSetupFailed(Bundle resultData) {
- reasonToFail = resultData.getString(ERRORS);
- showDownloadFailedDialog();
- }
-
- void handleCorrectlyDownloadedCertificate(Provider handledProvider) {
+ @Override
+ public void handleCorrectlyDownloadedCertificate(Provider handledProvider) {
this.provider = handledProvider;
showProviderDetails();
}
+ // -----------------------------------------
- void handleIncorrectlyDownloadedCertificate() {
- cancelSettingUpProvider();
- setResult(RESULT_CANCELED, configState);
- }
-
+ //TODO: only keep empty method for testing purposes
@Override
public void onReceiveResult(int resultCode, Bundle resultData) {
- if (resultCode == ProviderAPI.PROVIDER_OK) {
- Provider provider = resultData.getParcelable(PROVIDER_KEY);
- handleProviderSetUp(provider);
- } else if (resultCode == AboutFragment.VIEWED) {
+ super.onReceiveResult(resultCode, resultData);
+ if (resultCode == AboutFragment.VIEWED) {
// Do nothing, right now
// I need this for CW to wait for the About activity to end before going back to Dashboard.
+ //FIXME: WEEEIRD!
}
}
@OnItemClick(R.id.provider_list)
void onItemSelected(int position) {
- if (SETTING_UP_PROVIDER.equals(configState.getAction()) ||
- SHOW_FAILED_DIALOG.equals(configState.getAction())) {
+ if (SETTING_UP_PROVIDER == getConfigState() ||
+ SHOW_FAILED_DIALOG == getConfigState()) {
return;
}
@@ -279,7 +182,7 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity
provider = adapter.getItem(position);
if (provider != null && !provider.isDefault()) {
//TODO Code 2 pane view
- configState.setAction(SETTING_UP_PROVIDER);
+ providerConfigState = SETTING_UP_PROVIDER;
showProgressBar();
onItemSelectedLogic();
} else {
@@ -289,39 +192,14 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity
@Override
public void onBackPressed() {
- if (SETTING_UP_PROVIDER.equals(configState.getAction()) ||
- SHOW_FAILED_DIALOG.equals(configState.getAction())) {
+ if (SETTING_UP_PROVIDER == providerConfigState ||
+ SHOW_FAILED_DIALOG == providerConfigState) {
cancelSettingUpProvider();
} else {
super.onBackPressed();
}
}
- @Override
- public void cancelSettingUpProvider() {
- configState.setAction(PROVIDER_NOT_SET);
- provider = null;
- hideProgressBar();
- }
-
- @Override
- public void updateProviderDetails() {
- configState.setAction(SETTING_UP_PROVIDER);
- ProviderAPICommand.execute(this, UPDATE_PROVIDER_DETAILS, provider);
- }
-
- public void checkProviderSetUp() {
- ProviderAPICommand.execute(this, PROVIDER_SET_UP, provider, providerAPIResultReceiver);
- }
-
- /**
- * Asks ProviderApiService to download an anonymous (anon) VPN certificate.
- */
- private void downloadVpnCertificate() {
- ProviderAPICommand.execute(this, DOWNLOAD_VPN_CERTIFICATE, provider);
- }
-
-
/**
* Open the new provider dialog
*/
@@ -340,85 +218,5 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity
intent.putExtra(EXTRAS_KEY_INVALID_URL, url);
startActivityForResult(intent, REQUEST_CODE_ADD_PROVIDER);
}
-
- /**
- * Shows an error dialog, if configuring of a provider failed.
- */
- public void showDownloadFailedDialog() {
- try {
- configState.setAction(SHOW_FAILED_DIALOG);
- FragmentTransaction fragmentTransaction = fragmentManager.removePreviousFragment(ProviderSetupFailedDialog.TAG);
- DialogFragment newFragment;
- try {
- JSONObject errorJson = new JSONObject(reasonToFail);
- newFragment = ProviderSetupFailedDialog.newInstance(provider, errorJson, testNewURL);
- } catch (JSONException e) {
- e.printStackTrace();
- newFragment = ProviderSetupFailedDialog.newInstance(provider, reasonToFail);
- } catch (NullPointerException e) {
- //reasonToFail was null
- return;
- }
- newFragment.show(fragmentTransaction, ProviderSetupFailedDialog.TAG);
- } catch (IllegalStateException e) {
- e.printStackTrace();
- configState.setAction(PENDING_SHOW_FAILED_DIALOG);
- }
- }
-
- /**
- * Once selected a provider, this fragment offers the user to log in,
- * use it anonymously (if possible)
- * or cancel his/her election pressing the back button.
- */
- public void showProviderDetails() {
- // show only if current activity is shown
- if (isActivityShowing && configState.getAction() != null &&
- !configState.getAction().equalsIgnoreCase(SHOWING_PROVIDER_DETAILS)) {
- configState.setAction(SHOWING_PROVIDER_DETAILS);
- Intent intent = new Intent(this, ProviderDetailActivity.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
- intent.putExtra(PROVIDER_KEY, provider);
- startActivityForResult(intent, REQUEST_CODE_CONFIGURE_LEAP);
- }
- }
-
- public class ProviderAPIBroadcastReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- Log.d(TAG, "received Broadcast");
-
- String action = intent.getAction();
- if (action == null || !action.equalsIgnoreCase(BROADCAST_PROVIDER_API_EVENT)) {
- return;
- }
-
- if (configState.getAction() != null &&
- configState.getAction().equalsIgnoreCase(SETTING_UP_PROVIDER)) {
- int resultCode = intent.getIntExtra(BROADCAST_RESULT_CODE, RESULT_CANCELED);
- Log.d(TAG, "Broadcast resultCode: " + Integer.toString(resultCode));
-
- Bundle resultData = intent.getParcelableExtra(BROADCAST_RESULT_KEY);
- Provider handledProvider = resultData.getParcelable(PROVIDER_KEY);
-
- if (handledProvider != null && provider != null &&
- handledProvider.getDomain().equalsIgnoreCase(provider.getDomain())) {
- switch (resultCode) {
- case PROVIDER_OK:
- handleProviderSetUp(handledProvider);
- break;
- case PROVIDER_NOK:
- handleProviderSetupFailed(resultData);
- break;
- case CORRECTLY_DOWNLOADED_VPN_CERTIFICATE:
- handleCorrectlyDownloadedCertificate(handledProvider);
- break;
- case INCORRECTLY_DOWNLOADED_VPN_CERTIFICATE:
- handleIncorrectlyDownloadedCertificate();
- break;
- }
- }
- }
- }
- }
+
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderSetupBaseActivity.java b/app/src/main/java/se/leap/bitmaskclient/ProviderSetupBaseActivity.java
new file mode 100644
index 00000000..8731a2cc
--- /dev/null
+++ b/app/src/main/java/se/leap/bitmaskclient/ProviderSetupBaseActivity.java
@@ -0,0 +1,235 @@
+package se.leap.bitmaskclient;
+
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.PersistableBundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.DialogFragment;
+import android.support.v4.app.FragmentTransaction;
+import android.support.v4.content.LocalBroadcastManager;
+import android.util.Log;
+
+import org.jetbrains.annotations.NotNull;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import static se.leap.bitmaskclient.Constants.BROADCAST_PROVIDER_API_EVENT;
+import static se.leap.bitmaskclient.Constants.PROVIDER_KEY;
+import static se.leap.bitmaskclient.Constants.REQUEST_CODE_CONFIGURE_LEAP;
+import static se.leap.bitmaskclient.ProviderAPI.DOWNLOAD_VPN_CERTIFICATE;
+import static se.leap.bitmaskclient.ProviderAPI.ERRORS;
+import static se.leap.bitmaskclient.ProviderAPI.PROVIDER_SET_UP;
+import static se.leap.bitmaskclient.ProviderAPI.UPDATE_PROVIDER_DETAILS;
+import static se.leap.bitmaskclient.ProviderSetupInterface.ProviderConfigState.PENDING_SHOW_FAILED_DIALOG;
+import static se.leap.bitmaskclient.ProviderSetupInterface.ProviderConfigState.PROVIDER_NOT_SET;
+import static se.leap.bitmaskclient.ProviderSetupInterface.ProviderConfigState.SETTING_UP_PROVIDER;
+import static se.leap.bitmaskclient.ProviderSetupInterface.ProviderConfigState.SHOWING_PROVIDER_DETAILS;
+import static se.leap.bitmaskclient.ProviderSetupInterface.ProviderConfigState.SHOW_FAILED_DIALOG;
+
+/**
+ * Created by cyberta on 19.08.18.
+ */
+
+public abstract class ProviderSetupBaseActivity extends ConfigWizardBaseActivity implements ProviderAPIResultReceiver.Receiver, ProviderSetupInterface, ProviderSetupFailedDialog.DownloadFailedDialogInterface {
+ final public static String TAG = "PoviderSetupActivity";
+ final private static String ACTIVITY_STATE = "ACTIVITY STATE";
+ final private static String REASON_TO_FAIL = "REASON TO FAIL";
+
+ protected ProviderSetupInterface.ProviderConfigState providerConfigState = PROVIDER_NOT_SET;
+ private ProviderManager providerManager;
+ private FragmentManagerEnhanced fragmentManager;
+
+ private String reasonToFail;
+ protected boolean testNewURL;
+
+ private ProviderApiSetupBroadcastReceiver providerAPIBroadcastReceiver;
+ private ProviderAPIResultReceiver providerAPIResultReceiver;
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ fragmentManager = new FragmentManagerEnhanced(getSupportFragmentManager());
+ providerManager = ProviderManager.getInstance(getAssets(), getExternalFilesDir(null));
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ Log.d(TAG, "resuming with ConfigState: " + providerConfigState.toString());
+ setUpProviderAPIResultReceiver();
+ if (SETTING_UP_PROVIDER == providerConfigState) {
+ showProgressBar();
+ checkProviderSetUp();
+ } else if (PENDING_SHOW_FAILED_DIALOG == providerConfigState) {
+ showProgressBar();
+ showDownloadFailedDialog();
+ } else if (SHOW_FAILED_DIALOG == providerConfigState) {
+ showProgressBar();
+ } else if (SHOWING_PROVIDER_DETAILS == providerConfigState) {
+ cancelSettingUpProvider();
+ }
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ if (providerAPIBroadcastReceiver != null)
+ LocalBroadcastManager.getInstance(this).unregisterReceiver(providerAPIBroadcastReceiver);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ providerAPIResultReceiver = null;
+ }
+
+
+ @Override
+ public void onSaveInstanceState(@NotNull Bundle outState) {
+ outState.putString(ACTIVITY_STATE, providerConfigState.toString());
+ outState.putString(REASON_TO_FAIL, reasonToFail);
+
+ super.onSaveInstanceState(outState);
+ }
+
+ protected FragmentManagerEnhanced getFragmentManagerEnhanced() {
+ return fragmentManager;
+ }
+
+ protected ProviderManager getProviderManager() {
+ return providerManager;
+ }
+
+ protected void setProviderConfigState(ProviderConfigState state) {
+ this.providerConfigState = state;
+ }
+
+ protected void setProvider(Provider provider) {
+ this.provider = provider;
+ }
+
+ // --------- ProviderSetupInterface ---v
+ @Override
+ public Provider getProvider() {
+ return provider;
+ }
+
+ @Override
+ public ProviderConfigState getConfigState() {
+ return providerConfigState;
+ }
+
+ @Override
+ public void handleProviderSetupFailed(Bundle resultData) {
+ reasonToFail = resultData.getString(ERRORS);
+ showDownloadFailedDialog();
+ }
+
+ @Override
+ public void handleIncorrectlyDownloadedCertificate() {
+ cancelSettingUpProvider();
+ setResult(RESULT_CANCELED, new Intent(getConfigState().toString()));
+ }
+
+ // -------- DownloadFailedDialogInterface ---v
+ @Override
+ public void cancelSettingUpProvider() {
+ providerConfigState = PROVIDER_NOT_SET;
+ provider = null;
+ hideProgressBar();
+ }
+
+ @Override
+ public void updateProviderDetails() {
+ providerConfigState = SETTING_UP_PROVIDER;
+ ProviderAPICommand.execute(this, UPDATE_PROVIDER_DETAILS, provider);
+ }
+
+ // -------- ProviderAPIResultReceiver.Receiver ---v
+ @Override
+ public void onReceiveResult(int resultCode, Bundle resultData) {
+ if (resultCode == ProviderAPI.PROVIDER_OK) {
+ Provider provider = resultData.getParcelable(PROVIDER_KEY);
+ handleProviderSetUp(provider);
+ }
+ }
+
+ protected void restoreState(Bundle savedInstanceState) {
+ super.restoreState(savedInstanceState);
+ if (savedInstanceState == null) {
+ return;
+ }
+ this.providerConfigState = ProviderSetupInterface.ProviderConfigState.valueOf(savedInstanceState.getString(ACTIVITY_STATE, PROVIDER_NOT_SET.toString()));
+ if (savedInstanceState.containsKey(REASON_TO_FAIL)) {
+ reasonToFail = savedInstanceState.getString(REASON_TO_FAIL);
+ }
+ }
+
+ private void setUpProviderAPIResultReceiver() {
+ providerAPIResultReceiver = new ProviderAPIResultReceiver(new Handler(), this);
+ providerAPIBroadcastReceiver = new ProviderApiSetupBroadcastReceiver(this);
+
+ IntentFilter updateIntentFilter = new IntentFilter(BROADCAST_PROVIDER_API_EVENT);
+ updateIntentFilter.addCategory(Intent.CATEGORY_DEFAULT);
+ LocalBroadcastManager.getInstance(this).registerReceiver(providerAPIBroadcastReceiver, updateIntentFilter);
+ }
+
+ /**
+ * Asks ProviderApiService to download an anonymous (anon) VPN certificate.
+ */
+ protected void downloadVpnCertificate() {
+ ProviderAPICommand.execute(this, DOWNLOAD_VPN_CERTIFICATE, provider);
+ }
+
+ /*
+ *
+ */
+ public void checkProviderSetUp() {
+ ProviderAPICommand.execute(this, PROVIDER_SET_UP, provider, providerAPIResultReceiver);
+ }
+
+ /**
+ * Once selected a provider, this fragment offers the user to log in,
+ * use it anonymously (if possible)
+ * or cancel his/her election pressing the back button.
+ */
+ public void showProviderDetails() {
+ // show only if current activity is shown
+ if (isActivityShowing &&
+ providerConfigState != SHOWING_PROVIDER_DETAILS) {
+ providerConfigState = SHOWING_PROVIDER_DETAILS;
+ Intent intent = new Intent(this, ProviderDetailActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
+ intent.putExtra(PROVIDER_KEY, provider);
+ startActivityForResult(intent, REQUEST_CODE_CONFIGURE_LEAP);
+ }
+ }
+
+ /**
+ * Shows an error dialog, if configuring of a provider failed.
+ */
+ public void showDownloadFailedDialog() {
+ try {
+ providerConfigState = SHOW_FAILED_DIALOG;
+ FragmentTransaction fragmentTransaction = fragmentManager.removePreviousFragment(ProviderSetupFailedDialog.TAG);
+ DialogFragment newFragment;
+ try {
+ JSONObject errorJson = new JSONObject(reasonToFail);
+ newFragment = ProviderSetupFailedDialog.newInstance(provider, errorJson, testNewURL);
+ } catch (JSONException e) {
+ e.printStackTrace();
+ newFragment = ProviderSetupFailedDialog.newInstance(provider, reasonToFail);
+ } catch (NullPointerException e) {
+ //reasonToFail was null
+ return;
+ }
+ newFragment.show(fragmentTransaction, ProviderSetupFailedDialog.TAG);
+ } catch (IllegalStateException e) {
+ e.printStackTrace();
+ providerConfigState = PENDING_SHOW_FAILED_DIALOG;
+ }
+ }
+
+}
diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderSetupFailedDialog.java b/app/src/main/java/se/leap/bitmaskclient/ProviderSetupFailedDialog.java
index 3cfae776..71b67df1 100644
--- a/app/src/main/java/se/leap/bitmaskclient/ProviderSetupFailedDialog.java
+++ b/app/src/main/java/se/leap/bitmaskclient/ProviderSetupFailedDialog.java
@@ -171,8 +171,8 @@ public class ProviderSetupFailedDialog extends DialogFragment {
@Override
public void onCancel(DialogInterface dialog) {
- interfaceWithConfigurationWizard.cancelSettingUpProvider();
dialog.dismiss();
+ interfaceWithConfigurationWizard.cancelSettingUpProvider();
}
@Override
diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderSetupInterface.java b/app/src/main/java/se/leap/bitmaskclient/ProviderSetupInterface.java
new file mode 100644
index 00000000..167db604
--- /dev/null
+++ b/app/src/main/java/se/leap/bitmaskclient/ProviderSetupInterface.java
@@ -0,0 +1,24 @@
+package se.leap.bitmaskclient;
+
+import android.os.Bundle;
+
+/**
+ * Created by cyberta on 17.08.18.
+ */
+
+public interface ProviderSetupInterface {
+ enum ProviderConfigState {
+ PROVIDER_NOT_SET,
+ SETTING_UP_PROVIDER,
+ SHOWING_PROVIDER_DETAILS,
+ PENDING_SHOW_FAILED_DIALOG,
+ SHOW_FAILED_DIALOG,
+ }
+
+ void handleProviderSetUp(Provider provider);
+ void handleProviderSetupFailed(Bundle resultData);
+ void handleCorrectlyDownloadedCertificate(Provider provider);
+ void handleIncorrectlyDownloadedCertificate();
+ Provider getProvider();
+ ProviderConfigState getConfigState();
+}
diff --git a/app/src/main/java/se/leap/bitmaskclient/StartActivity.java b/app/src/main/java/se/leap/bitmaskclient/StartActivity.java
index 33c13b90..28eebb07 100644
--- a/app/src/main/java/se/leap/bitmaskclient/StartActivity.java
+++ b/app/src/main/java/se/leap/bitmaskclient/StartActivity.java
@@ -18,6 +18,7 @@ import se.leap.bitmaskclient.userstatus.User;
import se.leap.bitmaskclient.utils.ConfigHelper;
import static se.leap.bitmaskclient.Constants.APP_ACTION_CONFIGURE_ALWAYS_ON_PROFILE;
+import static se.leap.bitmaskclient.Constants.DEFAULT_BITMASK;
import static se.leap.bitmaskclient.Constants.EIP_RESTART_ON_BOOT;
import static se.leap.bitmaskclient.Constants.PREFERENCES_APP_VERSION;
import static se.leap.bitmaskclient.Constants.PROVIDER_EIP_DEFINITION;
@@ -25,6 +26,7 @@ import static se.leap.bitmaskclient.Constants.PROVIDER_KEY;
import static se.leap.bitmaskclient.Constants.REQUEST_CODE_CONFIGURE_LEAP;
import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES;
import static se.leap.bitmaskclient.MainActivity.ACTION_SHOW_VPN_FRAGMENT;
+import static se.leap.bitmaskclient.utils.ConfigHelper.isDefaultBitmask;
import static se.leap.bitmaskclient.utils.PreferenceHelper.getSavedProviderFromSharedPreferences;
import static se.leap.bitmaskclient.utils.PreferenceHelper.providerInSharedPreferences;
import static se.leap.bitmaskclient.utils.PreferenceHelper.storeProviderInPreferences;
@@ -181,7 +183,11 @@ public class StartActivity extends Activity{
if (getIntent().hasExtra(APP_ACTION_CONFIGURE_ALWAYS_ON_PROFILE)) {
getIntent().removeExtra(APP_ACTION_CONFIGURE_ALWAYS_ON_PROFILE);
}
- startActivityForResult(new Intent(this, ProviderListActivity.class), REQUEST_CODE_CONFIGURE_LEAP);
+ if (isDefaultBitmask()) {
+ startActivityForResult(new Intent(this, ProviderListActivity.class), REQUEST_CODE_CONFIGURE_LEAP);
+ } else { // custom branded app
+ startActivityForResult(new Intent(this, CustomProviderSetupActivity.class), REQUEST_CODE_CONFIGURE_LEAP);
+ }
}
@Override
diff --git a/app/src/main/java/se/leap/bitmaskclient/TLSCompatSocketFactory.java b/app/src/main/java/se/leap/bitmaskclient/TLSCompatSocketFactory.java
index cca75bdf..32652964 100644
--- a/app/src/main/java/se/leap/bitmaskclient/TLSCompatSocketFactory.java
+++ b/app/src/main/java/se/leap/bitmaskclient/TLSCompatSocketFactory.java
@@ -73,7 +73,7 @@ public class TLSCompatSocketFactory extends SSLSocketFactory {
trustManager = trustManagers[0];
- // Create an SSLContext that uses our TrustManager
+ // Create a SSLContext that uses our TrustManager
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
internalSSLSocketFactory = sslContext.getSocketFactory();
diff --git a/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java b/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java
index 6e9879dd..769bd887 100644
--- a/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java
@@ -50,7 +50,6 @@ import android.widget.ArrayAdapter;
import android.widget.CompoundButton;
import android.widget.ListView;
-import se.leap.bitmaskclient.utils.ConfigHelper;
import se.leap.bitmaskclient.DrawerSettingsAdapter;
import se.leap.bitmaskclient.DrawerSettingsAdapter.DrawerSettingsItem;
import se.leap.bitmaskclient.EipFragment;
@@ -64,11 +63,11 @@ import se.leap.bitmaskclient.fragments.LogFragment;
import static android.content.Context.MODE_PRIVATE;
import static se.leap.bitmaskclient.BitmaskApp.getRefWatcher;
+import static se.leap.bitmaskclient.Constants.DONATION_URL;
+import static se.leap.bitmaskclient.Constants.ENABLE_DONATION;
import static se.leap.bitmaskclient.Constants.PROVIDER_KEY;
import static se.leap.bitmaskclient.Constants.REQUEST_CODE_SWITCH_PROVIDER;
import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES;
-import static se.leap.bitmaskclient.Constants.DONATION_URL;
-import static se.leap.bitmaskclient.Constants.ENABLE_DONATION;
import static se.leap.bitmaskclient.DrawerSettingsAdapter.ABOUT;
import static se.leap.bitmaskclient.DrawerSettingsAdapter.ALWAYS_ON;
import static se.leap.bitmaskclient.DrawerSettingsAdapter.BATTERY_SAVER;
@@ -78,14 +77,15 @@ import static se.leap.bitmaskclient.DrawerSettingsAdapter.DrawerSettingsItem.get
import static se.leap.bitmaskclient.DrawerSettingsAdapter.LOG;
import static se.leap.bitmaskclient.DrawerSettingsAdapter.SWITCH_PROVIDER;
import static se.leap.bitmaskclient.R.string.about_fragment_title;
+import static se.leap.bitmaskclient.R.string.donate_title;
import static se.leap.bitmaskclient.R.string.log_fragment_title;
import static se.leap.bitmaskclient.R.string.switch_provider_menu_option;
+import static se.leap.bitmaskclient.utils.ConfigHelper.isDefaultBitmask;
import static se.leap.bitmaskclient.utils.PreferenceHelper.getProviderName;
import static se.leap.bitmaskclient.utils.PreferenceHelper.getSaveBattery;
import static se.leap.bitmaskclient.utils.PreferenceHelper.getSavedProviderFromSharedPreferences;
import static se.leap.bitmaskclient.utils.PreferenceHelper.getShowAlwaysOnDialog;
import static se.leap.bitmaskclient.utils.PreferenceHelper.saveBattery;
-import static se.leap.bitmaskclient.R.string.donate_title;
/**
* Fragment used for managing interactions for and presentation of a navigation drawer.
@@ -286,7 +286,9 @@ public class NavigationDrawerFragment extends Fragment {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
settingsListAdapter.addItem(getSimpleTextInstance(getString(R.string.always_on_vpn), ALWAYS_ON));
}
- settingsListAdapter.addItem(getSimpleTextInstance(getString(switch_provider_menu_option), SWITCH_PROVIDER));
+ if (isDefaultBitmask()) {
+ settingsListAdapter.addItem(getSimpleTextInstance(getString(switch_provider_menu_option), SWITCH_PROVIDER));
+ }
settingsListAdapter.addItem(getSimpleTextInstance(getString(log_fragment_title), LOG));
if (ENABLE_DONATION) {
settingsListAdapter.addItem(getSimpleTextInstance(getString(donate_title), DONATE));
diff --git a/app/src/main/java/se/leap/bitmaskclient/utils/ConfigHelper.java b/app/src/main/java/se/leap/bitmaskclient/utils/ConfigHelper.java
index 5bb637b7..326139c0 100644
--- a/app/src/main/java/se/leap/bitmaskclient/utils/ConfigHelper.java
+++ b/app/src/main/java/se/leap/bitmaskclient/utils/ConfigHelper.java
@@ -40,8 +40,11 @@ import java.security.interfaces.RSAPrivateKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
+import se.leap.bitmaskclient.BuildConfig;
import se.leap.bitmaskclient.ProviderAPI;
+import static se.leap.bitmaskclient.Constants.DEFAULT_BITMASK;
+
/**
* Stores constants, and implements auxiliary methods used across all Bitmask Android classes.
*
@@ -167,4 +170,11 @@ public class ConfigHelper {
}
}
+ public static boolean isDefaultBitmask() {
+ return BuildConfig.FLAVOR_branding.equals(DEFAULT_BITMASK);
+ }
+
+ public static boolean preferAnonymousUsage() {
+ return BuildConfig.priotize_anonymous_usage;
+ }
}
diff --git a/app/src/main/res/layout-sw600dp-port/a_custom_provider_setup.xml b/app/src/main/res/layout-sw600dp-port/a_custom_provider_setup.xml
new file mode 100644
index 00000000..f32cdd65
--- /dev/null
+++ b/app/src/main/res/layout-sw600dp-port/a_custom_provider_setup.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/provider_list_layout"
+ style="@style/BitmaskActivity"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".CustomProviderSetupActivity">
+
+ <android.support.v7.widget.AppCompatImageView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ app:srcCompat="@drawable/background_main"
+ android:scaleType="centerCrop"
+ />
+
+ <android.support.constraint.Guideline
+ android:id="@+id/guideline_left"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ app:layout_constraintGuide_percent="0.2" />
+
+ <android.support.constraint.Guideline
+ android:id="@+id/guideline_right"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ app:layout_constraintGuide_percent="0.8" />
+
+ <android.support.constraint.Guideline
+ android:id="@+id/guideline_top"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ app:layout_constraintGuide_percent="0.275" />
+
+ <android.support.constraint.Guideline
+ android:id="@+id/guideline_bottom"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ app:layout_constraintGuide_percent="0.725" />
+
+ <include layout="@layout/a_custom_provider_setup_tablet_linear_layout" />
+
+</android.support.constraint.ConstraintLayout>
diff --git a/app/src/main/res/layout-xlarge/a_custom_provider_setup.xml b/app/src/main/res/layout-xlarge/a_custom_provider_setup.xml
new file mode 100644
index 00000000..a6578c2a
--- /dev/null
+++ b/app/src/main/res/layout-xlarge/a_custom_provider_setup.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/provider_list_layout"
+ style="@style/BitmaskActivity"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".CustomProviderSetupActivity">
+
+ <android.support.v7.widget.AppCompatImageView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ app:srcCompat="@drawable/background_main"
+ android:scaleType="centerCrop"
+ />
+
+ <android.support.constraint.Guideline
+ android:id="@+id/guideline_left"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ app:layout_constraintGuide_percent="0.2" />
+
+ <android.support.constraint.Guideline
+ android:id="@+id/guideline_right"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ app:layout_constraintGuide_percent="0.8" />
+
+ <android.support.constraint.Guideline
+ android:id="@+id/guideline_top"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ app:layout_constraintGuide_percent="0.15" />
+
+ <android.support.constraint.Guideline
+ android:id="@+id/guideline_bottom"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ app:layout_constraintGuide_percent="0.85" />
+
+ <include layout="@layout/a_custom_provider_setup_tablet_linear_layout" />
+
+</android.support.constraint.ConstraintLayout>
diff --git a/app/src/main/res/layout/a_custom_provider_setup.xml b/app/src/main/res/layout/a_custom_provider_setup.xml
new file mode 100644
index 00000000..34c59259
--- /dev/null
+++ b/app/src/main/res/layout/a_custom_provider_setup.xml
@@ -0,0 +1,30 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/custom_provider_setup_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".CustomProviderSetupActivity"
+ android:padding="@dimen/stdpadding"
+ style="@style/BitmaskActivity" >
+
+ <!-- a "content" view that is required for
+ ConfigWizardBaseActivities -->
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_height="0dp"
+ android:layout_width="0dp"
+ android:id="@id/content">
+ <se.leap.bitmaskclient.views.ProviderHeaderView
+ android:id="@+id/header"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="visible"
+ />
+ </LinearLayout>
+
+ <include layout="@layout/v_loading_screen"
+ android:visibility="visible"
+ />
+
+</LinearLayout>
diff --git a/app/src/main/res/layout/a_custom_provider_setup_tablet_linear_layout.xml b/app/src/main/res/layout/a_custom_provider_setup_tablet_linear_layout.xml
new file mode 100644
index 00000000..b3df1950
--- /dev/null
+++ b/app/src/main/res/layout/a_custom_provider_setup_tablet_linear_layout.xml
@@ -0,0 +1,33 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:orientation="vertical"
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_margin="@dimen/stdpadding"
+ android:padding="@dimen/stdpadding"
+ android:background="@color/colorBackground"
+ app:layout_constraintBottom_toTopOf="@+id/guideline_bottom"
+ app:layout_constraintEnd_toStartOf="@+id/guideline_right"
+ app:layout_constraintHeight_min="411dp"
+ app:layout_constraintStart_toStartOf="@+id/guideline_left"
+ app:layout_constraintTop_toTopOf="@+id/guideline_top"
+ app:layout_constraintWidth_min="731dp">
+ <!-- a "content" view that is required for
+ ConfigWizardBaseActivities -->
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_height="0dp"
+ android:layout_width="0dp"
+ android:id="@id/content">
+ <se.leap.bitmaskclient.views.ProviderHeaderView
+ android:id="@+id/header"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="visible"
+ />
+ </LinearLayout>
+
+ <include layout="@layout/v_loading_screen"
+ android:visibility="visible"
+ />
+</LinearLayout> \ No newline at end of file
diff --git a/app/src/normal/assets/calyx.net.json b/app/src/normal/assets/calyx.net.json
new file mode 100644
index 00000000..69e1c2a6
--- /dev/null
+++ b/app/src/normal/assets/calyx.net.json
@@ -0,0 +1,37 @@
+{
+ "api_uri": "https://api.calyx.net:4430",
+ "api_version": "1",
+ "ca_cert_fingerprint": "SHA256: 43683c9ba3862c5384a8c1885072fcac40b5d2d4dd67331443f13a3077fa2e69",
+ "ca_cert_uri": "https://calyx.net/ca.crt",
+ "default_language": "en",
+ "description": {
+ "en": "Calyx Institute privacy focused ISP testbed"
+ },
+ "domain": "calyx.net",
+ "enrollment_policy": "open",
+ "languages": [
+ "en"
+ ],
+ "name": {
+ "en": "calyx"
+ },
+ "service": {
+ "allow_anonymous": false,
+ "allow_free": true,
+ "allow_limited_bandwidth": false,
+ "allow_paid": false,
+ "allow_registration": true,
+ "allow_unlimited_bandwidth": true,
+ "bandwidth_limit": 102400,
+ "default_service_level": 1,
+ "levels": {
+ "1": {
+ "description": "Please donate.",
+ "name": "free"
+ }
+ }
+ },
+ "services": [
+ "openvpn"
+ ]
+} \ No newline at end of file
diff --git a/app/src/normal/assets/calyx.net.pem b/app/src/normal/assets/calyx.net.pem
new file mode 100644
index 00000000..cedb2e38
--- /dev/null
+++ b/app/src/normal/assets/calyx.net.pem
@@ -0,0 +1,31 @@
+-----BEGIN CERTIFICATE-----
+MIIFYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQ0FADBEMQ4wDAYDVQQKDAVjYWx5
+eDEaMBgGA1UECwwRaHR0cHM6Ly9jYWx5eC5uZXQxFjAUBgNVBAMMDWNhbHl4IFJv
+b3QgQ0EwHhcNMTMwNzAyMDAwMDAwWhcNMjMwNzAyMDAwMDAwWjBEMQ4wDAYDVQQK
+DAVjYWx5eDEaMBgGA1UECwwRaHR0cHM6Ly9jYWx5eC5uZXQxFjAUBgNVBAMMDWNh
+bHl4IFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDupdnx
+Bgat537XOqrZOulE/RvjoXB1S07sy9/MMtksXFoQuWJZRCSTp1Jaqg3H/e9o1nct
+LQO91+izfJe07TUyajFl7CfllYgMeyKTYcT85dFwNX4pcIHZr8UpmO0MpGBoR4W1
+8cPa3vxAG0CsyUmrASJVyhRouk4qazRosM5RwBxTdMzCK7L3SwqPQoxlY9YmRJlD
+XYZlK5VMJd0dj9XxhMeFs5n43R0bsDENryrExSbuxoNfnUoQg3wffKk+Z0gW7YgW
+ivPsbObqOgXUuBEU0xr9xMNBpU33ffLIsccrHq1EKp8zGfCOcww6v7+zEadUkVLo
+6j/rRhYYgRw9lijZG1rMuV/mTGnUqbjHsdoz5mzkFFWeTSqo44lvhveUyCcwRNmi
+2sjS77l0fCTzfreufffFoOEcRVMRfsnJdu/xPeARoXILEx8nQ421mSn6spOZlDQr
+Tt0T0BAWt+VNc+m0IGSW3SwS7r5MUyQ/M5GrbQBGi5W2SzPriKZ79YTOwPVmXKLZ
+vJoEuKRDkEPJLBAhcD5oSQljOm/Wp/hjmRH4HnI1y4XMshWlDsyRDB1Au5yrsfwN
+noFVSskEcbXlZfNgml4lktLBqz+qwsw+voq6Ak7ROKbc0ii5s8+iNMbAtIK7GcFF
+kuKKIyRmmGlDim/SDhlNdWo7Ah4Akde7zfWufwIDAQABo2AwXjAdBgNVHQ4EFgQU
+AY8+K4ZupAQ+L9ttFJG3vaLBq5gwDgYDVR0PAQH/BAQDAgIEMAwGA1UdEwQFMAMB
+Af8wHwYDVR0jBBgwFoAUAY8+K4ZupAQ+L9ttFJG3vaLBq5gwDQYJKoZIhvcNAQEN
+BQADggIBAOpXi5o3g/2o2rPa53iG7Zgcy8RpePGgZk6xknGYWeLamEqSh+XWQZ2w
+2kQP54bf8HfPj3ugJBWsVtYAs/ltJwzeBfYDrwEJd1N8tw2IRuGlQOWiTAVVLBj4
+Zs+dikSuMoA399f/7BlUIEpVLUiV/emTtbkjFnDeKEV9zql6ypR0BtR8Knf8ALvL
+YfMsWLvTe4rXeypzxIaE2pn8ttcXLYAX0ml2MofTi5xcDhMn1vznKIvs82xhncQx
+I1MJMWqPHNHgJUJpA+y1IFh5LPbpag9PKQ0yQ9sM+/dyGumF2jElsMw71flh/Txr
+2dEv8+FNV1pPK26XJZBK24rNWFs30eAFfH9EQCwVla174I4PDoWqsIR7vtQMObDt
+Bq34R3TjjJJIt2sCSlYLooWwiK7Q+d/SgYqA+MSDmmwhzm86ToK6cwbCsvuw1AxR
+X6VIs4U8wOotgljzX/CSpKqlxcqZjhnAuelZ1+KiN8RHKPj7AzSLYOv/YwTjLTIq
+EOxquoNR58uDa5pBG22a7xWbSaKosn/mEl8SrUr6klzzc8Vh09IMoxrw74uLdAg2
+1jnrhm7qg91Ttb0aXiqbV+Kg/qQzojdewnnoBFnv4jaQ3y8zDCfMhsBtWlWz4Knb
+Zqga1WyRm3Gj1j6IV0oOincYMrw5YA7bgXpwop/Lo/mmliMA14ps
+-----END CERTIFICATE----- \ No newline at end of file
diff --git a/app/src/normal/assets/demo.bitmask.net.json b/app/src/normal/assets/demo.bitmask.net.json
new file mode 100644
index 00000000..e7fe6099
--- /dev/null
+++ b/app/src/normal/assets/demo.bitmask.net.json
@@ -0,0 +1,42 @@
+{
+ "api_uri": "https://api.demo.bitmask.net:4430",
+ "api_version": "1",
+ "ca_cert_fingerprint": "SHA256: 0f17c033115f6b76ff67871872303ff65034efe7dd1b910062ca323eb4da5c7e",
+ "ca_cert_uri": "https://demo.bitmask.net/ca.crt",
+ "default_language": "en",
+ "description": {
+ "el": "demo.bitmask.net allows you to test the Bitmask application. User accounts may be periodically deleted.",
+ "en": "demo.bitmask.net allows you to test the Bitmask application. User accounts may be periodically deleted.",
+ "es": "demo.bitmask.net allows you to test the Bitmask application. User accounts may be periodically deleted."
+ },
+ "domain": "demo.bitmask.net",
+ "enrollment_policy": "open",
+ "languages": [
+ "de",
+ "en",
+ "es",
+ "pt"
+ ],
+ "name": {
+ "en": "Bitmask"
+ },
+ "service": {
+ "allow_anonymous": true,
+ "allow_free": true,
+ "allow_limited_bandwidth": false,
+ "allow_paid": false,
+ "allow_registration": true,
+ "allow_unlimited_bandwidth": true,
+ "bandwidth_limit": 102400,
+ "default_service_level": 1,
+ "levels": {
+ "1": {
+ "description": "Please donate.",
+ "name": "free"
+ }
+ }
+ },
+ "services": [
+ "openvpn"
+ ]
+} \ No newline at end of file
diff --git a/app/src/normal/assets/demo.bitmask.net.pem b/app/src/normal/assets/demo.bitmask.net.pem
new file mode 100644
index 00000000..9a422161
--- /dev/null
+++ b/app/src/normal/assets/demo.bitmask.net.pem
@@ -0,0 +1,32 @@
+-----BEGIN CERTIFICATE-----
+MIIFbzCCA1egAwIBAgIBATANBgkqhkiG9w0BAQ0FADBKMRgwFgYDVQQDDA9CaXRt
+YXNrIFJvb3QgQ0ExEDAOBgNVBAoMB0JpdG1hc2sxHDAaBgNVBAsME2h0dHBzOi8v
+Yml0bWFzay5uZXQwHhcNMTIxMTA2MDAwMDAwWhcNMjIxMTA2MDAwMDAwWjBKMRgw
+FgYDVQQDDA9CaXRtYXNrIFJvb3QgQ0ExEDAOBgNVBAoMB0JpdG1hc2sxHDAaBgNV
+BAsME2h0dHBzOi8vYml0bWFzay5uZXQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
+ggIKAoICAQC1eV4YvayaU+maJbWrD4OHo3d7S1BtDlcvkIRS1Fw3iYDjsyDkZxai
+dHp4EUasfNQ+EVtXUvtk6170EmLco6Elg8SJBQ27trE6nielPRPCfX3fQzETRfvB
+7tNvGw4Jn2YKiYoMD79kkjgyZjkJ2r/bEHUSevmR09BRp86syHZerdNGpXYhcQ84
+CA1+V+603GFIHnrP+uQDdssW93rgDNYu+exT+Wj6STfnUkugyjmPRPjL7wh0tzy+
+znCeLl4xiV3g9sjPnc7r2EQKd5uaTe3j71sDPF92KRk0SSUndREz+B1+Dbe/RGk4
+MEqGFuOzrtsgEhPIX0hplhb0Tgz/rtug+yTT7oJjBa3u20AAOQ38/M99EfdeJvc4
+lPFF1XBBLh6X9UKF72an2NuANiX6XPySnJgZ7nZ09RiYZqVwu/qt3DfvLfhboq+0
+bQvLUPXrVDr70onv5UDjpmEA/cLmaIqqrduuTkFZOym65/PfAPvpGnt7crQj/Ibl
+DEDYZQmP7AS+6zBjoOzNjUGE5r40zWAR1RSi7zliXTu+yfsjXUIhUAWmYR6J3KxB
+lfsiHBQ+8dn9kC3YrUexWoOqBiqJOAJzZh5Y1tqgzfh+2nmHSB2dsQRs7rDRRlyy
+YMbkpzL9ZsOUO2eTP1mmar6YjCN+rggYjRrX71K2SpBG6b1zZxOG+wIDAQABo2Aw
+XjAdBgNVHQ4EFgQUuYGDLL2sswnYpHHvProt1JU+D48wDgYDVR0PAQH/BAQDAgIE
+MAwGA1UdEwQFMAMBAf8wHwYDVR0jBBgwFoAUuYGDLL2sswnYpHHvProt1JU+D48w
+DQYJKoZIhvcNAQENBQADggIBADeG67vaFcbITGpi51264kHPYPEWaXUa5XYbtmBl
+cXYyB6hY5hv/YNuVGJ1gWsDmdeXEyj0j2icGQjYdHRfwhrbEri+h1EZOm1cSBDuY
+k/P5+ctHyOXx8IE79DBsZ6IL61UKIaKhqZBfLGYcWu17DVV6+LT+AKtHhOrv3TSj
+RnAcKnCbKqXLhUPXpK0eTjPYS2zQGQGIhIy9sQXVXJJJsGrPgMxna1Xw2JikBOCG
+htD/JKwt6xBmNwktH0GI/LVtVgSp82Clbn9C4eZN9E5YbVYjLkIEDhpByeC71QhX
+EIQ0ZR56bFuJA/CwValBqV/G9gscTPQqd+iETp8yrFpAVHOW+YzSFbxjTEkBte1J
+aF0vmbqdMAWLk+LEFPQRptZh0B88igtx6tV5oVd+p5IVRM49poLhuPNJGPvMj99l
+mlZ4+AeRUnbOOeAEuvpLJbel4rhwFzmUiGoeTVoPZyMevWcVFq6BMkS+jRR2w0jK
+G6b0v5XDHlcFYPOgUrtsOBFJVwbutLvxdk6q37kIFnWCd8L3kmES5q4wjyFK47Co
+Ja8zlx64jmMZPg/t3wWqkZgXZ14qnbyG5/lGsj5CwVtfDljrhN0oCWK1FZaUmW3d
+69db12/g4f6phldhxiWuGC/W6fCW5kre7nmhshcltqAJJuU47iX+DarBFiIj816e
+yV8e
+-----END CERTIFICATE----- \ No newline at end of file
diff --git a/app/src/normal/assets/riseup.net.json b/app/src/normal/assets/riseup.net.json
new file mode 100644
index 00000000..82290ecd
--- /dev/null
+++ b/app/src/normal/assets/riseup.net.json
@@ -0,0 +1,37 @@
+{
+ "api_uri": "https://api.black.riseup.net:443",
+ "api_version": "1",
+ "ca_cert_fingerprint": "SHA256: a5244308a1374709a9afce95e3ae47c1b44bc2398c0a70ccbf8b3a8a97f29494",
+ "ca_cert_uri": "https://black.riseup.net/ca.crt",
+ "default_language": "en",
+ "description": {
+ "en": "Riseup is a non-profit collective in Seattle that provides online communication tools for people and groups working toward liberatory social change."
+ },
+ "domain": "riseup.net",
+ "enrollment_policy": "open",
+ "languages": [
+ "en"
+ ],
+ "name": {
+ "en": "Riseup Networks"
+ },
+ "service": {
+ "allow_anonymous": true,
+ "allow_free": true,
+ "allow_limited_bandwidth": false,
+ "allow_paid": false,
+ "allow_registration": true,
+ "allow_unlimited_bandwidth": true,
+ "bandwidth_limit": 102400,
+ "default_service_level": 1,
+ "levels": {
+ "1": {
+ "description": "Please donate.",
+ "name": "free"
+ }
+ }
+ },
+ "services": [
+ "openvpn"
+ ]
+} \ No newline at end of file
diff --git a/app/src/normal/assets/riseup.net.pem b/app/src/normal/assets/riseup.net.pem
new file mode 100644
index 00000000..c890aff4
--- /dev/null
+++ b/app/src/normal/assets/riseup.net.pem
@@ -0,0 +1,32 @@
+-----BEGIN CERTIFICATE-----
+MIIFjTCCA3WgAwIBAgIBATANBgkqhkiG9w0BAQ0FADBZMRgwFgYDVQQKDA9SaXNl
+dXAgTmV0d29ya3MxGzAZBgNVBAsMEmh0dHBzOi8vcmlzZXVwLm5ldDEgMB4GA1UE
+AwwXUmlzZXVwIE5ldHdvcmtzIFJvb3QgQ0EwHhcNMTQwNDI4MDAwMDAwWhcNMjQw
+NDI4MDAwMDAwWjBZMRgwFgYDVQQKDA9SaXNldXAgTmV0d29ya3MxGzAZBgNVBAsM
+Emh0dHBzOi8vcmlzZXVwLm5ldDEgMB4GA1UEAwwXUmlzZXVwIE5ldHdvcmtzIFJv
+b3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC76J4ciMJ8Sg0m
+TP7DF2DT9zNe0Csk4myoMFC57rfJeqsAlJCv1XMzBmXrw8wq/9z7XHv6n/0sWU7a
+7cF2hLR33ktjwODlx7vorU39/lXLndo492ZBhXQtG1INMShyv+nlmzO6GT7ESfNE
+LliFitEzwIegpMqxCIHXFuobGSCWF4N0qLHkq/SYUMoOJ96O3hmPSl1kFDRMtWXY
+iw1SEKjUvpyDJpVs3NGxeLCaA7bAWhDY5s5Yb2fA1o8ICAqhowurowJpW7n5ZuLK
+5VNTlNy6nZpkjt1QycYvNycffyPOFm/Q/RKDlvnorJIrihPkyniV3YY5cGgP+Qkx
+HUOT0uLA6LHtzfiyaOqkXwc4b0ZcQD5Vbf6Prd20Ppt6ei0zazkUPwxld3hgyw58
+m/4UIjG3PInWTNf293GngK2Bnz8Qx9e/6TueMSAn/3JBLem56E0WtmbLVjvko+LF
+PM5xA+m0BmuSJtrD1MUCXMhqYTtiOvgLBlUm5zkNxALzG+cXB28k6XikXt6MRG7q
+hzIPG38zwkooM55yy5i1YfcIi5NjMH6A+t4IJxxwb67MSb6UFOwg5kFokdONZcwj
+shczHdG9gLKSBIvrKa03Nd3W2dF9hMbRu//STcQxOailDBQCnXXfAATj9pYzdY4k
+ha8VCAREGAKTDAex9oXf1yRuktES4QIDAQABo2AwXjAdBgNVHQ4EFgQUC4tdmLVu
+f9hwfK4AGliaet5KkcgwDgYDVR0PAQH/BAQDAgIEMAwGA1UdEwQFMAMBAf8wHwYD
+VR0jBBgwFoAUC4tdmLVuf9hwfK4AGliaet5KkcgwDQYJKoZIhvcNAQENBQADggIB
+AGzL+GRnYu99zFoy0bXJKOGCF5XUXP/3gIXPRDqQf5g7Cu/jYMID9dB3No4Zmf7v
+qHjiSXiS8jx1j/6/Luk6PpFbT7QYm4QLs1f4BlfZOti2KE8r7KRDPIecUsUXW6P/
+3GJAVYH/+7OjA39za9AieM7+H5BELGccGrM5wfl7JeEz8in+V2ZWDzHQO4hMkiTQ
+4ZckuaL201F68YpiItBNnJ9N5nHr1MRiGyApHmLXY/wvlrOpclh95qn+lG6/2jk7
+3AmihLOKYMlPwPakJg4PYczm3icFLgTpjV5sq2md9bRyAg3oPGfAuWHmKj2Ikqch
+Td5CHKGxEEWbGUWEMP0s1A/JHWiCbDigc4Cfxhy56CWG4q0tYtnc2GMw8OAUO6Wf
+Xu5pYKNkzKSEtT/MrNJt44tTZWbKV/Pi/N2Fx36my7TgTUj7g3xcE9eF4JV2H/sg
+tsK3pwE0FEqGnT4qMFbixQmc8bGyuakr23wjMvfO7eZUxBuWYR2SkcP26sozF9PF
+tGhbZHQVGZUTVPyvwahMUEhbPGVerOW0IYpxkm0x/eaWdTc4vPpf/rIlgbAjarnJ
+UN9SaWRlWKSdP4haujnzCoJbM7dU9bjvlGZNyXEekgeT0W2qFeGGp+yyUWw8tNsp
+0BuC1b7uW/bBn/xKm319wXVDvBgZgcktMolak39V7DVO
+-----END CERTIFICATE----- \ No newline at end of file
diff --git a/app/src/normal/assets/urls/calyx.net.url b/app/src/normal/assets/urls/calyx.net.url
new file mode 100644
index 00000000..807e9e18
--- /dev/null
+++ b/app/src/normal/assets/urls/calyx.net.url
@@ -0,0 +1,3 @@
+{
+ "main_url" : "https://calyx.net"
+}
diff --git a/app/src/normal/assets/urls/demo.bitmask.net.url b/app/src/normal/assets/urls/demo.bitmask.net.url
new file mode 100644
index 00000000..0c4de648
--- /dev/null
+++ b/app/src/normal/assets/urls/demo.bitmask.net.url
@@ -0,0 +1,3 @@
+{
+ "main_url" : "https://demo.bitmask.net"
+}
diff --git a/app/src/normal/assets/urls/riseup.net.url b/app/src/normal/assets/urls/riseup.net.url
new file mode 100644
index 00000000..42cdb979
--- /dev/null
+++ b/app/src/normal/assets/urls/riseup.net.url
@@ -0,0 +1,3 @@
+{
+ "main_url" : "https://riseup.net"
+}
diff --git a/app/src/production/java/se/leap/bitmaskclient/ProviderListActivity.java b/app/src/production/java/se/leap/bitmaskclient/ProviderListActivity.java
index 172c9e61..7c617e29 100644
--- a/app/src/production/java/se/leap/bitmaskclient/ProviderListActivity.java
+++ b/app/src/production/java/se/leap/bitmaskclient/ProviderListActivity.java
@@ -18,10 +18,8 @@ package se.leap.bitmaskclient;
import android.support.annotation.NonNull;
-import java.net.MalformedURLException;
-import java.net.URL;
-
import static se.leap.bitmaskclient.ProviderAPI.SET_UP_PROVIDER;
+import static se.leap.bitmaskclient.ProviderSetupInterface.ProviderConfigState.SETTING_UP_PROVIDER;
/**
* Activity that builds and shows the list of known available providers.
@@ -44,13 +42,13 @@ public class ProviderListActivity extends ProviderListBaseActivity {
*
*/
public void setUpProvider() {
- configState.setAction(SETTING_UP_PROVIDER);
+ providerConfigState = SETTING_UP_PROVIDER;
ProviderAPICommand.execute(this, SET_UP_PROVIDER, provider);
}
@Override
public void retrySetUpProvider(@NonNull Provider provider) {
- configState.setAction(SETTING_UP_PROVIDER);
+ providerConfigState = SETTING_UP_PROVIDER;
ProviderAPICommand.execute(this, SET_UP_PROVIDER, provider);
}