X-Git-Url: http://www.average.org/gitweb/?p=YkNeoCR.git;a=blobdiff_plain;f=src%2Forg%2Faverage%2Fnfcauthcr%2FTagEvent.java;fp=src%2Forg%2Faverage%2Fnfcauthcr%2FTagEvent.java;h=7ef69433537bae7c64cd28196f5d2b4e0f54555b;hp=0000000000000000000000000000000000000000;hb=9194bb54ed7bfd3ccb2ee93151fb3b1467cdae35;hpb=bb4b51c880cf9a1942151bf1dd8977e3a8e0ccf6
diff --git a/src/org/average/nfcauthcr/TagEvent.java b/src/org/average/nfcauthcr/TagEvent.java
new file mode 100644
index 0000000..7ef6943
--- /dev/null
+++ b/src/org/average/nfcauthcr/TagEvent.java
@@ -0,0 +1,122 @@
+package org.average.nfcauthcr;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.PendingIntent;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.nfc.NfcAdapter;
+import android.nfc.Tag;
+import android.nfc.TagLostException;
+import android.nfc.tech.IsoDep;
+import android.util.Log;
+import android.widget.Toast;
+
+import org.average.nfcauthcr.YkNeo;
+import org.average.nfcauthcr.CRException;
+
+public class TagEvent extends Activity {
+
+ private final String TAG = getClass().getName();
+
+ private PendingIntent tagIntent;
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ Log.v(TAG, "Starting the work");
+
+ Intent intent = getIntent();
+ setResult(RESULT_CANCELED);
+ int slot = intent.getIntExtra("slot", -1);
+ if (slot > 0) {
+ enableDispatch(slot);
+ }
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ Log.v(TAG, "Finished the work");
+
+ disableDispatch();
+ }
+
+ public void onNewIntent(Intent intent) {
+ Log.v(TAG, "NFC Intent arrived");
+ int slot = intent.getIntExtra("slot", -1);
+ byte[] challenge = intent.getByteArrayExtra("challenge");
+ if (slot <= 0) return;
+ Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
+ if (tag == null) return;
+ IsoDep isoTag = IsoDep.get(tag);
+ try {
+ byte[] response = YkNeo.doChallengeYubiKey(
+ isoTag, slot, challenge);
+ Intent data = getIntent();
+ data.putExtra("response", response);
+ setResult(RESULT_OK, data);
+ } catch (CRException e) {
+ Log.v(TAG, e.getMessage());
+ Toast.makeText(this, e.getMessage(),
+ Toast.LENGTH_LONG).show();
+ }
+ finish();
+ }
+
+/*
+
+
+
+
+
+
+
+
+
+
+
+ android.nfc.tech.IsoDep
+
+
+
+*/
+
+ private void enableDispatch(int slot) {
+ Intent intent = getIntent();
+ intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
+ intent.putExtra("slot", slot);
+ tagIntent = PendingIntent.getActivity(this, 0, intent, 0);
+ IntentFilter iso =
+ new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
+ NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);
+ if (adapter == null) {
+ Toast.makeText(this, R.string.no_nfc,
+ Toast.LENGTH_LONG).show();
+ finish();
+ }
+ if (! adapter.isEnabled()) {
+ Toast.makeText(this, R.string.nfc_disabled,
+ Toast.LENGTH_LONG).show();
+ finish();
+ }
+ adapter.enableForegroundDispatch(
+ this, tagIntent, new IntentFilter[] {iso},
+ new String[][] {new String[] {IsoDep.class.getName()}});
+ }
+
+ private void disableDispatch() {
+ if (tagIntent != null) {
+ tagIntent.cancel();
+ tagIntent = null;
+ }
+ NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);
+ if (adapter != null) {
+ adapter.disableForegroundDispatch(this);
+ }
+ }
+}