From 604d2e2d726b0af2d9581bb3161e0de13156caba Mon Sep 17 00:00:00 2001 From: Eugene Crosser Date: Sat, 4 May 2013 01:32:58 +0400 Subject: [PATCH] WIP convert to service (not working) --- src/org/average/nfcauthcr/Check.java | 71 ++++++++--------- src/org/average/nfcauthcr/CheckConnector.java | 34 ++++++++ src/org/average/nfcauthcr/Enroll.java | 79 ++++++++++++++----- 3 files changed, 128 insertions(+), 56 deletions(-) create mode 100644 src/org/average/nfcauthcr/CheckConnector.java diff --git a/src/org/average/nfcauthcr/Check.java b/src/org/average/nfcauthcr/Check.java index f65ae1b..eaf804d 100644 --- a/src/org/average/nfcauthcr/Check.java +++ b/src/org/average/nfcauthcr/Check.java @@ -1,60 +1,68 @@ 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"); @@ -76,19 +84,6 @@ public class Check extends Activity { 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); diff --git a/src/org/average/nfcauthcr/CheckConnector.java b/src/org/average/nfcauthcr/CheckConnector.java new file mode 100644 index 0000000..69f6378 --- /dev/null +++ b/src/org/average/nfcauthcr/CheckConnector.java @@ -0,0 +1,34 @@ +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); + } +} diff --git a/src/org/average/nfcauthcr/Enroll.java b/src/org/average/nfcauthcr/Enroll.java index 190c08f..4ca03a8 100644 --- a/src/org/average/nfcauthcr/Enroll.java +++ b/src/org/average/nfcauthcr/Enroll.java @@ -5,25 +5,49 @@ import java.util.Random; 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) @@ -31,6 +55,8 @@ public class Enroll extends Activity { 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 @@ -53,13 +79,19 @@ public class Enroll extends Activity { 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) { @@ -78,24 +110,24 @@ public class Enroll extends Activity { 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)); @@ -120,17 +152,28 @@ public class Enroll extends Activity { 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) { -- 2.39.2