package com.dniemcu;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Typeface;
import android.net.Uri;
import android.nfc.NfcAdapter;
import android.nfc.NfcAdapter.ReaderCallback;
import android.nfc.Tag;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.util.DisplayMetrics;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import com.dniemcu.gui.CustomPdfAdapter;
import com.dniemcu.gui.MyPasswordDialog;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.security.DigestAlgorithms;
import com.itextpdf.text.pdf.security.MakeSignature.CryptoStandard;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Security;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import de.tsenger.androsmex.data.CANSpecDO;
import de.tsenger.androsmex.data.CANSpecDOStore;
import de.tsenger.androsmex.pace.PaceException;
import es.gob.jmulticard.jse.provider.DnieProvider;
import es.gob.jmulticard.ui.passwordcallback.CancelledOperationException;
import es.gob.jmulticard.ui.passwordcallback.DNIeDialogManager;

@SuppressLint("NewApi")
public class PrKOperations_kitkat extends Activity implements ReaderCallback{


	static private NfcAdapter myNfcAdapter = null;
	private Tag tagFromIntent;

	private String m_PDFinbox;
	private String m_PDFoutbox;
	private String m_PDFsendbox;
	
	private KeyStore ksUserDNIe=null;
	
	final Handler myHandler = new Handler();
	
	private String strError;
	
	private Activity myActivity;
	private Context myContext;
	
	private CANSpecDOStore cansDO;
	private CANSpecDO canDnie;

	private ProgressDialog progressBar;
	private String textoProcessDlg;

	private int currentapiVersion;

	private boolean readerModeON 	= false;
	private boolean bIsTabletSize	= true;
	private boolean m_success		= false;
	
    private static final String AUTH_CERT_ALIAS = "CertAutenticacion"; //$NON-NLS-1$
    private static final String SIGN_CERT_ALIAS = "CertFirmaDigital"; //$NON-NLS-1$
	
	private ArrayList<PDFSigned.PDFItem> pdfItems = new ArrayList<PDFSigned.PDFItem>();
	List<String> filesPDF = new ArrayList<String>();
	private ListView listView;

	private static int PDF_VIEWER = 0x10;

	private final static String SETTING_USER = "setting_user";
	private final static String SETTING_PASS = "setting_pass";
	
    private File pdfFile	= null;
    private File appDir		= null;
    private File sentDir	= null;
    private File temporalFile = null; 
    
	// Dirección de envío del documento firmado. Debería ser la del colegio origen
	private String m_destino = "direccionemail@mail.com";

	final Runnable askForRead = new Runnable()
	{
		public void run()
		{
			((ImageView)findViewById(R.id.logocyl)).setImageResource(R.drawable.dni30_grey_peq);
			findViewById(R.id.logocyl).setVisibility(ImageView.VISIBLE);

			Typeface type = Typeface.createFromAsset(myContext.getAssets(),"fonts/NeutraText-LightAlt.otf");
			TextView myText = (TextView)findViewById(R.id.result1);
			myText.setText(R.string.op_dgtreinit);
			myText.setTypeface(type);

			myText = (TextView)findViewById(R.id.result2);
			myText.setVisibility(TextView.INVISIBLE);
			myText.setTypeface(type);

			myText = (TextView)findViewById(R.id.resultinfo);
			myText.setVisibility(TextView.INVISIBLE);
			myText.setTypeface(type);

			((ImageView)findViewById(R.id.resultimg)).setImageResource(R.drawable.checked_false);
			findViewById(R.id.resultimg).setVisibility(ImageView.INVISIBLE);
		}
	};

