WIP convert to service (not working)
authorEugene Crosser <crosser@average.org>
Fri, 3 May 2013 21:32:58 +0000 (01:32 +0400)
committerEugene Crosser <crosser@average.org>
Fri, 3 May 2013 21:32:58 +0000 (01:32 +0400)
src/org/average/nfcauthcr/Check.java
src/org/average/nfcauthcr/CheckConnector.java [new file with mode: 0644]
src/org/average/nfcauthcr/Enroll.java

index f65ae1ba034536692c5ba0be8c216e329bac146f..eaf804d25a25353345e535ab5aeda8672830bae3 100644 (file)
@@ -1,60 +1,68 @@
 package org.average.nfcauthcr;
 
 package org.average.nfcauthcr;
 
-import android.app.Activity;
-import android.app.AlertDialog;
+import android.app.Service;
 import android.app.PendingIntent;
 import android.app.PendingIntent;
-import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
 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.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 android.util.Log;
 import android.widget.Toast;
 
+import org.average.nfcauthcr.CheckConnector;
 import org.average.nfcauthcr.YkNeo;
 import org.average.nfcauthcr.CRException;
 
 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 final String TAG = getClass().getName();
 
-       private AlertDialog swipeDialog;
+       private final CheckConnector checkConnector = new CheckConnector();
+       private SharedPreferences prefs;
+       private int startId;
        private PendingIntent tagIntent;
 
        @Override
        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) {
                if (slot > 0) {
-                       swipeDialog = makeDialog();
-                       swipeDialog.show();
                        enableDispatch(slot);
                        enableDispatch(slot);
+               } else {
+                       stopSelf(startId);
                }
                }
+               return START_NOT_STICKY;
        }
 
        @Override
        }
 
        @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();
        }
 
                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");
                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();
        }
 
                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);
        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 (file)
index 0000000..69f6378
--- /dev/null
@@ -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);
+       }
+}
index 190c08ff921c190b65754e5d3b01eb4ae9f5c331..4ca03a88bc4f9437cd2f837ceb12a820719f462c 100644 (file)
@@ -5,25 +5,49 @@ import java.util.Random;
 import android.os.Bundle;
 import android.app.Activity;
 import android.app.AlertDialog;
 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.Intent;
+import android.content.ServiceConnection;
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
 import android.content.DialogInterface;
 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 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();
 
 
 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 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)
 
        @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);
                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
        }
 
        @Override
@@ -53,13 +79,19 @@ public class Enroll extends Activity {
        protected void onPause() {
                super.onPause();
                Log.v(TAG, "Going inactive, try to stop");
        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");
        }
 
        @Override
        protected void onStop() {
                super.onStop();
                Log.v(TAG, "Stop requested");
+               if (mBound) {
+                       unbindService(mConnection);
+                       mBound = false;
+               }
        }
 
        public void onSlotSelectionClicked(View view) {
        }
 
        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) {
        public void onEnrollClicked(View view) {
                Log.v(TAG, "Enroll clicked");
                if (slot > 0) {
-                       runEnrollment(slot);
+                       runEnrollment();
                } else {
                        showEnrollResult(R.string.need_slot);
                }
        }
 
                } 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;
                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;
                }
                        return;
                }
-               byte[] challenge = intent.getByteArrayExtra("challenge");
                Log.v(TAG, "Challenge is \"" + hex(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));
                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();
        }
 
                dialog.show();
        }
 
-       private void runEnrollment(int slot) {
+       private void runEnrollment() {
                Random rng = new Random();
                Random rng = new Random();
-               byte[] challenge = new byte[63];
                rng.nextBytes(challenge);
                Log.v(TAG, "Random challenge: " + hex(challenge));
                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;
                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) {
        }
 
        private String hex(byte[] a) {