diff options
Diffstat (limited to 'app/src/main/java')
14 files changed, 676 insertions, 275 deletions
diff --git a/app/src/main/java/se/leap/bitmaskclient/AbstractProviderDetailActivity.java b/app/src/main/java/se/leap/bitmaskclient/AbstractProviderDetailActivity.java index d521a3a9..fbb27b58 100644 --- a/app/src/main/java/se/leap/bitmaskclient/AbstractProviderDetailActivity.java +++ b/app/src/main/java/se/leap/bitmaskclient/AbstractProviderDetailActivity.java @@ -4,6 +4,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.support.annotation.Nullable; +import android.support.v7.widget.AppCompatTextView; import android.util.Log; import android.view.View; import android.widget.AdapterView; @@ -20,22 +21,14 @@ import butterknife.InjectView; import static se.leap.bitmaskclient.Constants.PROVIDER_ALLOW_ANONYMOUS; import static se.leap.bitmaskclient.Constants.PROVIDER_KEY; -import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES; -import static se.leap.bitmaskclient.MainActivity.ACTION_SHOW_VPN_FRAGMENT; +import static se.leap.bitmaskclient.Constants.REQUEST_CODE_CONFIGURE_LEAP; -public abstract class AbstractProviderDetailActivity extends ButterKnifeActivity { +public abstract class AbstractProviderDetailActivity extends ConfigWizardBaseActivity { final public static String TAG = "providerDetailActivity"; - protected SharedPreferences preferences; - - @InjectView(R.id.provider_detail_domain) - TextView domain; - - @InjectView(R.id.provider_detail_name) - TextView name; @InjectView(R.id.provider_detail_description) - TextView description; + AppCompatTextView description; @InjectView(R.id.provider_detail_options) ListView options; @@ -43,22 +36,18 @@ public abstract class AbstractProviderDetailActivity extends ButterKnifeActivity @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.provider_detail_fragment); + setContentView(R.layout.a_provider_detail); - preferences = getSharedPreferences(SHARED_PREFERENCES, MODE_PRIVATE); try { JSONObject providerJson = new JSONObject(preferences.getString(Provider.KEY, "")); - domain.setText(providerJson.getString(Provider.DOMAIN)); - name.setText(providerJson.getJSONObject(Provider.NAME).getString("en")); - description.setText(providerJson.getJSONObject(Provider.DESCRIPTION).getString("en")); - - setTitle(R.string.provider_details_title); + setProviderHeaderText(ConfigHelper.getProviderName(preferences)); + description.setText(ConfigHelper.getDescription(preferences)); // Show only the options allowed by the provider ArrayList<String> optionsList = new ArrayList<>(); if (registrationAllowed(providerJson)) { - optionsList.add(getString(R.string.login_button)); - optionsList.add(getString(R.string.signup_button)); + optionsList.add(getString(R.string.login_to_profile)); + optionsList.add(getString(R.string.create_profile)); } if (anonAllowed(providerJson)) { optionsList.add(getString(R.string.use_anonymously_button)); @@ -75,19 +64,23 @@ public abstract class AbstractProviderDetailActivity extends ButterKnifeActivity public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String text = ((TextView) view).getText().toString(); Intent intent; - if (text.equals(getString(R.string.login_button))) { + if (text.equals(getString(R.string.login_to_profile))) { Log.d(TAG, "login selected"); intent = new Intent(getApplicationContext(), LoginActivity.class); - } else if (text.equals(getString(R.string.signup_button))) { + } else if (text.equals(getString(R.string.create_profile))) { Log.d(TAG, "signup selected"); intent = new Intent(getApplicationContext(), SignupActivity.class); } else { Log.d(TAG, "use anonymously selected"); - intent = new Intent(getApplicationContext(), MainActivity.class); - intent.setAction(ACTION_SHOW_VPN_FRAGMENT); + intent = new Intent(); + intent.putExtra(Provider.KEY, provider); + setResult(RESULT_OK, intent); + finish(); + return; } + intent.putExtra(PROVIDER_KEY, provider); intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); - startActivity(intent); + startActivityForResult(intent, REQUEST_CODE_CONFIGURE_LEAP); } }); } catch (JSONException e) { @@ -95,6 +88,22 @@ public abstract class AbstractProviderDetailActivity extends ButterKnifeActivity } } + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + provider = intent.getParcelableExtra(PROVIDER_KEY); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == REQUEST_CODE_CONFIGURE_LEAP) { + if (resultCode == RESULT_OK) { + setResult(resultCode, data); + finish(); + } + } + } + private boolean anonAllowed(JSONObject providerJson) { try { JSONObject serviceDescription = providerJson.getJSONObject(Provider.SERVICE); diff --git a/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java b/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java index ccdf5064..741a6f56 100644 --- a/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java +++ b/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java @@ -18,8 +18,10 @@ package se.leap.bitmaskclient; import android.content.SharedPreferences; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.util.Log; +import org.jetbrains.annotations.NotNull; import org.json.JSONException; import org.json.JSONObject; import org.spongycastle.util.encoders.Base64; @@ -45,6 +47,7 @@ import java.security.cert.X509Certificate; import java.security.interfaces.RSAPrivateKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; +import java.util.Locale; import static android.R.attr.name; import static se.leap.bitmaskclient.Constants.PROVIDER_CONFIGURED; @@ -261,16 +264,6 @@ public class ConfigHelper { } - public static String getCurrentProviderName(@NonNull SharedPreferences preferences) { - try { - JSONObject providerDefintion = new JSONObject(preferences.getString(Provider.KEY, "")); - return providerDefintion.getString(Provider.DOMAIN); - } catch (JSONException e) { - e.printStackTrace(); - } - return null; - } - public static boolean providerInSharedPreferences(@NonNull SharedPreferences preferences) { return preferences.getBoolean(PROVIDER_CONFIGURED, false); } @@ -288,4 +281,74 @@ public class ConfigHelper { return provider; } + public static String getProviderName(String provider) { + return getProviderName(null, provider); + } + + public static String getProviderName(@Nullable SharedPreferences preferences) { + return getProviderName(preferences,null); + } + + public static String getProviderName(@Nullable SharedPreferences preferences, @Nullable String provider) { + if (provider == null && preferences != null) { + provider = preferences.getString(Provider.KEY, ""); + } + try { + JSONObject providerJson = new JSONObject(provider); + String lang = Locale.getDefault().getLanguage(); + return providerJson.getJSONObject(Provider.NAME).getString(lang); + } catch (JSONException e) { + try { + JSONObject providerJson = new JSONObject(provider); + return providerJson.getJSONObject(Provider.NAME).getString("en"); + } catch (JSONException e2) { + return null; + } + } catch (NullPointerException npe) { + return null; + } + } + + public static String getProviderDomain(SharedPreferences preferences) { + return getProviderDomain(preferences, null); + } + + public static String getProviderDomain(String provider) { + return getProviderDomain(null, provider); + } + + public static String getProviderDomain(@Nullable SharedPreferences preferences, @Nullable String provider) { + if (provider == null && preferences != null) { + provider = preferences.getString(Provider.KEY, ""); + } + try { + JSONObject providerJson = new JSONObject(provider); + return providerJson.getString(Provider.DOMAIN); + } catch (JSONException | NullPointerException e) { + return null; + } + } + + public static String getDescription(SharedPreferences preferences) { + try { + JSONObject providerJson = new JSONObject(preferences.getString(Provider.KEY, "")); + String lang = Locale.getDefault().getLanguage(); + return providerJson.getJSONObject(Provider.DESCRIPTION).getString(lang); + } catch (JSONException e) { + try { + JSONObject providerJson = new JSONObject(preferences.getString(Provider.KEY, "")); + return providerJson.getJSONObject(Provider.DESCRIPTION).getString("en"); + } catch (JSONException e1) { + return null; + } + } + } + + public static void storeProviderInPreferences(SharedPreferences preferences, Provider provider) { + preferences.edit().putBoolean(PROVIDER_CONFIGURED, true). + putString(Provider.MAIN_URL, provider.getMainUrlString()). + putString(Provider.KEY, provider.getDefinitionString()). + putString(Provider.CA_CERT, provider.getCaCert()). + apply(); + } } diff --git a/app/src/main/java/se/leap/bitmaskclient/ConfigWizardBaseActivity.java b/app/src/main/java/se/leap/bitmaskclient/ConfigWizardBaseActivity.java new file mode 100644 index 00000000..79a78fe1 --- /dev/null +++ b/app/src/main/java/se/leap/bitmaskclient/ConfigWizardBaseActivity.java @@ -0,0 +1,104 @@ +package se.leap.bitmaskclient; + +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.annotation.DrawableRes; +import android.support.annotation.Nullable; +import android.support.annotation.StringRes; +import android.support.v7.widget.AppCompatImageView; +import android.support.v7.widget.AppCompatTextView; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; + +import butterknife.InjectView; + +import static android.view.View.GONE; +import static android.view.View.VISIBLE; +import static se.leap.bitmaskclient.Constants.PROVIDER_KEY; +import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES; + +/** + * Base Activity for configuration wizard activities + * + * Created by fupduck on 09.01.18. + */ + +public abstract class ConfigWizardBaseActivity extends ButterKnifeActivity { + + protected SharedPreferences preferences; + + @InjectView(R.id.provider_header_logo) + AppCompatImageView providerHeaderLogo; + + @InjectView(R.id.provider_header_text) + AppCompatTextView providerHeaderText; + + @InjectView(R.id.loading_screen) + protected LinearLayout loadingScreen; + + @InjectView(R.id.progressbar_description) + protected AppCompatTextView progressbarText; + + @InjectView(R.id.content) + protected LinearLayout content; + + protected Provider provider; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + preferences = getSharedPreferences(SHARED_PREFERENCES, MODE_PRIVATE); + + provider = getIntent().getParcelableExtra(PROVIDER_KEY); + } + + @Override + public void setContentView(View view) { + super.setContentView(view); + setProviderHeaderText(ConfigHelper.getProviderName(preferences)); + } + + @Override + public void setContentView(int layoutResID) { + super.setContentView(layoutResID); + setProviderHeaderText(ConfigHelper.getProviderName(preferences)); + } + + @Override + public void setContentView(View view, ViewGroup.LayoutParams params) { + super.setContentView(view, params); + setProviderHeaderText(ConfigHelper.getProviderName(preferences)); + } + + protected void setProviderHeaderLogo(@DrawableRes int providerHeaderLogo) { + this.providerHeaderLogo.setImageResource(providerHeaderLogo); + } + + protected void setProviderHeaderText(String providerHeaderText) { + this.providerHeaderText.setText(providerHeaderText); + } + + protected void setProviderHeaderText(@StringRes int providerHeaderText) { + this.providerHeaderText.setText(providerHeaderText); + } + + protected void hideProgressBar() { + loadingScreen.setVisibility(GONE); + content.setVisibility(VISIBLE); + } + + protected void showProgressBar() { + content.setVisibility(GONE); + loadingScreen.setVisibility(VISIBLE); + } + + protected void setProgressbarText(String progressbarText) { + this.progressbarText.setText(progressbarText); + } + + protected void setProgressbarText(@StringRes int progressbarText) { + this.progressbarText.setText(progressbarText); + } + +} diff --git a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java index a14b7d2f..a4db5f84 100644 --- a/app/src/main/java/se/leap/bitmaskclient/Dashboard.java +++ b/app/src/main/java/se/leap/bitmaskclient/Dashboard.java @@ -232,7 +232,7 @@ public class Dashboard extends ButterKnifeActivity { private void handleConfigureAlwaysOn(Intent intent) { intent.removeExtra(APP_ACTION_CONFIGURE_ALWAYS_ON_PROFILE); Log.d(TAG, "start Configuration wizard!"); - startActivityForResult(new Intent(this, ConfigurationWizard.class), REQUEST_CODE_CONFIGURE_LEAP); + startActivityForResult(new Intent(this, ProviderListActivity.class), REQUEST_CODE_CONFIGURE_LEAP); } private void prepareEIP(Bundle savedInstanceState) { @@ -255,7 +255,7 @@ public class Dashboard extends ButterKnifeActivity { if (getIntent().hasExtra(APP_ACTION_CONFIGURE_ALWAYS_ON_PROFILE)) { getIntent().removeExtra(APP_ACTION_CONFIGURE_ALWAYS_ON_PROFILE); } - startActivityForResult(new Intent(this, ConfigurationWizard.class), REQUEST_CODE_CONFIGURE_LEAP); + startActivityForResult(new Intent(this, ProviderListActivity.class), REQUEST_CODE_CONFIGURE_LEAP); } @SuppressLint("CommitPrefEdits") private void providerToPreferences(Provider provider) { @@ -273,7 +273,7 @@ public class Dashboard extends ButterKnifeActivity { .setPositiveButton(getResources().getString(R.string.setup_error_configure_button), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - startActivityForResult(new Intent(Dashboard.this, ConfigurationWizard.class), REQUEST_CODE_CONFIGURE_LEAP); + startActivityForResult(new Intent(Dashboard.this, ProviderListActivity.class), REQUEST_CODE_CONFIGURE_LEAP); } }) .setNegativeButton(getResources().getString(R.string.setup_error_close_button), new DialogInterface.OnClickListener() { @@ -416,7 +416,7 @@ public class Dashboard extends ButterKnifeActivity { clearDataOfLastProvider(); switching_provider = false; - startActivityForResult(new Intent(this, ConfigurationWizard.class), REQUEST_CODE_SWITCH_PROVIDER); + startActivityForResult(new Intent(this, ProviderListActivity.class), REQUEST_CODE_SWITCH_PROVIDER); } private void clearDataOfLastProvider() { @@ -441,7 +441,7 @@ public class Dashboard extends ButterKnifeActivity { preferenceEditor.apply(); switching_provider = false; - startActivityForResult(new Intent(this, ConfigurationWizard.class), REQUEST_CODE_SWITCH_PROVIDER); + startActivityForResult(new Intent(this, ProviderListActivity.class), REQUEST_CODE_SWITCH_PROVIDER); } private static class DashboardReceiver implements ProviderAPIResultReceiver.Receiver{ diff --git a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java index cf2f0eff..414b1f2a 100644 --- a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java +++ b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java @@ -360,7 +360,7 @@ public class EipFragment extends Fragment implements Observer { key.setImageResource(R.drawable.vpn_connected); routedText.setVisibility(VISIBLE); vpnRoute.setVisibility(VISIBLE); - vpnRoute.setText(ConfigHelper.getCurrentProviderName(preferences)); + vpnRoute.setText(ConfigHelper.getProviderName(preferences)); colorBackground(); } else { mainButton.setText(activity.getString(R.string.vpn_button_turn_on)); diff --git a/app/src/main/java/se/leap/bitmaskclient/LoginActivity.java b/app/src/main/java/se/leap/bitmaskclient/LoginActivity.java index a5cbf5f5..a407b0a9 100644 --- a/app/src/main/java/se/leap/bitmaskclient/LoginActivity.java +++ b/app/src/main/java/se/leap/bitmaskclient/LoginActivity.java @@ -2,11 +2,12 @@ package se.leap.bitmaskclient; import android.os.Bundle; import android.support.annotation.Nullable; -import android.util.Log; import butterknife.OnClick; /** + * Activity to login to chosen Provider + * * Created by fupduck on 09.01.18. */ @@ -15,20 +16,15 @@ public class LoginActivity extends ProviderCredentialsBaseActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.a_login); - - setProviderHeaderText("providerNAME"); + setProgressbarText(R.string.logging_in); setProviderHeaderLogo(R.drawable.mask); - } - - @Override - protected void onResume() { - super.onResume(); + setProviderHeaderText(R.string.login_to_profile); } @Override @OnClick(R.id.button) void handleButton() { + super.handleButton(); login(getUsername(), getPassword()); } diff --git a/app/src/main/java/se/leap/bitmaskclient/MainActivity.java b/app/src/main/java/se/leap/bitmaskclient/MainActivity.java index 4fd16a8b..7629f0b7 100644 --- a/app/src/main/java/se/leap/bitmaskclient/MainActivity.java +++ b/app/src/main/java/se/leap/bitmaskclient/MainActivity.java @@ -2,6 +2,7 @@ package se.leap.bitmaskclient; import android.content.Intent; +import android.content.SharedPreferences; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; @@ -12,11 +13,15 @@ import android.support.v7.widget.Toolbar; import se.leap.bitmaskclient.drawer.NavigationDrawerFragment; import se.leap.bitmaskclient.userstatus.SessionDialog; +import static se.leap.bitmaskclient.Constants.REQUEST_CODE_CONFIGURE_LEAP; +import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES; + public class MainActivity extends AppCompatActivity { private static Provider provider = new Provider(); private static FragmentManagerEnhanced fragmentManager; + private SharedPreferences preferences; public final static String ACTION_SHOW_VPN_FRAGMENT = "action_show_vpn_fragment"; @@ -34,6 +39,7 @@ public class MainActivity extends AppCompatActivity { NavigationDrawerFragment navigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_drawer); + preferences = getSharedPreferences(SHARED_PREFERENCES, MODE_PRIVATE); fragmentManager = new FragmentManagerEnhanced(getSupportFragmentManager()); // Set up the drawer. navigationDrawerFragment.setUp( @@ -81,5 +87,18 @@ public class MainActivity extends AppCompatActivity { } } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (data == null) { + return; + } + + if (requestCode == REQUEST_CODE_CONFIGURE_LEAP) { + if (resultCode == RESULT_OK && data.hasExtra(Provider.KEY)) { + Provider provider = data.getParcelableExtra(Provider.KEY); + ConfigHelper.storeProviderInPreferences(preferences, provider); + } + } + } } diff --git a/app/src/main/java/se/leap/bitmaskclient/Provider.java b/app/src/main/java/se/leap/bitmaskclient/Provider.java index 60b1b93c..ae329cd1 100644 --- a/app/src/main/java/se/leap/bitmaskclient/Provider.java +++ b/app/src/main/java/se/leap/bitmaskclient/Provider.java @@ -16,6 +16,7 @@ */ package se.leap.bitmaskclient; +import android.content.SharedPreferences; import android.os.*; import com.google.gson.Gson; @@ -26,6 +27,8 @@ import java.io.Serializable; import java.net.*; import java.util.*; +import static se.leap.bitmaskclient.Constants.PROVIDER_CONFIGURED; + /** * @author Sean Leonard <meanderingcode@aetherislands.net> * @author Parménides GV <parmegv@sdf.org> @@ -118,10 +121,18 @@ public final class Provider implements Parcelable { return definition; } + String getDefinitionString() { + return getDefinition().toString(); + } + protected String getDomain() { return mainUrl.getDomain(); } + String getMainUrlString() { + return getMainUrl().toString(); + } + protected DefaultedURL getMainUrl() { return mainUrl; } @@ -158,9 +169,13 @@ public final class Provider implements Parcelable { name = definition.getJSONObject(API_TERM_NAME).getString(lang); else throw new JSONException("Provider not defined"); } catch (JSONException e) { - if (mainUrl != null) { - String host = mainUrl.getDomain(); - name = host.substring(0, host.indexOf(".")); + try { + name = definition.getJSONObject(API_TERM_NAME).getString("en"); + } catch (JSONException e2) { + if (mainUrl != null) { + String host = mainUrl.getDomain(); + name = host.substring(0, host.indexOf(".")); + } } } diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderApiManagerBase.java b/app/src/main/java/se/leap/bitmaskclient/ProviderApiManagerBase.java index da2e4c8b..cfc6e49d 100644 --- a/app/src/main/java/se/leap/bitmaskclient/ProviderApiManagerBase.java +++ b/app/src/main/java/se/leap/bitmaskclient/ProviderApiManagerBase.java @@ -96,7 +96,6 @@ import static se.leap.bitmaskclient.R.string.error_io_exception_user_message; import static se.leap.bitmaskclient.R.string.error_json_exception_user_message; import static se.leap.bitmaskclient.R.string.error_no_such_algorithm_exception_user_message; import static se.leap.bitmaskclient.R.string.malformed_url; -import static se.leap.bitmaskclient.R.string.routes_info_excl; import static se.leap.bitmaskclient.R.string.server_unreachable_message; import static se.leap.bitmaskclient.R.string.service_is_down_error; import static se.leap.bitmaskclient.R.string.warning_corrupted_provider_cert; diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderCredentialsBaseActivity.java b/app/src/main/java/se/leap/bitmaskclient/ProviderCredentialsBaseActivity.java index 1ed64559..25dca4e0 100644 --- a/app/src/main/java/se/leap/bitmaskclient/ProviderCredentialsBaseActivity.java +++ b/app/src/main/java/se/leap/bitmaskclient/ProviderCredentialsBaseActivity.java @@ -1,91 +1,207 @@ package se.leap.bitmaskclient; +import android.content.BroadcastReceiver; +import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.os.Bundle; -import android.os.Handler; -import android.support.annotation.DrawableRes; import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.support.design.widget.TextInputEditText; -import android.widget.Button; -import android.widget.ImageView; +import android.support.design.widget.TextInputLayout; +import android.support.v7.widget.AppCompatButton; +import android.support.v7.widget.AppCompatTextView; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.Log; +import android.view.KeyEvent; +import android.view.inputmethod.InputMethodManager; import android.widget.TextView; import butterknife.InjectView; import butterknife.OnClick; import se.leap.bitmaskclient.userstatus.SessionDialog; +import se.leap.bitmaskclient.userstatus.SessionDialog.ERRORS; import se.leap.bitmaskclient.userstatus.User; -import static se.leap.bitmaskclient.MainActivity.ACTION_SHOW_VPN_FRAGMENT; +import static android.view.View.GONE; +import static android.view.View.VISIBLE; +import static android.view.inputmethod.EditorInfo.IME_ACTION_DONE; +import static se.leap.bitmaskclient.ProviderAPI.PROVIDER_API_EVENT; +import static se.leap.bitmaskclient.ProviderAPI.RESULT_CODE; +import static se.leap.bitmaskclient.ProviderAPI.RESULT_KEY; +import static se.leap.bitmaskclient.userstatus.SessionDialog.USERNAME; /** + * Base Activity for activities concerning a provider interaction + * * Created by fupduck on 09.01.18. */ -public abstract class ProviderCredentialsBaseActivity extends ButterKnifeActivity { +public abstract class ProviderCredentialsBaseActivity extends ConfigWizardBaseActivity { - protected ProviderAPIResultReceiver providerAPIResultReceiver; + final protected static String TAG = ProviderCredentialsBaseActivity.class.getName(); - @InjectView(R.id.provider_header_logo) - ImageView providerHeaderLogo; + final private static String ACTIVITY_STATE = "ACTIVITY STATE"; - @InjectView(R.id.provider_header_text) - TextView providerHeaderText; + final private static String SHOWING_FORM = "SHOWING_FORM"; + final private static String PERFORMING_ACTION = "PERFORMING_ACTION"; + final private static String USER_MESSAGE = "USER_MESSAGE"; + final private static String USERNAME_ERROR = "USERNAME_ERROR"; + final private static String PASSWORD_ERROR = "PASSWORD_ERROR"; + final private static String PASSWORD_VERIFICATION_ERROR = "PASSWORD_VERIFICATION_ERROR"; + + protected Intent mConfigState = new Intent(SHOWING_FORM); + protected ProviderAPIBroadcastReceiver providerAPIBroadcastReceiver; + + @InjectView(R.id.provider_credentials_user_message) + AppCompatTextView userMessage; @InjectView(R.id.provider_credentials_username) - TextInputEditText providerCredentialsUsername; + TextInputEditText usernameField; @InjectView(R.id.provider_credentials_password) - TextInputEditText providerCredentialsPassword; + TextInputEditText passwordField; + + @InjectView(R.id.provider_credentials_password_verification) + TextInputEditText passwordVerificationField; + + @InjectView(R.id.provider_credentials_username_error) + TextInputLayout usernameError; + + @InjectView(R.id.provider_credentials_password_error) + TextInputLayout passwordError; + + @InjectView(R.id.provider_credentials_password_verification_error) + TextInputLayout passwordVerificationError; @InjectView(R.id.button) - Button providerCredentialsButton; + AppCompatButton button; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - providerAPIResultReceiver = new ProviderAPIResultReceiver(new Handler(), new ProviderCredentialsReceiver(this)); + setContentView(R.layout.a_provider_credentials); + providerAPIBroadcastReceiver = new ProviderAPIBroadcastReceiver(); + + IntentFilter updateIntentFilter = new IntentFilter(PROVIDER_API_EVENT); + updateIntentFilter.addCategory(Intent.CATEGORY_DEFAULT); + registerReceiver(providerAPIBroadcastReceiver, updateIntentFilter); + setUpListeners(); + if(savedInstanceState != null) { + restoreState(savedInstanceState); + } } - @OnClick(R.id.button) - abstract void handleButton(); + @Override + protected void onResume() { + super.onResume(); + + String action = mConfigState.getAction(); + if (action == null) { + return; + } + + if(action.equalsIgnoreCase(PERFORMING_ACTION)) { + showProgressBar(); + } + } + + private void restoreState(Bundle savedInstance) { + if (savedInstance.getString(USER_MESSAGE) != null) { + userMessage.setText(savedInstance.getString(USER_MESSAGE)); + userMessage.setVisibility(VISIBLE); + } + usernameError.setError(savedInstance.getString(USERNAME_ERROR)); + passwordError.setError(savedInstance.getString(PASSWORD_ERROR)); + passwordVerificationError.setError(savedInstance.getString(PASSWORD_VERIFICATION_ERROR)); + if (savedInstance.getString(ACTIVITY_STATE) != null) { + mConfigState.setAction(savedInstance.getString(ACTIVITY_STATE)); + } + } - protected void setProviderHeaderLogo(@DrawableRes int providerHeaderLogo) { - this.providerHeaderLogo.setImageResource(providerHeaderLogo); + @Override + public void onSaveInstanceState(Bundle outState) { + outState.putString(ACTIVITY_STATE, mConfigState.getAction()); + if (userMessage.getText() != null && userMessage.getVisibility() == VISIBLE) { + outState.putString(USER_MESSAGE, userMessage.getText().toString()); + } + if (usernameError.getError() != null) { + outState.putString(USERNAME_ERROR, usernameError.getError().toString()); + } + if (passwordError.getError() != null) { + outState.putString(PASSWORD_ERROR, passwordError.getError().toString()); + } + if (passwordVerificationError.getError() != null) { + outState.putString(PASSWORD_VERIFICATION_ERROR, passwordVerificationError.getError().toString()); + } + + super.onSaveInstanceState(outState); } - protected void setProviderHeaderText(String providerHeaderText) { - this.providerHeaderText.setText(providerHeaderText); + @Override + protected void onDestroy() { + super.onDestroy(); + if (providerAPIBroadcastReceiver != null) + unregisterReceiver(providerAPIBroadcastReceiver); } - protected void setProviderHeaderText(@StringRes int providerHeaderText) { - this.providerHeaderText.setText(providerHeaderText); + @OnClick(R.id.button) + void handleButton() { + mConfigState.setAction(PERFORMING_ACTION); + hideKeyboard(); + showProgressBar(); } protected void setButtonText(@StringRes int buttonText) { - providerCredentialsButton.setText(buttonText); + button.setText(buttonText); } String getUsername() { - return providerCredentialsUsername.getText().toString(); + String username = usernameField.getText().toString(); + String providerDomain = provider.getDomain(); + if (username.endsWith(providerDomain)) { + return username.split("@" + providerDomain)[0]; + } + return username; } String getPassword() { - return providerCredentialsPassword.getText().toString(); + return passwordField.getText().toString(); + } + + String getPasswordVerification() { + return passwordVerificationField.getText().toString(); } void login(String username, String password) { User.setUserName(username); + + Intent providerAPICommand = new Intent(this, ProviderAPI.class); Bundle parameters = bundlePassword(password); - ProviderAPICommand.execute(parameters, ProviderAPI.LOG_IN, providerAPIResultReceiver); + providerAPICommand.setAction(ProviderAPI.LOG_IN); + providerAPICommand.putExtra(ProviderAPI.PARAMETERS, parameters); + startService(providerAPICommand); } public void signUp(String username, String password) { User.setUserName(username); + + Intent providerAPICommand = new Intent(this, ProviderAPI.class); Bundle parameters = bundlePassword(password); - ProviderAPICommand.execute(parameters, ProviderAPI.SIGN_UP, providerAPIResultReceiver); + providerAPICommand.setAction(ProviderAPI.SIGN_UP); + providerAPICommand.putExtra(ProviderAPI.PARAMETERS, parameters); + startService(providerAPICommand); } + + void downloadVpnCertificate() { + Intent providerAPICommand = new Intent(this, ProviderAPI.class); + providerAPICommand.setAction(ProviderAPI.DOWNLOAD_CERTIFICATE); + providerAPICommand.putExtra(ProviderAPI.PARAMETERS, Bundle.EMPTY); + startService(providerAPICommand); + } + protected Bundle bundlePassword(String password) { Bundle parameters = new Bundle(); if (!password.isEmpty()) @@ -93,45 +209,176 @@ public abstract class ProviderCredentialsBaseActivity extends ButterKnifeActivit return parameters; } - public static class ProviderCredentialsReceiver implements ProviderAPIResultReceiver.Receiver{ + private void setUpListeners() { + usernameField.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } - private ProviderCredentialsBaseActivity activity; + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void afterTextChanged(Editable s) { + if (getUsername().equalsIgnoreCase("")) { + usernameError.setError(getString(R.string.username_ask)); + } else { + usernameError.setError(null); + } + } + }); + usernameField.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (actionId == IME_ACTION_DONE + || event != null && event.getAction() == KeyEvent.ACTION_DOWN + && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) { + passwordField.requestFocus(); + return true; + } + return false; + } + }); + + passwordField.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void afterTextChanged(Editable s) { + if(getPassword().length() < 8) { + passwordError.setError(getString(R.string.error_not_valid_password_user_message)); + } else { + passwordError.setError(null); + } + } + }); + passwordField.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (actionId == IME_ACTION_DONE + || event != null && event.getAction() == KeyEvent.ACTION_DOWN + && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) { + if (passwordVerificationField.getVisibility() == VISIBLE) { + passwordVerificationField.requestFocus(); + } else { + button.performClick(); + } + return true; + } + return false; + } + }); - ProviderCredentialsReceiver(ProviderCredentialsBaseActivity activity) { - this.activity = activity; + passwordVerificationField.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void afterTextChanged(Editable s) { + if(getPassword().equals(getPasswordVerification())) { + passwordVerificationError.setError(null); + } else { + passwordVerificationError.setError(getString(R.string.password_mismatch)); + } + } + }); + passwordVerificationField.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (actionId == IME_ACTION_DONE + || event != null && event.getAction() == KeyEvent.ACTION_DOWN + && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) { + button.performClick(); + return true; + } + return false; + } + }); + } + + private void hideKeyboard() { + InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); + if (imm != null) { + imm.hideSoftInputFromWindow(passwordField.getWindowToken(), 0); } + } + private void handleReceivedErrors(Bundle arguments) { + if (arguments.containsKey(ERRORS.PASSWORD_INVALID_LENGTH.toString())) + passwordError.setError(getString(R.string.error_not_valid_password_user_message)); + else if (arguments.containsKey(ERRORS.RISEUP_WARNING.toString())) { + userMessage.setVisibility(VISIBLE); + userMessage.setText(R.string.login_riseup_warning); + } + if (arguments.containsKey(USERNAME)) { + String username = arguments.getString(USERNAME); + usernameField.setText(username); + } + if (arguments.containsKey(ERRORS.USERNAME_MISSING.toString())) { + usernameError.setError(getString(R.string.username_ask)); + } + if (arguments.containsKey(getString(R.string.user_message))) { + userMessage.setText(arguments.getString(getString(R.string.user_message))); + userMessage.setVisibility(VISIBLE); + } else if (userMessage.getVisibility() != VISIBLE) { + userMessage.setVisibility(GONE); + } + + if (!usernameField.getText().toString().isEmpty() && passwordField.isFocusable()) + passwordField.requestFocus(); + + mConfigState.setAction(SHOWING_FORM); + hideProgressBar(); + } + + private void successfullyFinished() { + Intent resultData = new Intent(); + resultData.putExtra(Provider.KEY, provider); + setResult(RESULT_OK, resultData); + finish(); + } + + public class ProviderAPIBroadcastReceiver extends BroadcastReceiver { @Override - public void onReceiveResult(int resultCode, Bundle resultData) { - if (resultCode == ProviderAPI.SUCCESSFUL_SIGNUP) { - String username = resultData.getString(SessionDialog.USERNAME); - String password = resultData.getString(SessionDialog.PASSWORD); - activity.login(username, password); - } else if (resultCode == ProviderAPI.FAILED_SIGNUP) { - //MainActivity.sessionDialog(resultData); - } else if (resultCode == ProviderAPI.SUCCESSFUL_LOGIN) { - Intent intent = new Intent(activity, MainActivity.class); - intent.setAction(ACTION_SHOW_VPN_FRAGMENT); - activity.startActivity(intent); - } else if (resultCode == ProviderAPI.FAILED_LOGIN) { - //MainActivity.sessionDialog(resultData); -// TODO MOVE -// } else if (resultCode == ProviderAPI.SUCCESSFUL_LOGOUT) { -// if (switching_provider) activity.switchProvider(); -// } else if (resultCode == ProviderAPI.LOGOUT_FAILED) { -// activity.setResult(RESULT_CANCELED); -// } else if (resultCode == ProviderAPI.CORRECTLY_DOWNLOADED_CERTIFICATE) { -// activity.eip_fragment.updateEipService(); -// activity.setResult(RESULT_OK); -// } else if (resultCode == ProviderAPI.INCORRECTLY_DOWNLOADED_CERTIFICATE) { -// activity.setResult(RESULT_CANCELED); -// } else if (resultCode == ProviderAPI.CORRECTLY_DOWNLOADED_EIP_SERVICE) { -// activity.eip_fragment.updateEipService(); -// activity.setResult(RESULT_OK); -// } else if (resultCode == ProviderAPI.INCORRECTLY_DOWNLOADED_EIP_SERVICE) { -// activity.setResult(RESULT_CANCELED); + public void onReceive(Context context, Intent intent) { + Log.d(TAG, "received Broadcast"); + + String action = intent.getAction(); + if (action == null || !action.equalsIgnoreCase(PROVIDER_API_EVENT)) { + return; + } + + int resultCode = intent.getIntExtra(RESULT_CODE, -1); + switch (resultCode) { + case ProviderAPI.SUCCESSFUL_SIGNUP: + case ProviderAPI.SUCCESSFUL_LOGIN: + downloadVpnCertificate(); + break; + case ProviderAPI.FAILED_LOGIN: + case ProviderAPI.FAILED_SIGNUP: + handleReceivedErrors((Bundle) intent.getParcelableExtra(RESULT_KEY)); + break; + + case ProviderAPI.CORRECTLY_DOWNLOADED_CERTIFICATE: + successfullyFinished(); + //activity.eip_fragment.updateEipService(); + break; + case ProviderAPI.INCORRECTLY_DOWNLOADED_CERTIFICATE: + // TODO activity.setResult(RESULT_CANCELED); + break; } } } - } diff --git a/app/src/main/java/se/leap/bitmaskclient/BaseConfigurationWizard.java b/app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java index d0868437..2b0c72db 100644 --- a/app/src/main/java/se/leap/bitmaskclient/BaseConfigurationWizard.java +++ b/app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java @@ -21,21 +21,14 @@ 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.support.v4.app.DialogFragment; import android.support.v4.app.FragmentTransaction; import android.util.Log; -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; @@ -53,12 +46,10 @@ import butterknife.OnItemClick; import se.leap.bitmaskclient.fragments.AboutFragment; import static android.view.View.GONE; -import static android.view.View.INVISIBLE; -import static android.view.View.VISIBLE; import static se.leap.bitmaskclient.Constants.APP_ACTION_QUIT; import static se.leap.bitmaskclient.Constants.PROVIDER_ALLOW_ANONYMOUS; import static se.leap.bitmaskclient.Constants.PROVIDER_KEY; -import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES; +import static se.leap.bitmaskclient.Constants.REQUEST_CODE_CONFIGURE_LEAP; import static se.leap.bitmaskclient.ProviderAPI.CORRECTLY_DOWNLOADED_CERTIFICATE; import static se.leap.bitmaskclient.ProviderAPI.ERRORS; import static se.leap.bitmaskclient.ProviderAPI.INCORRECTLY_DOWNLOADED_CERTIFICATE; @@ -68,11 +59,10 @@ import static se.leap.bitmaskclient.ProviderAPI.PROVIDER_OK; import static se.leap.bitmaskclient.ProviderAPI.PROVIDER_SET_UP; import static se.leap.bitmaskclient.ProviderAPI.RESULT_CODE; import static se.leap.bitmaskclient.ProviderAPI.RESULT_KEY; -import static se.leap.bitmaskclient.ProviderAPI.UPDATE_PROGRESSBAR; /** * 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 + * The implementation of ProviderListBaseActivity 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. @@ -81,12 +71,8 @@ import static se.leap.bitmaskclient.ProviderAPI.UPDATE_PROGRESSBAR; * @author cyberta */ -public abstract class BaseConfigurationWizard extends ButterKnifeActivity +public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity implements NewProviderDialog.NewProviderDialogInterface, DownloadFailedDialog.DownloadFailedDialogInterface, ProviderAPIResultReceiver.Receiver { - @InjectView(R.id.progressbar_configuration_wizard) - protected ProgressBar mProgressBar; - @InjectView(R.id.progressbar_description) - protected TextView progressbarDescription; @InjectView(R.id.provider_list) protected ListView providerListView; @@ -95,9 +81,10 @@ public abstract class BaseConfigurationWizard extends ButterKnifeActivity private ProviderManager providerManager; protected Intent mConfigState = new Intent(PROVIDER_NOT_SET); - protected Provider selectedProvider; - final public static String TAG = ConfigurationWizard.class.getSimpleName(); + final public static String TAG = ProviderListActivity.class.getSimpleName(); + + final private static String ACTIVITY_STATE = "ACTIVITY STATE"; final protected static String PROVIDER_NOT_SET = "PROVIDER NOT SET"; final protected static String SETTING_UP_PROVIDER = "PROVIDER GETS SET"; @@ -106,16 +93,10 @@ public abstract class BaseConfigurationWizard extends ButterKnifeActivity final private static String REASON_TO_FAIL = "REASON TO FAIL"; 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"; - final private static String ACTIVITY_STATE = "ACTIVITY STATE"; - public ProviderAPIResultReceiver providerAPIResultReceiver; private ProviderAPIBroadcastReceiver providerAPIBroadcastReceiver; - protected static SharedPreferences preferences; FragmentManagerEnhanced fragmentManager; - //TODO: add some states (values for progressbarText) about ongoing setup or remove that field private boolean isActivityShowing; private String reasonToFail; @@ -135,12 +116,8 @@ public abstract class BaseConfigurationWizard extends ButterKnifeActivity @Override protected void onSaveInstanceState(@NotNull Bundle outState) { - if (mProgressBar != null) - outState.putInt(PROGRESSBAR_NUMBER, mProgressBar.getProgress()); - if (progressbarDescription != null) - outState.putString(PROGRESSBAR_TEXT, progressbarDescription.getText().toString()); outState.putString(ACTIVITY_STATE, mConfigState.getAction()); - outState.putParcelable(Provider.KEY, selectedProvider); + outState.putParcelable(Provider.KEY, provider); DialogFragment dialogFragment = (DialogFragment) fragmentManager.findFragmentByTag(DownloadFailedDialog.TAG); if (dialogFragment != null) { @@ -154,7 +131,6 @@ public abstract class BaseConfigurationWizard extends ButterKnifeActivity @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - preferences = getSharedPreferences(SHARED_PREFERENCES, MODE_PRIVATE); fragmentManager = new FragmentManagerEnhanced(getSupportFragmentManager()); providerManager = ProviderManager.getInstance(getAssets(), getExternalFilesDir(null)); @@ -169,7 +145,7 @@ public abstract class BaseConfigurationWizard extends ButterKnifeActivity private void restoreState(Bundle savedInstanceState) { - selectedProvider = savedInstanceState.getParcelable(Provider.KEY); + provider = savedInstanceState.getParcelable(Provider.KEY); mConfigState.setAction(savedInstanceState.getString(ACTIVITY_STATE, PROVIDER_NOT_SET)); reasonToFail = savedInstanceState.getString(REASON_TO_FAIL); @@ -180,7 +156,7 @@ public abstract class BaseConfigurationWizard extends ButterKnifeActivity if (SETTING_UP_PROVIDER.equals(mConfigState.getAction()) || PENDING_SHOW_FAILED_DIALOG.equals(mConfigState.getAction()) ) { - onItemSelectedUi(); + showProgressBar(); } } @@ -192,7 +168,7 @@ public abstract class BaseConfigurationWizard extends ButterKnifeActivity isActivityShowing = true; if (SETTING_UP_PROVIDER.equals(mConfigState.getAction())) { showProgressBar(); - adapter.hideAllBut(adapter.indexOf(selectedProvider)); + adapter.hideAllBut(adapter.indexOf(provider)); checkProviderSetUp(); } else if (PENDING_SHOW_FAILED_DIALOG.equals(mConfigState.getAction())) { showDownloadFailedDialog(); @@ -203,22 +179,10 @@ public abstract class BaseConfigurationWizard extends ButterKnifeActivity private void setUpInitialUI() { setContentView(R.layout.configuration_wizard_activity); + setProviderHeaderText(R.string.setup_provider); hideProgressBar(); } - private void hideProgressBar() { - //needs to be "INVISIBLE" instead of GONE b/c the progressbarDescription gets translated - // by the height of mProgressbar (and the height of the first list item) - mProgressBar.setVisibility(INVISIBLE); - progressbarDescription.setVisibility(INVISIBLE); - mProgressBar.setProgress(0); - } - - protected void showProgressBar() { - mProgressBar.setVisibility(VISIBLE); - progressbarDescription.setVisibility(VISIBLE); - } - @Override protected void onPause() { super.onPause(); @@ -233,12 +197,21 @@ public abstract class BaseConfigurationWizard extends ButterKnifeActivity providerAPIResultReceiver = null; } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == REQUEST_CODE_CONFIGURE_LEAP) { + if (resultCode == RESULT_OK) { + setResult(resultCode, data); + finish(); + } + } + } + private void setUpProviderAPIResultReceiver() { providerAPIResultReceiver = new ProviderAPIResultReceiver(new Handler(), this); providerAPIBroadcastReceiver = new ProviderAPIBroadcastReceiver(); - IntentFilter updateIntentFilter = new IntentFilter(UPDATE_PROGRESSBAR); - updateIntentFilter.addAction(PROVIDER_API_EVENT); + IntentFilter updateIntentFilter = new IntentFilter(PROVIDER_API_EVENT); updateIntentFilter.addCategory(Intent.CATEGORY_DEFAULT); registerReceiver(providerAPIBroadcastReceiver, updateIntentFilter); } @@ -247,9 +220,9 @@ public abstract class BaseConfigurationWizard extends ButterKnifeActivity try { String providerJsonString = preferences.getString(Provider.KEY, ""); if (!providerJsonString.isEmpty()) - selectedProvider.define(new JSONObject(providerJsonString)); + provider.define(new JSONObject(providerJsonString)); String caCert = preferences.getString(Provider.CA_CERT, ""); - selectedProvider.setCACert(caCert); + provider.setCACert(caCert); } catch (JSONException e) { e.printStackTrace(); } @@ -259,9 +232,6 @@ public abstract class BaseConfigurationWizard extends ButterKnifeActivity downloadVpnCertificate(); } else { - mProgressBar.incrementProgressBy(1); - hideProgressBar(); - showProviderDetails(); } } @@ -277,8 +247,6 @@ public abstract class BaseConfigurationWizard extends ButterKnifeActivity } void handleCorrectlyDownloadedCertificate() { - mProgressBar.incrementProgressBy(1); - hideProgressBar(); showProviderDetails(); } @@ -307,16 +275,11 @@ public abstract class BaseConfigurationWizard extends ButterKnifeActivity //TODO Code 2 pane view mConfigState.setAction(SETTING_UP_PROVIDER); - selectedProvider = adapter.getItem(position); - onItemSelectedUi(); + provider = adapter.getItem(position); + showProgressBar(); onItemSelectedLogic(); } - protected void onItemSelectedUi() { - adapter.hideAllBut(adapter.indexOf(selectedProvider)); - startProgressBar(); - } - @Override public void onBackPressed() { if (SETTING_UP_PROVIDER.equals(mConfigState.getAction()) || @@ -330,9 +293,7 @@ public abstract class BaseConfigurationWizard extends ButterKnifeActivity private void stopSettingUpProvider() { ProviderAPI.stop(); - mProgressBar.setVisibility(GONE); - mProgressBar.setProgress(0); - progressbarDescription.setVisibility(GONE); + loadingScreen.setVisibility(GONE); cancelSettingUpProvider(); } @@ -352,7 +313,7 @@ public abstract class BaseConfigurationWizard extends ButterKnifeActivity providerAPICommand.setAction(ProviderAPI.UPDATE_PROVIDER_DETAILS); Bundle parameters = new Bundle(); - parameters.putString(Provider.MAIN_URL, selectedProvider.getMainUrl().toString()); + parameters.putString(Provider.MAIN_URL, provider.getMainUrl().toString()); providerAPICommand.putExtra(ProviderAPI.PARAMETERS, parameters); startService(providerAPICommand); @@ -371,34 +332,6 @@ public abstract class BaseConfigurationWizard extends ButterKnifeActivity setResult(RESULT_CANCELED, askQuit); } - private void startProgressBar() { - showProgressBar(); - mProgressBar.setProgress(0); - mProgressBar.setMax(3); - - int measured_height = listItemHeight(); - mProgressBar.setTranslationY(measured_height); - progressbarDescription.setTranslationY(measured_height + mProgressBar.getHeight()); - } - - private int listItemHeight() { - View listItem = adapter.getView(0, null, providerListView); - 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 ProviderApiService to download an anonymous (anon) VPN certificate. */ @@ -461,11 +394,13 @@ public abstract class BaseConfigurationWizard extends ButterKnifeActivity */ public void showProviderDetails() { // show only if current activity is shown - if (isActivityShowing && !mConfigState.getAction().equalsIgnoreCase(SHOWING_PROVIDER_DETAILS)) { + if (isActivityShowing && mConfigState.getAction() != null && + !mConfigState.getAction().equalsIgnoreCase(SHOWING_PROVIDER_DETAILS)) { mConfigState.setAction(SHOWING_PROVIDER_DETAILS); Intent intent = new Intent(this, ProviderDetailActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); - startActivity(intent); + intent.putExtra(PROVIDER_KEY, provider); + startActivityForResult(intent, REQUEST_CODE_CONFIGURE_LEAP); } } @@ -491,39 +426,57 @@ public abstract class BaseConfigurationWizard extends ButterKnifeActivity public void cancelAndShowAllProviders() { mConfigState.setAction(PROVIDER_NOT_SET); - selectedProvider = null; + provider = null; adapter.showAllProviders(); } public class ProviderAPIBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); + Log.d(TAG, "received Broadcast"); - if (action == null) { + String action = intent.getAction(); + if (action == null || !action.equalsIgnoreCase(PROVIDER_API_EVENT)) { return; } - if (action.equalsIgnoreCase(UPDATE_PROGRESSBAR)) { - int update = intent.getIntExtra(ProviderAPI.CURRENT_PROGRESS, 0); - mProgressBar.setProgress(update); - } else if (action.equalsIgnoreCase(PROVIDER_API_EVENT)) { + if (mConfigState.getAction() != null && + mConfigState.getAction().equalsIgnoreCase(SETTING_UP_PROVIDER)) { int resultCode = intent.getIntExtra(RESULT_CODE, -1); + Log.d(TAG, "Broadcast resultCode: " + Integer.toString(resultCode)); - switch (resultCode) { - case PROVIDER_OK: - handleProviderSetUp(); - break; - case PROVIDER_NOK: - handleProviderSetupFailed((Bundle) intent.getParcelableExtra(RESULT_KEY)); - break; - case CORRECTLY_DOWNLOADED_CERTIFICATE: - handleCorrectlyDownloadedCertificate(); - break; - case INCORRECTLY_DOWNLOADED_CERTIFICATE: - handleIncorrectlyDownloadedCertificate(); - break; + Bundle resultData = intent.getParcelableExtra(RESULT_KEY); + String handledProvider = resultData.getString(Provider.KEY); + + String providerName = ConfigHelper.getProviderName(handledProvider); + String providerDomain = ConfigHelper.getProviderDomain(handledProvider); + + //FIXME: remove that lines as soon as Provider gets sent via broadcast + if (resultCode == PROVIDER_OK && handledProvider == null) { + providerName = ConfigHelper.getProviderName(preferences); + providerDomain = ConfigHelper.getProviderDomain(preferences); + } + if (providerName != null && providerName.equalsIgnoreCase(provider.getName()) && + providerDomain != null && + providerDomain.equalsIgnoreCase(provider.getDomain())) { + switch (resultCode) { + case PROVIDER_OK: + handleProviderSetUp(); + break; + case PROVIDER_NOK: + handleProviderSetupFailed(resultData); + break; + } + } else { + switch (resultCode) { + case CORRECTLY_DOWNLOADED_CERTIFICATE: + handleCorrectlyDownloadedCertificate(); + break; + case INCORRECTLY_DOWNLOADED_CERTIFICATE: + handleIncorrectlyDownloadedCertificate(); + break; + } } } } diff --git a/app/src/main/java/se/leap/bitmaskclient/SignupActivity.java b/app/src/main/java/se/leap/bitmaskclient/SignupActivity.java index f6344065..0ff792bb 100644 --- a/app/src/main/java/se/leap/bitmaskclient/SignupActivity.java +++ b/app/src/main/java/se/leap/bitmaskclient/SignupActivity.java @@ -2,65 +2,38 @@ package se.leap.bitmaskclient; import android.os.Bundle; import android.support.annotation.Nullable; -import android.support.design.widget.TextInputEditText; -import android.support.design.widget.TextInputLayout; -import android.text.Editable; -import android.text.TextWatcher; +import android.view.View; -import butterknife.InjectView; import butterknife.OnClick; +import static android.view.View.VISIBLE; + /** * Create an account with a provider */ public class SignupActivity extends ProviderCredentialsBaseActivity { - @InjectView(R.id.provider_credentials_password_verification) - TextInputEditText providerCredentialsPasswordVerification; - - @InjectView(R.id.provider_credentials_password_verification_layout) - TextInputLayout providerCredentialsPasswordVerificationLayout; - @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.a_signup); - setProviderHeaderText("providerNAME"); setProviderHeaderLogo(R.drawable.mask); + setProviderHeaderText(R.string.create_profile); + setProgressbarText(R.string.signing_up); setButtonText(R.string.signup_button); - providerCredentialsPasswordVerification.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - - @Override - public void afterTextChanged(Editable s) { - if(getPassword().equals(getPasswordVerification())) { - providerCredentialsPasswordVerificationLayout.setError(null); - } else { - providerCredentialsPasswordVerificationLayout.setError(getString(R.string.password_mismatch)); - } - } - }); + passwordVerificationField.setVisibility(VISIBLE); + passwordVerificationError.setVisibility(VISIBLE); } @Override @OnClick(R.id.button) void handleButton() { + super.handleButton(); if (getPassword().equals(getPasswordVerification())) { signUp(getUsername(), getPassword()); } } - - private String getPasswordVerification() { - return providerCredentialsPasswordVerification.getText().toString(); - } } diff --git a/app/src/main/java/se/leap/bitmaskclient/StartActivity.java b/app/src/main/java/se/leap/bitmaskclient/StartActivity.java index bb01ddc0..f5991538 100644 --- a/app/src/main/java/se/leap/bitmaskclient/StartActivity.java +++ b/app/src/main/java/se/leap/bitmaskclient/StartActivity.java @@ -55,7 +55,7 @@ public class StartActivity extends Activity { case FIRST: storeAppVersion(); // TODO start ProfileCreation & replace below code - // (new Intent(getActivity(), ConfigurationWizard.class), Constants.REQUEST_CODE_SWITCH_PROVIDER); + // (new Intent(getActivity(), ProviderListActivity.class), Constants.REQUEST_CODE_SWITCH_PROVIDER); break; case UPGRADE: @@ -153,9 +153,7 @@ public class StartActivity extends Activity { //buildDashboard(getIntent().getBooleanExtra(EIP_RESTART_ON_BOOT, false)); // user_status_fragment.restoreSessionStatus(savedInstanceState); - Intent intent = new Intent(this, MainActivity.class); - intent.setAction(MainActivity.ACTION_SHOW_VPN_FRAGMENT); - startActivity(intent); + showMainActivity(); } } else { configureLeapProvider(); @@ -166,7 +164,32 @@ public class StartActivity extends Activity { if (getIntent().hasExtra(APP_ACTION_CONFIGURE_ALWAYS_ON_PROFILE)) { getIntent().removeExtra(APP_ACTION_CONFIGURE_ALWAYS_ON_PROFILE); } - startActivityForResult(new Intent(this, ConfigurationWizard.class), REQUEST_CODE_CONFIGURE_LEAP); + startActivityForResult(new Intent(this, ProviderListActivity.class), REQUEST_CODE_CONFIGURE_LEAP); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (data == null) { + return; + } + + if (requestCode == REQUEST_CODE_CONFIGURE_LEAP) { + if (resultCode == RESULT_OK && data.hasExtra(Provider.KEY)) { + Provider provider = data.getParcelableExtra(Provider.KEY); + ConfigHelper.storeProviderInPreferences(preferences, provider); + + showMainActivity(); + } else if (resultCode == RESULT_CANCELED) { + finish(); + } + } + } + + private void showMainActivity() { + Intent intent = new Intent(this, MainActivity.class); + intent.setAction(MainActivity.ACTION_SHOW_VPN_FRAGMENT); + startActivity(intent); + finish(); } } diff --git a/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java b/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java index 4f2d0744..090e8d26 100644 --- a/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java +++ b/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java @@ -27,7 +27,7 @@ import android.widget.ListView; import android.widget.Toast; import se.leap.bitmaskclient.ConfigHelper; -import se.leap.bitmaskclient.ConfigurationWizard; +import se.leap.bitmaskclient.ProviderListActivity; import se.leap.bitmaskclient.EipFragment; import se.leap.bitmaskclient.R; import se.leap.bitmaskclient.fragments.AboutFragment; @@ -143,7 +143,7 @@ public class NavigationDrawerFragment extends Fragment { android.R.layout.simple_list_item_activated_1, android.R.id.text1); - String providerName = ConfigHelper.getCurrentProviderName(preferences); + String providerName = ConfigHelper.getProviderName(preferences); if (providerName == null) { //TODO: ADD A header to the ListView containing a useful message. //TODO 2: disable switchProvider @@ -304,7 +304,7 @@ public class NavigationDrawerFragment extends Fragment { // TODO STOP VPN // if (provider.hasEIP()) eip_fragment.stopEipIfPossible(); preferences.edit().clear().apply(); - startActivityForResult(new Intent(getActivity(), ConfigurationWizard.class), REQUEST_CODE_SWITCH_PROVIDER); + startActivityForResult(new Intent(getActivity(), ProviderListActivity.class), REQUEST_CODE_SWITCH_PROVIDER); break; case 1: mTitle = getString(R.string.log_fragment_title); |