altosdroid: Toast() requests don't need Bundles
[fw/altos] / altosdroid / src / org / altusmetrum / AltosDroid / AltosDroid.java
index c1b9c654cd59c163a53736277ba884a981324749..33da93466ac14406fca341673bdad98ca33d8418 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;
@@ -30,6 +31,8 @@ import android.os.Handler;
 import android.os.Message;
 import android.os.Messenger;
 import android.os.RemoteException;
+import android.speech.tts.TextToSpeech;
+import android.speech.tts.TextToSpeech.OnInitListener;
 import android.text.method.ScrollingMovementMethod;
 import android.util.Log;
 //import android.view.KeyEvent;
@@ -60,10 +63,6 @@ public class AltosDroid extends Activity {
        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;
        private static final int REQUEST_ENABLE_BT      = 2;
@@ -76,33 +75,39 @@ public class AltosDroid extends Activity {
 
        private boolean mIsBound;
        Messenger mService = null;
-       final Messenger mMessenger = new Messenger(new IncomingHandler());
+       final Messenger mMessenger = new Messenger(new IncomingHandler(this));
 
        // Name of the connected device
        private String mConnectedDeviceName = null;
        // Local Bluetooth adapter
        private BluetoothAdapter mBluetoothAdapter = null;
 
+       private TextToSpeech tts;
+       private boolean tts_enabled = false;
 
        // The Handler that gets information back from the Telemetry Service
-       class IncomingHandler extends Handler {
+       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:
-                                       mTitle.setText(R.string.title_connected_to);
-                                       mTitle.append(mConnectedDeviceName);
-                                       mSerialView.setText("");
+                                       ad.mTitle.setText(R.string.title_connected_to);
+                                       ad.mTitle.append(ad.mConnectedDeviceName);
+                                       ad.mSerialView.setText("");
                                        break;
                                case TelemetryService.STATE_CONNECTING:
-                                       mTitle.setText(R.string.title_connecting);
+                                       ad.mTitle.setText(R.string.title_connecting);
                                        break;
                                case TelemetryService.STATE_READY:
                                case TelemetryService.STATE_NONE:
-                                       mTitle.setText(R.string.title_not_connected);
+                                       ad.mTitle.setText(R.string.title_not_connected);
                                        break;
                                }
                                break;
@@ -110,18 +115,19 @@ public class AltosDroid extends Activity {
                                byte[] buf = (byte[]) msg.obj;
                                // construct a string from the buffer
                                String telem = new String(buf);
-                               mSerialView.append(telem);
+                               ad.mSerialView.append(telem);
                                break;
                        case MSG_DEVNAME:
                                // save the connected device's name
-                               mConnectedDeviceName = msg.getData().getString(KEY_DEVNAME);
-                               Toast.makeText(getApplicationContext(), "Connected to "
-                                                       + mConnectedDeviceName, Toast.LENGTH_SHORT).show();
+                               ad.mConnectedDeviceName = (String) msg.obj;
+                               if (ad.mConnectedDeviceName != null)
+                                       Toast.makeText(ad.getApplicationContext(), "Connected to "
+                                                       + ad.mConnectedDeviceName, Toast.LENGTH_SHORT).show();
                                break;
                        case MSG_TOAST:
                                Toast.makeText(
-                                               getApplicationContext(),
-                                               msg.getData().getString(KEY_TOAST),
+                                               ad.getApplicationContext(),
+                                               (String) msg.obj,
                                                Toast.LENGTH_SHORT).show();
                                break;
                        }
@@ -178,6 +184,14 @@ public class AltosDroid extends Activity {
                        return;
                }
 
+               // Enable Text to Speech
+               tts = new TextToSpeech(this, new OnInitListener() {
+                       public void onInit(int status) {
+                               if (status == TextToSpeech.SUCCESS) tts_enabled = true;
+                               if (tts_enabled) tts.speak("AltosDroid ready", TextToSpeech.QUEUE_ADD, null );
+                       }
+               });
+
                // Start Telemetry Service
                startService(new Intent(AltosDroid.this, TelemetryService.class));
 
@@ -232,6 +246,8 @@ public class AltosDroid extends Activity {
 
                doUnbindService();
 
+               if (tts != null) tts.shutdown();
+
                if(D) Log.e(TAG, "--- ON DESTROY ---");
        }
 
@@ -322,9 +338,10 @@ public class AltosDroid extends Activity {
                                // User did not enable Bluetooth or an error occured
                                Log.d(TAG, "BT not enabled");
                                stopService(new Intent(AltosDroid.this, TelemetryService.class));
-                               Toast.makeText(this, R.string.bt_not_enabled_leaving, Toast.LENGTH_SHORT).show();
+                               Toast.makeText(this, R.string.bt_not_enabled, Toast.LENGTH_SHORT).show();
                                finish();
                        }
+                       break;
                }
        }
 
@@ -338,13 +355,13 @@ public class AltosDroid extends Activity {
                        //Message msg = Message.obtain(null, TelemetryService.MSG_CONNECT_TELEBT);
                        //msg.obj = device;
                        //mService.send(msg);
-                       mService.send(Message.obtain(null, TelemetryService.MSG_CONNECT_TELEBT, device));
+                       if (D) Log.i(TAG, "Connecting to " + device.getName());
+                       mService.send(Message.obtain(null, TelemetryService.MSG_CONNECT, device));
                } catch (RemoteException e) {
                        e.printStackTrace();
                }
        }
 
-
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                MenuInflater inflater = getMenuInflater();