diff --git a/src/frontends/android/res/layout/profile_detail_view.xml b/src/frontends/android/res/layout/profile_detail_view.xml index d9ccca546..1ca562a18 100644 --- a/src/frontends/android/res/layout/profile_detail_view.xml +++ b/src/frontends/android/res/layout/profile_detail_view.xml @@ -56,28 +56,49 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" - android:text="@string/profile_username_label" /> + android:text="@string/profile_vpn_type_label" /> - + android:spinnerMode="dialog" + android:entries="@array/vpn_types" /> - + android:orientation="vertical" > - + + + + + + + + + + + + + + IKEv2 EAP (Benutzername/Passwort) + + \ No newline at end of file diff --git a/src/frontends/android/res/values-de/strings.xml b/src/frontends/android/res/values-de/strings.xml index 9f3f637a8..9e415ab8b 100644 --- a/src/frontends/android/res/values-de/strings.xml +++ b/src/frontends/android/res/values-de/strings.xml @@ -49,6 +49,7 @@ Profilname: (Gateway-Adresse verwenden) Gateway: + Typ: Benutzername: Passwort: (anfordern wenn benötigt) diff --git a/src/frontends/android/res/values-pl/arrays.xml b/src/frontends/android/res/values-pl/arrays.xml new file mode 100644 index 000000000..ed14934e0 --- /dev/null +++ b/src/frontends/android/res/values-pl/arrays.xml @@ -0,0 +1,21 @@ + + + + + + IKEv2 EAP (użytkownik/hasło) + + \ No newline at end of file diff --git a/src/frontends/android/res/values-pl/strings.xml b/src/frontends/android/res/values-pl/strings.xml index e7d4670d9..4a474e88b 100644 --- a/src/frontends/android/res/values-pl/strings.xml +++ b/src/frontends/android/res/values-pl/strings.xml @@ -51,6 +51,7 @@ Nazwa profilu: (użyj adresu bramki) Bramka: + Typ: Użytkownik: Hasło: (w razie potrzebz zapromptuj) diff --git a/src/frontends/android/res/values/arrays.xml b/src/frontends/android/res/values/arrays.xml new file mode 100644 index 000000000..62164f7c2 --- /dev/null +++ b/src/frontends/android/res/values/arrays.xml @@ -0,0 +1,21 @@ + + + + + + IKEv2 EAP (Username/Password) + + \ No newline at end of file diff --git a/src/frontends/android/res/values/strings.xml b/src/frontends/android/res/values/strings.xml index bc7fa4a1d..29cd6430b 100644 --- a/src/frontends/android/res/values/strings.xml +++ b/src/frontends/android/res/values/strings.xml @@ -49,6 +49,7 @@ Profile Name: (use gateway address) Gateway: + Type: Username: Password: (prompt when needed) diff --git a/src/frontends/android/src/org/strongswan/android/data/VpnType.java b/src/frontends/android/src/org/strongswan/android/data/VpnType.java index 35b32da53..44a4fa6b4 100644 --- a/src/frontends/android/src/org/strongswan/android/data/VpnType.java +++ b/src/frontends/android/src/org/strongswan/android/data/VpnType.java @@ -17,6 +17,7 @@ package org.strongswan.android.data; public enum VpnType { + /* the order here must match the items in R.array.vpn_types */ IKEV2_EAP("ikev2-eap", true, false), IKEV2_CERT("ikev2-cert", false, true); diff --git a/src/frontends/android/src/org/strongswan/android/ui/VpnProfileDetailActivity.java b/src/frontends/android/src/org/strongswan/android/ui/VpnProfileDetailActivity.java index 73365b40c..73fa3017b 100644 --- a/src/frontends/android/src/org/strongswan/android/ui/VpnProfileDetailActivity.java +++ b/src/frontends/android/src/org/strongswan/android/ui/VpnProfileDetailActivity.java @@ -23,6 +23,7 @@ import org.strongswan.android.R; import org.strongswan.android.data.TrustedCertificateEntry; import org.strongswan.android.data.VpnProfile; import org.strongswan.android.data.VpnProfileDataSource; +import org.strongswan.android.data.VpnType; import org.strongswan.android.logic.TrustedCertificateManager; import android.app.Activity; @@ -36,11 +37,15 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemSelectedListener; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.EditText; import android.widget.RelativeLayout; +import android.widget.Spinner; import android.widget.TextView; public class VpnProfileDetailActivity extends Activity @@ -50,9 +55,12 @@ public class VpnProfileDetailActivity extends Activity private VpnProfileDataSource mDataSource; private Long mId; private TrustedCertificateEntry mCertEntry; + private VpnType mVpnType = VpnType.IKEV2_EAP; private VpnProfile mProfile; private EditText mName; private EditText mGateway; + private Spinner mSelectVpnType; + private ViewGroup mUsernamePassword; private EditText mUsername; private EditText mPassword; private CheckBox mCheckAuto; @@ -60,7 +68,6 @@ public class VpnProfileDetailActivity extends Activity private TextView mCertTitle; private TextView mCertSubtitle; - @Override public void onCreate(Bundle savedInstanceState) { @@ -75,15 +82,35 @@ public class VpnProfileDetailActivity extends Activity setContentView(R.layout.profile_detail_view); mName = (EditText)findViewById(R.id.name); - mPassword = (EditText)findViewById(R.id.password); mGateway = (EditText)findViewById(R.id.gateway); + mSelectVpnType = (Spinner)findViewById(R.id.vpn_type); + + mUsernamePassword = (ViewGroup)findViewById(R.id.username_password_group); mUsername = (EditText)findViewById(R.id.username); + mPassword = (EditText)findViewById(R.id.password); mCheckAuto = (CheckBox)findViewById(R.id.ca_auto); mSelectCert = (RelativeLayout)findViewById(R.id.select_certificate); mCertTitle = (TextView)findViewById(R.id.select_certificate_title); mCertSubtitle = (TextView)findViewById(R.id.select_certificate_subtitle); + + mSelectVpnType.setOnItemSelectedListener(new OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) + { + mVpnType = VpnType.values()[position]; + updateClientCredentialView(); + } + + @Override + public void onNothingSelected(AdapterView parent) + { /* should not happen */ + mVpnType = VpnType.IKEV2_EAP; + updateClientCredentialView(); + } + }); + mCheckAuto.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) @@ -110,6 +137,7 @@ public class VpnProfileDetailActivity extends Activity loadProfileData(savedInstanceState); + updateClientCredentialView(); updateCertificateSelector(); } @@ -178,6 +206,14 @@ public class VpnProfileDetailActivity extends Activity } } + /** + * Update the UI to enter client credentials depending on the type of VPN currently selected + */ + private void updateClientCredentialView() + { + mUsernamePassword.setVisibility(mVpnType.getRequiresUsernamePassword() ? View.VISIBLE : View.GONE); + } + /** * Show an alert in case the previously selected certificate is not found anymore * or the user did not select a certificate in the spinner. @@ -262,10 +298,13 @@ public class VpnProfileDetailActivity extends Activity mGateway.setError(getString(R.string.alert_text_no_input_gateway)); valid = false; } - if (mUsername.getText().toString().trim().isEmpty()) + if (mVpnType.getRequiresUsernamePassword()) { - mUsername.setError(getString(R.string.alert_text_no_input_username)); - valid = false; + if (mUsername.getText().toString().trim().isEmpty()) + { + mUsername.setError(getString(R.string.alert_text_no_input_username)); + valid = false; + } } if (!mCheckAuto.isChecked() && mCertEntry == null) { @@ -285,10 +324,14 @@ public class VpnProfileDetailActivity extends Activity String gateway = mGateway.getText().toString().trim(); mProfile.setName(name.isEmpty() ? gateway : name); mProfile.setGateway(gateway); - mProfile.setUsername(mUsername.getText().toString().trim()); - String password = mPassword.getText().toString().trim(); - password = password.isEmpty() ? null : password; - mProfile.setPassword(password); + mProfile.setVpnType(mVpnType); + if (mVpnType.getRequiresUsernamePassword()) + { + mProfile.setUsername(mUsername.getText().toString().trim()); + String password = mPassword.getText().toString().trim(); + password = password.isEmpty() ? null : password; + mProfile.setPassword(password); + } String certAlias = mCheckAuto.isChecked() ? null : mCertEntry.getAlias(); mProfile.setCertificateAlias(certAlias); } @@ -310,6 +353,7 @@ public class VpnProfileDetailActivity extends Activity { mName.setText(mProfile.getName()); mGateway.setText(mProfile.getGateway()); + mVpnType = mProfile.getVpnType(); mUsername.setText(mProfile.getUsername()); mPassword.setText(mProfile.getPassword()); alias = mProfile.getCertificateAlias(); @@ -323,6 +367,8 @@ public class VpnProfileDetailActivity extends Activity } } + mSelectVpnType.setSelection(mVpnType.ordinal()); + /* check if the user selected a certificate previously */ alias = savedInstanceState == null ? alias : savedInstanceState.getString(VpnProfileDataSource.KEY_CERTIFICATE); mCheckAuto.setChecked(alias == null);