diff options
Diffstat (limited to 'app')
7 files changed, 223 insertions, 11 deletions
diff --git a/app/src/main/java/se/leap/bitmaskclient/Constants.java b/app/src/main/java/se/leap/bitmaskclient/Constants.java index d719e8d3..c79ce87b 100644 --- a/app/src/main/java/se/leap/bitmaskclient/Constants.java +++ b/app/src/main/java/se/leap/bitmaskclient/Constants.java @@ -19,6 +19,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/ProviderListBaseActivity.java b/app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java index 5f73a074..756264ec 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/>. */ @@ -50,6 +50,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; @@ -88,7 +89,7 @@ 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"; @@ -101,6 +102,7 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity private boolean isActivityShowing; private String reasonToFail; + private boolean testNewURL; public abstract void retrySetUpProvider(@NonNull Provider provider); @@ -191,6 +193,11 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity setResult(resultCode, data); finish(); } + } else if (requestCode == REQUEST_CODE_ADD_PROVIDER) { + if (resultCode == RESULT_OK) { + testNewURL = true; + showAndSelectProvider(data.getStringExtra("new_url")); + } } } @@ -216,6 +223,7 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity } void handleProviderSetupFailed(Bundle resultData) { + reasonToFail = resultData.getString(ERRORS); showDownloadFailedDialog(); } @@ -304,9 +312,21 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity */ public void addAndSelectNewProvider() { FragmentTransaction fragmentTransaction = fragmentManager.removePreviousFragment(NewProviderDialog.TAG); + Intent intent = new Intent(this, AddProviderActivity.class); + startActivityForResult(intent, REQUEST_CODE_ADD_PROVIDER); + //ToDo: Delete NewProviderDialog() + } - DialogFragment newFragment = new NewProviderDialog(); - newFragment.show(fragmentTransaction, NewProviderDialog.TAG); + /** + * Open the new provider dialog + */ + @Override + public void addAndSelectNewProvider(String url) { + testNewURL = false; + FragmentTransaction fragmentTransaction = fragmentManager.removePreviousFragment(NewProviderDialog.TAG); + Intent intent = new Intent(this, AddProviderActivity.class); + intent.putExtra("invalid_url", url); + startActivityForResult(intent, REQUEST_CODE_ADD_PROVIDER); } /** @@ -319,7 +339,7 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity 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); @@ -339,8 +359,6 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity * 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 diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderSetupFailedDialog.java b/app/src/main/java/se/leap/bitmaskclient/ProviderSetupFailedDialog.java index 5bd9575e..3d0bdbdb 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.getApiUrlString()); + } + }); + 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/res/layout/a_add_provider.xml b/app/src/main/res/layout/a_add_provider.xml new file mode 100644 index 00000000..14bf8482 --- /dev/null +++ b/app/src/main/res/layout/a_add_provider.xml @@ -0,0 +1,47 @@ +<?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" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".AddProviderActivity" + android:padding="@dimen/stdpadding" + style="@style/BitmaskActivity"> + + <!--Contains header information!??? --> + <include layout="@layout/v_add_provider" /> + + <LinearLayout + android:id="@+id/content" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <!-- the header contains the mask--> + <include layout="@layout/v_provider_header" /> + + <EditText + android:id="@+id/textUri" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:hint="@string/new_provider_uri" + android:inputType="text" + android:padding="@dimen/stdpadding"/> + <!-- android:imeOptions="actionSend" => was passieren soll, wenn ok geklickt wird --> + + + <Button + android:id="@+id/button_save" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:text="@string/save" /> + + <Button + android:id="@+id/button_cancel" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:text="@string/cancel" /> + + </LinearLayout> + +</RelativeLayout> 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/values/strings.xml b/app/src/main/res/values/strings.xml index a308b5e7..77bac436 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -113,4 +113,5 @@ <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> </resources> 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..8c7dcbf5 --- /dev/null +++ b/app/src/production/java/se/leap/bitmaskclient/AddProviderActivity.java @@ -0,0 +1,92 @@ +package se.leap.bitmaskclient; + +import android.content.Intent; +import android.os.Bundle; +import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.Snackbar; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + +public class AddProviderActivity extends ConfigWizardBaseActivity { + + private EditText editText; + final public static String TAG = "AddProviderActivity"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.a_add_provider); + editText = findViewById(R.id.textUri); + if (this.getIntent().getExtras() != null) { + editText.setText(this.getIntent().getExtras().getString("invalid_url")); + } + final Button saveButton = findViewById(R.id.button_save); + saveButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + Log.d(TAG, "On Click when save works"); + saveProvider(); + } + }); + + final Button cancelButton = findViewById(R.id.button_cancel); + cancelButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + finish(); + //ToDo: Implement this and set testNewURL in ProviderListBaseActivty false!! + /* Intent intent= new Intent(); + intent.putExtra("new_url", entered_url); + setResult(RESULT_NOT_OK, intent); + finish();*/ + } + }); + setUpInitialUI(); + } + + private void setUpInitialUI() { + //ToDo: find out if needed: + // setContentView(R.layout.a_provider_list); + setProviderHeaderText(R.string.add_provider); + hideProgressBar(); + } + + + private void saveProvider() { + String entered_url = editText.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); + } + Log.d(TAG, "Behind https addition"); + if (validURL(entered_url)) { + Log.d(TAG, "URL seems fine"); + Intent intent = this.getIntent(); + intent.putExtra("new_url", entered_url); + setResult(RESULT_OK, intent); + finish(); + } else { + Log.d(TAG, "Bad URL."); + editText.setText(""); + Toast.makeText(this.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 android.util.Patterns.WEB_URL.matcher(enteredUrl).matches(); + } + + +} |