altosdroid: Need access to handler inside AltosBluetooth
[fw/altos] / altosdroid / src / org / altusmetrum / AltosDroid / AltosDroid.java
index 54b61c67ca793849d19e0c3707e49977d7165d93..b8ddd5743245470f407ec81d53670dfe76f8910c 100644 (file)
@@ -17,6 +17,7 @@
 
 package org.altusmetrum.AltosDroid;
 
+import java.lang.ref.WeakReference;
 import android.app.Activity;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
@@ -54,18 +55,15 @@ public class AltosDroid extends Activity {
        private static final String TAG = "AltosDroid";
        private static final boolean D = true;
 
-    // Message types sent from the BluetoothChatService Handler
-    public static final int MESSAGE_STATE_CHANGE = 1;
-    public static final int MESSAGE_READ = 2;
-    public static final int MESSAGE_WRITE = 3;
-    public static final int MESSAGE_DEVICE_NAME = 4;
-    public static final int MESSAGE_TOAST = 5;
-
-    // Key names received from the BluetoothChatService Handler
-    public static final String DEVICE_NAME = "device_name";
-    public static final String TOAST = "toast";
-
+       // Message types sent from the TelemetryService Handler
+       public static final int MSG_STATE_CHANGE    = 1;
+       public static final int MSG_DEVNAME         = 2;
+       public static final int MSG_INCOMING_TELEM  = 3;
+       public static final int MSG_TOAST           = 4;
 
+       // Key names received from the TelemetryService Handler
+       public static final String KEY_DEVNAME = "key_devname";
+       public static final String KEY_TOAST   = "key_toast";
 
        // Intent request codes
        private static final int REQUEST_CONNECT_DEVICE = 1;
@@ -79,18 +77,73 @@ public class AltosDroid extends Activity {
 
        private boolean mIsBound;
        Messenger mService = null;
+       final Messenger mMessenger = new Messenger(new IncomingHandler());
 
        // Name of the connected device
        private String mConnectedDeviceName = null;
        // Local Bluetooth adapter
        private BluetoothAdapter mBluetoothAdapter = null;
 
+
+       // The Handler that gets information back from the Telemetry Service
+       static class IncomingHandler extends Handler {
+               private final WeakReference<AltosDroid> mAltosDroid;
+               IncomingHandler(AltosDroid ad) { mAltosDroid = new WeakReference<AltosDroid>(ad); }
+
+               @Override
+               public void handleMessage(Message msg) {
+                       AltosDroid ad = mAltosDroid.get();
+                       switch (msg.what) {
+                       case MSG_STATE_CHANGE:
+                               if(D) Log.i(TAG, "MSG_STATE_CHANGE: " + msg.arg1);
+                               switch (msg.arg1) {
+                               case TelemetryService.STATE_CONNECTED:
+                                       ad.mTitle.setText(R.string.title_connected_to);
+                                       ad.mTitle.append(ad.mConnectedDeviceName);
+                                       ad.mSerialView.setText("");
+                                       break;
+                               case TelemetryService.STATE_CONNECTING:
+                                       ad.mTitle.setText(R.string.title_connecting);
+                                       break;
+                               case TelemetryService.STATE_READY:
+                               case TelemetryService.STATE_NONE:
+                                       ad.mTitle.setText(R.string.title_not_connected);
+                                       break;
+                               }
+                               break;
+                       case MSG_INCOMING_TELEM:
+                               byte[] buf = (byte[]) msg.obj;
+                               // construct a string from the buffer
+                               String telem = new String(buf);
+                               ad.mSerialView.append(telem);
+                               break;
+                       case MSG_DEVNAME:
+                               // save the connected device's name
+                               ad.mConnectedDeviceName = msg.getData().getString(KEY_DEVNAME);
+                               Toast.makeText(ad.getApplicationContext(), "Connected to "
+                                                       + ad.mConnectedDeviceName, Toast.LENGTH_SHORT).show();
+                               break;
+                       case MSG_TOAST:
+                               Toast.makeText(
+                                               ad.getApplicationContext(),
+                                               msg.getData().getString(KEY_TOAST),
+                                               Toast.LENGTH_SHORT).show();
+                               break;
+                       }
+               }
        };
 
 
        private ServiceConnection mConnection = new ServiceConnection() {
                public void onServiceConnected(ComponentName className, IBinder service) {
                        mService = new Messenger(service);
+                       try {
+                               Message msg = Message.obtain(null, TelemetryService.MSG_REGISTER_CLIENT);
+                               msg.replyTo = mMessenger;
+                               mService.send(msg);
+                       } catch (RemoteException e) {
+                               // In this case the service has crashed before we could even do anything with it
+                       }
                }
 
                public void onServiceDisconnected(ComponentName className) {
@@ -286,6 +339,14 @@ public class AltosDroid extends Activity {
                // Get the BLuetoothDevice object
                BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
                // Attempt to connect to the device
+               try {
+                       //Message msg = Message.obtain(null, TelemetryService.MSG_CONNECT_TELEBT);
+                       //msg.obj = device;
+                       //mService.send(msg);
+                       mService.send(Message.obtain(null, TelemetryService.MSG_CONNECT, device));
+               } catch (RemoteException e) {
+                       e.printStackTrace();
+               }
        }
 
 
@@ -318,6 +379,15 @@ public class AltosDroid extends Activity {
        void doUnbindService() {
                if (mIsBound) {
                        // If we have received the service, and hence registered with it, then now is the time to unregister.
+                       if (mService != null) {
+                               try {
+                                       Message msg = Message.obtain(null, TelemetryService.MSG_UNREGISTER_CLIENT);
+                                       msg.replyTo = mMessenger;
+                                       mService.send(msg);
+                               } catch (RemoteException e) {
+                                       // There is nothing special we need to do if the service has crashed.
+                               }
+                       }
                        // Detach our existing connection.
                        unbindService(mConnection);
                        mIsBound = false;