package de.blinkt.openvpn; import android.content.Context; import android.preference.DialogPreference; import android.util.AttributeSet; import android.util.Pair; import android.view.View; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ScrollView; import android.widget.Spinner; import android.widget.TextView; public class RemoteCNPreference extends DialogPreference { private Spinner mSpinner; private EditText mEditText; private int mDNType; private String mDn; private TextView mRemoteTLSNote; //private ScrollView mScrollView; public RemoteCNPreference(Context context, AttributeSet attrs) { super(context, attrs); setDialogLayoutResource(R.layout.tlsremote); } @Override protected void onBindDialogView(View view) { super.onBindDialogView(view); mEditText = (EditText) view.findViewById(R.id.tlsremotecn); mSpinner = (Spinner) view.findViewById(R.id.x509verifytype); mRemoteTLSNote = (TextView) view.findViewById(R.id.tlsremotenote); //mScrollView = (ScrollView) view.findViewById(R.id.tlsremotescroll); if(mDn!=null) mEditText.setText(mDn); populateSpinner(); } public String getCNText() { return mDn; } public int getAuthtype() { return mDNType; } public void setDN(String dn) { mDn = dn; if(mEditText!=null) mEditText.setText(dn); } void setAuthType(int x509authtype) { mDNType = x509authtype; if (mSpinner!=null) populateSpinner(); } @Override protected void onDialogClosed(boolean positiveResult) { super.onDialogClosed(positiveResult); if (positiveResult) { String dn = mEditText.getText().toString(); int authtype = getAuthTypeFromSpinner(); if (callChangeListener(new Pair(authtype, dn))) { mDn = dn; mDNType = authtype; } } } private void populateSpinner() { ArrayAdapter authtypes = new ArrayAdapter(getContext(), android.R.layout.simple_spinner_item); authtypes.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); authtypes.add(getContext().getString(R.string.complete_dn)); authtypes.add(getContext().getString(R.string.rdn)); authtypes.add(getContext().getString(R.string.rdn_prefix)); if ((mDNType == VpnProfile.X509_VERIFY_TLSREMOTE || mDNType == VpnProfile.X509_VERIFY_TLSREMOTE_COMPAT_NOREMAPPING) && !(mDn==null || "".equals(mDn))) { authtypes.add(getContext().getString(R.string.tls_remote_deprecated)); mRemoteTLSNote.setVisibility(View.VISIBLE); } else { mRemoteTLSNote.setVisibility(View.GONE); } mSpinner.setAdapter(authtypes); mSpinner.setSelection(getSpinnerPositionFromAuthTYPE()); } private int getSpinnerPositionFromAuthTYPE() { switch (mDNType) { case VpnProfile.X509_VERIFY_TLSREMOTE_DN: return 0; case VpnProfile.X509_VERIFY_TLSREMOTE_RDN: return 1; case VpnProfile.X509_VERIFY_TLSREMOTE_RDN_PREFIX: return 2; case VpnProfile.X509_VERIFY_TLSREMOTE_COMPAT_NOREMAPPING: case VpnProfile.X509_VERIFY_TLSREMOTE: if (mDn==null || "".equals(mDn)) return 1; else return 3; default: return 0; } } private int getAuthTypeFromSpinner() { int pos = mSpinner.getSelectedItemPosition(); switch (pos) { case 0: return VpnProfile.X509_VERIFY_TLSREMOTE_DN; case 1: return VpnProfile.X509_VERIFY_TLSREMOTE_RDN; case 2: return VpnProfile.X509_VERIFY_TLSREMOTE_RDN_PREFIX; case 3: // This is the tls-remote entry, only visible if mDntype is a // tls-remote type return mDNType; default: return VpnProfile.X509_VERIFY_TLSREMOTE; } } }