package es.gob.jmulticard.android.callbacks;
import java.util.logging.Logger;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import android.app.Activity;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import es.gob.jmulticard.card.dnie.CustomAuthorizeCallback;
import es.gob.jmulticard.card.dnie.CustomTextInputCallback;
/** CallbackHandler que gestiona los Callbacks de petición de información al usuario.
* @author Sergio Martínez Rico. */
public class DnieNFCCallbackHandler implements CallbackHandler {
private static final Logger LOGGER = Logger.getLogger("es.gob.jmulticard"); //$NON-NLS-1$
private final Activity activity;
private final DialogDoneChecker dialogDone;
private CachePasswordCallback passwordCallback;
/** CallbackHandler que gestiona los Callbacks de petición de información al usuario.
* @param ac Handler de la actividad desde la que se llama.
* @param ddc Instancia de la clase utilizada para utilizar wait() y notify() al esperar el PIN.
* @param passwordCallback Instancia que contiene el CAN pedido antes a la lectura NFC.*/
public DnieNFCCallbackHandler(final Activity ac, final DialogDoneChecker ddc, final CachePasswordCallback passwordCallback) {
this.activity = ac;
this.dialogDone = ddc;
this.passwordCallback = passwordCallback;
}
@Override
public void handle(final Callback[] callbacks) throws UnsupportedCallbackException {
if (callbacks != null) {
for (final Callback cb : callbacks) {
if (cb instanceof PasswordCallback) {
final PinDialog dialog = new PinDialog(
false,
this.activity,
cb,
this.dialogDone
);
final FragmentTransaction ft = ((FragmentActivity)this.activity).getSupportFragmentManager().beginTransaction();
final ShowPinDialogTask spdt = new ShowPinDialogTask(dialog, ft, this.activity, this.dialogDone);
final String input = spdt.getInput();
((PasswordCallback) cb).setPassword(input.toCharArray());
return;
}
String input;
if (cb instanceof CustomTextInputCallback) {
if(this.passwordCallback == null) {
final PinDialog dialog = new PinDialog(
true,
this.activity,
cb,
this.dialogDone
);
final FragmentTransaction ft = ((FragmentActivity)this.activity).getSupportFragmentManager().beginTransaction();
final ShowPinDialogTask spdt = new ShowPinDialogTask(dialog, ft, this.activity, this.dialogDone);
input = spdt.getInput();
}
else {
input = new String(this.passwordCallback.getPassword());
// En caso de fallar el primer CAN lo pedira de nuevo al ususario
this.passwordCallback = null;
}
((CustomTextInputCallback) cb).setText(input);
return;
}
if (cb instanceof CustomAuthorizeCallback) {
return;
}
LOGGER.severe(cb.getClass().getName());
}
}
else {
LOGGER.warning("Se ha recibido un array de Callbacks nulo"); //$NON-NLS-1$
throw new UnsupportedCallbackException(null);
}
}
}