diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileDetailActivity.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileDetailActivity.java
index 2af208d6f..29124ced7 100644
--- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileDetailActivity.java
+++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileDetailActivity.java
@@ -61,6 +61,7 @@ import org.strongswan.android.data.VpnType;
import org.strongswan.android.data.VpnType.VpnTypeFeature;
import org.strongswan.android.logic.TrustedCertificateManager;
import org.strongswan.android.security.TrustedCertificateEntry;
+import org.strongswan.android.ui.adapter.CertificateIdentitiesAdapter;
import org.strongswan.android.ui.widget.TextInputLayoutHelper;
import java.security.cert.X509Certificate;
@@ -75,6 +76,8 @@ public class VpnProfileDetailActivity extends AppCompatActivity
private Long mId;
private TrustedCertificateEntry mCertEntry;
private String mUserCertLoading;
+ private CertificateIdentitiesAdapter mSelectUserIdAdapter;
+ private String mSelectedUserId;
private TrustedCertificateEntry mUserCertEntry;
private VpnType mVpnType = VpnType.IKEV2_EAP;
private VpnProfile mProfile;
@@ -89,6 +92,7 @@ public class VpnProfileDetailActivity extends AppCompatActivity
private EditText mPassword;
private ViewGroup mUserCertificate;
private RelativeLayout mSelectUserCert;
+ private Spinner mSelectUserId;
private CheckBox mCheckAuto;
private RelativeLayout mSelectCert;
private RelativeLayout mTncNotice;
@@ -130,6 +134,7 @@ public class VpnProfileDetailActivity extends AppCompatActivity
mUserCertificate = (ViewGroup)findViewById(R.id.user_certificate_group);
mSelectUserCert = (RelativeLayout)findViewById(R.id.select_user_certificate);
+ mSelectUserId = (Spinner)findViewById(R.id.select_user_id);
mCheckAuto = (CheckBox)findViewById(R.id.ca_auto);
mSelectCert = (RelativeLayout)findViewById(R.id.select_certificate);
@@ -205,6 +210,24 @@ public class VpnProfileDetailActivity extends AppCompatActivity
});
mSelectUserCert.setOnClickListener(new SelectUserCertOnClickListener());
+ mSelectUserIdAdapter = new CertificateIdentitiesAdapter(this);
+ mSelectUserId.setAdapter(mSelectUserIdAdapter);
+ mSelectUserId.setOnItemSelectedListener(new OnItemSelectedListener() {
+ @Override
+ public void onItemSelected(AdapterView> parent, View view, int position, long id)
+ {
+ if (mUserCertEntry != null)
+ { /* we don't store the subject DN as it is in the reverse order and the default anyway */
+ mSelectedUserId = position == 0 ? null : mSelectUserIdAdapter.getItem(position);
+ }
+ }
+
+ @Override
+ public void onNothingSelected(AdapterView> parent)
+ {
+ mSelectedUserId = null;
+ }
+ });
mCheckAuto.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
@@ -265,6 +288,10 @@ public class VpnProfileDetailActivity extends AppCompatActivity
{
outState.putString(VpnProfileDataSource.KEY_USER_CERTIFICATE, mUserCertEntry.getAlias());
}
+ if (mSelectedUserId != null)
+ {
+ outState.putString(VpnProfileDataSource.KEY_LOCAL_ID, mSelectedUserId);
+ }
if (mCertEntry != null)
{
outState.putString(VpnProfileDataSource.KEY_CERTIFICATE, mCertEntry.getAlias());
@@ -326,6 +353,7 @@ public class VpnProfileDetailActivity extends AppCompatActivity
if (mVpnType.has(VpnTypeFeature.CERTIFICATE))
{
+ mSelectUserId.setEnabled(false);
if (mUserCertLoading != null)
{
((TextView)mSelectUserCert.findViewById(android.R.id.text1)).setText(mUserCertLoading);
@@ -336,11 +364,15 @@ public class VpnProfileDetailActivity extends AppCompatActivity
((TextView)mSelectUserCert.findViewById(android.R.id.text1)).setError(null);
((TextView)mSelectUserCert.findViewById(android.R.id.text1)).setText(mUserCertEntry.getAlias());
((TextView)mSelectUserCert.findViewById(android.R.id.text2)).setText(mUserCertEntry.getCertificate().getSubjectDN().toString());
+ mSelectUserIdAdapter.setCertificate(mUserCertEntry);
+ mSelectUserId.setSelection(mSelectUserIdAdapter.getPosition(mSelectedUserId));
+ mSelectUserId.setEnabled(true);
}
else
{
((TextView)mSelectUserCert.findViewById(android.R.id.text1)).setText(R.string.profile_user_select_certificate_label);
((TextView)mSelectUserCert.findViewById(android.R.id.text2)).setText(R.string.profile_user_select_certificate);
+ mSelectUserIdAdapter.setCertificate(null);
}
}
}
@@ -500,6 +532,7 @@ public class VpnProfileDetailActivity extends AppCompatActivity
if (mVpnType.has(VpnTypeFeature.CERTIFICATE))
{
mProfile.setUserCertificateAlias(mUserCertEntry.getAlias());
+ mProfile.setLocalId(mSelectedUserId);
}
String certAlias = mCheckAuto.isChecked() ? null : mCertEntry.getAlias();
mProfile.setCertificateAlias(certAlias);
@@ -520,7 +553,7 @@ public class VpnProfileDetailActivity extends AppCompatActivity
*/
private void loadProfileData(Bundle savedInstanceState)
{
- String useralias = null, alias = null;
+ String useralias = null, local_id = null, alias = null;
getSupportActionBar().setTitle(R.string.add_profile);
if (mId != null && mId != 0)
@@ -539,6 +572,7 @@ public class VpnProfileDetailActivity extends AppCompatActivity
mBlockIPv4.setChecked(mProfile.getSplitTunneling() != null ? (mProfile.getSplitTunneling() & VpnProfile.SPLIT_TUNNELING_BLOCK_IPV4) != 0 : false);
mBlockIPv6.setChecked(mProfile.getSplitTunneling() != null ? (mProfile.getSplitTunneling() & VpnProfile.SPLIT_TUNNELING_BLOCK_IPV6) != 0 : false);
useralias = mProfile.getUserCertificateAlias();
+ local_id = mProfile.getLocalId();
alias = mProfile.getCertificateAlias();
getSupportActionBar().setTitle(mProfile.getName());
}
@@ -553,11 +587,13 @@ public class VpnProfileDetailActivity extends AppCompatActivity
mSelectVpnType.setSelection(mVpnType.ordinal());
/* check if the user selected a user certificate previously */
- useralias = savedInstanceState == null ? useralias: savedInstanceState.getString(VpnProfileDataSource.KEY_USER_CERTIFICATE);
+ useralias = savedInstanceState == null ? useralias : savedInstanceState.getString(VpnProfileDataSource.KEY_USER_CERTIFICATE);
+ local_id = savedInstanceState == null ? local_id : savedInstanceState.getString(VpnProfileDataSource.KEY_LOCAL_ID);
if (useralias != null)
{
UserCertificateLoader loader = new UserCertificateLoader(this, useralias);
mUserCertLoading = useralias;
+ mSelectedUserId = local_id;
loader.execute();
}
diff --git a/src/frontends/android/app/src/main/res/layout/profile_detail_view.xml b/src/frontends/android/app/src/main/res/layout/profile_detail_view.xml
index 847228950..08881b38c 100644
--- a/src/frontends/android/app/src/main/res/layout/profile_detail_view.xml
+++ b/src/frontends/android/app/src/main/res/layout/profile_detail_view.xml
@@ -122,6 +122,20 @@
android:id="@+id/select_user_certificate"
layout="@layout/two_line_button" />
+
+
+
+