From d94eabbc4919b8484262d31abc996376917d46d4 Mon Sep 17 00:00:00 2001 From: cyBerta Date: Mon, 6 Nov 2017 01:17:57 +0100 Subject: #8777 fixes NPEs and errorneous provider selection --- .../se/leap/bitmaskclient/ConfigurationWizard.java | 93 ++++++++++++---------- .../leap/bitmaskclient/ProviderDetailFragment.java | 4 +- .../java/se/leap/bitmaskclient/ConfigHelper.java | 10 ++- .../se/leap/bitmaskclient/ProviderApiBase.java | 4 + .../se/leap/bitmaskclient/ConfigurationWizard.java | 93 ++++++++++++---------- .../leap/bitmaskclient/ProviderDetailFragment.java | 5 +- 6 files changed, 120 insertions(+), 89 deletions(-) (limited to 'app') diff --git a/app/src/insecure/java/se/leap/bitmaskclient/ConfigurationWizard.java b/app/src/insecure/java/se/leap/bitmaskclient/ConfigurationWizard.java index 2505d37b..f9210aff 100644 --- a/app/src/insecure/java/se/leap/bitmaskclient/ConfigurationWizard.java +++ b/app/src/insecure/java/se/leap/bitmaskclient/ConfigurationWizard.java @@ -42,12 +42,15 @@ import se.leap.bitmaskclient.ProviderListContent.ProviderItem; import se.leap.bitmaskclient.eip.*; import se.leap.bitmaskclient.userstatus.SessionDialog; +import static android.view.View.*; + /** * Activity that builds and shows the list of known available providers. *