    final Runnable newRead = new Runnable()
	{
		public void run() 
		{
			((ImageView)findViewById(R.id.logocyl)).setImageResource(R.drawable.dni30_peq);
			findViewById(R.id.logocyl).setVisibility(ImageView.VISIBLE);
			((TextView)findViewById(R.id.result1)).setText(R.string.process_msg_lectura);

            Typeface type = Typeface.createFromAsset(myContext.getAssets(),"fonts/NeutraText-LightAlt.otf");
            TextView myText = (TextView)findViewById(R.id.result1);
            myText.setTypeface(type);

            myText = (TextView)findViewById(R.id.result2);
            myText.setVisibility(TextView.INVISIBLE);
            myText.setTypeface(type);

            myText = (TextView)findViewById(R.id.resultinfo);
            myText.setVisibility(TextView.INVISIBLE);
            myText.setTypeface(type);

			((ImageView)findViewById(R.id.resultimg)).setImageResource(R.drawable.checked_false);
			findViewById(R.id.resultimg).setVisibility(ImageView.INVISIBLE);
		}
	};
	
	final Runnable updateStatus = new Runnable() {
		public void run() 
		{
			progressBar.setMessage(textoProcessDlg);
			if(!progressBar.isShowing())
				progressBar.show();
		}
	};
	
