summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcyberta <cyberta@riseup.net>2017-11-09 10:34:27 -0800
committercyberta <cyberta@riseup.net>2017-11-09 10:34:27 -0800
commit925d13bcb57745ea0c37bf2d65a30b1fca4bd8bb (patch)
tree669c9a24bc154c6254ff04a6e93f34e91bd3eed6
parentf6e7474c37bd2ee65b290474f5ea601082ca7eb4 (diff)
parent0af3aaf6a05630d3c3fe2313221340827040ca7f (diff)
Merge branch '8777_crashes_when_clicking_too_fast' into 'master'
8777 crashes when clicking too fast See merge request leap/bitmask_android!16
-rw-r--r--app/src/androidTest/java/se/leap/bitmaskclient/test/TestVpnCertificateValidator.java6
-rw-r--r--app/src/insecure/java/se/leap/bitmaskclient/ConfigurationWizard.java375
-rw-r--r--app/src/insecure/java/se/leap/bitmaskclient/ProviderDetailFragment.java4
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/BaseConfigurationWizard.java448
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java10
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/ProviderApiBase.java4
-rw-r--r--app/src/production/java/se/leap/bitmaskclient/ConfigurationWizard.java388
-rw-r--r--app/src/production/java/se/leap/bitmaskclient/ProviderDetailFragment.java5
8 files changed, 489 insertions, 751 deletions
diff --git a/app/src/androidTest/java/se/leap/bitmaskclient/test/TestVpnCertificateValidator.java b/app/src/androidTest/java/se/leap/bitmaskclient/test/TestVpnCertificateValidator.java
index 97a0e36d..70596c10 100644
--- a/app/src/androidTest/java/se/leap/bitmaskclient/test/TestVpnCertificateValidator.java
+++ b/app/src/androidTest/java/se/leap/bitmaskclient/test/TestVpnCertificateValidator.java
@@ -65,7 +65,7 @@ public class TestVpnCertificateValidator extends InstrumentationTestCase {
calendar.set(Calendar.YEAR, 2012);
calendar.set(Calendar.MONTH, Calendar.NOVEMBER);
- calendar.set(Calendar.DAY_OF_MONTH, 6);
+ calendar.set(Calendar.DAY_OF_MONTH, 7);
validator.setCalendarProvider(new TestCalendarProvider(calendar.getTimeInMillis()));
assertTrue(validator.isValid());
@@ -77,10 +77,10 @@ public class TestVpnCertificateValidator extends InstrumentationTestCase {
calendar.set(Calendar.YEAR, 2022);
calendar.set(Calendar.MONTH, Calendar.OCTOBER);
- calendar.set(Calendar.DAY_OF_MONTH, 22);
+ calendar.set(Calendar.DAY_OF_MONTH, 23);
validator.setCalendarProvider(new TestCalendarProvider(calendar.getTimeInMillis()));
assertFalse(validator.isValid());
}
-}
+} \ No newline at end of file
diff --git a/app/src/insecure/java/se/leap/bitmaskclient/ConfigurationWizard.java b/app/src/insecure/java/se/leap/bitmaskclient/ConfigurationWizard.java
index 2505d37b..df1a59ff 100644
--- a/app/src/insecure/java/se/leap/bitmaskclient/ConfigurationWizard.java
+++ b/app/src/insecure/java/se/leap/bitmaskclient/ConfigurationWizard.java
@@ -16,31 +16,15 @@
*/
package se.leap.bitmaskclient;
-import android.app.*;
-import android.content.*;
-import android.os.*;
-import android.view.*;
-import android.widget.*;
+import android.app.DialogFragment;
+import android.app.FragmentTransaction;
+import android.content.Intent;
+import android.os.Bundle;
-import com.pedrogomez.renderers.*;
+import java.net.MalformedURLException;
+import java.net.URL;
-import java.net.*;
-import java.util.*;
-
-import butterknife.*;
-
-import org.jetbrains.annotations.*;
-import org.json.*;
-
-import javax.inject.*;
-
-import se.leap.bitmaskclient.DownloadFailedDialog.DownloadFailedDialogInterface;
-import se.leap.bitmaskclient.NewProviderDialog.NewProviderDialogInterface;
-import se.leap.bitmaskclient.ProviderAPIResultReceiver.Receiver;
-import se.leap.bitmaskclient.ProviderDetailFragment.ProviderDetailFragmentInterface;
import se.leap.bitmaskclient.ProviderListContent.ProviderItem;
-import se.leap.bitmaskclient.eip.*;
-import se.leap.bitmaskclient.userstatus.SessionDialog;
/**
* Activity that builds and shows the list of known available providers.
@@ -48,271 +32,20 @@ import se.leap.bitmaskclient.userstatus.SessionDialog;
* It also allows the user to enter custom providers with a button.
*
* @author parmegv
+ * @author cyberta
*/
-public class ConfigurationWizard extends Activity
- implements NewProviderDialogInterface, ProviderDetailFragmentInterface, DownloadFailedDialogInterface, Receiver {
-
- @InjectView(R.id.progressbar_configuration_wizard)
- ProgressBar mProgressBar;
- @InjectView(R.id.progressbar_description)
- TextView progressbar_description;
-
- @InjectView(R.id.provider_list)
- ListView provider_list_view;
- @Inject
- ProviderListAdapter adapter;
-
- private ProviderManager provider_manager;
- private Intent mConfigState = new Intent();
- private Provider selected_provider;
-
- final public static String TAG = ConfigurationWizard.class.getSimpleName();
-
- final protected static String PROVIDER_SET = "PROVIDER SET";
- final protected static String SERVICES_RETRIEVED = "SERVICES RETRIEVED";
-
- final private static String PROGRESSBAR_TEXT = TAG + "PROGRESSBAR_TEXT";
- final private static String PROGRESSBAR_NUMBER = TAG + "PROGRESSBAR_NUMBER";
-
- public ProviderAPIResultReceiver providerAPI_result_receiver;
- private ProviderAPIBroadcastReceiver_Update providerAPI_broadcast_receiver_update;
-
- private static SharedPreferences preferences;
- FragmentManagerEnhanced fragment_manager;
- private static boolean setting_up_provider = false;
- private String progressbar_text = "";
- private String provider_name = "";
- private int progress = -1;
-
- private void initProviderList() {
- List<Renderer<Provider>> prototypes = new ArrayList<>();
- prototypes.add(new ProviderRenderer(this));
- ProviderRendererBuilder providerRendererBuilder = new ProviderRendererBuilder(prototypes);
- adapter = new ProviderListAdapter(getLayoutInflater(), providerRendererBuilder, provider_manager);
- provider_list_view.setAdapter(adapter);
- }
-
- @Override
- protected void onSaveInstanceState(@NotNull Bundle outState) {
- if (mProgressBar != null)
- outState.putInt(PROGRESSBAR_NUMBER, mProgressBar.getProgress());
- if (progressbar_description != null)
- outState.putString(PROGRESSBAR_TEXT, progressbar_description.getText().toString());
- outState.putParcelable(Provider.KEY, selected_provider);
- super.onSaveInstanceState(outState);
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- preferences = getSharedPreferences(Dashboard.SHARED_PREFERENCES, MODE_PRIVATE);
- fragment_manager = new FragmentManagerEnhanced(getFragmentManager());
- provider_manager = ProviderManager.getInstance(getAssets(), getExternalFilesDir(null));
-
- setUpInitialUI();
-
- initProviderList();
-
- if (savedInstanceState != null)
- restoreState(savedInstanceState);
- setUpProviderAPIResultReceiver();
- }
-
- private void restoreState(Bundle savedInstanceState) {
- progressbar_text = savedInstanceState.getString(PROGRESSBAR_TEXT, "");
- provider_name = savedInstanceState.getString(Provider.NAME, "");
- selected_provider = savedInstanceState.getParcelable(Provider.KEY);
- progress = savedInstanceState.getInt(PROGRESSBAR_NUMBER, -1);
-
- if (fragment_manager.findFragmentByTag(ProviderDetailFragment.TAG) == null && setting_up_provider) {
- onItemSelectedUi();
- if (progress > 0)
- mProgressBar.setProgress(progress);
- }
-
- }
-
- @Override
- protected void onPostResume() {
- super.onPostResume();
- if (!progressbar_text.isEmpty() && !provider_name.isEmpty() && progress != -1) {
- progressbar_description.setText(progressbar_text);
- mProgressBar.setProgress(progress);
-
- progressbar_text = "";
- provider_name = "";
- progress = -1;
- }
- }
-
- private void setUpInitialUI() {
- setContentView(R.layout.configuration_wizard_activity);
- ButterKnife.inject(this);
-
- hideProgressBar();
- }
-
- private void hideProgressBar() {
- mProgressBar.setVisibility(ProgressBar.INVISIBLE);
- progressbar_description.setVisibility(TextView.INVISIBLE);
- }
+public class ConfigurationWizard extends BaseConfigurationWizard {
@Override
- protected void onDestroy() {
- super.onDestroy();
- if (providerAPI_broadcast_receiver_update != null)
- unregisterReceiver(providerAPI_broadcast_receiver_update);
- }
-
- private void setUpProviderAPIResultReceiver() {
- providerAPI_result_receiver = new ProviderAPIResultReceiver(new Handler(), this);
- providerAPI_broadcast_receiver_update = new ProviderAPIBroadcastReceiver_Update();
-
- IntentFilter update_intent_filter = new IntentFilter(ProviderAPI.UPDATE_PROGRESSBAR);
- update_intent_filter.addCategory(Intent.CATEGORY_DEFAULT);
- registerReceiver(providerAPI_broadcast_receiver_update, update_intent_filter);
- }
-
- @Override
- public void onReceiveResult(int resultCode, Bundle resultData) {
- if (resultCode == ProviderAPI.PROVIDER_OK) {
- mConfigState.setAction(PROVIDER_SET);
-
- try {
- String provider_json_string = preferences.getString(Provider.KEY, "");
- if (!provider_json_string.isEmpty())
- selected_provider.define(new JSONObject(provider_json_string));
- } catch (JSONException e) {
- e.printStackTrace();
- }
-
- if (preferences.getBoolean(Constants.ALLOWED_ANON, false)) {
- mConfigState.putExtra(SERVICES_RETRIEVED, true);
-
- downloadVpnCertificate();
- } else {
- mProgressBar.incrementProgressBy(1);
- hideProgressBar();
-
- showProviderDetails();
- }
- } else if (resultCode == ProviderAPI.PROVIDER_NOK) {
- hideProgressBar();
- preferences.edit().remove(Provider.KEY).apply();
- setting_up_provider = false;
-
- String reason_to_fail = resultData.getString(ProviderAPI.ERRORS);
- showDownloadFailedDialog(reason_to_fail);
- } else if (resultCode == ProviderAPI.CORRECTLY_DOWNLOADED_CERTIFICATE) {
- mProgressBar.incrementProgressBy(1);
- hideProgressBar();
-
- showProviderDetails();
- } else if (resultCode == ProviderAPI.INCORRECTLY_DOWNLOADED_CERTIFICATE) {
- hideProgressBar();
- cancelSettingUpProvider();
- Toast.makeText(getApplicationContext(), R.string.provider_problem, Toast.LENGTH_LONG).show();
- } else if (resultCode == AboutActivity.VIEWED) {
- // Do nothing, right now
- // I need this for CW to wait for the About activity to end before going back to Dashboard.
- }
- }
-
- @OnItemClick(R.id.provider_list)
- void onItemSelected(int position) {
- //TODO Code 2 pane view
- selected_provider = adapter.getItem(position);
- onItemSelectedLogic();
- onItemSelectedUi();
- }
-
- private void onItemSelectedLogic() {
+ protected void onItemSelectedLogic() {
boolean danger_on = preferences.getBoolean(ProviderItem.DANGER_ON, true);
setUpProvider(danger_on);
}
- private void onItemSelectedUi() {
- startProgressBar();
- adapter.hideAllBut(adapter.indexOf(selected_provider));
- }
-
@Override
- public void onBackPressed() {
- if (setting_up_provider) {
- stopSettingUpProvider();
- } else {
- askDashboardToQuitApp();
- super.onBackPressed();
- }
- }
-
- private void stopSettingUpProvider() {
- ProviderAPI.stop();
- mProgressBar.setVisibility(ProgressBar.GONE);
- mProgressBar.setProgress(0);
- progressbar_description.setVisibility(TextView.GONE);
-
- cancelSettingUpProvider();
- }
-
public void cancelSettingUpProvider() {
- adapter.showAllProviders();
- setting_up_provider = false;
- preferences.edit().remove(Provider.KEY).remove(ProviderItem.DANGER_ON).remove(Constants.ALLOWED_ANON).remove(Constants.KEY).commit();
- }
-
- private void askDashboardToQuitApp() {
- Intent ask_quit = new Intent();
- ask_quit.putExtra(Dashboard.ACTION_QUIT, Dashboard.ACTION_QUIT);
- setResult(RESULT_CANCELED, ask_quit);
- }
-
- private void startProgressBar() {
- mProgressBar.setVisibility(ProgressBar.VISIBLE);
- progressbar_description.setVisibility(TextView.VISIBLE);
- mProgressBar.setProgress(0);
- mProgressBar.setMax(3);
-
- int measured_height = listItemHeight();
- mProgressBar.setTranslationY(measured_height);
- progressbar_description.setTranslationY(measured_height + mProgressBar.getHeight());
- }
-
- private int listItemHeight() {
- View listItem = adapter.getView(0, null, provider_list_view);
- listItem.setLayoutParams(new RelativeLayout.LayoutParams(
- RelativeLayout.LayoutParams.WRAP_CONTENT,
- RelativeLayout.LayoutParams.WRAP_CONTENT));
- WindowManager wm = (WindowManager) getApplicationContext()
- .getSystemService(Context.WINDOW_SERVICE);
- Display display = wm.getDefaultDisplay();
- int screenWidth = display.getWidth(); // deprecated
-
- int listViewWidth = screenWidth - 10 - 10;
- int widthSpec = View.MeasureSpec.makeMeasureSpec(listViewWidth,
- View.MeasureSpec.AT_MOST);
- listItem.measure(widthSpec, 0);
-
- return listItem.getMeasuredHeight();
- }
-
- /**
- * Asks ProviderAPI to download an anonymous (anon) VPN certificate.
- */
- private void downloadVpnCertificate() {
- Intent provider_API_command = new Intent(this, ProviderAPI.class);
-
- provider_API_command.setAction(ProviderAPI.DOWNLOAD_CERTIFICATE);
- provider_API_command.putExtra(ProviderAPI.RECEIVER_KEY, providerAPI_result_receiver);
- startService(provider_API_command);
- }
-
- /**
- * Open the new provider dialog
- */
- public void addAndSelectNewProvider() {
- FragmentTransaction fragment_transaction = fragment_manager.removePreviousFragment(NewProviderDialog.TAG);
- new NewProviderDialog().show(fragment_transaction, NewProviderDialog.TAG);
+ super.cancelSettingUpProvider();
+ preferences.edit().remove(ProviderItem.DANGER_ON).apply();
}
/**
@@ -329,35 +62,6 @@ public class ConfigurationWizard extends Activity
newFragment.show(fragment_transaction, NewProviderDialog.TAG);
}
- /**
- * 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.
- *
- * @param reason_to_fail
- */
- public void showDownloadFailedDialog(String reason_to_fail) {
- FragmentTransaction fragment_transaction = fragment_manager.removePreviousFragment(DownloadFailedDialog.TAG);
-
- DialogFragment newFragment = DownloadFailedDialog.newInstance(reason_to_fail);
- newFragment.show(fragment_transaction, DownloadFailedDialog.TAG);
- }
-
- /**
- * 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.
- */
- private void showProviderDetails() {
- if (setting_up_provider) {
- FragmentTransaction fragment_transaction = fragment_manager.removePreviousFragment(ProviderDetailFragment.TAG);
-
- DialogFragment newFragment = ProviderDetailFragment.newInstance();
- newFragment.show(fragment_transaction, ProviderDetailFragment.TAG);
- setting_up_provider = false;
- }
- }
-
public void showAndSelectProvider(String provider_main_url, boolean danger_on) {
try {
selected_provider = new Provider(new URL((provider_main_url)));
@@ -379,9 +83,10 @@ public class ConfigurationWizard extends Activity
/**
* Asks ProviderAPI to download a new provider.json file
*
- * @param danger_on tells if HTTPS client should bypass certificate errors
+ * @param danger_on tells if HTTPS client should bypass certificate errors
*/
public void setUpProvider(boolean danger_on) {
+ mConfigState.setAction(SETTING_UP_PROVIDER);
Intent provider_API_command = new Intent(this, ProviderAPI.class);
Bundle parameters = new Bundle();
parameters.putString(Provider.MAIN_URL, selected_provider.mainUrl().getUrl().toString());
@@ -393,9 +98,11 @@ public class ConfigurationWizard extends Activity
provider_API_command.putExtra(ProviderAPI.RECEIVER_KEY, providerAPI_result_receiver);
startService(provider_API_command);
- setting_up_provider = true;
}
+ /**
+ * Retrys setup of last used provider, allows bypassing ca certificate validation.
+ */
public void retrySetUpProvider() {
cancelSettingUpProvider();
if (!ProviderAPI.caCertDownloaded()) {
@@ -410,54 +117,4 @@ public class ConfigurationWizard extends Activity
}
}
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.configuration_wizard_activity, menu);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.about_leap:
- startActivityForResult(new Intent(this, AboutActivity.class), 0);
- return true;
- case R.id.new_provider:
- addAndSelectNewProvider();
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
-
- public void showAllProviders() {
- adapter.showAllProviders();
- }
-
- @Override
- public void login() {
- Intent ask_login = new Intent();
- ask_login.putExtra(SessionDialog.TAG, SessionDialog.TAG);
- ask_login.putExtra(Provider.KEY, selected_provider);
- setResult(RESULT_OK, ask_login);
- setting_up_provider = false;
- finish();
- }
-
- @Override
- public void use_anonymously() {
- Intent pass_provider = new Intent();
- pass_provider.putExtra(Provider.KEY, selected_provider);
- setResult(RESULT_OK, pass_provider);
- setting_up_provider = false;
- finish();
- }
-
- public class ProviderAPIBroadcastReceiver_Update extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- int update = intent.getIntExtra(ProviderAPI.CURRENT_PROGRESS, 0);
- mProgressBar.setProgress(update);
- }
- }
}
diff --git a/app/src/insecure/java/se/leap/bitmaskclient/ProviderDetailFragment.java b/app/src/insecure/java/se/leap/bitmaskclient/ProviderDetailFragment.java
index 6d9a16cd..629867e6 100644
--- a/app/src/insecure/java/se/leap/bitmaskclient/ProviderDetailFragment.java
+++ b/app/src/insecure/java/se/leap/bitmaskclient/ProviderDetailFragment.java
@@ -80,7 +80,7 @@ public class ProviderDetailFragment extends DialogFragment {
super.onCancel(dialog);
SharedPreferences.Editor editor = getActivity().getSharedPreferences(Dashboard.SHARED_PREFERENCES, Activity.MODE_PRIVATE).edit();
editor.remove(Provider.KEY).remove(ProviderItem.DANGER_ON).remove(Constants.ALLOWED_ANON).remove(Constants.KEY).commit();
- interface_with_configuration_wizard.showAllProviders();
+ interface_with_configuration_wizard.cancelAndShowAllProviders();
}
public static DialogFragment newInstance() {
@@ -104,7 +104,7 @@ public class ProviderDetailFragment extends DialogFragment {
public void use_anonymously();
- public void showAllProviders();
+ public void cancelAndShowAllProviders();
}
ProviderDetailFragmentInterface interface_with_configuration_wizard;
diff --git a/app/src/main/java/se/leap/bitmaskclient/BaseConfigurationWizard.java b/app/src/main/java/se/leap/bitmaskclient/BaseConfigurationWizard.java
new file mode 100644
index 00000000..1ff0d2de
--- /dev/null
+++ b/app/src/main/java/se/leap/bitmaskclient/BaseConfigurationWizard.java
@@ -0,0 +1,448 @@
+/**
+ * Copyright (c) 2017 LEAP Encryption Access Project and contributors
+ *
+ * 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.app.Activity;
+import android.app.DialogFragment;
+import android.app.FragmentTransaction;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.Display;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.ListView;
+import android.widget.ProgressBar;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.pedrogomez.renderers.Renderer;
+
+import org.jetbrains.annotations.NotNull;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import butterknife.ButterKnife;
+import butterknife.InjectView;
+import butterknife.OnItemClick;
+import se.leap.bitmaskclient.eip.Constants;
+import se.leap.bitmaskclient.userstatus.SessionDialog;
+
+import static android.view.View.GONE;
+import static android.view.View.INVISIBLE;
+import static android.view.View.VISIBLE;
+
+/**
+ * abstract base Activity that builds and shows the list of known available providers.
+ * The implementation of BaseConfigurationWizard differ in that they may or may not allow to bypass
+ * secure download mechanisms including certificate validation.
+ * <p/>
+ * It also allows the user to enter custom providers with a button.
+ *
+ * @author parmegv
+ * @author cyberta
+ */
+
+public abstract class BaseConfigurationWizard extends Activity
+ implements NewProviderDialog.NewProviderDialogInterface, ProviderDetailFragment.ProviderDetailFragmentInterface, DownloadFailedDialog.DownloadFailedDialogInterface, ProviderAPIResultReceiver.Receiver {
+ @InjectView(R.id.progressbar_configuration_wizard)
+ protected ProgressBar mProgressBar;
+ @InjectView(R.id.progressbar_description)
+ protected TextView progressbar_description;
+
+ @InjectView(R.id.provider_list)
+ protected ListView provider_list_view;
+ @Inject
+ protected ProviderListAdapter adapter;
+
+ private ProviderManager provider_manager;
+ protected Intent mConfigState = new Intent(PROVIDER_NOT_SET);
+ protected Provider selected_provider;
+
+ final public static String TAG = ConfigurationWizard.class.getSimpleName();
+
+ final protected static String PROVIDER_NOT_SET = "PROVIDER NOT SET";
+ final protected static String SETTING_UP_PROVIDER = "PROVIDER GETS SET";
+ private static final String SETTING_UP_PROVIDER_SHOW_PROVIDER_DETILS = "PROVIDER DETAILS SHOWN";
+ final protected static String PROVIDER_SET = "PROVIDER SET";
+ final protected static String SERVICES_RETRIEVED = "SERVICES RETRIEVED";
+
+ final private static String PROGRESSBAR_TEXT = TAG + "PROGRESSBAR_TEXT";
+ final private static String PROGRESSBAR_NUMBER = TAG + "PROGRESSBAR_NUMBER";
+
+ public ProviderAPIResultReceiver providerAPI_result_receiver;
+ private ProviderAPIBroadcastReceiver_Update providerAPI_broadcast_receiver_update;
+
+ protected static SharedPreferences preferences;
+ FragmentManagerEnhanced fragment_manager;
+ //TODO: add some states (values for progressbar_text) about ongoing setup or remove that field
+ private String progressbar_text = "";
+
+
+
+ public abstract void retrySetUpProvider();
+
+ protected abstract void onItemSelectedLogic();
+
+
+ private void initProviderList() {
+ List<Renderer<Provider>> prototypes = new ArrayList<>();
+ prototypes.add(new ProviderRenderer(this));
+ ProviderRendererBuilder providerRendererBuilder = new ProviderRendererBuilder(prototypes);
+ adapter = new ProviderListAdapter(getLayoutInflater(), providerRendererBuilder, provider_manager);
+ provider_list_view.setAdapter(adapter);
+ }
+
+ @Override
+ protected void onSaveInstanceState(@NotNull Bundle outState) {
+ if (mProgressBar != null)
+ outState.putInt(PROGRESSBAR_NUMBER, mProgressBar.getProgress());
+ if (progressbar_description != null)
+ outState.putString(PROGRESSBAR_TEXT, progressbar_description.getText().toString());
+ outState.putParcelable(Provider.KEY, selected_provider);
+ super.onSaveInstanceState(outState);
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ preferences = getSharedPreferences(Dashboard.SHARED_PREFERENCES, MODE_PRIVATE);
+ fragment_manager = new FragmentManagerEnhanced(getFragmentManager());
+ provider_manager = ProviderManager.getInstance(getAssets(), getExternalFilesDir(null));
+
+ setUpInitialUI();
+
+ initProviderList();
+
+ if (savedInstanceState != null)
+ restoreState(savedInstanceState);
+ setUpProviderAPIResultReceiver();
+ }
+
+ private void restoreState(Bundle savedInstanceState) {
+ progressbar_text = savedInstanceState.getString(PROGRESSBAR_TEXT, "");
+ selected_provider = savedInstanceState.getParcelable(Provider.KEY);
+
+ if (fragment_manager.findFragmentByTag(ProviderDetailFragment.TAG) == null && SETTING_UP_PROVIDER.equals(mConfigState.getAction())) {
+ onItemSelectedUi();
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ if (SETTING_UP_PROVIDER.equals(mConfigState.getAction())) {
+ showProgressBar();
+ adapter.hideAllBut(adapter.indexOf(selected_provider));
+ } else if (SETTING_UP_PROVIDER_SHOW_PROVIDER_DETILS.equals(mConfigState.getAction())) {
+ showProviderDetails();
+ }
+ }
+
+ private void setUpInitialUI() {
+ setContentView(R.layout.configuration_wizard_activity);
+ ButterKnife.inject(this);
+
+ hideProgressBar();
+ }
+
+ private void hideProgressBar() {
+ //needs to be "INVISIBLE" instead of GONE b/c the progressbar_description gets translated
+ // by the height of mProgressbar (and the height of the first list item)
+ mProgressBar.setVisibility(INVISIBLE);
+ progressbar_description.setVisibility(INVISIBLE);
+
+ }
+
+ private void showProgressBar() {
+ mProgressBar.setVisibility(VISIBLE);
+ progressbar_description.setVisibility(VISIBLE);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (providerAPI_broadcast_receiver_update != null)
+ unregisterReceiver(providerAPI_broadcast_receiver_update);
+ }
+
+ private void setUpProviderAPIResultReceiver() {
+ providerAPI_result_receiver = new ProviderAPIResultReceiver(new Handler(), this);
+ providerAPI_broadcast_receiver_update = new ProviderAPIBroadcastReceiver_Update();
+
+ IntentFilter update_intent_filter = new IntentFilter(ProviderAPI.UPDATE_PROGRESSBAR);
+ update_intent_filter.addCategory(Intent.CATEGORY_DEFAULT);
+ registerReceiver(providerAPI_broadcast_receiver_update, update_intent_filter);
+ }
+
+ @Override
+ public void onReceiveResult(int resultCode, Bundle resultData) {
+ if (resultCode == ProviderAPI.PROVIDER_OK) {
+ try {
+ String provider_json_string = preferences.getString(Provider.KEY, "");
+ if (!provider_json_string.isEmpty())
+ selected_provider.define(new JSONObject(provider_json_string));
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+
+ if (preferences.getBoolean(Constants.ALLOWED_ANON, false)) {
+ mConfigState.putExtra(SERVICES_RETRIEVED, true);
+
+ downloadVpnCertificate();
+ } else {
+ mProgressBar.incrementProgressBy(1);
+ hideProgressBar();
+
+ showProviderDetails();
+ }
+ } else if (resultCode == ProviderAPI.PROVIDER_NOK) {
+ mConfigState.setAction(PROVIDER_NOT_SET);
+ hideProgressBar();
+ preferences.edit().remove(Provider.KEY).apply();
+
+ setResult(RESULT_CANCELED, mConfigState);
+
+ String reason_to_fail = resultData.getString(ProviderAPI.ERRORS);
+ showDownloadFailedDialog(reason_to_fail);
+ } else if (resultCode == ProviderAPI.CORRECTLY_DOWNLOADED_CERTIFICATE) {
+ mProgressBar.incrementProgressBy(1);
+ hideProgressBar();
+ showProviderDetails();
+ } else if (resultCode == ProviderAPI.INCORRECTLY_DOWNLOADED_CERTIFICATE) {
+ mConfigState.setAction(PROVIDER_NOT_SET);
+ hideProgressBar();
+ setResult(RESULT_CANCELED, mConfigState);
+ } else if (resultCode == AboutActivity.VIEWED) {
+ // Do nothing, right now
+ // I need this for CW to wait for the About activity to end before going back to Dashboard.
+ }
+ }
+
+ @OnItemClick(R.id.provider_list)
+ void onItemSelected(int position) {
+ if (SETTING_UP_PROVIDER.equals(mConfigState.getAction()) ||
+ SETTING_UP_PROVIDER_SHOW_PROVIDER_DETILS.equals(mConfigState.getAction())) {
+ return;
+ }
+
+ //TODO Code 2 pane view
+ mConfigState.setAction(SETTING_UP_PROVIDER);
+ selected_provider = adapter.getItem(position);
+ onItemSelectedUi();
+ onItemSelectedLogic();
+ }
+
+ protected void onItemSelectedUi() {
+ adapter.hideAllBut(adapter.indexOf(selected_provider));
+ startProgressBar();
+ }
+
+ @Override
+ public void onBackPressed() {
+ if (SETTING_UP_PROVIDER.equals(mConfigState.getAction())) {
+ stopSettingUpProvider();
+ } else {
+ askDashboardToQuitApp();
+ super.onBackPressed();
+ }
+ }
+
+ private void stopSettingUpProvider() {
+ ProviderAPI.stop();
+ mProgressBar.setVisibility(GONE);
+ mProgressBar.setProgress(0);
+ progressbar_description.setVisibility(GONE);
+
+ cancelSettingUpProvider();
+ }
+
+ public void cancelSettingUpProvider() {
+ mConfigState.setAction(PROVIDER_NOT_SET);
+ adapter.showAllProviders();
+ preferences.edit().remove(Provider.KEY).remove(Constants.ALLOWED_ANON).remove(Constants.KEY).apply();
+ }
+
+ private void askDashboardToQuitApp() {
+ Intent ask_quit = new Intent();
+ ask_quit.putExtra(Dashboard.ACTION_QUIT, Dashboard.ACTION_QUIT);
+ setResult(RESULT_CANCELED, ask_quit);
+ }
+
+ private void startProgressBar() {
+ showProgressBar();
+ mProgressBar.setProgress(0);
+ mProgressBar.setMax(3);
+
+ int measured_height = listItemHeight();
+ mProgressBar.setTranslationY(measured_height);
+ progressbar_description.setTranslationY(measured_height + mProgressBar.getHeight());
+ }
+
+ private int listItemHeight() {
+ View listItem = adapter.getView(0, null, provider_list_view);
+ listItem.setLayoutParams(new RelativeLayout.LayoutParams(
+ RelativeLayout.LayoutParams.WRAP_CONTENT,
+ RelativeLayout.LayoutParams.WRAP_CONTENT));
+ WindowManager wm = (WindowManager) getApplicationContext()
+ .getSystemService(Context.WINDOW_SERVICE);
+ Display display = wm.getDefaultDisplay();
+ int screenWidth = display.getWidth(); // deprecated
+
+ int listViewWidth = screenWidth - 10 - 10;
+ int widthSpec = View.MeasureSpec.makeMeasureSpec(listViewWidth,
+ View.MeasureSpec.AT_MOST);
+ listItem.measure(widthSpec, 0);
+
+ return listItem.getMeasuredHeight();
+ }
+
+ /**
+ * Asks ProviderAPI to download an anonymous (anon) VPN certificate.
+ */
+ private void downloadVpnCertificate() {
+ Intent provider_API_command = new Intent(this, ProviderAPI.class);
+
+ provider_API_command.setAction(ProviderAPI.DOWNLOAD_CERTIFICATE);
+ provider_API_command.putExtra(ProviderAPI.RECEIVER_KEY, providerAPI_result_receiver);
+
+ startService(provider_API_command);
+ }
+
+ /**
+ * Open the new provider dialog
+ */
+ public void addAndSelectNewProvider() {
+ FragmentTransaction fragment_transaction = fragment_manager.removePreviousFragment(NewProviderDialog.TAG);
+ new NewProviderDialog().show(fragment_transaction, NewProviderDialog.TAG);
+ }
+
+ /**
+ * Open the new provider dialog with data
+ */
+ public void addAndSelectNewProvider(String main_url) {
+ FragmentTransaction fragment_transaction = fragment_manager.removePreviousFragment(NewProviderDialog.TAG);
+
+ DialogFragment newFragment = new NewProviderDialog();
+ Bundle data = new Bundle();
+ data.putString(Provider.MAIN_URL, main_url);
+ newFragment.setArguments(data);
+ newFragment.show(fragment_transaction, NewProviderDialog.TAG);
+ }
+
+ /**
+ * 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.
+ *
+ * @param reason_to_fail
+ */
+ public void showDownloadFailedDialog(String reason_to_fail) {
+ FragmentTransaction fragment_transaction = fragment_manager.removePreviousFragment(DownloadFailedDialog.TAG);
+
+ DialogFragment newFragment = DownloadFailedDialog.newInstance(reason_to_fail);
+ newFragment.show(fragment_transaction, DownloadFailedDialog.TAG);
+ }
+
+
+
+ /**
+ * 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() {
+ mConfigState.setAction(SETTING_UP_PROVIDER_SHOW_PROVIDER_DETILS);
+ try {
+ FragmentTransaction fragment_transaction = fragment_manager.removePreviousFragment(ProviderDetailFragment.TAG);
+
+ DialogFragment newFragment = ProviderDetailFragment.newInstance();
+ newFragment.show(fragment_transaction, ProviderDetailFragment.TAG);
+ } catch (IllegalStateException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.configuration_wizard_activity, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.about_leap:
+ startActivityForResult(new Intent(this, AboutActivity.class), 0);
+ return true;
+ case R.id.new_provider:
+ addAndSelectNewProvider();
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ @Override
+ public void cancelAndShowAllProviders() {
+ mConfigState.setAction(PROVIDER_NOT_SET);
+ selected_provider = null;
+ adapter.showAllProviders();
+ }
+
+ @Override
+ public void login() {
+ mConfigState.setAction(PROVIDER_SET);
+ Intent ask_login = new Intent();
+ ask_login.putExtra(Provider.KEY, selected_provider);
+ ask_login.putExtra(SessionDialog.TAG, SessionDialog.TAG);
+ setResult(RESULT_OK, ask_login);
+ finish();
+ }
+
+ @Override
+ public void use_anonymously() {
+ mConfigState.setAction(PROVIDER_SET);
+ Intent pass_provider = new Intent();
+ pass_provider.putExtra(Provider.KEY, selected_provider);
+ setResult(RESULT_OK, pass_provider);
+ finish();
+ }
+
+ public class ProviderAPIBroadcastReceiver_Update extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ int update = intent.getIntExtra(ProviderAPI.CURRENT_PROGRESS, 0);
+ mProgressBar.setProgress(update);
+ }
+ }
+}
diff --git a/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java b/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java
index 33b2e225..fd1e2080 100644
--- a/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java
+++ b/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java
@@ -99,13 +99,12 @@ public class ConfigHelper {
return (X509Certificate) certificate;
}
- protected static RSAPrivateKey parseRsaKeyFromString(String RsaKeyString) {
+ protected static RSAPrivateKey parseRsaKeyFromString(String rsaKeyString) {
RSAPrivateKey key = null;
try {
KeyFactory kf = KeyFactory.getInstance("RSA", "BC");
-
- RsaKeyString = RsaKeyString.replaceFirst("-----BEGIN RSA PRIVATE KEY-----", "").replaceFirst("-----END RSA PRIVATE KEY-----", "");
- PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decode(RsaKeyString, Base64.DEFAULT));
+ rsaKeyString = rsaKeyString.replaceFirst("-----BEGIN RSA PRIVATE KEY-----", "").replaceFirst("-----END RSA PRIVATE KEY-----", "");
+ PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decode(rsaKeyString, Base64.DEFAULT));
key = (RSAPrivateKey) kf.generatePrivate(keySpec);
} catch (InvalidKeySpecException e) {
// TODO Auto-generated catch block
@@ -119,6 +118,9 @@ public class ConfigHelper {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
+ } catch (NullPointerException e) {
+ e.printStackTrace();
+ return null;
}
return key;
diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderApiBase.java b/app/src/main/java/se/leap/bitmaskclient/ProviderApiBase.java
index bf1c3941..acac607c 100644
--- a/app/src/main/java/se/leap/bitmaskclient/ProviderApiBase.java
+++ b/app/src/main/java/se/leap/bitmaskclient/ProviderApiBase.java
@@ -799,6 +799,10 @@ public abstract class ProviderApiBase extends IntentService {
//FIXME: don't save private keys in shared preferences! use the keystore
protected boolean loadCertificate(String cert_string) {
+ if (cert_string == null) {
+ return false;
+ }
+
try {
// API returns concatenated cert & key. Split them for OpenVPN options
String certificateString = null, keyString = null;
diff --git a/app/src/production/java/se/leap/bitmaskclient/ConfigurationWizard.java b/app/src/production/java/se/leap/bitmaskclient/ConfigurationWizard.java
index 2e5521b1..fc2569b2 100644
--- a/app/src/production/java/se/leap/bitmaskclient/ConfigurationWizard.java
+++ b/app/src/production/java/se/leap/bitmaskclient/ConfigurationWizard.java
@@ -16,30 +16,11 @@
*/
package se.leap.bitmaskclient;
-import android.app.*;
-import android.content.*;
-import android.os.*;
-import android.view.*;
-import android.widget.*;
+import android.content.Intent;
+import android.os.Bundle;
-import com.pedrogomez.renderers.*;
-
-import java.net.*;
-import java.util.*;
-
-import butterknife.*;
-
-import org.jetbrains.annotations.*;
-import org.json.*;
-
-import javax.inject.*;
-
-import se.leap.bitmaskclient.DownloadFailedDialog.DownloadFailedDialogInterface;
-import se.leap.bitmaskclient.NewProviderDialog.NewProviderDialogInterface;
-import se.leap.bitmaskclient.ProviderAPIResultReceiver.Receiver;
-import se.leap.bitmaskclient.ProviderDetailFragment.ProviderDetailFragmentInterface;
-import se.leap.bitmaskclient.eip.Constants;
-import se.leap.bitmaskclient.userstatus.SessionDialog;
+import java.net.MalformedURLException;
+import java.net.URL;
/**
* Activity that builds and shows the list of known available providers.
@@ -47,319 +28,16 @@ import se.leap.bitmaskclient.userstatus.SessionDialog;
* It also allows the user to enter custom providers with a button.
*
* @author parmegv
+ * @author cyberta
*/
-public class ConfigurationWizard extends Activity
- implements NewProviderDialogInterface, ProviderDetailFragmentInterface, DownloadFailedDialogInterface, Receiver {
-
-
- @InjectView(R.id.progressbar_configuration_wizard)
- ProgressBar mProgressBar;
- @InjectView(R.id.progressbar_description)
- TextView progressbar_description;
-
- @InjectView(R.id.provider_list)
- ListView provider_list_view;
- @Inject
- ProviderListAdapter adapter;
-
- private ProviderManager provider_manager;
- private Intent mConfigState = new Intent();
- private Provider selected_provider;
+public class ConfigurationWizard extends BaseConfigurationWizard {
- final public static String TAG = ConfigurationWizard.class.getSimpleName();
-
- final protected static String PROVIDER_SET = "PROVIDER SET";
- final protected static String SERVICES_RETRIEVED = "SERVICES RETRIEVED";
- final protected static String ASSETS_URL_FOLDER = "urls";
-
- final private static String PROGRESSBAR_TEXT = TAG + "PROGRESSBAR_TEXT";
- final private static String PROGRESSBAR_NUMBER = TAG + "PROGRESSBAR_NUMBER";
-
- public ProviderAPIResultReceiver providerAPI_result_receiver;
- private ProviderAPIBroadcastReceiver_Update providerAPI_broadcast_receiver_update;
-
- private static SharedPreferences preferences;
- FragmentManagerEnhanced fragment_manager;
- private static boolean setting_up_provider = false;
- private String progressbar_text = "";
- private String provider_name = "";
- private int progress = -1;
-
- private void initProviderList() {
- List<Renderer<Provider>> prototypes = new ArrayList<Renderer<Provider>>();
- prototypes.add(new ProviderRenderer(this));
- ProviderRendererBuilder providerRendererBuilder = new ProviderRendererBuilder(prototypes);
- adapter = new ProviderListAdapter(getLayoutInflater(), providerRendererBuilder, provider_manager);
- provider_list_view.setAdapter(adapter);
- }
@Override
- protected void onSaveInstanceState(@NotNull Bundle outState) {
- if (mProgressBar != null)
- outState.putInt(PROGRESSBAR_NUMBER, mProgressBar.getProgress());
- if (progressbar_description != null)
- outState.putString(PROGRESSBAR_TEXT, progressbar_description.getText().toString());
- outState.putParcelable(Provider.KEY, selected_provider);
- super.onSaveInstanceState(outState);
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- preferences = getSharedPreferences(Dashboard.SHARED_PREFERENCES, MODE_PRIVATE);
- fragment_manager = new FragmentManagerEnhanced(getFragmentManager());
- provider_manager = ProviderManager.getInstance(getAssets(), getExternalFilesDir(null));
-
- setUpInitialUI();
-
- initProviderList();
-
- if (savedInstanceState != null)
- restoreState(savedInstanceState);
- setUpProviderAPIResultReceiver();
- }
-
- private void restoreState(Bundle savedInstanceState) {
- progressbar_text = savedInstanceState.getString(PROGRESSBAR_TEXT, "");
- provider_name = savedInstanceState.getString(Provider.NAME, "");
- selected_provider = savedInstanceState.getParcelable(Provider.KEY);
-
- if (fragment_manager.findFragmentByTag(ProviderDetailFragment.TAG) == null && setting_up_provider) {
- onItemSelectedUi();
- if (progress > 0)
- mProgressBar.setProgress(progress);
- }
- }
-
- @Override
- protected void onPostResume() {
- super.onPostResume();
- if (!progressbar_text.isEmpty() && !provider_name.isEmpty() && progress != -1) {
- progressbar_description.setText(progressbar_text);
- mProgressBar.setProgress(progress);
-
- progressbar_text = "";
- provider_name = "";
- progress = -1;
- }
- }
-
- private void setUpInitialUI() {
- setContentView(R.layout.configuration_wizard_activity);
- ButterKnife.inject(this);
-
- hideProgressBar();
- }
-
- private void hideProgressBar() {
- mProgressBar.setVisibility(ProgressBar.INVISIBLE);
-
- progressbar_description.setVisibility(TextView.INVISIBLE);
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- if (providerAPI_broadcast_receiver_update != null)
- unregisterReceiver(providerAPI_broadcast_receiver_update);
- }
-
- private void setUpProviderAPIResultReceiver() {
- providerAPI_result_receiver = new ProviderAPIResultReceiver(new Handler(), this);
- providerAPI_broadcast_receiver_update = new ProviderAPIBroadcastReceiver_Update();
-
- IntentFilter update_intent_filter = new IntentFilter(ProviderAPI.UPDATE_PROGRESSBAR);
- update_intent_filter.addCategory(Intent.CATEGORY_DEFAULT);
- registerReceiver(providerAPI_broadcast_receiver_update, update_intent_filter);
- }
-
- @Override
- public void onReceiveResult(int resultCode, Bundle resultData) {
- if (resultCode == ProviderAPI.PROVIDER_OK) {
- mConfigState.setAction(PROVIDER_SET);
- try {
- String provider_json_string = preferences.getString(Provider.KEY, "");
- if (!provider_json_string.isEmpty())
- selected_provider.define(new JSONObject(provider_json_string));
- } catch (JSONException e) {
- e.printStackTrace();
- }
-
- if (preferences.getBoolean(Constants.ALLOWED_ANON, false)) {
- mConfigState.putExtra(SERVICES_RETRIEVED, true);
-
- downloadVpnCertificate();
- } else {
- mProgressBar.incrementProgressBy(1);
- hideProgressBar();
-
- showProviderDetails();
- }
- } else if (resultCode == ProviderAPI.PROVIDER_NOK) {
- hideProgressBar();
- preferences.edit().remove(Provider.KEY).apply();
- setting_up_provider = false;
-
- setResult(RESULT_CANCELED, mConfigState);
-
- String reason_to_fail = resultData.getString(ProviderAPI.ERRORS);
- showDownloadFailedDialog(reason_to_fail);
- } else if (resultCode == ProviderAPI.CORRECTLY_DOWNLOADED_CERTIFICATE) {
- mProgressBar.incrementProgressBy(1);
- hideProgressBar();
-
- showProviderDetails();
- } else if (resultCode == ProviderAPI.INCORRECTLY_DOWNLOADED_CERTIFICATE) {
- hideProgressBar();
-
- setResult(RESULT_CANCELED, mConfigState);
- } else if (resultCode == AboutActivity.VIEWED) {
- // Do nothing, right now
- // I need this for CW to wait for the About activity to end before going back to Dashboard.
- }
- }
-
- @OnItemClick(R.id.provider_list)
- void onItemSelected(int position) {
- //TODO Code 2 pane view
- selected_provider = adapter.getItem(position);
- onItemSelectedUi();
- onItemSelectedLogic();
- }
-
- private void onItemSelectedLogic() {
+ protected void onItemSelectedLogic() {
setUpProvider();
}
- private void onItemSelectedUi() {
- startProgressBar();
- adapter.hideAllBut(adapter.indexOf(selected_provider));
- }
-
- @Override
- public void onBackPressed() {
- if (setting_up_provider) {
- stopSettingUpProvider();
- } else {
- askDashboardToQuitApp();
- super.onBackPressed();
- }
- }
-
- private void stopSettingUpProvider() {
- ProviderAPI.stop();
- mProgressBar.setVisibility(ProgressBar.GONE);
- mProgressBar.setProgress(0);
- progressbar_description.setVisibility(TextView.GONE);
-
- cancelSettingUpProvider();
- }
-
- public void cancelSettingUpProvider() {
- adapter.showAllProviders();
- setting_up_provider = false;
- preferences.edit().remove(Provider.KEY).remove(Constants.ALLOWED_ANON).remove(Constants.KEY).apply();
- }
-
- private void askDashboardToQuitApp() {
- Intent ask_quit = new Intent();
- ask_quit.putExtra(Dashboard.ACTION_QUIT, Dashboard.ACTION_QUIT);
- setResult(RESULT_CANCELED, ask_quit);
- }
-
- private void startProgressBar() {
- mProgressBar.setVisibility(ProgressBar.VISIBLE);
- progressbar_description.setVisibility(TextView.VISIBLE);
- mProgressBar.setProgress(0);
- mProgressBar.setMax(3);
-
- int measured_height = listItemHeight();
- mProgressBar.setTranslationY(measured_height);
- progressbar_description.setTranslationY(measured_height + mProgressBar.getHeight());
- }
-
- private int listItemHeight() {
- View listItem = adapter.getView(0, null, provider_list_view);
- listItem.setLayoutParams(new RelativeLayout.LayoutParams(
- RelativeLayout.LayoutParams.WRAP_CONTENT,
- RelativeLayout.LayoutParams.WRAP_CONTENT));
- WindowManager wm = (WindowManager) getApplicationContext()
- .getSystemService(Context.WINDOW_SERVICE);
- Display display = wm.getDefaultDisplay();
- int screenWidth = display.getWidth(); // deprecated
-
- int listViewWidth = screenWidth - 10 - 10;
- int widthSpec = View.MeasureSpec.makeMeasureSpec(listViewWidth,
- View.MeasureSpec.AT_MOST);
- listItem.measure(widthSpec, 0);
-
- return listItem.getMeasuredHeight();
- }
-
- /**
- * Asks ProviderAPI to download an anonymous (anon) VPN certificate.
- */
- private void downloadVpnCertificate() {
- Intent provider_API_command = new Intent(this, ProviderAPI.class);
-
- provider_API_command.setAction(ProviderAPI.DOWNLOAD_CERTIFICATE);
- provider_API_command.putExtra(ProviderAPI.RECEIVER_KEY, providerAPI_result_receiver);
-
- startService(provider_API_command);
- }
-
- /**
- * Open the new provider dialog
- */
- public void addAndSelectNewProvider() {
- FragmentTransaction fragment_transaction = fragment_manager.removePreviousFragment(NewProviderDialog.TAG);
- new NewProviderDialog().show(fragment_transaction, NewProviderDialog.TAG);
- }
-
- /**
- * Open the new provider dialog with data
- */
- public void addAndSelectNewProvider(String main_url) {
- FragmentTransaction fragment_transaction = fragment_manager.removePreviousFragment(NewProviderDialog.TAG);
-
- DialogFragment newFragment = new NewProviderDialog();
- Bundle data = new Bundle();
- data.putString(Provider.MAIN_URL, main_url);
- newFragment.setArguments(data);
- newFragment.show(fragment_transaction, NewProviderDialog.TAG);
- }
-
- /**
- * 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.
- *
- * @param reason_to_fail
- */
- public void showDownloadFailedDialog(String reason_to_fail) {
- FragmentTransaction fragment_transaction = fragment_manager.removePreviousFragment(DownloadFailedDialog.TAG);
-
- DialogFragment newFragment = DownloadFailedDialog.newInstance(reason_to_fail);
- newFragment.show(fragment_transaction, DownloadFailedDialog.TAG);
- }
-
- /**
- * 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.
- *
- *
- */
- private void showProviderDetails() {
- if (setting_up_provider) {
- FragmentTransaction fragment_transaction = fragment_manager.removePreviousFragment(ProviderDetailFragment.TAG);
-
- DialogFragment newFragment = ProviderDetailFragment.newInstance();
- newFragment.show(fragment_transaction, ProviderDetailFragment.TAG);
- setting_up_provider = false;
- }
- }
-
public void showAndSelectProvider(String provider_main_url) {
try {
selected_provider = new Provider(new URL((provider_main_url)));
@@ -382,6 +60,7 @@ public class ConfigurationWizard extends Activity
*
*/
public void setUpProvider() {
+ mConfigState.setAction(SETTING_UP_PROVIDER);
Intent provider_API_command = new Intent(this, ProviderAPI.class);
Bundle parameters = new Bundle();
parameters.putString(Provider.MAIN_URL, selected_provider.mainUrl().toString());
@@ -392,7 +71,6 @@ public class ConfigurationWizard extends Activity
provider_API_command.putExtra(ProviderAPI.RECEIVER_KEY, providerAPI_result_receiver);
startService(provider_API_command);
- setting_up_provider = true;
}
public void retrySetUpProvider() {
@@ -409,54 +87,4 @@ public class ConfigurationWizard extends Activity
}
}
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.configuration_wizard_activity, menu);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.about_leap:
- startActivityForResult(new Intent(this, AboutActivity.class), 0);
- return true;
- case R.id.new_provider:
- addAndSelectNewProvider();
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
-
- public void showAllProviders() {
- adapter.showAllProviders();
- }
-
- @Override
- public void login() {
- Intent ask_login = new Intent();
- ask_login.putExtra(Provider.KEY, selected_provider);
- ask_login.putExtra(SessionDialog.TAG, SessionDialog.TAG);
- setResult(RESULT_OK, ask_login);
- setting_up_provider = false;
- finish();
- }
-
- @Override
- public void use_anonymously() {
- Intent pass_provider = new Intent();
- pass_provider.putExtra(Provider.KEY, selected_provider);
- setResult(RESULT_OK, pass_provider);
- setting_up_provider = false;
- finish();
- }
-
- public class ProviderAPIBroadcastReceiver_Update extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- int update = intent.getIntExtra(ProviderAPI.CURRENT_PROGRESS, 0);
- mProgressBar.setProgress(update);
- }
- }
}
diff --git a/app/src/production/java/se/leap/bitmaskclient/ProviderDetailFragment.java b/app/src/production/java/se/leap/bitmaskclient/ProviderDetailFragment.java
index 08fc5f3d..da7f8763 100644
--- a/app/src/production/java/se/leap/bitmaskclient/ProviderDetailFragment.java
+++ b/app/src/production/java/se/leap/bitmaskclient/ProviderDetailFragment.java
@@ -3,7 +3,6 @@ package se.leap.bitmaskclient;
import org.json.*;
import se.leap.bitmaskclient.eip.*;
-import se.leap.bitmaskclient.ProviderListContent.ProviderItem;
import android.app.*;
import android.content.*;
@@ -80,7 +79,7 @@ public class ProviderDetailFragment extends DialogFragment {
super.onCancel(dialog);
SharedPreferences.Editor editor = getActivity().getSharedPreferences(Dashboard.SHARED_PREFERENCES, Activity.MODE_PRIVATE).edit();
editor.remove(Provider.KEY).remove(Constants.ALLOWED_ANON).remove(Constants.KEY).commit();
- interface_with_configuration_wizard.showAllProviders();
+ interface_with_configuration_wizard.cancelAndShowAllProviders();
}
public static DialogFragment newInstance() {
@@ -104,7 +103,7 @@ public class ProviderDetailFragment extends DialogFragment {
public void use_anonymously();
- public void showAllProviders();
+ public void cancelAndShowAllProviders();
}
ProviderDetailFragmentInterface interface_with_configuration_wizard;