/* Tibisay Movil Copyright (C) 2013 Antonio Araujo (aaraujo@cenditel.gob.ve), Jose Ruiz (jruiz@cenditel.gob.ve), Fundacion Centro Nacional de Desarrollo e Investigacion en Tecnologias Libres - CENDITEL. La Fundación CENDITEL concede permiso para usar, copiar, distribuir y/o modificar este programa, reconociendo el derecho que la humanidad posee al libre acceso al conocimiento, bajo los términos de la licencia de software GPL versión 2.0 de la Free Software Foundation. Este programa se distribuye con la esperanza de que sea util, pero SIN NINGUNA GARANTIA; tampoco las implicitas garantias de MERCANTILIDAD o ADECUACION A UN PROPOSITO PARTICULAR. Para mayor información sobre los términos de la licencia ver el archivo llamado "gpl-2.0.txt" en ingles. */ package ve.gob.cenditel.tibisaymovil; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Collections; import java.util.List; import android.content.Context; import android.os.AsyncTask; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.ListView; import android.widget.TextView; public class DirectCertificateAdapter extends BaseAdapter { private final List aliases; private final List subjects = new ArrayList(); private DirectKeyChain keyChain; private Context context; public DirectCertificateAdapter(DirectKeyChain keyChain, Context context) throws KeystoreException { this.context=context; this.aliases = Collections.list(keyChain.getAliases()); this.subjects.addAll(Collections.nCopies(this.aliases.size(), (String) null)); this.keyChain = keyChain; } @Override public int getCount() { return this.aliases.size(); } @Override public String getItem(int adapterPosition) { return this.aliases.get(adapterPosition); } @Override public long getItemId(int adapterPosition) { return adapterPosition; } @Override public View getView(final int position, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = LayoutInflater.from(this.context); convertView = inflater.inflate(R.layout.cert_item, parent, false); } TextView aliasTextView = (TextView) convertView.findViewById(R.id.cert_item_alias); TextView subjectTextView = (TextView) convertView.findViewById(R.id.cert_item_subject); CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.cert_item_selected); String alias = this.aliases.get(position); convertView.setTag(alias); aliasTextView.setText(alias); String subject = this.subjects.get(position); if (subject == null) { new CertLoader(position, subjectTextView, this.keyChain).execute(); } else { subjectTextView.setText(subject); } ListView lv = (ListView)parent; /* //Old monochoice code. int listViewCheckedItemPosition = lv.getCheckedItemPosition(); int adapterCheckedItemPosition = listViewCheckedItemPosition; checkBox.setChecked(position == adapterCheckedItemPosition); */ checkBox.setChecked(lv.getCheckedItemPositions().get(position)); return convertView; } private class CertLoader extends AsyncTask { private final int adapterPosition; private final TextView subjectView; private DirectKeyChain keyChain; private CertLoader(int adapterPosition, TextView subjectView, DirectKeyChain keyChain) { this.adapterPosition = adapterPosition; this.subjectView = subjectView; this.keyChain = keyChain; } @Override protected String doInBackground(Void... params) { String alias = DirectCertificateAdapter.this.aliases.get(this.adapterPosition); X509Certificate cert; try { cert = this.keyChain.getCertificateChain(alias)[0]; // bouncycastle can handle the emailAddress OID of 1.2.840.113549.1.9.1 return cert.getSubjectDN().getName(); } catch (KeystoreException e) { return ""; } } @Override protected void onPostExecute(String subjectString) { DirectCertificateAdapter.this.subjects.set(this.adapterPosition, subjectString); this.subjectView.setText(subjectString); } } }