package com.example.app_10p5; import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; import android.nfc.NfcAdapter; import android.nfc.Tag; import android.nfc.tech.MifareClassic; import android.os.Bundle; import android.widget.Toast; import org.json.JSONObject; import java.net.URL; import java.util.HashMap; /** * Created by beaus on 24/04/2016. */ public class CarteActivite extends Activity implements ASyncResponse { private NfcAdapter mNfcAdapter; private HashMap mParam; private String mAPI; public static final String HOST = "https://10p5.clubinfo.frogeye.fr/"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_carte); mParam = new HashMap(); switch (getIntent().getIntExtra("state", MainActivite.STATE_RIEN)) { case MainActivite.STATE_COMMANDE: //TODO: XOR du cancer //mParam.put("quantite", String.valueOf(getIntent().getIntExtra("quantite", -1))); mParam.put("montant", String.valueOf(getIntent().getFloatExtra("montant", -1))); mParam.put("jeton", getIntent().getStringExtra("token")); mAPI = "api/client/payer"; break; case MainActivite.STATE_CREATION_COMPTE: mParam.put("solde", String.valueOf(getIntent().getFloatExtra("montant", -1))); mParam.put("jeton", getIntent().getStringExtra("token")); mAPI = "api/client/ajouter"; break; case MainActivite.STATE_RECHARGEMENT: mParam.put("montant", String.valueOf(getIntent().getFloatExtra("montant", -1))); mParam.put("jeton", getIntent().getStringExtra("token")); mAPI = "api/client/recharger"; break; case MainActivite.STATE_VIDANGE: //pas de paramètre mAPI = "api/client/vidange"; break; case MainActivite.STATE_CONNEXION: //Impossible c'est pas géré ici case MainActivite.STATE_RIEN: default: Toast.makeText(this, "WTF, le cancer est dans l'application!!", Toast.LENGTH_LONG).show(); finish(); return; } mNfcAdapter = NfcAdapter.getDefaultAdapter(this); if (mNfcAdapter == null) { // Stop here, we definitely need NFC Toast.makeText(this, "This device doesn't support NFC.", Toast.LENGTH_LONG).show(); finish(); return; } handleIntent(getIntent()); } @Override protected void onResume() { super.onResume(); setupForegroundDispatch(this, mNfcAdapter); } // Convertit l'array de byte en chaîne hexadécimale (si le byte = 0x63, str = "63"). private String ByteArrayToHexString(byte [] inarray) { int i, j, in; String [] hex = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; String out= ""; for(j = 0 ; j < inarray.length ; ++j) { in = (int) inarray[j] & 0xff; i = (in >> 4) & 0x0f; out += hex[i]; i = in & 0x0f; out += hex[i]; } return out; } @Override protected void onNewIntent(Intent intent) { handleIntent(intent); } @Override protected void onPause() { stopForegroundDispatch(this, mNfcAdapter); super.onPause(); } private void handleIntent(Intent intent){ if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) { String id_carte = ByteArrayToHexString(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID)); mParam.put("idCarte", id_carte); //Lecture des données Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); MifareClassic mfc = MifareClassic.get(tag); byte[] data; String prenom = null, nom = null, login = null; if (mfc != null) { try { mfc.connect(); //Clé A byte[] cleA = new byte[]{(byte) 0xa0, (byte) 0xa1, (byte) 0xa2, (byte) 0xa3, (byte) 0xa4, (byte) 0xa5}; //On veut juste lire le secteur 12 boolean estConnecte = mfc.authenticateSectorWithKeyA(12, cleA); if (estConnecte) { //Il y a 4 blocs dans le secteur 12 -> INE, numéro étudiant, prénom, nom //On ne veut que prénom et nom, donc on passe les deux premiers for (int i = 2, bIndex = mfc.sectorToBlock(12) + i; i < 4; i++, bIndex++) { //sectorToBlock : Renvoie l'indice (global, parmis tous les blocs de // tous les secteurs) du premier bloc du secteur 12 //Lit les données du bloc data = mfc.readBlock(bIndex); //Convertit les bytes en String String dataStr = new String(data); if (i == 2) //Prénom prenom = dataStr; else if (i == 3) //Nom nom = dataStr; } } else { Toast.makeText(this, "Impossible de lire le secteur 12", Toast.LENGTH_LONG).show(); } mfc.close(); } catch (Throwable t) { Toast.makeText(this, "WTF, le cancer est dans l'application!! Autodéstruction dans 5 secondes !!!!!!!!!" + t.toString(), Toast.LENGTH_LONG).show(); } //Concaténation des données récupérées en login login = prenom; login.concat("."); login.concat(nom); } else { Toast.makeText(this, "Pas de Mifare Classic", Toast.LENGTH_SHORT).show(); } //Éxécution de la fonction clientAPI(); } } public static void setupForegroundDispatch(final Activity activity, NfcAdapter adapter){ final Intent intent = new Intent(activity.getApplicationContext(), activity.getClass()); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); final PendingIntent pendingIntent = PendingIntent.getActivity(activity.getApplicationContext(), 0, intent, 0); adapter.enableForegroundDispatch(activity, pendingIntent, null, null); } public static void stopForegroundDispatch(final Activity activity, NfcAdapter adapter) { adapter.disableForegroundDispatch(activity); } public void clientAPI() { try { URL url = new URL(HOST + mAPI); NetworkThread nt = new NetworkThread(url, mParam); nt.delegate = this; nt.execute(); } catch (Throwable t){ Toast.makeText(this, "WTF, le cancer est dans l'application!! " + t.toString(), Toast.LENGTH_LONG).show(); finish(); return; } } /* Retour du NetworkThread */ @Override public void processFinish(JSONObject output) { try { if (output.get("status").equals("ok")) { Toast.makeText(this, "Tout c'est bien passé: " + output.get("status").toString(), Toast.LENGTH_LONG).show(); } else { Toast.makeText(this, "Erreur lors du traitement de la requête: " + output.get("status").toString(), Toast.LENGTH_LONG).show(); } } catch (Throwable t) { Toast.makeText(this, "WTF, le cancer est dans l'application!! " + t.toString(), Toast.LENGTH_LONG).show(); } finish(); return; } }