* 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 { @@ -63,11 +66,14 @@ public class ConfigurationWizard extends Activity ProviderListAdapter adapter; private ProviderManager provider_manager; - private Intent mConfigState = new Intent(); + private Intent mConfigState = new Intent(PROVIDER_NOT_SET); private 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"; @@ -79,10 +85,8 @@ public class ConfigurationWizard extends Activity private static SharedPreferences preferences; FragmentManagerEnhanced fragment_manager; - private static boolean setting_up_provider = false; + //TODO: add some states (values for progressbar_text) about ongoing setup or remove that field private String progressbar_text = ""; - private String provider_name = ""; - private int progress = -1; private void initProviderList() { List> prototypes = new ArrayList<>(); @@ -120,28 +124,22 @@ public class ConfigurationWizard extends Activity 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) { + if (fragment_manager.findFragmentByTag(ProviderDetailFragment.TAG) == null && SETTING_UP_PROVIDER.equals(mConfigState.getAction())) { 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; + 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(); } } @@ -153,8 +151,15 @@ public class ConfigurationWizard extends Activity } private void hideProgressBar() { - mProgressBar.setVisibility(ProgressBar.INVISIBLE); - progressbar_description.setVisibility(TextView.INVISIBLE); + //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 @@ -176,8 +181,6 @@ public class ConfigurationWizard extends Activity @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()) @@ -197,20 +200,20 @@ public class ConfigurationWizard extends Activity showProviderDetails(); } } else if (resultCode == ProviderAPI.PROVIDER_NOK) { + mConfigState.setAction(PROVIDER_NOT_SET); 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) { + mConfigState.setAction(PROVIDER_NOT_SET); hideProgressBar(); - cancelSettingUpProvider(); + setResult(RESULT_CANCELED, mConfigState); Toast.makeText(getApplicationContext(), R.string.provider_problem, Toast.LENGTH_LONG).show(); } else if (resultCode == AboutActivity.VIEWED) { // Do nothing, right now @@ -220,7 +223,13 @@ public class ConfigurationWizard extends Activity @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); onItemSelectedLogic(); onItemSelectedUi(); @@ -232,13 +241,13 @@ public class ConfigurationWizard extends Activity } private void onItemSelectedUi() { - startProgressBar(); adapter.hideAllBut(adapter.indexOf(selected_provider)); + startProgressBar(); } @Override public void onBackPressed() { - if (setting_up_provider) { + if (SETTING_UP_PROVIDER.equals(mConfigState.getAction())) { stopSettingUpProvider(); } else { askDashboardToQuitApp(); @@ -248,16 +257,16 @@ public class ConfigurationWizard extends Activity private void stopSettingUpProvider() { ProviderAPI.stop(); - mProgressBar.setVisibility(ProgressBar.GONE); + mProgressBar.setVisibility(GONE); mProgressBar.setProgress(0); - progressbar_description.setVisibility(TextView.GONE); + progressbar_description.setVisibility(GONE); cancelSettingUpProvider(); } public void cancelSettingUpProvider() { + mConfigState.setAction(PROVIDER_NOT_SET); adapter.showAllProviders(); - setting_up_provider = false; preferences.edit().remove(Provider.KEY).remove(ProviderItem.DANGER_ON).remove(Constants.ALLOWED_ANON).remove(Constants.KEY).commit(); } @@ -268,8 +277,7 @@ public class ConfigurationWizard extends Activity } private void startProgressBar() { - mProgressBar.setVisibility(ProgressBar.VISIBLE); - progressbar_description.setVisibility(TextView.VISIBLE); + showProgressBar(); mProgressBar.setProgress(0); mProgressBar.setMax(3); @@ -289,8 +297,8 @@ public class ConfigurationWizard extends Activity int screenWidth = display.getWidth(); // deprecated int listViewWidth = screenWidth - 10 - 10; - int widthSpec = View.MeasureSpec.makeMeasureSpec(listViewWidth, - View.MeasureSpec.AT_MOST); + int widthSpec = MeasureSpec.makeMeasureSpec(listViewWidth, + MeasureSpec.AT_MOST); listItem.measure(widthSpec, 0); return listItem.getMeasuredHeight(); @@ -349,12 +357,14 @@ public class ConfigurationWizard extends Activity * or cancel his/her election pressing the back button. */ private void showProviderDetails() { - if (setting_up_provider) { + 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); - setting_up_provider = false; + } catch (IllegalStateException e) { + e.printStackTrace(); } } @@ -382,6 +392,7 @@ public class ConfigurationWizard extends Activity * @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,7 +404,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() { @@ -430,26 +440,29 @@ public class ConfigurationWizard extends Activity } } - public void showAllProviders() { + @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(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() { + mConfigState.setAction(PROVIDER_SET); Intent pass_provider = new Intent(); pass_provider.putExtra(Provider.KEY, selected_provider); setResult(RESULT_OK, pass_provider); - setting_up_provider = false; finish(); } 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/ConfigHelper.java b/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java index 4929f040..232a00e9 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 caa48231..15440330 100644 --- a/app/src/main/java/se/leap/bitmaskclient/ProviderApiBase.java +++ b/app/src/main/java/se/leap/bitmaskclient/ProviderApiBase.java @@ -788,6 +788,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..612c01fe 100644 --- a/app/src/production/java/se/leap/bitmaskclient/ConfigurationWizard.java +++ b/app/src/production/java/se/leap/bitmaskclient/ConfigurationWizard.java @@ -41,12 +41,15 @@ import se.leap.bitmaskclient.ProviderDetailFragment.ProviderDetailFragmentInterf import se.leap.bitmaskclient.eip.Constants; import se.leap.bitmaskclient.userstatus.SessionDialog; +import static android.view.View.*; + /** * Activity that builds and shows the list of known available providers. *

* 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 { @@ -63,14 +66,16 @@ public class ConfigurationWizard extends Activity ProviderListAdapter adapter; private ProviderManager provider_manager; - private Intent mConfigState = new Intent(); + private Intent mConfigState = new Intent(PROVIDER_NOT_SET); private 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 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"; @@ -80,13 +85,11 @@ public class ConfigurationWizard extends Activity private static SharedPreferences preferences; FragmentManagerEnhanced fragment_manager; - private static boolean setting_up_provider = false; + //TODO: add some states (values for progressbar_text) about ongoing setup or remove that field private String progressbar_text = ""; - private String provider_name = ""; - private int progress = -1; private void initProviderList() { - List> prototypes = new ArrayList>(); + List> prototypes = new ArrayList<>(); prototypes.add(new ProviderRenderer(this)); ProviderRendererBuilder providerRendererBuilder = new ProviderRendererBuilder(prototypes); adapter = new ProviderListAdapter(getLayoutInflater(), providerRendererBuilder, provider_manager); @@ -121,26 +124,21 @@ public class ConfigurationWizard extends Activity 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) { + if (fragment_manager.findFragmentByTag(ProviderDetailFragment.TAG) == null && SETTING_UP_PROVIDER.equals(mConfigState.getAction())) { 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; + 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(); } } @@ -152,9 +150,16 @@ public class ConfigurationWizard extends Activity } private void hideProgressBar() { - mProgressBar.setVisibility(ProgressBar.INVISIBLE); + //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); + + } - progressbar_description.setVisibility(TextView.INVISIBLE); + private void showProgressBar() { + mProgressBar.setVisibility(VISIBLE); + progressbar_description.setVisibility(VISIBLE); } @Override @@ -176,7 +181,6 @@ public class ConfigurationWizard extends Activity @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()) @@ -196,9 +200,9 @@ public class ConfigurationWizard extends Activity showProviderDetails(); } } else if (resultCode == ProviderAPI.PROVIDER_NOK) { + mConfigState.setAction(PROVIDER_NOT_SET); hideProgressBar(); preferences.edit().remove(Provider.KEY).apply(); - setting_up_provider = false; setResult(RESULT_CANCELED, mConfigState); @@ -207,11 +211,10 @@ public class ConfigurationWizard extends Activity } 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 @@ -221,7 +224,13 @@ public class ConfigurationWizard extends Activity @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(); @@ -232,13 +241,13 @@ public class ConfigurationWizard extends Activity } private void onItemSelectedUi() { - startProgressBar(); adapter.hideAllBut(adapter.indexOf(selected_provider)); + startProgressBar(); } @Override public void onBackPressed() { - if (setting_up_provider) { + if (SETTING_UP_PROVIDER.equals(mConfigState.getAction())) { stopSettingUpProvider(); } else { askDashboardToQuitApp(); @@ -248,16 +257,16 @@ public class ConfigurationWizard extends Activity private void stopSettingUpProvider() { ProviderAPI.stop(); - mProgressBar.setVisibility(ProgressBar.GONE); + mProgressBar.setVisibility(GONE); mProgressBar.setProgress(0); - progressbar_description.setVisibility(TextView.GONE); + progressbar_description.setVisibility(GONE); cancelSettingUpProvider(); } public void cancelSettingUpProvider() { + mConfigState.setAction(PROVIDER_NOT_SET); adapter.showAllProviders(); - setting_up_provider = false; preferences.edit().remove(Provider.KEY).remove(Constants.ALLOWED_ANON).remove(Constants.KEY).apply(); } @@ -268,8 +277,7 @@ public class ConfigurationWizard extends Activity } private void startProgressBar() { - mProgressBar.setVisibility(ProgressBar.VISIBLE); - progressbar_description.setVisibility(TextView.VISIBLE); + showProgressBar(); mProgressBar.setProgress(0); mProgressBar.setMax(3); @@ -289,8 +297,8 @@ public class ConfigurationWizard extends Activity int screenWidth = display.getWidth(); // deprecated int listViewWidth = screenWidth - 10 - 10; - int widthSpec = View.MeasureSpec.makeMeasureSpec(listViewWidth, - View.MeasureSpec.AT_MOST); + int widthSpec = MeasureSpec.makeMeasureSpec(listViewWidth, + MeasureSpec.AT_MOST); listItem.measure(widthSpec, 0); return listItem.getMeasuredHeight(); @@ -351,12 +359,14 @@ public class ConfigurationWizard extends Activity * */ private void showProviderDetails() { - if (setting_up_provider) { + 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); - setting_up_provider = false; + } catch (IllegalStateException e) { + e.printStackTrace(); } } @@ -382,6 +392,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 +403,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() { @@ -429,26 +439,29 @@ public class ConfigurationWizard extends Activity } } - public void showAllProviders() { + @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); - setting_up_provider = false; 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); - setting_up_provider = false; finish(); } 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; -- cgit v1.2.3 From bfd95cf2afbf854078861f5c19f1da042246f02d Mon Sep 17 00:00:00 2001 From: cyBerta Date: Mon, 6 Nov 2017 01:18:10 +0100 Subject: fix test --- .../java/se/leap/bitmaskclient/test/TestVpnCertificateValidator.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'app') 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..95e83cfe 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,11 @@ 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()); } } +2 \ No newline at end of file -- cgit v1.2.3 From 0af3aaf6a05630d3c3fe2313221340827040ca7f Mon Sep 17 00:00:00 2001 From: cyBerta Date: Mon, 6 Nov 2017 13:35:26 +0100 Subject: reduce duplicate code in ConfigurationWizard for different flavors --- .../test/TestVpnCertificateValidator.java | 3 +- .../se/leap/bitmaskclient/ConfigurationWizard.java | 384 +----------------- .../bitmaskclient/BaseConfigurationWizard.java | 448 +++++++++++++++++++++ .../se/leap/bitmaskclient/ConfigurationWizard.java | 397 +----------------- 4 files changed, 469 insertions(+), 763 deletions(-) create mode 100644 app/src/main/java/se/leap/bitmaskclient/BaseConfigurationWizard.java (limited to 'app') 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 95e83cfe..70596c10 100644 --- a/app/src/androidTest/java/se/leap/bitmaskclient/test/TestVpnCertificateValidator.java +++ b/app/src/androidTest/java/se/leap/bitmaskclient/test/TestVpnCertificateValidator.java @@ -83,5 +83,4 @@ public class TestVpnCertificateValidator extends InstrumentationTestCase { } -} -2 \ No newline at end of file +} \ 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 f9210aff..df1a59ff 100644 --- a/app/src/insecure/java/se/leap/bitmaskclient/ConfigurationWizard.java +++ b/app/src/insecure/java/se/leap/bitmaskclient/ConfigurationWizard.java @@ -16,33 +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; - -import static android.view.View.*; /** * Activity that builds and shows the list of known available providers. @@ -52,275 +34,18 @@ import static android.view.View.*; * @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(PROVIDER_NOT_SET); - private 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; - - private 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 = ""; - - private void initProviderList() { - List> 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(); - } - - } +public class ConfigurationWizard extends BaseConfigurationWizard { @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(); - - 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); - 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) { - 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); - onItemSelectedLogic(); - onItemSelectedUi(); - } - - private void onItemSelectedLogic() { + protected void onItemSelectedLogic() { boolean danger_on = preferences.getBoolean(ProviderItem.DANGER_ON, true); setUpProvider(danger_on); } - private 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(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() { - 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 = MeasureSpec.makeMeasureSpec(listViewWidth, - 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(); } /** @@ -337,37 +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() { - 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(); - } - } - public void showAndSelectProvider(String provider_main_url, boolean danger_on) { try { selected_provider = new Provider(new URL((provider_main_url))); @@ -389,7 +83,7 @@ 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); @@ -406,6 +100,9 @@ public class ConfigurationWizard extends Activity startService(provider_API_command); } + /** + * Retrys setup of last used provider, allows bypassing ca certificate validation. + */ public void retrySetUpProvider() { cancelSettingUpProvider(); if (!ProviderAPI.caCertDownloaded()) { @@ -420,57 +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); - } - } - - @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(SessionDialog.TAG, SessionDialog.TAG); - ask_login.putExtra(Provider.KEY, selected_provider); - 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/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 . + */ + +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. + *

+ * 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> 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/production/java/se/leap/bitmaskclient/ConfigurationWizard.java b/app/src/production/java/se/leap/bitmaskclient/ConfigurationWizard.java index 612c01fe..fc2569b2 100644 --- a/app/src/production/java/se/leap/bitmaskclient/ConfigurationWizard.java +++ b/app/src/production/java/se/leap/bitmaskclient/ConfigurationWizard.java @@ -16,32 +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 static android.view.View.*; +import java.net.MalformedURLException; +import java.net.URL; /** * Activity that builds and shows the list of known available providers. @@ -51,325 +30,14 @@ import static android.view.View.*; * @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(PROVIDER_NOT_SET); - private 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; - - private 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 = ""; - - private void initProviderList() { - List> 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(); - } - } +public class ConfigurationWizard extends BaseConfigurationWizard { - 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(); - } - - private void onItemSelectedLogic() { + protected void onItemSelectedLogic() { setUpProvider(); } - private 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 = MeasureSpec.makeMeasureSpec(listViewWidth, - 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() { - 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(); - } - } - public void showAndSelectProvider(String provider_main_url) { try { selected_provider = new Provider(new URL((provider_main_url))); @@ -419,57 +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); - } - } - - @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); - } - } } -- cgit v1.2.3