diff options
Diffstat (limited to 'app/src')
42 files changed, 1185 insertions, 729 deletions
diff --git a/app/src/insecure/java/se/leap/bitmaskclient/AddProviderActivity.java b/app/src/insecure/java/se/leap/bitmaskclient/AddProviderActivity.java new file mode 100644 index 00000000..10608a14 --- /dev/null +++ b/app/src/insecure/java/se/leap/bitmaskclient/AddProviderActivity.java @@ -0,0 +1,89 @@ +package se.leap.bitmaskclient; + +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; + +import butterknife.InjectView; +import butterknife.Optional; +import se.leap.bitmaskclient.ProviderListContent.ProviderItem; + +import static android.widget.RelativeLayout.BELOW; +import static android.widget.RelativeLayout.LEFT_OF; + +public class AddProviderActivity extends AddProviderBaseActivity { + + final public static String TAG = "AddProviderActivity"; + + @InjectView(R.id.danger_checkbox) + CheckBox checkboxDanger; + + @InjectView(R.id.button_save) + Button saveButton; + + @Optional + @InjectView(R.id.button_container) + LinearLayout buttonContainer; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.a_add_provider); + init(); + + checkboxDanger.setVisibility(View.VISIBLE); + checkboxDanger.setText(R.string.danger_checkbox); + checkboxDanger.setChecked(preferences.getBoolean(ProviderItem.DANGER_ON, false)); + } + + @Override + public void setupSaveButton() { + saveButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + preferences.edit().putBoolean(ProviderItem.DANGER_ON, checkboxDanger.isChecked()).apply(); + saveProvider(); + } + }); + } + + @Override + protected void showCompactLayout() { + if (isCompactLayout) { + return; + } + super.showCompactLayout(); + showCompactButtonLayout(); + } + + @Override + protected void showStandardLayout() { + if (!isCompactLayout) { + return; + } + super.showStandardLayout(); + showStandardButtonLayout(); + } + + private void showCompactButtonLayout() { + RelativeLayout.LayoutParams phoneButtonContainerParams = (RelativeLayout.LayoutParams) buttonContainer.getLayoutParams(); + phoneButtonContainerParams.addRule(BELOW, 0); + buttonContainer.setLayoutParams(phoneButtonContainerParams); + + RelativeLayout.LayoutParams checkBoxParams = (RelativeLayout.LayoutParams) checkboxDanger.getLayoutParams(); + checkBoxParams.addRule(LEFT_OF, R.id.button_container); + checkboxDanger.setLayoutParams(checkBoxParams); + } + + private void showStandardButtonLayout() { + RelativeLayout.LayoutParams phoneButtonContainerParams = (RelativeLayout.LayoutParams) buttonContainer.getLayoutParams(); + phoneButtonContainerParams.addRule(BELOW, R.id.danger_checkbox); + buttonContainer.setLayoutParams(phoneButtonContainerParams); + + RelativeLayout.LayoutParams checkBoxParams = (RelativeLayout.LayoutParams) checkboxDanger.getLayoutParams(); + checkBoxParams.addRule(LEFT_OF, 0); + checkboxDanger.setLayoutParams(checkBoxParams); + } +} diff --git a/app/src/insecure/java/se/leap/bitmaskclient/NewProviderDialog.java b/app/src/insecure/java/se/leap/bitmaskclient/NewProviderDialog.java deleted file mode 100644 index d7d9eec5..00000000 --- a/app/src/insecure/java/se/leap/bitmaskclient/NewProviderDialog.java +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Copyright (c) 2013 LEAP Encryption Access Project and contributers - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ -package se.leap.bitmaskclient; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.Context; -import android.content.DialogInterface; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.CheckBox; -import android.widget.EditText; -import android.widget.Toast; - -import butterknife.ButterKnife; -import butterknife.InjectView; -import se.leap.bitmaskclient.ProviderListContent.ProviderItem; - -/** - * Implements the new custom provider dialog. - * - * @author parmegv - */ -public class NewProviderDialog extends DialogFragment { - - final public static String TAG = "newProviderDialog"; - - @InjectView(R.id.new_provider_url) - EditText url_input_field; - - @InjectView(R.id.danger_checkbox) - CheckBox danger_checkbox; - - public interface NewProviderDialogInterface { - void showAndSelectProvider(String url_provider, boolean danger_on); - } - - NewProviderDialogInterface interface_with_ConfigurationWizard; - - @Override - public void onAttach(Context context) { - super.onAttach(context); - try { - interface_with_ConfigurationWizard = (NewProviderDialogInterface) context; - } catch (ClassCastException e) { - throw new ClassCastException(context.toString() - + " must implement NoticeDialogListener"); - } - } - - @Override - @NonNull - public Dialog onCreateDialog(Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - LayoutInflater inflater = getActivity().getLayoutInflater(); - View view = inflater.inflate(R.layout.new_provider_dialog, null); - ButterKnife.inject(this, view); - Bundle arguments = getArguments(); - if (arguments != null) { - url_input_field.setText(arguments.getString(Provider.MAIN_URL, "")); - danger_checkbox.setActivated(arguments.getBoolean(ProviderItem.DANGER_ON, false)); - } - - builder.setView(view) - .setMessage(R.string.introduce_new_provider) - .setPositiveButton(R.string.save, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - saveProvider(); - } - }) - .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - } - }); - // Create the AlertDialog object and return it - return builder.create(); - } - - private void saveProvider() { - String entered_url = url_input_field.getText().toString().trim(); - if (!entered_url.startsWith("https://")) { - if (entered_url.startsWith("http://")) { - entered_url = entered_url.substring("http://".length()); - } - entered_url = "https://".concat(entered_url); - } - boolean danger_on = danger_checkbox.isChecked(); - if (validURL(entered_url)) { - interface_with_ConfigurationWizard.showAndSelectProvider(entered_url, danger_on); - Toast.makeText(getActivity().getApplicationContext(), R.string.valid_url_entered, Toast.LENGTH_LONG).show(); - } else { - url_input_field.setText(""); - danger_checkbox.setChecked(false); - Toast.makeText(getActivity().getApplicationContext(), R.string.not_valid_url_entered, Toast.LENGTH_LONG).show(); - } - } - - /** - * Checks if the entered url is valid or not. - * - * @param entered_url - * @return true if it's not empty nor contains only the protocol. - */ - boolean validURL(String entered_url) { - //return !entered_url.isEmpty() && entered_url.matches("http[s]?://.+") && !entered_url.replaceFirst("http[s]?://", "").isEmpty(); - return android.util.Patterns.WEB_URL.matcher(entered_url).matches(); - } -} diff --git a/app/src/insecure/java/se/leap/bitmaskclient/ProviderApiManager.java b/app/src/insecure/java/se/leap/bitmaskclient/ProviderApiManager.java index 7e33cd63..e3fb549f 100644 --- a/app/src/insecure/java/se/leap/bitmaskclient/ProviderApiManager.java +++ b/app/src/insecure/java/se/leap/bitmaskclient/ProviderApiManager.java @@ -142,8 +142,7 @@ public class ProviderApiManager extends ProviderApiManagerBase { providerDotJsonString = downloadFromApiUrlWithProviderCA("/provider.json", caCert, providerDefinition, dangerOn); if (ConfigHelper.checkErroneousDownload(providerDotJsonString) || !isValidJson(providerDotJsonString)) { - result.putString(ERRORS, resources.getString(malformed_url)); - result.putBoolean(BROADCAST_RESULT_KEY, false); + setErrorResult(result, malformed_url, null); return result; } diff --git a/app/src/insecure/java/se/leap/bitmaskclient/ProviderListActivity.java b/app/src/insecure/java/se/leap/bitmaskclient/ProviderListActivity.java index 67565d70..3190d651 100644 --- a/app/src/insecure/java/se/leap/bitmaskclient/ProviderListActivity.java +++ b/app/src/insecure/java/se/leap/bitmaskclient/ProviderListActivity.java @@ -50,29 +50,13 @@ public class ProviderListActivity extends ProviderListBaseActivity { preferences.edit().remove(ProviderItem.DANGER_ON).apply(); } - public void showAndSelectProvider(String provider_main_url, boolean danger_on) { - try { - provider = new Provider(new URL((provider_main_url))); - autoSelectProvider(provider, danger_on); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - } - - private void autoSelectProvider(Provider provider, boolean danger_on) { - preferences.edit().putBoolean(ProviderItem.DANGER_ON, danger_on).apply(); - this.provider = provider; - onItemSelectedLogic(); - showProgressBar(); - } - /** * Asks ProviderAPI to download a new provider.json file * * @param danger_on tells if HTTPS client should bypass certificate errors */ public void setUpProvider(boolean danger_on) { - mConfigState.setAction(SETTING_UP_PROVIDER); + configState.setAction(SETTING_UP_PROVIDER); Bundle parameters = new Bundle(); parameters.putBoolean(ProviderItem.DANGER_ON, danger_on); @@ -85,7 +69,7 @@ public class ProviderListActivity extends ProviderListBaseActivity { */ @Override public void retrySetUpProvider(@NonNull Provider provider) { - mConfigState.setAction(SETTING_UP_PROVIDER); + configState.setAction(SETTING_UP_PROVIDER); ProviderAPICommand.execute(this, SET_UP_PROVIDER, provider); } diff --git a/app/src/insecure/res/layout-xlarge/new_provider_dialog.xml b/app/src/insecure/res/layout-xlarge/new_provider_dialog.xml deleted file mode 100644 index fc7d84ab..00000000 --- a/app/src/insecure/res/layout-xlarge/new_provider_dialog.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:orientation="vertical" - android:textSize="24sp" > - - <EditText - android:id="@+id/new_provider_url" - android:inputType="textUri" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="16dp" - android:layout_marginLeft="4dp" - android:layout_marginRight="4dp" - android:textSize="24sp" - android:hint="@string/new_provider_uri" /> - - <CheckBox - android:id="@+id/danger_checkbox" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textSize="24sp" - android:text="@string/danger_checkbox" /> - -</LinearLayout>
\ No newline at end of file diff --git a/app/src/insecure/res/layout/new_provider_dialog.xml b/app/src/insecure/res/layout/new_provider_dialog.xml deleted file mode 100644 index 8888a1d9..00000000 --- a/app/src/insecure/res/layout/new_provider_dialog.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:orientation="vertical" > - - <EditText - android:id="@+id/new_provider_url" - android:inputType="textUri" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="16dp" - android:layout_marginLeft="4dp" - android:layout_marginRight="4dp" - android:layout_marginBottom="4dp" - android:hint="@string/new_provider_uri" /> - - <CheckBox - android:id="@+id/danger_checkbox" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/danger_checkbox" /> - -</LinearLayout>
\ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8b87d095..b1131850 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -94,6 +94,10 @@ android:label="@string/configuration_wizard_title" /> <activity + android:name=".AddProviderActivity" + android:label="@string/add_provider" /> + + <activity android:name=".ProviderDetailActivity" android:label="@string/provider_details_title" android:launchMode="singleTop" /> diff --git a/app/src/main/java/se/leap/bitmaskclient/AddProviderBaseActivity.java b/app/src/main/java/se/leap/bitmaskclient/AddProviderBaseActivity.java new file mode 100644 index 00000000..ca848f2e --- /dev/null +++ b/app/src/main/java/se/leap/bitmaskclient/AddProviderBaseActivity.java @@ -0,0 +1,124 @@ +package se.leap.bitmaskclient; + +import android.content.Intent; +import android.os.Bundle; +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 android.widget.Button; + +import butterknife.InjectView; + +import static se.leap.bitmaskclient.ProviderListBaseActivity.EXTRAS_KEY_INVALID_URL; + +/** + * Created by cyberta on 30.06.18. + */ + +public abstract class AddProviderBaseActivity extends ConfigWizardBaseActivity { + + final public static String EXTRAS_KEY_NEW_URL = "NEW_URL"; + + @InjectView(R.id.text_uri_error) + TextInputLayout urlError; + + @InjectView(R.id.text_uri) + TextInputEditText editUrl; + + @InjectView(R.id.button_cancel) + Button cancelButton; + + @InjectView(R.id.button_save) + Button saveButton; + + + protected void init() { + Bundle extras = this.getIntent().getExtras(); + if (extras != null && extras.containsKey(EXTRAS_KEY_INVALID_URL)) { + editUrl.setText(extras.getString(EXTRAS_KEY_INVALID_URL)); + saveButton.setEnabled(true); + } + + setupSaveButton(); + setupCancelButton(); + setUpListeners(); + setUpInitialUI(); + } + + public abstract void setupSaveButton(); + + private void setupCancelButton() { + cancelButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + finish(); + } + }); + } + + private void setUpInitialUI() { + setProviderHeaderText(R.string.add_provider); + hideProgressBar(); + } + + protected void saveProvider() { + String entered_url = getURL(); + if (validURL(entered_url)) { + Intent intent = this.getIntent(); + intent.putExtra(EXTRAS_KEY_NEW_URL, entered_url); + setResult(RESULT_OK, intent); + finish(); + } else { + editUrl.setText(""); + urlError.setError(getString(R.string.not_valid_url_entered)); + } + } + + private void setUpListeners() { + + editUrl.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 (!validURL(getURL())) { + urlError.setError(getString(R.string.not_valid_url_entered)); + saveButton.setEnabled(false); + + } else { + urlError.setError(null); + saveButton.setEnabled(true); + } + } + }); + } + + private String getURL() { + String entered_url = editUrl.getText().toString().trim(); + if (entered_url.contains("www.")) entered_url = entered_url.replaceFirst("www.", ""); + if (!entered_url.startsWith("https://")) { + if (entered_url.startsWith("http://")) { + entered_url = entered_url.substring("http://".length()); + } + entered_url = "https://".concat(entered_url); + } + return entered_url; + } + + /** + * Checks if the entered url is valid or not. + * + * @param enteredUrl + * @return true if it's not empty nor contains only the protocol. + */ + boolean validURL(String enteredUrl) { + return android.util.Patterns.WEB_URL.matcher(enteredUrl).matches(); + } +} diff --git a/app/src/main/java/se/leap/bitmaskclient/ConfigWizardBaseActivity.java b/app/src/main/java/se/leap/bitmaskclient/ConfigWizardBaseActivity.java index f0e2de85..227c8cf4 100644 --- a/app/src/main/java/se/leap/bitmaskclient/ConfigWizardBaseActivity.java +++ b/app/src/main/java/se/leap/bitmaskclient/ConfigWizardBaseActivity.java @@ -2,21 +2,28 @@ package se.leap.bitmaskclient; import android.content.SharedPreferences; import android.graphics.PorterDuff; +import android.graphics.Rect; import android.os.Build; import android.os.Bundle; import android.support.annotation.DrawableRes; import android.support.annotation.Nullable; import android.support.annotation.StringRes; +import android.support.constraint.ConstraintLayout; +import android.support.constraint.Guideline; import android.support.v4.content.ContextCompat; -import android.support.v7.widget.AppCompatImageView; import android.support.v7.widget.AppCompatTextView; +import android.util.Log; import android.view.View; import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.widget.LinearLayout; import android.widget.ProgressBar; import butterknife.InjectView; +import butterknife.Optional; +import se.leap.bitmaskclient.views.ProviderHeaderView; +import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.view.View.GONE; import static android.view.View.VISIBLE; import static se.leap.bitmaskclient.Constants.PROVIDER_KEY; @@ -30,28 +37,44 @@ import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES; public abstract class ConfigWizardBaseActivity extends ButterKnifeActivity { + private static final String TAG = ConfigWizardBaseActivity.class.getName(); + public static final float GUIDE_LINE_COMPACT_DELTA = 0.1f; protected SharedPreferences preferences; - @InjectView(R.id.provider_header_logo) - AppCompatImageView providerHeaderLogo; - - @InjectView(R.id.provider_header_text) - AppCompatTextView providerHeaderText; + @InjectView(R.id.header) + ProviderHeaderView providerHeaderView; + //Add provider screen has no loading screen + @Optional @InjectView(R.id.loading_screen) protected LinearLayout loadingScreen; + @Optional @InjectView(R.id.progressbar) protected ProgressBar progressBar; + @Optional @InjectView(R.id.progressbar_description) protected AppCompatTextView progressbarText; + //Only tablet layouts have guidelines as they are based on a ConstraintLayout + @Optional + @InjectView(R.id.guideline_top) + protected Guideline guideline_top; + + @Optional + @InjectView(R.id.guideline_bottom) + protected Guideline guideline_bottom; + @InjectView(R.id.content) protected LinearLayout content; protected Provider provider; + protected boolean isCompactLayout = false; + private float defaultGuidelineTopPercentage; + private float defaultGuidelineBottomPercentage; + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -63,33 +86,44 @@ public abstract class ConfigWizardBaseActivity extends ButterKnifeActivity { @Override public void setContentView(View view) { super.setContentView(view); - if (provider != null) - setProviderHeaderText(provider.getName()); - setProgressbarColorForPreLollipop(); + initContentView(); } @Override public void setContentView(int layoutResID) { super.setContentView(layoutResID); - if (provider != null) - setProviderHeaderText(provider.getName()); - setProgressbarColorForPreLollipop(); + initContentView(); } @Override public void setContentView(View view, ViewGroup.LayoutParams params) { super.setContentView(view, params); - if (provider != null) + initContentView(); + } + + private void initContentView() { + if (provider != null) { setProviderHeaderText(provider.getName()); + } setProgressbarColorForPreLollipop(); + setDefaultGuidelineValues(); + setGlobalLayoutChangeListener(); + } + + private void setDefaultGuidelineValues() { + if (isTabletLayout()) { + defaultGuidelineTopPercentage = ((ConstraintLayout.LayoutParams) guideline_top.getLayoutParams()).guidePercent; + defaultGuidelineBottomPercentage = ((ConstraintLayout.LayoutParams) guideline_bottom.getLayoutParams()).guidePercent; + } } private void setProgressbarColorForPreLollipop() { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - progressBar.getIndeterminateDrawable().setColorFilter( - ContextCompat.getColor(this, R.color.colorPrimary), - PorterDuff.Mode.SRC_IN); + if (progressBar == null || Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + return; } + progressBar.getIndeterminateDrawable().setColorFilter( + ContextCompat.getColor(this, R.color.colorPrimary), + PorterDuff.Mode.SRC_IN); } @@ -108,33 +142,134 @@ public abstract class ConfigWizardBaseActivity extends ButterKnifeActivity { } protected void setProviderHeaderLogo(@DrawableRes int providerHeaderLogo) { - this.providerHeaderLogo.setImageResource(providerHeaderLogo); + providerHeaderView.setLogo(providerHeaderLogo); } protected void setProviderHeaderText(String providerHeaderText) { - this.providerHeaderText.setText(providerHeaderText); + providerHeaderView.setTitle(providerHeaderText); } protected void setProviderHeaderText(@StringRes int providerHeaderText) { - this.providerHeaderText.setText(providerHeaderText); + providerHeaderView.setTitle(providerHeaderText); } protected void hideProgressBar() { + if (loadingScreen == null) { + return; + } loadingScreen.setVisibility(GONE); content.setVisibility(VISIBLE); } protected void showProgressBar() { + if (loadingScreen == null) { + return; + } content.setVisibility(GONE); loadingScreen.setVisibility(VISIBLE); } - protected void setProgressbarText(String progressbarText) { + protected void setProgressbarText(@StringRes int progressbarText) { + if (this.progressbarText == null) { + return; + } this.progressbarText.setText(progressbarText); } - protected void setProgressbarText(@StringRes int progressbarText) { - this.progressbarText.setText(progressbarText); + + protected void showCompactLayout() { + if (isCompactLayout) { + return; + } + + if (isTabletLayoutInLandscape() || isPhoneLayout()) { + providerHeaderView.showCompactLayout(); + } + + showIncreasedTabletContentArea(); + isCompactLayout = true; + } + + protected void showStandardLayout() { + if (!isCompactLayout) { + return; + } + providerHeaderView.showStandardLayout(); + showStandardTabletContentArea(); + isCompactLayout = false; + } + + private boolean isTabletLayoutInLandscape() { + // TabletLayout is based on a ConstraintLayout and uses Guidelines whereas the phone layout + // has no such elements in it's layout xml file + return guideline_top != null && + guideline_bottom != null && + getResources().getConfiguration().orientation == ORIENTATION_LANDSCAPE; + } + + protected boolean isPhoneLayout() { + return guideline_top == null && guideline_bottom == null; + } + + protected boolean isTabletLayout() { + return guideline_top != null && guideline_bottom != null; + } + + /** + * Increases the white content area in tablet layouts + */ + private void showIncreasedTabletContentArea() { + if (isPhoneLayout()) { + return; + } + ConstraintLayout.LayoutParams guideLineTopParams = (ConstraintLayout.LayoutParams) guideline_top.getLayoutParams(); + float increasedTopPercentage = defaultGuidelineTopPercentage - GUIDE_LINE_COMPACT_DELTA; + guideLineTopParams.guidePercent = increasedTopPercentage > 0f ? increasedTopPercentage : 0f; + guideline_top.setLayoutParams(guideLineTopParams); + + ConstraintLayout.LayoutParams guideLineBottomParams = (ConstraintLayout.LayoutParams) guideline_bottom.getLayoutParams(); + float increasedBottomPercentage = defaultGuidelineBottomPercentage + GUIDE_LINE_COMPACT_DELTA; + guideLineBottomParams.guidePercent = increasedBottomPercentage < 1f ? increasedBottomPercentage : 1f; + guideline_bottom.setLayoutParams(guideLineBottomParams); + } + + /** + * Restores the default size of the white content area in tablet layouts + */ + private void showStandardTabletContentArea() { + if (isPhoneLayout()) { + return; + } + ConstraintLayout.LayoutParams guideLineTopParams = (ConstraintLayout.LayoutParams) guideline_top.getLayoutParams(); + guideLineTopParams.guidePercent = defaultGuidelineTopPercentage; + guideline_top.setLayoutParams(guideLineTopParams); + + ConstraintLayout.LayoutParams guideLineBottomParams = (ConstraintLayout.LayoutParams) guideline_bottom.getLayoutParams(); + guideLineBottomParams.guidePercent = defaultGuidelineBottomPercentage; + guideline_bottom.setLayoutParams(guideLineBottomParams); + } + + /** + * Checks if the keyboard is shown and switches between the standard layout and the compact layout + */ + private void setGlobalLayoutChangeListener() { + final View rootView = content.getRootView(); + rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + Rect r = new Rect(); + //r will be populated with the coordinates of your view that area still visible. + rootView.getWindowVisibleDisplayFrame(r); + + float deltaHiddenScreen = 1f - ((float) (r.bottom - r.top) / (float) rootView.getHeight()); + if (deltaHiddenScreen > 0.25f) { + // if more than 1/4 of the screen is hidden + showCompactLayout(); + } else { + showStandardLayout(); + } + } + }); } } diff --git a/app/src/main/java/se/leap/bitmaskclient/Constants.java b/app/src/main/java/se/leap/bitmaskclient/Constants.java index 8ec3fcc7..2efc2c1f 100644 --- a/app/src/main/java/se/leap/bitmaskclient/Constants.java +++ b/app/src/main/java/se/leap/bitmaskclient/Constants.java @@ -21,6 +21,7 @@ public interface Constants { int REQUEST_CODE_CONFIGURE_LEAP = 0; int REQUEST_CODE_SWITCH_PROVIDER = 1; int REQUEST_CODE_LOG_IN = 2; + int REQUEST_CODE_ADD_PROVIDER = 3; ////////////////////////////////////////////// diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderCredentialsBaseActivity.java b/app/src/main/java/se/leap/bitmaskclient/ProviderCredentialsBaseActivity.java index 15cd9617..27fe9e40 100644 --- a/app/src/main/java/se/leap/bitmaskclient/ProviderCredentialsBaseActivity.java +++ b/app/src/main/java/se/leap/bitmaskclient/ProviderCredentialsBaseActivity.java @@ -16,6 +16,7 @@ import android.support.v7.widget.AppCompatButton; import android.support.v7.widget.AppCompatTextView; import android.text.Editable; import android.text.Html; +import android.text.TextUtils; import android.text.TextWatcher; import android.text.method.LinkMovementMethod; import android.text.util.Linkify; @@ -33,6 +34,7 @@ import se.leap.bitmaskclient.Constants.CREDENTIAL_ERRORS; import se.leap.bitmaskclient.eip.EipCommand; import se.leap.bitmaskclient.userstatus.User; +import static android.text.TextUtils.isEmpty; import static android.view.View.GONE; import static android.view.View.VISIBLE; import static android.view.inputmethod.EditorInfo.IME_ACTION_DONE; @@ -94,6 +96,10 @@ public abstract class ProviderCredentialsBaseActivity extends ConfigWizardBaseAc @InjectView(R.id.button) AppCompatButton button; + private boolean isUsernameError = false; + private boolean isPasswordError = false; + private boolean isVerificationError = false; + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -137,14 +143,42 @@ public abstract class ProviderCredentialsBaseActivity extends ConfigWizardBaseAc 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)); + updateUsernameError(savedInstance.getString(USERNAME_ERROR)); + updatePasswordError(savedInstance.getString(PASSWORD_ERROR)); + updateVerificationError(savedInstance.getString(PASSWORD_VERIFICATION_ERROR)); if (savedInstance.getString(ACTIVITY_STATE) != null) { mConfigState.setAction(savedInstance.getString(ACTIVITY_STATE)); } } + private void updateUsernameError(String usernameErrorString) { + usernameError.setError(usernameErrorString); + isUsernameError = usernameErrorString != null; + updateButton(); + } + + private void updatePasswordError(String passwordErrorString) { + passwordError.setError(passwordErrorString); + isPasswordError = passwordErrorString != null; + updateButton(); + } + + private void updateVerificationError(String verificationErrorString) { + passwordVerificationError.setError(verificationErrorString); + isVerificationError = verificationErrorString != null; + updateButton(); + } + + private void updateButton() { + button.setEnabled(!isPasswordError && + !isUsernameError && + !isVerificationError && + !isEmpty(passwordField.getText()) && + !isEmpty(usernameField.getText()) && + !(passwordVerificationField.getVisibility() == VISIBLE && + getPasswordVerification().length() == 0)); + } + @Override public void onSaveInstanceState(Bundle outState) { outState.putString(ACTIVITY_STATE, mConfigState.getAction()); @@ -245,9 +279,9 @@ public abstract class ProviderCredentialsBaseActivity extends ConfigWizardBaseAc public void afterTextChanged(Editable s) { if (getUsername().equalsIgnoreCase("")) { s.clear(); - usernameError.setError(getString(R.string.username_ask)); + updateUsernameError(getString(R.string.username_ask)); } else { - usernameError.setError(null); + updateUsernameError(null); String suffix = "@" + provider.getDomain(); if (!usernameField.getText().toString().endsWith(suffix)) { s.append(suffix); @@ -281,9 +315,9 @@ public abstract class ProviderCredentialsBaseActivity extends ConfigWizardBaseAc @Override public void afterTextChanged(Editable s) { if(getPassword().length() < 8) { - passwordError.setError(getString(R.string.error_not_valid_password_user_message)); + updatePasswordError(getString(R.string.error_not_valid_password_user_message)); } else { - passwordError.setError(null); + updatePasswordError(null); } } }); @@ -316,9 +350,9 @@ public abstract class ProviderCredentialsBaseActivity extends ConfigWizardBaseAc @Override public void afterTextChanged(Editable s) { if(getPassword().equals(getPasswordVerification())) { - passwordVerificationError.setError(null); + updateVerificationError(null); } else { - passwordVerificationError.setError(getString(R.string.password_mismatch)); + updateVerificationError(getString(R.string.password_mismatch)); } } }); @@ -344,9 +378,9 @@ public abstract class ProviderCredentialsBaseActivity extends ConfigWizardBaseAc } private void handleReceivedErrors(Bundle arguments) { - if (arguments.containsKey(CREDENTIAL_ERRORS.PASSWORD_INVALID_LENGTH.toString())) - passwordError.setError(getString(R.string.error_not_valid_password_user_message)); - else if (arguments.containsKey(CREDENTIAL_ERRORS.RISEUP_WARNING.toString())) { + if (arguments.containsKey(CREDENTIAL_ERRORS.PASSWORD_INVALID_LENGTH.toString())) { + updatePasswordError(getString(R.string.error_not_valid_password_user_message)); + } else if (arguments.containsKey(CREDENTIAL_ERRORS.RISEUP_WARNING.toString())) { userMessage.setVisibility(VISIBLE); userMessage.setText(R.string.login_riseup_warning); } @@ -355,7 +389,7 @@ public abstract class ProviderCredentialsBaseActivity extends ConfigWizardBaseAc usernameField.setText(username); } if (arguments.containsKey(CREDENTIAL_ERRORS.USERNAME_MISSING.toString())) { - usernameError.setError(getString(R.string.username_ask)); + updateUsernameError(getString(R.string.username_ask)); } if (arguments.containsKey(USER_MESSAGE)) { String userMessageString = arguments.getString(USER_MESSAGE); diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java b/app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java index 6a0a1864..cc8aceec 100644 --- a/app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java +++ b/app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java @@ -1,16 +1,16 @@ /** * Copyright (c) 2017 LEAP Encryption Access Project and contributors - * + * <p> * 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. - * + * <p> * 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. - * + * <p> * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ @@ -33,10 +33,11 @@ import android.widget.ListView; import com.pedrogomez.renderers.Renderer; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.json.JSONException; import org.json.JSONObject; +import java.net.MalformedURLException; +import java.net.URL; import java.util.ArrayList; import java.util.List; @@ -50,6 +51,7 @@ import static se.leap.bitmaskclient.Constants.BROADCAST_PROVIDER_API_EVENT; import static se.leap.bitmaskclient.Constants.BROADCAST_RESULT_CODE; import static se.leap.bitmaskclient.Constants.BROADCAST_RESULT_KEY; import static se.leap.bitmaskclient.Constants.PROVIDER_KEY; +import static se.leap.bitmaskclient.Constants.REQUEST_CODE_ADD_PROVIDER; import static se.leap.bitmaskclient.Constants.REQUEST_CODE_CONFIGURE_LEAP; import static se.leap.bitmaskclient.ProviderAPI.CORRECTLY_DOWNLOADED_VPN_CERTIFICATE; import static se.leap.bitmaskclient.ProviderAPI.DOWNLOAD_VPN_CERTIFICATE; @@ -72,7 +74,7 @@ import static se.leap.bitmaskclient.ProviderAPI.UPDATE_PROVIDER_DETAILS; */ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity - implements NewProviderDialog.NewProviderDialogInterface, ProviderSetupFailedDialog.DownloadFailedDialogInterface, ProviderAPIResultReceiver.Receiver { + implements ProviderSetupFailedDialog.DownloadFailedDialogInterface, ProviderAPIResultReceiver.Receiver { @InjectView(R.id.provider_list) protected ListView providerListView; @@ -80,7 +82,7 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity protected ProviderListAdapter adapter; private ProviderManager providerManager; - protected Intent mConfigState = new Intent(PROVIDER_NOT_SET); + protected Intent configState = new Intent(PROVIDER_NOT_SET); final public static String TAG = ProviderListActivity.class.getSimpleName(); @@ -88,25 +90,26 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity final protected static String PROVIDER_NOT_SET = "PROVIDER NOT SET"; final protected static String SETTING_UP_PROVIDER = "PROVIDER GETS SET"; - final private static String SHOWING_PROVIDER_DETAILS = "SHOWING PROVIDER DETAILS"; + final private static String SHOWING_PROVIDER_DETAILS = "SHOWING PROVIDER DETAILS"; final private static String PENDING_SHOW_FAILED_DIALOG = "SHOW FAILED DIALOG PENDING"; final private static String SHOW_FAILED_DIALOG = "SHOW FAILED DIALOG"; final private static String REASON_TO_FAIL = "REASON TO FAIL"; final protected static String SERVICES_RETRIEVED = "SERVICES RETRIEVED"; + final protected static String EXTRAS_KEY_INVALID_URL = "INVALID_URL"; public ProviderAPIResultReceiver providerAPIResultReceiver; private ProviderAPIBroadcastReceiver providerAPIBroadcastReceiver; - FragmentManagerEnhanced fragmentManager; + private FragmentManagerEnhanced fragmentManager; private boolean isActivityShowing; private String reasonToFail; + private boolean testNewURL; public abstract void retrySetUpProvider(@NonNull Provider provider); protected abstract void onItemSelectedLogic(); - private void initProviderList() { List<Renderer<Provider>> prototypes = new ArrayList<>(); prototypes.add(new ProviderRenderer(this)); @@ -117,7 +120,7 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity @Override public void onSaveInstanceState(@NotNull Bundle outState) { - outState.putString(ACTIVITY_STATE, mConfigState.getAction()); + outState.putString(ACTIVITY_STATE, configState.getAction()); outState.putString(REASON_TO_FAIL, reasonToFail); super.onSaveInstanceState(outState); @@ -128,7 +131,7 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity if (savedInstanceState == null) { return; } - mConfigState.setAction(savedInstanceState.getString(ACTIVITY_STATE, PROVIDER_NOT_SET)); + configState.setAction(savedInstanceState.getString(ACTIVITY_STATE, PROVIDER_NOT_SET)); if (savedInstanceState.containsKey(REASON_TO_FAIL)) { reasonToFail = savedInstanceState.getString(REASON_TO_FAIL); } @@ -147,19 +150,19 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity @Override protected void onResume() { - Log.d(TAG, "resuming with ConfigState: " + mConfigState.getAction()); + Log.d(TAG, "resuming with ConfigState: " + configState.getAction()); super.onResume(); setUpProviderAPIResultReceiver(); isActivityShowing = true; - if (SETTING_UP_PROVIDER.equals(mConfigState.getAction())) { + if (SETTING_UP_PROVIDER.equals(configState.getAction())) { showProgressBar(); checkProviderSetUp(); - } else if (PENDING_SHOW_FAILED_DIALOG.equals(mConfigState.getAction())) { + } else if (PENDING_SHOW_FAILED_DIALOG.equals(configState.getAction())) { showProgressBar(); showDownloadFailedDialog(); - } else if (SHOW_FAILED_DIALOG.equals(mConfigState.getAction())) { + } else if (SHOW_FAILED_DIALOG.equals(configState.getAction())) { showProgressBar(); - } else if (SHOWING_PROVIDER_DETAILS.equals(mConfigState.getAction())) { + } else if (SHOWING_PROVIDER_DETAILS.equals(configState.getAction())) { cancelSettingUpProvider(); } } @@ -191,9 +194,33 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity setResult(resultCode, data); finish(); } + } else if (requestCode == REQUEST_CODE_ADD_PROVIDER) { + if (resultCode == RESULT_OK) { + testNewURL = true; + String newUrl = data.getStringExtra(AddProviderActivity.EXTRAS_KEY_NEW_URL); + this.provider.setMainUrl(newUrl); + showAndSelectProvider(newUrl); + } else { + cancelSettingUpProvider(); + } } } + public void showAndSelectProvider(String newURL) { + try { + provider = new Provider(new URL((newURL))); + autoSelectProvider(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + } + + private void autoSelectProvider() { + onItemSelectedLogic(); + showProgressBar(); + } + + private void setUpProviderAPIResultReceiver() { providerAPIResultReceiver = new ProviderAPIResultReceiver(new Handler(), this); providerAPIBroadcastReceiver = new ProviderAPIBroadcastReceiver(); @@ -208,7 +235,7 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity adapter.add(provider); adapter.saveProviders(); if (provider.allowsAnonymous()) { - mConfigState.putExtra(SERVICES_RETRIEVED, true); + configState.putExtra(SERVICES_RETRIEVED, true); downloadVpnCertificate(); } else { showProviderDetails(); @@ -227,7 +254,7 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity void handleIncorrectlyDownloadedCertificate() { cancelSettingUpProvider(); - setResult(RESULT_CANCELED, mConfigState); + setResult(RESULT_CANCELED, configState); } @Override @@ -243,8 +270,8 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity @OnItemClick(R.id.provider_list) void onItemSelected(int position) { - if (SETTING_UP_PROVIDER.equals(mConfigState.getAction()) || - SHOW_FAILED_DIALOG.equals(mConfigState.getAction())) { + if (SETTING_UP_PROVIDER.equals(configState.getAction()) || + SHOW_FAILED_DIALOG.equals(configState.getAction())) { return; } @@ -252,7 +279,7 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity provider = adapter.getItem(position); if (provider != null && !provider.isDefault()) { //TODO Code 2 pane view - mConfigState.setAction(SETTING_UP_PROVIDER); + configState.setAction(SETTING_UP_PROVIDER); showProgressBar(); onItemSelectedLogic(); } else { @@ -262,28 +289,24 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity @Override public void onBackPressed() { - if (SETTING_UP_PROVIDER.equals(mConfigState.getAction()) || - SHOW_FAILED_DIALOG.equals(mConfigState.getAction())) { - stopSettingUpProvider(); + if (SETTING_UP_PROVIDER.equals(configState.getAction()) || + SHOW_FAILED_DIALOG.equals(configState.getAction())) { + cancelSettingUpProvider(); } else { super.onBackPressed(); } } - private void stopSettingUpProvider() { - cancelSettingUpProvider(); - } - @Override public void cancelSettingUpProvider() { - mConfigState.setAction(PROVIDER_NOT_SET); + configState.setAction(PROVIDER_NOT_SET); provider = null; hideProgressBar(); } @Override public void updateProviderDetails() { - mConfigState.setAction(SETTING_UP_PROVIDER); + configState.setAction(SETTING_UP_PROVIDER); ProviderAPICommand.execute(this, UPDATE_PROVIDER_DETAILS, provider); } @@ -298,28 +321,24 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity ProviderAPICommand.execute(this, DOWNLOAD_VPN_CERTIFICATE, provider); } + /** * Open the new provider dialog */ public void addAndSelectNewProvider() { - addAndSelectNewProvider(null); + Intent intent = new Intent(this, AddProviderActivity.class); + startActivityForResult(intent, REQUEST_CODE_ADD_PROVIDER); } /** * Open the new provider dialog - * @param mainUrl - the main url of the provider to add - if null add a new provider */ - public void addAndSelectNewProvider(@Nullable String mainUrl) { - FragmentTransaction fragmentTransaction = fragmentManager.removePreviousFragment(NewProviderDialog.TAG); - - DialogFragment newFragment = new NewProviderDialog(); - - if (mainUrl != null) { - Bundle data = new Bundle(); - data.putString(Provider.MAIN_URL, mainUrl); - newFragment.setArguments(data); - } - newFragment.show(fragmentTransaction, NewProviderDialog.TAG); + @Override + public void addAndSelectNewProvider(String url) { + testNewURL = false; + Intent intent = new Intent(this, AddProviderActivity.class); + intent.putExtra(EXTRAS_KEY_INVALID_URL, url); + startActivityForResult(intent, REQUEST_CODE_ADD_PROVIDER); } /** @@ -327,12 +346,12 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity */ public void showDownloadFailedDialog() { try { - mConfigState.setAction(SHOW_FAILED_DIALOG); + configState.setAction(SHOW_FAILED_DIALOG); FragmentTransaction fragmentTransaction = fragmentManager.removePreviousFragment(ProviderSetupFailedDialog.TAG); DialogFragment newFragment; try { JSONObject errorJson = new JSONObject(reasonToFail); - newFragment = ProviderSetupFailedDialog.newInstance(provider, errorJson); + newFragment = ProviderSetupFailedDialog.newInstance(provider, errorJson, testNewURL); } catch (JSONException e) { e.printStackTrace(); newFragment = ProviderSetupFailedDialog.newInstance(provider, reasonToFail); @@ -343,23 +362,20 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity newFragment.show(fragmentTransaction, ProviderSetupFailedDialog.TAG); } catch (IllegalStateException e) { e.printStackTrace(); - mConfigState.setAction(PENDING_SHOW_FAILED_DIALOG); + configState.setAction(PENDING_SHOW_FAILED_DIALOG); } - } /** * Once selected a provider, this fragment offers the user to log in, * use it anonymously (if possible) * or cancel his/her election pressing the back button. - * - * */ public void showProviderDetails() { // show only if current activity is shown - if (isActivityShowing && mConfigState.getAction() != null && - !mConfigState.getAction().equalsIgnoreCase(SHOWING_PROVIDER_DETAILS)) { - mConfigState.setAction(SHOWING_PROVIDER_DETAILS); + if (isActivityShowing && configState.getAction() != null && + !configState.getAction().equalsIgnoreCase(SHOWING_PROVIDER_DETAILS)) { + configState.setAction(SHOWING_PROVIDER_DETAILS); Intent intent = new Intent(this, ProviderDetailActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); intent.putExtra(PROVIDER_KEY, provider); @@ -377,8 +393,8 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity return; } - if (mConfigState.getAction() != null && - mConfigState.getAction().equalsIgnoreCase(SETTING_UP_PROVIDER)) { + if (configState.getAction() != null && + configState.getAction().equalsIgnoreCase(SETTING_UP_PROVIDER)) { int resultCode = intent.getIntExtra(BROADCAST_RESULT_CODE, RESULT_CANCELED); Log.d(TAG, "Broadcast resultCode: " + Integer.toString(resultCode)); diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderSetupFailedDialog.java b/app/src/main/java/se/leap/bitmaskclient/ProviderSetupFailedDialog.java index 5bd9575e..3cfae776 100644 --- a/app/src/main/java/se/leap/bitmaskclient/ProviderSetupFailedDialog.java +++ b/app/src/main/java/se/leap/bitmaskclient/ProviderSetupFailedDialog.java @@ -52,7 +52,8 @@ public class ProviderSetupFailedDialog extends DialogFragment { DEFAULT, ERROR_CORRUPTED_PROVIDER_JSON, ERROR_INVALID_CERTIFICATE, - ERROR_CERTIFICATE_PINNING + ERROR_CERTIFICATE_PINNING, + ERROR_NEW_URL_NO_VPN_PROVIDER } /** @@ -68,7 +69,7 @@ public class ProviderSetupFailedDialog extends DialogFragment { /** * @return a new instance of this DialogFragment. */ - public static DialogFragment newInstance(Provider provider, JSONObject errorJson) { + public static DialogFragment newInstance(Provider provider, JSONObject errorJson, boolean testNewURL) { ProviderSetupFailedDialog dialogFragment = new ProviderSetupFailedDialog(); dialogFragment.provider = provider; try { @@ -81,6 +82,8 @@ public class ProviderSetupFailedDialog extends DialogFragment { if (errorJson.has(ERRORID)) { dialogFragment.downloadError = valueOf(errorJson.getString(ERRORID)); + } else if (testNewURL) { + dialogFragment.downloadError = DOWNLOAD_ERRORS.ERROR_NEW_URL_NO_VPN_PROVIDER; } } catch (Exception e) { e.printStackTrace(); @@ -123,6 +126,13 @@ public class ProviderSetupFailedDialog extends DialogFragment { } }); break; + case ERROR_NEW_URL_NO_VPN_PROVIDER: + builder.setPositiveButton(R.string.retry, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + interfaceWithConfigurationWizard.addAndSelectNewProvider(provider.getMainUrlString()); + } + }); + break; default: builder.setPositiveButton(R.string.retry, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { @@ -142,6 +152,8 @@ public class ProviderSetupFailedDialog extends DialogFragment { void cancelSettingUpProvider(); void updateProviderDetails(); + + void addAndSelectNewProvider(String url); } DownloadFailedDialogInterface interfaceWithConfigurationWizard; diff --git a/app/src/main/java/se/leap/bitmaskclient/utils/ViewHelper.java b/app/src/main/java/se/leap/bitmaskclient/utils/ViewHelper.java new file mode 100644 index 00000000..86af3479 --- /dev/null +++ b/app/src/main/java/se/leap/bitmaskclient/utils/ViewHelper.java @@ -0,0 +1,18 @@ +package se.leap.bitmaskclient.utils; + +import android.content.Context; +import android.content.res.Resources; +import android.support.annotation.DimenRes; +import android.util.DisplayMetrics; + +/** + * Created by cyberta on 29.06.18. + */ + +public class ViewHelper { + + public static int convertDimensionToPx(Context context, @DimenRes int dimension) { + return context.getResources().getDimensionPixelSize(dimension); + } + +} diff --git a/app/src/main/java/se/leap/bitmaskclient/views/ProviderHeaderView.java b/app/src/main/java/se/leap/bitmaskclient/views/ProviderHeaderView.java new file mode 100644 index 00000000..ab5d6bc8 --- /dev/null +++ b/app/src/main/java/se/leap/bitmaskclient/views/ProviderHeaderView.java @@ -0,0 +1,109 @@ +package se.leap.bitmaskclient.views; + +import android.content.Context; +import android.support.annotation.DrawableRes; +import android.support.annotation.RequiresApi; +import android.support.annotation.StringRes; +import android.support.v7.widget.AppCompatImageView; +import android.support.v7.widget.AppCompatTextView; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.RelativeLayout; + +import se.leap.bitmaskclient.R; + +import static se.leap.bitmaskclient.utils.ViewHelper.convertDimensionToPx; + +/** + * Created by cyberta on 29.06.18. + */ + +public class ProviderHeaderView extends RelativeLayout { + private int stdPadding; + private int compactPadding; + private int stdImageSize; + private int compactImageSize; + + AppCompatImageView providerHeaderLogo; + AppCompatTextView providerHeaderText; + + public ProviderHeaderView(Context context) { + super(context); + initLayout(context); + } + + public ProviderHeaderView(Context context, AttributeSet attrs) { + super(context, attrs); + initLayout(context); + } + + public ProviderHeaderView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initLayout(context); + } + + @RequiresApi(21) + public ProviderHeaderView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + initLayout(context); + } + + + void initLayout(Context context) { + LayoutInflater inflater = (LayoutInflater) context + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View rootview = inflater.inflate(R.layout.v_provider_header, this, true); + providerHeaderLogo = rootview.findViewById(R.id.provider_header_logo); + providerHeaderText = rootview.findViewById(R.id.provider_header_text); + + stdPadding = convertDimensionToPx(context, R.dimen.stdpadding); + compactPadding = convertDimensionToPx(context, R.dimen.compact_padding); + stdImageSize = convertDimensionToPx(context, R.dimen.bitmask_logo); + compactImageSize = convertDimensionToPx(context, R.dimen.bitmask_logo_compact); + } + + public void setTitle(String title) { + providerHeaderText.setText(title); + } + + public void setTitle(@StringRes int stringRes) { + providerHeaderText.setText(stringRes); + } + + public void setLogo(@DrawableRes int drawableRes) { + providerHeaderLogo.setImageResource(drawableRes); + } + + public void showCompactLayout() { + LayoutParams logoLayoutParams = (LayoutParams) providerHeaderLogo.getLayoutParams(); + logoLayoutParams.width = compactImageSize; + logoLayoutParams.height = compactImageSize; + providerHeaderLogo.setLayoutParams(logoLayoutParams); + + LayoutParams textLayoutParams = (LayoutParams) providerHeaderText.getLayoutParams(); + textLayoutParams.addRule(RIGHT_OF, R.id.provider_header_logo); + textLayoutParams.addRule(BELOW, 0); + textLayoutParams.addRule(ALIGN_TOP, R.id.provider_header_logo); + textLayoutParams.setMargins(compactPadding, compactPadding, compactPadding, compactPadding); + + providerHeaderText.setLayoutParams(textLayoutParams); + providerHeaderText.setMaxLines(2); + } + + public void showStandardLayout() { + LayoutParams logoLayoutParams = (LayoutParams) providerHeaderLogo.getLayoutParams(); + logoLayoutParams.width = stdImageSize; + logoLayoutParams.height = stdImageSize; + providerHeaderLogo.setLayoutParams(logoLayoutParams); + + LayoutParams textLayoutParams = (LayoutParams) providerHeaderText.getLayoutParams(); + textLayoutParams.addRule(RIGHT_OF, 0); + textLayoutParams.addRule(BELOW, R.id.provider_header_logo); + textLayoutParams.addRule(ALIGN_TOP, 0); + textLayoutParams.setMargins(stdPadding, stdPadding, stdPadding, stdPadding); + providerHeaderText.setLayoutParams(textLayoutParams); + providerHeaderText.setMaxLines(1); + } + +} diff --git a/app/src/main/res/layout-sw600dp-port/a_add_provider.xml b/app/src/main/res/layout-sw600dp-port/a_add_provider.xml new file mode 100644 index 00000000..6f43778b --- /dev/null +++ b/app/src/main/res/layout-sw600dp-port/a_add_provider.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + style="@style/BitmaskActivity" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".ProviderCredentialsBaseActivity"> + + <android.support.v7.widget.AppCompatImageView + android:layout_width="match_parent" + android:layout_height="match_parent" + app:srcCompat="@drawable/ic_colorsquare" + android:scaleType="centerCrop" + /> + + <android.support.constraint.Guideline + android:id="@+id/guideline_left" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="vertical" + app:layout_constraintGuide_percent="0.2" /> + + <android.support.constraint.Guideline + android:id="@+id/guideline_right" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="vertical" + app:layout_constraintGuide_percent="0.8" /> + + <android.support.constraint.Guideline + android:id="@+id/guideline_top" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="horizontal" + app:layout_constraintGuide_percent="0.275" /> + + <android.support.constraint.Guideline + android:id="@+id/guideline_bottom" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="horizontal" + app:layout_constraintGuide_percent="0.725" /> + + <include layout="@layout/a_add_provider_tablet_scrollview"/> +</android.support.constraint.ConstraintLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout-sw600dp-port/a_provider_credentials.xml b/app/src/main/res/layout-sw600dp-port/a_provider_credentials.xml index 1d689db6..0aae8ede 100644 --- a/app/src/main/res/layout-sw600dp-port/a_provider_credentials.xml +++ b/app/src/main/res/layout-sw600dp-port/a_provider_credentials.xml @@ -42,60 +42,5 @@ android:orientation="horizontal" app:layout_constraintGuide_percent="0.725" /> - <LinearLayout - android:orientation="vertical" - style="@style/BitmaskActivity" - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_margin="@dimen/stdpadding" - android:padding="@dimen/stdpadding" - android:background="@color/colorBackground" - app:layout_constraintBottom_toTopOf="@+id/guideline_bottom" - app:layout_constraintEnd_toStartOf="@+id/guideline_right" - app:layout_constraintHeight_min="411dp" - app:layout_constraintStart_toStartOf="@+id/guideline_left" - app:layout_constraintTop_toTopOf="@+id/guideline_top" - app:layout_constraintWidth_min="731dp" - > - - <include layout="@layout/v_loading_screen" /> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:id="@+id/content" - android:orientation="vertical"> - - <include - layout="@layout/v_provider_header" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> - - - <ScrollView - android:layout_height="match_parent" - android:layout_width="match_parent" - android:isScrollContainer="true" - > - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - <include - layout="@layout/v_provider_credentials" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> - - <android.support.v7.widget.AppCompatButton - android:id="@+id/button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end" - android:text="@string/login_button" /> - - </LinearLayout> - </ScrollView> - </LinearLayout> - </LinearLayout> + <include layout="@layout/a_provider_credentials_tablet_linear_layout"/> </android.support.constraint.ConstraintLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout-sw600dp-port/a_provider_detail.xml b/app/src/main/res/layout-sw600dp-port/a_provider_detail.xml index 6d7c97ae..67ac1cfd 100644 --- a/app/src/main/res/layout-sw600dp-port/a_provider_detail.xml +++ b/app/src/main/res/layout-sw600dp-port/a_provider_detail.xml @@ -43,52 +43,5 @@ android:orientation="horizontal" app:layout_constraintGuide_percent="0.725" /> - <LinearLayout - android:orientation="vertical" - android:padding="@dimen/stdpadding" - style="@style/BitmaskActivity" - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_margin="@dimen/stdpadding" - android:background="@color/colorBackground" - app:layout_constraintBottom_toTopOf="@+id/guideline_bottom" - app:layout_constraintEnd_toStartOf="@+id/guideline_right" - app:layout_constraintHeight_min="411dp" - app:layout_constraintStart_toStartOf="@+id/guideline_left" - app:layout_constraintTop_toTopOf="@+id/guideline_top" - app:layout_constraintWidth_min="731dp"> - - <include layout="@layout/v_loading_screen" /> - - <LinearLayout - android:id="@+id/content" - android:orientation="vertical" - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <include - layout="@layout/v_provider_header" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> - - <android.support.v7.widget.AppCompatTextView - android:id="@+id/provider_detail_description" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textStyle="normal" - android:textAppearance="?android:attr/textAppearanceMedium" - android:layout_marginTop="@dimen/standard_margin" - android:layout_marginBottom="@dimen/standard_margin" - /> - - <ListView - android:id="@+id/provider_detail_options" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/list_view_margin_top" - android:drawSelectorOnTop="false" - /> - - </LinearLayout> - </LinearLayout> + <include layout="@layout/a_provider_detail_tablet_linear_layout" /> </android.support.constraint.ConstraintLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout-sw600dp-port/a_provider_list.xml b/app/src/main/res/layout-sw600dp-port/a_provider_list.xml index 818ce864..fbfba403 100644 --- a/app/src/main/res/layout-sw600dp-port/a_provider_list.xml +++ b/app/src/main/res/layout-sw600dp-port/a_provider_list.xml @@ -43,41 +43,5 @@ android:orientation="horizontal" app:layout_constraintGuide_percent="0.725" /> - <LinearLayout - android:orientation="vertical" - android:padding="@dimen/stdpadding" - style="@style/BitmaskActivity" - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_margin="@dimen/stdpadding" - android:background="@color/colorBackground" - app:layout_constraintBottom_toTopOf="@+id/guideline_bottom" - app:layout_constraintEnd_toStartOf="@+id/guideline_right" - app:layout_constraintHeight_min="411dp" - app:layout_constraintStart_toStartOf="@+id/guideline_left" - app:layout_constraintTop_toTopOf="@+id/guideline_top" - app:layout_constraintWidth_min="731dp"> - - <include layout="@layout/v_loading_screen" /> - - <LinearLayout - android:id="@+id/content" - android:orientation="vertical" - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <include layout="@layout/v_provider_header" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> - - <ListView - android:id="@+id/provider_list" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:drawSelectorOnTop="false" - android:layout_marginTop="@dimen/list_view_margin_top" - /> - - </LinearLayout> - </LinearLayout> + <include layout="@layout/a_provider_list_tablet_linear_layout" /> </android.support.constraint.ConstraintLayout> diff --git a/app/src/main/res/layout-xlarge/a_add_provider.xml b/app/src/main/res/layout-xlarge/a_add_provider.xml new file mode 100644 index 00000000..1bca612e --- /dev/null +++ b/app/src/main/res/layout-xlarge/a_add_provider.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + style="@style/BitmaskActivity" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".ProviderCredentialsBaseActivity"> + + <android.support.v7.widget.AppCompatImageView + android:layout_width="match_parent" + android:layout_height="match_parent" + app:srcCompat="@drawable/ic_colorsquare" + android:scaleType="centerCrop" + /> + + <android.support.constraint.Guideline + android:id="@+id/guideline_left" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="vertical" + app:layout_constraintGuide_percent="0.2" /> + + <android.support.constraint.Guideline + android:id="@+id/guideline_right" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="vertical" + app:layout_constraintGuide_percent="0.8" /> + + <android.support.constraint.Guideline + android:id="@+id/guideline_top" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="horizontal" + app:layout_constraintGuide_percent="0.15" /> + + <android.support.constraint.Guideline + android:id="@+id/guideline_bottom" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="horizontal" + app:layout_constraintGuide_percent="0.85" /> + + <include layout="@layout/a_add_provider_tablet_scrollview"/> +</android.support.constraint.ConstraintLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout-xlarge/a_provider_credentials.xml b/app/src/main/res/layout-xlarge/a_provider_credentials.xml index 79045082..f55f142c 100644 --- a/app/src/main/res/layout-xlarge/a_provider_credentials.xml +++ b/app/src/main/res/layout-xlarge/a_provider_credentials.xml @@ -42,59 +42,5 @@ android:orientation="horizontal" app:layout_constraintGuide_percent="0.85" /> - <LinearLayout - android:orientation="vertical" - style="@style/BitmaskActivity" - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_margin="@dimen/stdpadding" - android:padding="@dimen/stdpadding" - android:background="@color/colorBackground" - app:layout_constraintBottom_toTopOf="@+id/guideline_bottom" - app:layout_constraintEnd_toStartOf="@+id/guideline_right" - app:layout_constraintHeight_min="411dp" - app:layout_constraintStart_toStartOf="@+id/guideline_left" - app:layout_constraintTop_toTopOf="@+id/guideline_top" - app:layout_constraintWidth_min="731dp"> - - <include layout="@layout/v_loading_screen" /> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:id="@+id/content" - android:orientation="vertical"> - - <include - layout="@layout/v_provider_header" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> - - - <ScrollView - android:layout_height="match_parent" - android:layout_width="match_parent" - android:isScrollContainer="true" - > - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - <include - layout="@layout/v_provider_credentials" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> - - <android.support.v7.widget.AppCompatButton - android:id="@+id/button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end" - android:text="@string/login_button" /> - - </LinearLayout> - </ScrollView> - </LinearLayout> - </LinearLayout> + <include layout="@layout/a_provider_credentials_tablet_linear_layout"/> </android.support.constraint.ConstraintLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout-xlarge/a_provider_detail.xml b/app/src/main/res/layout-xlarge/a_provider_detail.xml index c1eeb0e0..ea677786 100644 --- a/app/src/main/res/layout-xlarge/a_provider_detail.xml +++ b/app/src/main/res/layout-xlarge/a_provider_detail.xml @@ -43,52 +43,5 @@ android:orientation="horizontal" app:layout_constraintGuide_percent="0.85" /> - <LinearLayout - android:orientation="vertical" - android:padding="@dimen/stdpadding" - style="@style/BitmaskActivity" - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_margin="@dimen/stdpadding" - android:background="@color/colorBackground" - app:layout_constraintBottom_toTopOf="@+id/guideline_bottom" - app:layout_constraintEnd_toStartOf="@+id/guideline_right" - app:layout_constraintHeight_min="411dp" - app:layout_constraintStart_toStartOf="@+id/guideline_left" - app:layout_constraintTop_toTopOf="@+id/guideline_top" - app:layout_constraintWidth_min="731dp"> - - <include layout="@layout/v_loading_screen" /> - - <LinearLayout - android:id="@+id/content" - android:orientation="vertical" - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <include - layout="@layout/v_provider_header" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> - - <android.support.v7.widget.AppCompatTextView - android:id="@+id/provider_detail_description" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textStyle="normal" - android:textAppearance="?android:attr/textAppearanceMedium" - android:layout_marginTop="@dimen/standard_margin" - android:layout_marginBottom="@dimen/standard_margin" - /> - - <ListView - android:id="@+id/provider_detail_options" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/list_view_margin_top" - android:drawSelectorOnTop="false" - /> - - </LinearLayout> - </LinearLayout> + <include layout="@layout/a_provider_detail_tablet_linear_layout" /> </android.support.constraint.ConstraintLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout-xlarge/a_provider_list.xml b/app/src/main/res/layout-xlarge/a_provider_list.xml index 9150466a..4e666a90 100644 --- a/app/src/main/res/layout-xlarge/a_provider_list.xml +++ b/app/src/main/res/layout-xlarge/a_provider_list.xml @@ -43,41 +43,5 @@ android:orientation="horizontal" app:layout_constraintGuide_percent="0.85" /> - <LinearLayout - android:orientation="vertical" - android:padding="@dimen/stdpadding" - style="@style/BitmaskActivity" - android:layout_width="0dp" - android:layout_height="0dp" - android:layout_margin="@dimen/stdpadding" - android:background="@color/colorBackground" - app:layout_constraintBottom_toTopOf="@+id/guideline_bottom" - app:layout_constraintEnd_toStartOf="@+id/guideline_right" - app:layout_constraintHeight_min="411dp" - app:layout_constraintStart_toStartOf="@+id/guideline_left" - app:layout_constraintTop_toTopOf="@+id/guideline_top" - app:layout_constraintWidth_min="731dp"> - - <include layout="@layout/v_loading_screen" /> - - <LinearLayout - android:id="@+id/content" - android:orientation="vertical" - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <include layout="@layout/v_provider_header" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> - - <ListView - android:id="@+id/provider_list" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:drawSelectorOnTop="false" - android:layout_marginTop="@dimen/list_view_margin_top" - /> - - </LinearLayout> - </LinearLayout> + <include layout="@layout/a_provider_list_tablet_linear_layout" /> </android.support.constraint.ConstraintLayout> diff --git a/app/src/main/res/layout-xlarge/v_provider_header.xml b/app/src/main/res/layout-xlarge/v_provider_header.xml index 45f8302b..6c06111a 100644 --- a/app/src/main/res/layout-xlarge/v_provider_header.xml +++ b/app/src/main/res/layout-xlarge/v_provider_header.xml @@ -1,11 +1,13 @@ <?xml version="1.0" encoding="utf-8"?> -<merge xmlns:android="http://schemas.android.com/apk/res/android" +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_height="wrap_content" + android:layout_width="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" > <android.support.v7.widget.AppCompatImageView android:id="@+id/provider_header_logo" - android:layout_width="@dimen/bitmask_logo_tablet" - android:layout_height="@dimen/bitmask_logo_tablet" + android:layout_width="@dimen/bitmask_logo" + android:layout_height="@dimen/bitmask_logo" android:adjustViewBounds="true" app:srcCompat="@drawable/mask" /> @@ -14,9 +16,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="" + android:ellipsize="end" + android:layout_below="@id/provider_header_logo" + android:gravity="center_vertical" android:textAppearance="@style/Base.TextAppearance.AppCompat.Headline" android:layout_marginTop="@dimen/standard_margin" android:layout_marginBottom="@dimen/standard_margin" /> -</merge>
\ No newline at end of file +</RelativeLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout/a_add_provider.xml b/app/src/main/res/layout/a_add_provider.xml new file mode 100644 index 00000000..c1322bef --- /dev/null +++ b/app/src/main/res/layout/a_add_provider.xml @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + style="@style/BitmaskActivity" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:padding="@dimen/stdpadding" + tools:context=".AddProviderActivity"> + + <LinearLayout + android:id="@+id/content" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_alignParentEnd="true" + android:layout_alignParentRight="true" + android:layout_alignParentTop="true" + android:orientation="vertical"> + + <!-- the header contains the mask--> + <se.leap.bitmaskclient.views.ProviderHeaderView + android:id="@+id/header" + android:layout_width="match_parent" + android:layout_height="wrap_content"/> + + <android.support.design.widget.TextInputLayout + android:id="@+id/text_uri_error" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/activity_vertical_margin" + android:hint="@string/new_provider_uri" + app:errorEnabled="true"> + + <android.support.design.widget.TextInputEditText + android:id="@+id/text_uri" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ems="10" + android:inputType="text" /> + + </android.support.design.widget.TextInputLayout> + + <RelativeLayout + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <CheckBox + android:id="@+id/danger_checkbox" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentLeft="true" + android:layout_alignParentStart="true" + android:visibility="gone" + android:layout_marginBottom="@dimen/add_button_margin" + /> + + <LinearLayout + android:id="@+id/button_container" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_alignParentRight="true" + android:layout_alignParentEnd="true" + android:gravity="right" + android:orientation="horizontal" + android:layout_below="@id/danger_checkbox"> + + <Button + android:id="@+id/button_cancel" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/cancel" /> + + <Button + android:id="@+id/button_save" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="@dimen/add_button_margin" + android:layout_marginStart="@dimen/add_button_margin" + android:enabled="false" + android:text="@string/save" /> + + </LinearLayout> + </RelativeLayout> + </LinearLayout> + +</RelativeLayout> diff --git a/app/src/main/res/layout/a_add_provider_tablet_scrollview.xml b/app/src/main/res/layout/a_add_provider_tablet_scrollview.xml new file mode 100644 index 00000000..132deba0 --- /dev/null +++ b/app/src/main/res/layout/a_add_provider_tablet_scrollview.xml @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="utf-8"?> +<ScrollView + android:orientation="vertical" + style="@style/BitmaskActivity" + android:layout_width="0dp" + android:layout_height="0dp" + app:layout_constraintBottom_toTopOf="@+id/guideline_bottom" + app:layout_constraintEnd_toStartOf="@+id/guideline_right" + app:layout_constraintHeight_min="411dp" + app:layout_constraintStart_toStartOf="@+id/guideline_left" + app:layout_constraintTop_toTopOf="@+id/guideline_top" + app:layout_constraintWidth_min="731dp" + android:layout_margin="@dimen/stdpadding" + android:padding="@dimen/stdpadding" + android:background="@color/colorBackground" + android:isScrollContainer="true" + android:fadeScrollbars="false" + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + + <LinearLayout + android:id="@+id/content" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <se.leap.bitmaskclient.views.ProviderHeaderView + android:id="@+id/header" + android:layout_width="match_parent" + android:layout_height="wrap_content"/> + + <android.support.design.widget.TextInputLayout + android:id="@+id/text_uri_error" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/activity_vertical_margin" + android:hint="@string/new_provider_uri" + app:errorEnabled="true"> + + <android.support.design.widget.TextInputEditText + android:id="@+id/text_uri" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:ems="10" + android:inputType="text" /> + + </android.support.design.widget.TextInputLayout> + + <RelativeLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + > + <CheckBox + android:id="@+id/danger_checkbox" + android:layout_alignParentLeft="true" + android:layout_alignParentStart="true" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:visibility="gone" + android:layout_marginBottom="@dimen/add_button_margin"/> + + <LinearLayout + android:id="@+id/button_container" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_alignParentEnd="true" + android:layout_alignParentRight="true" + android:gravity="right" + android:orientation="horizontal" + android:layout_below="@+id/danger_checkbox" + > + + <Button + android:id="@+id/button_cancel" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:minWidth="80dp" + android:text="@string/cancel" /> + + <Button + android:id="@+id/button_save" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:minWidth="80dp" + android:layout_marginLeft="@dimen/add_button_margin" + android:layout_marginStart="@dimen/add_button_margin" + android:enabled="false" + android:text="@string/save" /> + </LinearLayout> + </RelativeLayout> + </LinearLayout> +</ScrollView>
\ No newline at end of file diff --git a/app/src/main/res/layout/a_provider_credentials.xml b/app/src/main/res/layout/a_provider_credentials.xml index 5fefb2a3..99287cfe 100644 --- a/app/src/main/res/layout/a_provider_credentials.xml +++ b/app/src/main/res/layout/a_provider_credentials.xml @@ -16,8 +16,8 @@ android:layout_height="match_parent" > - <include - layout="@layout/v_provider_header" + <se.leap.bitmaskclient.views.ProviderHeaderView + android:id="@+id/header" android:layout_width="match_parent" android:layout_height="wrap_content" /> @@ -42,6 +42,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" + android:enabled="false" android:text="@string/login_button" /> </LinearLayout> diff --git a/app/src/main/res/layout/a_provider_credentials_tablet_linear_layout.xml b/app/src/main/res/layout/a_provider_credentials_tablet_linear_layout.xml new file mode 100644 index 00000000..b92a4bef --- /dev/null +++ b/app/src/main/res/layout/a_provider_credentials_tablet_linear_layout.xml @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:orientation="vertical" + style="@style/BitmaskActivity" + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_margin="@dimen/stdpadding" + android:padding="@dimen/stdpadding" + android:background="@color/colorBackground" + app:layout_constraintBottom_toTopOf="@+id/guideline_bottom" + app:layout_constraintEnd_toStartOf="@+id/guideline_right" + app:layout_constraintHeight_min="411dp" + app:layout_constraintStart_toStartOf="@+id/guideline_left" + app:layout_constraintTop_toTopOf="@+id/guideline_top" + app:layout_constraintWidth_min="731dp"> + + <include layout="@layout/v_loading_screen" /> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:id="@+id/content" + android:orientation="vertical"> + + <se.leap.bitmaskclient.views.ProviderHeaderView + android:id="@+id/header" + android:layout_width="match_parent" + android:layout_height="wrap_content"/> + + <ScrollView + android:layout_height="match_parent" + android:layout_width="match_parent" + android:isScrollContainer="true" + > + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + <include + layout="@layout/v_provider_credentials" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + + <android.support.v7.widget.AppCompatButton + android:id="@+id/button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end" + android:enabled="false" + android:text="@string/login_button" /> + + </LinearLayout> + </ScrollView> + </LinearLayout> +</LinearLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout/a_provider_detail.xml b/app/src/main/res/layout/a_provider_detail.xml index 56b38ada..11f4957d 100644 --- a/app/src/main/res/layout/a_provider_detail.xml +++ b/app/src/main/res/layout/a_provider_detail.xml @@ -15,8 +15,8 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - <include - layout="@layout/v_provider_header" + <se.leap.bitmaskclient.views.ProviderHeaderView + android:id="@+id/header" android:layout_width="match_parent" android:layout_height="wrap_content" /> diff --git a/app/src/main/res/layout/a_provider_detail_tablet_linear_layout.xml b/app/src/main/res/layout/a_provider_detail_tablet_linear_layout.xml new file mode 100644 index 00000000..17006d9c --- /dev/null +++ b/app/src/main/res/layout/a_provider_detail_tablet_linear_layout.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout + android:orientation="vertical" + android:padding="@dimen/stdpadding" + style="@style/BitmaskActivity" + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_margin="@dimen/stdpadding" + android:background="@color/colorBackground" + app:layout_constraintBottom_toTopOf="@+id/guideline_bottom" + app:layout_constraintEnd_toStartOf="@+id/guideline_right" + app:layout_constraintHeight_min="411dp" + app:layout_constraintStart_toStartOf="@+id/guideline_left" + app:layout_constraintTop_toTopOf="@+id/guideline_top" + app:layout_constraintWidth_min="731dp" + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + + <include layout="@layout/v_loading_screen" /> + + <LinearLayout + android:id="@+id/content" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <se.leap.bitmaskclient.views.ProviderHeaderView + android:id="@+id/header" + android:layout_width="match_parent" + android:layout_height="wrap_content"/> + + <android.support.v7.widget.AppCompatTextView + android:id="@+id/provider_detail_description" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textStyle="normal" + android:textAppearance="?android:attr/textAppearanceMedium" + android:layout_marginTop="@dimen/standard_margin" + android:layout_marginBottom="@dimen/standard_margin" + /> + + <ListView + android:id="@+id/provider_detail_options" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/list_view_margin_top" + android:drawSelectorOnTop="false" + /> + + </LinearLayout> +</LinearLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout/a_provider_list.xml b/app/src/main/res/layout/a_provider_list.xml index aa8cdfbb..2e2573eb 100644 --- a/app/src/main/res/layout/a_provider_list.xml +++ b/app/src/main/res/layout/a_provider_list.xml @@ -15,7 +15,10 @@ android:layout_height="match_parent" android:orientation="vertical"> - <include layout="@layout/v_provider_header" /> + <se.leap.bitmaskclient.views.ProviderHeaderView + android:id="@+id/header" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> <ListView android:id="@+id/provider_list" diff --git a/app/src/main/res/layout/a_provider_list_tablet_linear_layout.xml b/app/src/main/res/layout/a_provider_list_tablet_linear_layout.xml new file mode 100644 index 00000000..3c2b150d --- /dev/null +++ b/app/src/main/res/layout/a_provider_list_tablet_linear_layout.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout android:orientation="vertical" + android:padding="@dimen/stdpadding" + style="@style/BitmaskActivity" + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_margin="@dimen/stdpadding" + android:background="@color/colorBackground" + app:layout_constraintBottom_toTopOf="@+id/guideline_bottom" + app:layout_constraintEnd_toStartOf="@+id/guideline_right" + app:layout_constraintHeight_min="411dp" + app:layout_constraintStart_toStartOf="@+id/guideline_left" + app:layout_constraintTop_toTopOf="@+id/guideline_top" + app:layout_constraintWidth_min="731dp" + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + + <include layout="@layout/v_loading_screen" /> + + <LinearLayout + android:id="@+id/content" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <se.leap.bitmaskclient.views.ProviderHeaderView + android:id="@+id/header" + android:layout_width="match_parent" + android:layout_height="wrap_content"/> + + <ListView + android:id="@+id/provider_list" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:drawSelectorOnTop="false" + android:layout_marginTop="@dimen/list_view_margin_top" + /> + + </LinearLayout> +</LinearLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout/v_add_provider.xml b/app/src/main/res/layout/v_add_provider.xml new file mode 100644 index 00000000..44146fb5 --- /dev/null +++ b/app/src/main/res/layout/v_add_provider.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/loading_screen" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:visibility="gone"> + + <android.support.v7.widget.AppCompatImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:adjustViewBounds="true" + app:tint="@color/colorPrimary" + app:srcCompat="@drawable/action_history" + android:layout_marginTop="@dimen/loading_screen_icon_vertical_margin" + android:layout_marginBottom="@dimen/loading_screen_icon_vertical_margin" + /> + + <android.support.v7.widget.AppCompatTextView + android:id="@+id/progressbar_description" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:fadingEdge="horizontal" + android:singleLine="true" + android:text="@string/introduce_new_provider" + android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" + android:layout_marginTop="@dimen/standard_margin" + android:layout_marginBottom="@dimen/standard_margin" + /> + + <ProgressBar + android:id="@+id/progressbar" + style="@style/Widget.AppCompat.ProgressBar.Horizontal" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:indeterminate="true" + android:layout_marginTop="@dimen/standard_margin" + /> + +</LinearLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout/v_provider_header.xml b/app/src/main/res/layout/v_provider_header.xml index 6b08976c..d089b205 100644 --- a/app/src/main/res/layout/v_provider_header.xml +++ b/app/src/main/res/layout/v_provider_header.xml @@ -1,5 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> -<merge xmlns:android="http://schemas.android.com/apk/res/android" +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_height="wrap_content" + android:layout_width="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" > <android.support.v7.widget.AppCompatImageView @@ -13,10 +15,13 @@ android:id="@+id/provider_header_text" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_below="@id/provider_header_logo" android:text="" + android:ellipsize="end" + android:gravity="center_vertical" android:textAppearance="@style/Base.TextAppearance.AppCompat.Headline" android:layout_marginTop="@dimen/standard_margin" android:layout_marginBottom="@dimen/standard_margin" /> -</merge> +</RelativeLayout> diff --git a/app/src/main/res/values-sw600dp/dimens.xml b/app/src/main/res/values-sw600dp/dimens.xml index 100861fc..ec877dc8 100644 --- a/app/src/main/res/values-sw600dp/dimens.xml +++ b/app/src/main/res/values-sw600dp/dimens.xml @@ -6,5 +6,9 @@ <resources> <bool name="logSildersAlwaysVisible">true</bool> + <dimen name="bitmask_logo">72dp</dimen> + <dimen name="bitmask_logo_compact">56dp</dimen> + <dimen name="stdpadding">16dp</dimen> + <dimen name="compact_padding">6dp</dimen> </resources>
\ No newline at end of file diff --git a/app/src/main/res/values-sw600dp/styles.xml b/app/src/main/res/values-sw600dp/styles.xml deleted file mode 100644 index 387b2a81..00000000 --- a/app/src/main/res/values-sw600dp/styles.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright (c) 2012-2016 Arne Schwabe - ~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt - --> - -<resources> - - <dimen name="stdpadding">16dp</dimen> - -</resources>
\ No newline at end of file diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml index 63fc8164..654ea948 100644 --- a/app/src/main/res/values-w820dp/dimens.xml +++ b/app/src/main/res/values-w820dp/dimens.xml @@ -3,4 +3,8 @@ (such as screen margins) for screens with more than 820dp of available width. This would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). --> <dimen name="activity_horizontal_margin">64dp</dimen> + <dimen name="bitmask_logo">72dp</dimen> + <dimen name="bitmask_logo_compact">56dp</dimen> + <dimen name="compact_padding">6dp</dimen> + <dimen name="stdpadding">16dp</dimen> </resources> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index f160487b..10c32471 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -6,6 +6,7 @@ <resources> <dimen name="paddingItemsSidebarLog">20dp</dimen> <dimen name="stdpadding">8dp</dimen> + <dimen name="compact_padding">3dp</dimen> <dimen name="standard_margin">8dp</dimen> <dimen name="mainbutton_padding">20dp</dimen> <bool name="logSildersAlwaysVisible">false</bool> @@ -32,5 +33,10 @@ <dimen name="loading_screen_icon_vertical_margin">16dp</dimen> <dimen name="bitmask_logo">56dp</dimen> - <dimen name="bitmask_logo_tablet">72dp</dimen> + <dimen name="bitmask_logo_compact">42dp</dimen> + + <dimen name="constraint_top_std">0.15</dimen> + <dimen name="constraint_bottom_std">0.85</dimen> + <dimen name="constraint_top_compact">0.1</dimen> + <dimen name="constraint_bottom_compact">0.9</dimen> </resources>
\ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3aa00124..968ac2e0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -113,6 +113,7 @@ <string name="always_on_vpn">Always-on VPN</string> <string name="do_not_show_again">Do not show again.</string> <string name="always_on_vpn_user_message">To enable always-on VPN in Android VPN Settings click on the configure icon [img src] and turn the switch on."</string> + <string name="title_activity_provider_add">ProviderAddActivity</string> <string name="donate_title">Donate</string> <string name="donate_default_message">Please donate today if you value secure communication that is easy for both the end-user and the service provider.</string> <string name="donate_message">LEAP depends on donations and grants. Please donate today if you value secure communication that is easy for both the end-user and the service provider.</string> diff --git a/app/src/production/java/se/leap/bitmaskclient/AddProviderActivity.java b/app/src/production/java/se/leap/bitmaskclient/AddProviderActivity.java new file mode 100644 index 00000000..32c78c38 --- /dev/null +++ b/app/src/production/java/se/leap/bitmaskclient/AddProviderActivity.java @@ -0,0 +1,39 @@ +package se.leap.bitmaskclient; + +import android.content.Intent; +import android.os.Bundle; +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 android.widget.Button; + +import butterknife.InjectView; + +public class AddProviderActivity extends AddProviderBaseActivity { + + final public static String TAG = "AddProviderActivity"; + + @InjectView(R.id.button_save) + Button saveButton; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.a_add_provider); + init(); + + } + + + + @Override + public void setupSaveButton() { + saveButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + saveProvider(); + } + }); + } +} diff --git a/app/src/production/java/se/leap/bitmaskclient/NewProviderDialog.java b/app/src/production/java/se/leap/bitmaskclient/NewProviderDialog.java deleted file mode 100644 index cce49d9b..00000000 --- a/app/src/production/java/se/leap/bitmaskclient/NewProviderDialog.java +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Copyright (c) 2013 LEAP Encryption Access Project and contributers - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ -package se.leap.bitmaskclient; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.Context; -import android.content.DialogInterface; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.EditText; -import android.widget.Toast; - -import butterknife.ButterKnife; -import butterknife.InjectView; - -/** - * Implements the new custom provider dialog. - * - * @author parmegv - */ -public class NewProviderDialog extends DialogFragment { - - final public static String TAG = "newProviderDialog"; - - @InjectView(R.id.new_provider_url) - EditText urlInputField; - - public interface NewProviderDialogInterface { - void showAndSelectProvider(String url_provider); - } - - NewProviderDialogInterface interfaceWithConfigurationWizard; - - @Override - public void onAttach(Context context) { - super.onAttach(context); - try { - interfaceWithConfigurationWizard = (NewProviderDialogInterface) context; - } catch (ClassCastException e) { - throw new ClassCastException(context.toString() - + " must implement NoticeDialogListener"); - } - } - - @Override - @NonNull - public Dialog onCreateDialog(Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - LayoutInflater inflater = getActivity().getLayoutInflater(); - View view = inflater.inflate(R.layout.d_new_provider, null); - ButterKnife.inject(this, view); - Bundle arguments = getArguments(); - if (arguments != null) { - urlInputField.setText(arguments.getString(Provider.MAIN_URL, "")); - } - - builder.setView(view) - .setMessage(R.string.introduce_new_provider) - .setPositiveButton(R.string.save, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - saveProvider(); - } - }) - .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - } - }); - // Create the AlertDialog object and return it - return builder.create(); - } - - private void saveProvider() { - String entered_url = urlInputField.getText().toString().trim(); - if (!entered_url.startsWith("https://")) { - if (entered_url.startsWith("http://")) { - entered_url = entered_url.substring("http://".length()); - } - entered_url = "https://".concat(entered_url); - } - - if (validURL(entered_url)) { - interfaceWithConfigurationWizard.showAndSelectProvider(entered_url); - Toast.makeText(getActivity().getApplicationContext(), R.string.valid_url_entered, Toast.LENGTH_LONG).show(); - } else { - urlInputField.setText(""); - Toast.makeText(getActivity().getApplicationContext(), R.string.not_valid_url_entered, Toast.LENGTH_LONG).show(); - } - } - - /** - * Checks if the entered url is valid or not. - * - * @param enteredUrl - * @return true if it's not empty nor contains only the protocol. - */ - boolean validURL(String enteredUrl) { - //return !enteredUrl.isEmpty() && enteredUrl.matches("http[s]?://.+") && !enteredUrl.replaceFirst("http[s]?://", "").isEmpty(); - return android.util.Patterns.WEB_URL.matcher(enteredUrl).matches(); - } -} diff --git a/app/src/production/java/se/leap/bitmaskclient/ProviderListActivity.java b/app/src/production/java/se/leap/bitmaskclient/ProviderListActivity.java index cf1d1aa6..172c9e61 100644 --- a/app/src/production/java/se/leap/bitmaskclient/ProviderListActivity.java +++ b/app/src/production/java/se/leap/bitmaskclient/ProviderListActivity.java @@ -39,34 +39,18 @@ public class ProviderListActivity extends ProviderListBaseActivity { setUpProvider(); } - @Override - public void showAndSelectProvider(String provider_main_url) { - try { - provider = new Provider(new URL((provider_main_url))); - autoSelectProvider(provider); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - } - - private void autoSelectProvider(Provider provider) { - this.provider = provider; - onItemSelectedLogic(); - showProgressBar(); - } - /** * Asks ProviderAPI to download a new provider.json file * */ public void setUpProvider() { - mConfigState.setAction(SETTING_UP_PROVIDER); + configState.setAction(SETTING_UP_PROVIDER); ProviderAPICommand.execute(this, SET_UP_PROVIDER, provider); } @Override public void retrySetUpProvider(@NonNull Provider provider) { - mConfigState.setAction(SETTING_UP_PROVIDER); + configState.setAction(SETTING_UP_PROVIDER); ProviderAPICommand.execute(this, SET_UP_PROVIDER, provider); } |