package org.average.nfcauthcr;
-import android.app.Activity;
-import android.app.AlertDialog;
+import android.app.Service;
import android.app.PendingIntent;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.TagLostException;
import android.nfc.tech.IsoDep;
+import android.os.Binder;
+import android.os.IBinder;
+import android.preference.PreferenceManager;
import android.util.Log;
import android.widget.Toast;
+import org.average.nfcauthcr.CheckConnector;
import org.average.nfcauthcr.YkNeo;
import org.average.nfcauthcr.CRException;
-public class Check extends Activity {
+public class Check extends Service {
private final String TAG = getClass().getName();
- private AlertDialog swipeDialog;
+ private final CheckConnector checkConnector = new CheckConnector();
+ private SharedPreferences prefs;
+ private int startId;
private PendingIntent tagIntent;
@Override
- protected void onResume() {
- super.onResume();
- Log.v(TAG, "Starting the work");
+ public void onCreate() {
+ Log.v(TAG, "Created");
+ prefs = PreferenceManager.getDefaultSharedPreferences(this);
+ }
- Intent intent = getIntent();
- setResult(RESULT_CANCELED);
- if (swipeDialog != null) {
- swipeDialog.dismiss();
- swipeDialog = null;
- }
- int slot = intent.getIntExtra("slot", -1);
+ @Override
+ public int onStartCommand (Intent intent, int flags, int startId) {
+ Log.v(TAG, "Starting service");
+ this.startId = startId;
+ int slot = prefs.getInt("slot_number", -1);
if (slot > 0) {
- swipeDialog = makeDialog();
- swipeDialog.show();
enableDispatch(slot);
+ } else {
+ stopSelf(startId);
}
+ return START_NOT_STICKY;
}
@Override
- protected void onPause() {
- super.onPause();
- Log.v(TAG, "Finished the work");
+ public IBinder onBind(Intent intent) {
+ Log.v(TAG, "Binding");
+ checkConnector.setService(this);
+ return checkConnector;
+ }
- if(swipeDialog != null) {
- swipeDialog.dismiss();
- swipeDialog = null;
- }
+ @Override
+ public void onDestroy() {
+ Log.v(TAG, "Finished the run");
disableDispatch();
}
- public void onNewIntent(Intent intent) {
+ @Override
+ protected void onNewIntent(Intent intent) {
Log.v(TAG, "NFC Intent arrived");
int slot = intent.getIntExtra("slot", -1);
byte[] challenge = intent.getByteArrayExtra("challenge");
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);
--- /dev/null
+package org.average.nfcauthcr;
+
+import android.content.Context;
+import android.os.Binder;
+import android.util.Log;
+
+import org.average.nfcauthcr.Enroll;
+import org.average.nfcauthcr.Check;
+
+public class CheckConnector extends Binder {
+
+ private final String TAG = getClass().getName();
+
+ private Enroll caller;
+ private Check service;
+
+ public void setCaller(Enroll caller) {
+ this.caller = caller;
+ }
+
+ public void setService(Check service) {
+ this.service = service;
+ }
+
+ public void runEnroll(int slot, byte[] challenge) {
+ Log.v(TAG, "runEnroll");
+ service.runEnroll(slot, challenge);
+ }
+
+ public void runCallback(int rc, byte[] response) {
+ Log.v(TAG, "runCallback");
+ caller.runCallback(rc, response);
+ }
+}
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
-import android.preference.PreferenceManager;
+import android.content.Context;
+import android.content.ComponentName;
import android.content.Intent;
+import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.DialogInterface;
+import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.RadioButton;
import org.average.nfcauthcr.Check;
+import org.average.nfcauthcr.CheckConnector;
public class Enroll extends Activity {
private final String TAG = getClass().getName();
+ private Enroll thisActivity = this;
private static boolean waitingForResult = false;
private static SharedPreferences prefs;
private static int slot;
+ private AlertDialog swipeDialog;
+ private CheckConnector checkConnector;
+ private boolean mBound = false;
+ private byte[] challenge = new byte[63];
+
+ private ServiceConnection mConnection = new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName className,
+ IBinder service) {
+ checkConnector = (CheckConnector) service;
+ checkConnector.setCaller(activity);
+ mBound = true;
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName arg0) {
+ mBound = false;
+ }
+ };
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
Log.v(TAG, "Starting");
prefs = PreferenceManager.getDefaultSharedPreferences(this);
+ Intent intent = new Intent(this, Check.class);
+ bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onPause() {
super.onPause();
Log.v(TAG, "Going inactive, try to stop");
- if (!waitingForResult) { finish(); }
+ if (!waitingForResult) {
+ finish();
+ }
}
@Override
protected void onStop() {
super.onStop();
Log.v(TAG, "Stop requested");
+ if (mBound) {
+ unbindService(mConnection);
+ mBound = false;
+ }
}
public void onSlotSelectionClicked(View view) {
public void onEnrollClicked(View view) {
Log.v(TAG, "Enroll clicked");
if (slot > 0) {
- runEnrollment(slot);
+ runEnrollment();
} else {
showEnrollResult(R.string.need_slot);
}
}
- public void onActivityResult(int requestCode, int resultCode,
- Intent intent) {
- Log.v(TAG, "Got activity result");
+ public void runCallback(int rc, byte[] response) {
+ Log.v(TAG, "Got response");
waitingForResult = false;
-
- if (resultCode != RESULT_OK) {
- Log.v(TAG, "Error result code " + resultCode);
+ if(swipeDialog != null) {
+ swipeDialog.dismiss();
+ swipeDialog = null;
+ }
+ if (rc != 0) {
+ Log.v(TAG, "Error result code " + rc);
return;
}
- byte[] challenge = intent.getByteArrayExtra("challenge");
Log.v(TAG, "Challenge is \"" + hex(challenge) + "\"");
- byte[] response = intent.getByteArrayExtra("response");
Log.v(TAG, "Response is \"" + hex(response) + "\"");
Editor editor = prefs.edit();
editor.putString("challenge", hex(challenge));
dialog.show();
}
- private void runEnrollment(int slot) {
+ private void runEnrollment() {
Random rng = new Random();
- byte[] challenge = new byte[63];
rng.nextBytes(challenge);
Log.v(TAG, "Random challenge: " + hex(challenge));
- Log.v(TAG, "Launching challenging activity");
- Intent crIntent = new Intent(this, Check.class);
- crIntent.putExtra("slot", slot);
- crIntent.putExtra("challenge", challenge);
- this.startActivityForResult(crIntent, 0);
waitingForResult = true;
+ checkConnector.runEnroll(slot, challenge);
+ if (swipeDialog != null) swipeDialog.dismiss();
+ swipeDialog = makeDialog();
+ swipeDialog.show();
+ }
+
+ 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) {
+ Log.v(TAG, "unbind service FIXME");
+ }
+ });
+ return builder.create();
}
private String hex(byte[] a) {