	final Runnable updateResult = new Runnable()
	{
		public void run() 
		{
			// Mostramos el botón de Volver
        	findViewById(R.id.Btn_BACK).setVisibility(Button.VISIBLE);
    		
    		// Mostramos el logo de CYL
        	if(bIsTabletSize)
        		((ImageView)findViewById(R.id.logocyl)).setImageResource(R.drawable.icono_pdf75);
        	else
        		((ImageView)findViewById(R.id.logocyl)).setImageResource(R.drawable.icono_pdf50);
			findViewById(R.id.logocyl).setVisibility(ImageView.VISIBLE);
			
    		if(!m_success)
    		{    			
    			((TextView)findViewById(R.id.result1)).setText(R.string.str_envio_error);
    			findViewById(R.id.result1).setVisibility(TextView.VISIBLE);
    			((TextView)findViewById(R.id.result2)).setText(R.string.str_envio_error2);
    			findViewById(R.id.result2).setVisibility(TextView.VISIBLE);
    			((ImageView)findViewById(R.id.resultimg)).setImageResource(R.drawable.checked_false);
    			findViewById(R.id.resultimg).setVisibility(ImageView.VISIBLE);
    			
    			// Mostramos el error
    			TextView txtFinal = (TextView)findViewById(R.id.resultinfo);
            	
            	DisplayMetrics metrics;
            	metrics = getApplicationContext().getResources().getDisplayMetrics();
            	txtFinal.setTextSize(txtFinal.getTextSize()/metrics.density);
            	txtFinal.setText(strError);
            	txtFinal.setVisibility(TextView.VISIBLE);
				return;
    		}
    		
    		// La operación se realizó correctamente. Lo indicamos
			((TextView)findViewById(R.id.result1)).setText(R.string.str_envio_correcto);
			findViewById(R.id.result1).setVisibility(TextView.VISIBLE);
			((TextView)findViewById(R.id.result2)).setText(R.string.str_envio_correcto3);
			findViewById(R.id.result2).setVisibility(TextView.VISIBLE);
			((ImageView)findViewById(R.id.resultimg)).setImageResource(R.drawable.checked_true);
			findViewById(R.id.resultimg).setVisibility(ImageView.VISIBLE);
			((TextView)findViewById(R.id.resultinfo)).setText(R.string.str_mostrar_pdf);
			findViewById(R.id.resultinfo).setVisibility(TextView.VISIBLE);
        	
			// Mostramos la lista de ficheros enviados sólo si la operación fue correcta
    	    pdfFile = new File(m_PDFsendbox);
    	    if(pdfFile.exists())
    	    {
    	    	PDFSigned pdfLisIt = new PDFSigned();
    	    	String fechado = new SimpleDateFormat("dd-MM-yyyy, HH:mm:ss").format(
            		    new Date(pdfFile.lastModified()));
    	    	
    	    	Bitmap signedIcon = BitmapFactory.decodeResource(getResources(), R.drawable.pdf_signed2);
    			pdfItems.add(pdfLisIt.new PDFItem(signedIcon, pdfFile.getName(), "Enviado: "+fechado, (pdfFile.length()/1024)+" Kbs"));
            	filesPDF.add(pdfFile.getName());
            	
            	findViewById(R.id.resultinfo).setVisibility(TextView.VISIBLE);
            	findViewById(R.id.resultlist).setVisibility(LinearLayout.VISIBLE);

                CustomPdfAdapter mAdapter = new CustomPdfAdapter(myContext, m_PDFsendbox, R.id.list, pdfItems);
    		    listView.setAdapter(mAdapter);
    		    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    	        	@Override
    				public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) 
    	        	{
    	        		// Aseguramos el acceso a los directorios necesarios
    	    			appDir = getDir("FirmaPDF", MODE_PRIVATE);
    	    			sentDir = new File(appDir, "Enviados"); 
    	    			if(!sentDir.exists())
    	    				sentDir.mkdir();
    	    			
    					String fileName= sentDir.getPath()+"/"+pdfItems.get(arg2).getFileName();
    					try {
    						// Creamos el fichero temporal
    						temporalFile = File.createTempFile("temp", ".pdf", Environment.getExternalStorageDirectory());
    						
    						// Copiamos el contenido
    						InputStream in = new FileInputStream(new File(fileName));
    					    OutputStream out = new FileOutputStream(temporalFile);
    					    byte[] buf = new byte[1024];
    					    int len;
    					    while ((len = in.read(buf)) > 0) {
    					        out.write(buf, 0, len);}
    					    in.close();
    					    out.close();
    					    
    						// Abrimos el nuevo PDF
    						Uri path = Uri.fromFile(temporalFile); 
    						Intent intent = new Intent(Intent.ACTION_VIEW);
    						intent.setDataAndType(path, "application/pdf");
    						intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    		            	startActivityForResult(intent, PDF_VIEWER);
    	            	} catch (IOException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    				}});
    		    mAdapter.notifyDataSetChanged();
    	    }
		}	
	}; 
            
	public class MyTaskDNIe extends AsyncTask<Void, Integer, Void>
	{
		private boolean bForzamosReinicio = true;

	    @Override        
	    protected void onPreExecute() 
	    { 
			myHandler.post(newRead);
			
	    	// Lanzamos el di�logo con el progreso
		    progressBar.setIndeterminate(true);
		    progressBar.setCancelable(false);
		    progressBar.setTitle("DNIe version 3.0");
		    progressBar.setMessage("Estableciendo conexión...");
		    textoProcessDlg="Estableciendo conexión...";
	    }
	    
	    @Override
		protected void onProgressUpdate(Integer... values) {
			// TODO Auto-generated method stub
			super.onProgressUpdate(values);
			
			progressBar.setMessage(textoProcessDlg);
			progressBar.show();
		}
	    
		@Override
	    protected Void doInBackground(Void... arg0) 
		{
			try 
			{
				// Paso 1: accedemos al certificado de firma del DNIe
				CargarCDF();

				// Si llegamos hasta aquí, hemos solicitado y presentado el PIN,
				// de manera que ya no reintentaremos la conexión
				bForzamosReinicio = false;
			} catch (CancelledOperationException e)
			{
				bForzamosReinicio = false;
				strError = "Operación cancelada por el usuario.";
				return null;
			} catch (PaceException e)
			{
				// Si el código CAN es incorrecto, mostramos el error y no permitimos continuar.
				bForzamosReinicio   = false;
				strError    		= e.getMessage();
				return null;
			} catch (Exception e)
			{
				ksUserDNIe = null;
	    		strError = "Ocurrió un error durante la lectura y parseo de DFs.\n"+ e.getMessage();
	    		return null;
			}
			
			try 
			{
				// Paso 2: firmamos el documento PDF				
				FirmarPDF(ksUserDNIe);
			} 
			catch (Exception e) 
			{	    			
	    		strError = "Ocurrió un error durante el proceso de firma.\n"+ e.getMessage();
	    		return null;
			}

			try 
			{
	        	// Paso 3: envío del PDF
				EnviarPDF();
				
				strError = "Envío de documento realizado CORRECTAMENTE.";
				m_success = true;
			} 
			catch (Exception e) 
			{	    			
	    		strError = "Ocurrió un error durante el envío del documento.\n"+ e.getMessage();
		        return null;
			}
            
			return null;
        }

	    @Override
	    protected void onPostExecute(Void result) 
	    { 
	    	// Cerramos el dialogo de progreso y terminamos
    		progressBar.dismiss();

			// Si no hemos presentado el PIN aún, permitimos que se continuen las lecturas.
			// Es posible que el DNIe se haya movido sin querer así que entendemos que
			// el usuario no da por finalizada la operación
			if(bForzamosReinicio) {
				// Repintamos la pantalla
				myHandler.post(askForRead);

				// Si la versión de Android lo soporta, ajustamos la comprobación de presencia NFC a 1 segundo
				if (currentapiVersion > Build.VERSION_CODES.KITKAT)
					EnableReaderMode(250);

				return;
			}

			// Desactivamos el modo reader de NFC
			DisableReaderMode();

    		// Mostramos el resultado final y terminamos
    		myHandler.post(updateResult);
        }
    }
        
    private void handleError(String str)
    {
    	strError = str;
    	myHandler.post(updateResult);
    }
    
    private boolean borrarFichero(String fichero)  
    {
    	File file = new File(fichero);
    	if(file.exists())
    		return file.delete();

    	return true;
    }

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if ((keyCode == KeyEvent.KEYCODE_BACK)) {
			// Si habíamos acabado, volvemos a la pantalla principal
			if(m_success) {
				// Devolvemos el valor del módulo al Activity padre
				Intent intent = new Intent(PrKOperations_kitkat.this, DNIeMcu.class);
				startActivity(intent);
			}
			else {
				// Si la operación quedó a medias, volvemos al activity correspondiente
				onBackPressed();
			}
			return false;
		}
		else
			return super.onKeyDown(keyCode, event);
	}

    @Override
    public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
        
        // Quitamos la barra del título
		this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.setContentView(R.layout.pdf_send_kitkat);

		m_success 	= false;
		pdfFile 	= null;
		pdfItems.clear(); 
		listView = (ListView) findViewById(android.R.id.list);
		
		// Inicializamos controles
        tagFromIntent 	= null;
    	myContext 		= PrKOperations_kitkat.this;
    	myActivity 		= ((Activity) myContext);
    	
    	// Obtenemos el adaptador NFC
        myNfcAdapter = NfcAdapter.getDefaultAdapter(this);
        myNfcAdapter.setNdefPushMessage(null, this);
    	myNfcAdapter.setNdefPushMessageCallback(null, this);

		// Obtenemos la versión de Android
		currentapiVersion = android.os.Build.VERSION.SDK_INT;

        // Ocultamos los controles
		Typeface fontType = Typeface.createFromAsset(myContext.getAssets(), "fonts/NeutraText-LightAlt.otf");
        TextView myText = (TextView)findViewById(R.id.result1);
        myText.setTypeface(fontType);

        myText = (TextView)findViewById(R.id.result2);
        myText.setVisibility(TextView.INVISIBLE);
        myText.setTypeface(fontType);

        myText = (TextView)findViewById(R.id.resultinfo);
        myText.setVisibility(TextView.INVISIBLE);
        myText.setTypeface(fontType);

    	findViewById(R.id.resultlist).setVisibility(LinearLayout.INVISIBLE);
		((ImageView)findViewById(R.id.resultimg)).setImageResource(R.drawable.checked_false);
		findViewById(R.id.resultimg).setVisibility(ImageView.INVISIBLE);
		
		// Conexión con el DNIe
		cansDO = new CANSpecDOStore(this);
		canDnie = ((MyAppMcu)getApplicationContext()).getCAN();		
        
		// Controlamos el tamaño del dispositivo
        if ( (getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE)
        	bIsTabletSize= true;
        else
        	bIsTabletSize= false;
        
        // Creamos el diálogo de progreso
     	progressBar = new ProgressDialog(myContext);
	    
		///////////////////////////////////////////////////////////////////////////////////
		// Botón de vuelta al Activity anterior
    	findViewById(R.id.Btn_BACK).setOnClickListener(new OnClickListener() {
			public void onClick(View v) {

				// Si habíamos acabado, volvemos a la pantalla principal
				if(m_success){
					// Volvemos al Activity de lectura
					Intent intent = new Intent(PrKOperations_kitkat.this, DNIeMcu.class);
					startActivity(intent);
				}
				else {
					// Si la operación quedó a medias, volvemos al activity correspondiente
					onBackPressed();
				}
			}
		});
	}
    
    public class MailFile extends javax.mail.Authenticator 
    {    		
		public MailFile(){	}
		
		public void Mail(String user, String pass) { 
			
			// Mantenemos la sesión abierta anteriormente para lectura
			Session session = ((MyAppMcu)getApplicationContext()).getSession();
		        		    
		    try 
		    {
		        Message message = new MimeMessage(session);
		        message.setFrom(new InternetAddress(user));
		        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(m_destino));
		        message.setSubject("Documento firmado");
		        
		        Multipart multipart = new MimeMultipart();
		        MimeBodyPart messageBodyPart = new MimeBodyPart();
		        File signedFile     = new File(m_PDFoutbox);
                DataSource source   = new FileDataSource(signedFile);
	        	messageBodyPart.setDataHandler(new DataHandler(source));
	        	messageBodyPart.setFileName(m_PDFoutbox);
		        
		        messageBodyPart.setDisposition(MimeBodyPart.ATTACHMENT);
		        messageBodyPart.setHeader("Content-ID","<vogue>");
		        
		        multipart.addBodyPart(messageBodyPart);
		        message.setContent(multipart);
		        Transport.send(message);
		    } 
		    catch (MessagingException e) 
		    {
		    	throw new RuntimeException(e);
		    }           
		}   
	}
    
    public void CargarCDF() throws Exception
    {
		// Leemos los certificados
        try
        {
            // Actualizamos el estado del progress Dlg
            textoProcessDlg = "Leyendo DNIe...";
            myHandler.post(updateStatus);

            final DnieProvider p = new DnieProvider();
            p.setProviderTag(tagFromIntent);
            p.setProviderCan(canDnie.getCanNumber());
            Security.insertProviderAt(p, 1);

            // Nos aseguramos de cargar el proveedor de servicios criptográficos del DNIe
            Security.removeProvider("BC");
            Security.insertProviderAt(new BouncyCastleProvider(), 1);

            // Desactivamos el modod rápido
            System.setProperty("es.gob.jmulticard.fastmode", "false");

            // Creamos el cuadro de diálogo que solicitará el PIN
            MyPasswordDialog myFragment = new MyPasswordDialog(PrKOperations_kitkat.this, true);
            DNIeDialogManager.setDialogUIHandler(myFragment);

            // Actualizamos estado del progress dialog
            textoProcessDlg="Cargando certificados...";
            myHandler.post(updateStatus);

            // Cargamos certificados y keyReferences
            ksUserDNIe = KeyStore.getInstance("MRTD");
            ksUserDNIe.load(null,null);

			// Actualizamos la BBDD de los CAN para añadir estos datos si no los tuviéramos
			if(canDnie.getUserNif().length()==0){
				String certSubject = ((X509Certificate) ksUserDNIe.getCertificate(SIGN_CERT_ALIAS)).getSubjectDN().toString();
				CANSpecDO newCan = new CANSpecDO(canDnie.getCanNumber(),
						certSubject.substring((certSubject.indexOf("CN=") + 3)),
						certSubject.substring(certSubject.indexOf("NIF ") + 4));
				cansDO.delete(canDnie);
				cansDO.save(newCan);
			}

			// Forzamos a cargar los certificados reales pidiendo la clave
			ksUserDNIe.getKey(SIGN_CERT_ALIAS, null);
			ksUserDNIe.getCertificate(SIGN_CERT_ALIAS).getEncoded();

        } catch (CancelledOperationException e){
			e.printStackTrace();
			throw e;
		}
        catch (Exception e) {
            e.printStackTrace();
			if (e.getMessage().contains("CAN incorrecto"))
				throw new PaceException("Error al montar canal PACE. CAN incorrecto.");
            else
				throw new Exception(e.getMessage());
        }
    }
    
    private void FirmarPDF(KeyStore keystore) throws Exception
    {    	
    	// Actualizamos el estado del progress Dlg
    	textoProcessDlg = "Firmando documento...";
		myHandler.post(updateStatus);
		
    	// Recuperamos las direcciones de los PDFs
		m_PDFinbox	= ((MyAppMcu)getApplicationContext()).getPDF(1);
		m_PDFoutbox = ((MyAppMcu)getApplicationContext()).getPDF(2);
		strError		= "";
    	
    	try
		{
    		// Realizamos la firma del PDF
    		Enumeration<String> aliases = keystore.aliases();
            while (aliases.hasMoreElements()){
                String aliasPDF = aliases.nextElement();
                if (keystore.isCertificateEntry(aliasPDF)){
                    if (aliasPDF.toLowerCase().contains("firma")){
                    	PrivateKey key = (PrivateKey)keystore.getKey(aliasPDF, null);
                        Certificate[] chain = keystore.getCertificateChain(aliasPDF);
                        
                        PDFSignature metasign = new PDFSignature();
                        metasign.sign(	null, m_PDFinbox, m_PDFoutbox,
                                        chain, key, DigestAlgorithms.SHA1,
                                        "DNIeJCAProvider", CryptoStandard.CMS,
                                        "Autorización/Otorgamiento de representación", "");
                    }
               }
            }
        }catch (CancelledOperationException e){ 
        	handleError("La operación de firma ha sido cancelada.\n"+e.getMessage());
			borrarFichero(m_PDFoutbox);
			e.printStackTrace();
            throw e;
        }catch (IOException e) {
			handleError("Error de IO al realizar la firma electrónica con el DNIe.\n"+e.getMessage());
			borrarFichero(m_PDFoutbox);
			e.printStackTrace();
			throw e;
		} catch (GeneralSecurityException e){
			handleError("Error de seguridad al realizar la firma electrónica con el DNIe.\n"+e.getMessage());
			borrarFichero(m_PDFoutbox);
			e.printStackTrace();
			throw e;
		} catch(DocumentException e){
			handleError("No se ha podido realizar la firma electrónica del documento.\n"+e.getMessage());
			borrarFichero(m_PDFoutbox);
			e.printStackTrace();
			throw e;
		} catch (Exception e) {
			handleError("No se ha podido realizar ninguna firma con el DNIe.\n"+e.getMessage());
			borrarFichero(m_PDFoutbox);
			e.printStackTrace();
			throw e;
		}
    	
        // Actualizamos el número de notificaciones
    	((MyAppMcu)getApplicationContext()).setNotifications(MyAppMcu.EVENT_LOAD,((MyAppMcu)getApplicationContext()).getNotifications(MyAppMcu.EVENT_LOAD)-1);
    	((MyAppMcu)getApplicationContext()).setNotifications(MyAppMcu.EVENT_SIGN,((MyAppMcu)getApplicationContext()).getNotifications(MyAppMcu.EVENT_SIGN)+1);
    }
    
    private void EnviarPDF() throws Exception
    {
    	//Las preferencias se guardarán en com.sp.main_preferences. Debes tenerlo en cuenta para cuando recuperes los valores
		SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("com.sp.main_preferences", Context.MODE_PRIVATE);
 	    String user = sharedPreferences.getString(SETTING_USER,"");
 	    String pass = sharedPreferences.getString(SETTING_PASS,"");
	 	
 	    // Actualizamos el estado del progress Dlg
 	    textoProcessDlg = "Enviando documento...";
		myHandler.post(updateStatus);
		
		// Enviar el fichero vía SMTP:
	 	MailFile mail = new MailFile();
		mail.Mail(user, pass);
		
		// Movemos el fichero a la carpeta de ENVIADOS
		m_PDFsendbox  = m_PDFoutbox.replace("/Outbox/", "/Enviados/");
		MoveFileSource2Dest(m_PDFoutbox, m_PDFsendbox);
		
		// Actualizamos las notificaciones
		((MyAppMcu)getApplicationContext()).setNotifications(MyAppMcu.EVENT_SIGN,((MyAppMcu)getApplicationContext()).getNotifications(MyAppMcu.EVENT_SIGN)-1);
		
    	// Borramos el fichero original
    	//borrarFichero(m_PDFinbox);
    }
    
    @Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		
		if( (requestCode==PDF_VIEWER) && (temporalFile!=null))
			temporalFile.delete();
	}
	
	private void MoveFileSource2Dest (String fileSource, String fileDestination) throws Exception
	{
		try
		{
			// Mover el fichero a la carpeta de ENVIADOS
			File source = new File(fileSource);
	    	if(source.exists())
	    	{	
	    		File dest = new File(fileDestination);
	    		InputStream in = new FileInputStream(source);
	            OutputStream out = new FileOutputStream(dest);

	            // Copy the bits from instream to outstream
	            byte[] buf = new byte[1024];
	            int len;
	            while ((len = in.read(buf)) > 0) 
	                out.write(buf, 0, len);
	            
	            // Cerramos los ficheros
	            in.close();
	            out.close();
	            source.delete();
	    	}
		}catch(Exception e)
		{
			throw e;			
		}
	}

	@Override
	public void onResume() {
		super.onResume();

		// Activamos la lectura NFC tras unos segundos para dar tiempo a colocar la tarjeta
		Handler handler = new Handler();
		handler.postDelayed(new Runnable() {
			public void run() {
				if ((!m_success) && (!readerModeON)) {
					if (currentapiVersion <= Build.VERSION_CODES.KITKAT)
						EnableReaderMode(10000);
					else
						EnableReaderMode(1000);
				}
			}
		}, 1000);
	}

	@Override
	public void onTagDiscovered(Tag tag) {
		// TODO Auto-generated method stub
		tagFromIntent = tag;

		// En versiones anteriores a KITKAT no se puede ajustar en tiempo real el timer de comprobación
		if (currentapiVersion > Build.VERSION_CODES.KITKAT)
		{
			// Reconfiguramos el adaptador NFC para que el control de presencia de NFC no nos tire el canal
			EnableReaderMode(20000);
		}

		// Si tenemos disponible un interfaz válido, lanzamos la tarea
        MyTaskDNIe newTask = new MyTaskDNIe();
        newTask.execute();
	}
	
	private void EnableReaderMode (int msDelay)
	{
		// Ponemos en msDelay milisegundos el tiempo de espera para comprobar presencia de lectores NFC
		Bundle options = new Bundle();
		options.putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, msDelay);
		myNfcAdapter.enableReaderMode(  myActivity,
										this,
										NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK |
												NfcAdapter.FLAG_READER_NFC_A |
												NfcAdapter.FLAG_READER_NFC_B,
										options);
		readerModeON = true;
	}
	
	private void DisableReaderMode()
	{
		// Desactivamos el modo reader de NFC
		myNfcAdapter.disableReaderMode(myActivity);
		readerModeON = false;
	}
}
