From: Eugene Crosser Date: Wed, 1 May 2013 22:25:05 +0000 (+0400) Subject: intents work X-Git-Url: http://www.average.org/gitweb/?p=YkNeoCR.git;a=commitdiff_plain;h=16a341cff772b8d413af1d95a21e181a5b4879ff intents work --- diff --git a/AndroidManifest.xml b/AndroidManifest.xml index ee3692d..efcae30 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -22,6 +22,9 @@ + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 0fa12b6..b13405e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6,4 +6,10 @@ Slot 1 Slot 2 Enrollment result: + Ready to send challenge + Please touch the token with the phone + Cannot reach the NFC adapter + Need to enable NFC in Settings + Communitation with the tag lost + Error communicating with the tag diff --git a/src/org/average/nfcauthcr/NFCAuthCRCheck.java b/src/org/average/nfcauthcr/NFCAuthCRCheck.java new file mode 100644 index 0000000..6637c00 --- /dev/null +++ b/src/org/average/nfcauthcr/NFCAuthCRCheck.java @@ -0,0 +1,149 @@ +package org.average.nfcauthcr; + +import java.io.IOException; + +import android.os.Bundle; +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; + +public class NFCAuthCRCheck extends Activity { + + private final String TAG = getClass().getName(); + + private static final byte[] selectCommand = + {0x00, (byte) 0xA4, 0x04, 0x00, 0x07, (byte) 0xA0, + 0x00, 0x00, 0x05, 0x27, 0x20, 0x01, 0x00}; + + private AlertDialog swipeDialog; + private PendingIntent tagIntent; + + @Override + protected void onResume() { + super.onResume(); + Log.v(TAG, "Starting the work"); + + Intent intent = getIntent(); + Bundle extras = intent.getExtras(); + setResult(RESULT_CANCELED); + if(swipeDialog != null) { + swipeDialog.dismiss(); + swipeDialog = null; + } + if(extras != null) { + int slot = extras.getInt("slot"); + if (slot > 0) { + swipeDialog = makeDialog(); + swipeDialog.show(); + enableDispatch(slot); + } + } + } + + @Override + protected void onPause() { + super.onPause(); + Log.v(TAG, "Finished the work"); + + if(swipeDialog != null) { + swipeDialog.dismiss(); + swipeDialog = null; + } + disableDispatch(); + } + + public void onNewIntent(Intent intent) { + Log.v(TAG, "NFC Intent arrived"); + int slot = intent.getIntExtra("slot", -1); + if (slot <= 0) return; + Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); + if (tag == null) return; + IsoDep isoTag = IsoDep.get(tag); + try { + isoTag.connect(); + byte[] resp = isoTag.transceive(selectCommand); + int length = resp.length; + if (resp[length - 2] == (byte)0x90 && + resp[length - 1] == 0x00) { + doChallengeYubiKey(isoTag, slot); + } else { + Toast.makeText(this, R.string.tag_error, + Toast.LENGTH_LONG).show(); + } + } catch (TagLostException e) { + Toast.makeText(this, + R.string.tag_lost, Toast.LENGTH_LONG).show(); + } catch (IOException e) { + Toast.makeText(this, + getText(R.string.tag_error) + + e.getMessage(), + Toast.LENGTH_LONG).show(); + } + finish(); + } + + private AlertDialog makeDialog() { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.challenging); + builder.setMessage(R.string.swipe); + builder.setOnCancelListener( + new DialogInterface.OnCancelListener() { + public void onCancel(DialogInterface dialog) { + finish(); + } + }); + return builder.create(); + } + + 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(); + return; + } + if (! adapter.isEnabled()) { + Toast.makeText(this, R.string.nfc_disabled, + Toast.LENGTH_LONG).show(); + finish(); + return; + } + 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); + } + } + + private void doChallengeYubiKey(IsoDep isoTag, int slot) + throws IOException { + Intent data = getIntent(); + data.putExtra("response","real data here"); + setResult(RESULT_OK, data); + } +} diff --git a/src/org/average/nfcauthcr/NFCAuthCREnroll.java b/src/org/average/nfcauthcr/NFCAuthCREnroll.java index 6aae6f1..bb6b4f0 100644 --- a/src/org/average/nfcauthcr/NFCAuthCREnroll.java +++ b/src/org/average/nfcauthcr/NFCAuthCREnroll.java @@ -4,6 +4,7 @@ import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.preference.PreferenceManager; +import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.content.DialogInterface; @@ -12,8 +13,10 @@ import android.view.View; import android.widget.TextView; import android.widget.RadioButton; -public class NFCAuthCREnroll extends Activity -{ +import org.average.nfcauthcr.NFCAuthCRCheck; + +public class NFCAuthCREnroll extends Activity { + private final String TAG = getClass().getName(); private static boolean waitingForResult = false; @@ -73,12 +76,24 @@ public class NFCAuthCREnroll extends Activity public void onEnrollClicked(View view) { Log.v(TAG, "Enroll clicked"); if (slot > 0) { - showEnrollResult(" using slot" + slot); + runChallenge(slot); } else { showEnrollResult("Must specify which slot to use"); } } + public void onActivityResult(int requestCode, int resultCode, + Intent intent) { + Log.v(TAG, "Got activity result"); + waitingForResult = false; + if (resultCode == RESULT_OK) { + String res = intent.getStringExtra("response"); + Log.v(TAG, "Response is \"" + res + "\""); + } else { + Log.v(TAG, "Error result code " + resultCode); + } + } + private void showEnrollResult(final String msg) { Log.v(TAG, "Show result: \"" + msg + "\""); @@ -95,4 +110,12 @@ public class NFCAuthCREnroll extends Activity AlertDialog dialog = builder.create(); dialog.show(); } + + private void runChallenge(int slot) { + Log.v(TAG, "Launching challenging activity"); + Intent crIntent = new Intent(this, NFCAuthCRCheck.class); + crIntent.putExtra("slot", slot); + this.startActivityForResult(crIntent, 0); + waitingForResult = true; + } }