altosdroid: Check state.gps != null before using it
[fw/altos] / altosdroid / src / org / altusmetrum / AltosDroid / AltosDroid.java
index 63043abd503468e9e1730cf5ebbcd0290f45a8c8..cf4227cae7895e8c713e16ee45207a177ed3b766 100644 (file)
@@ -47,6 +47,7 @@ import android.widget.TabHost;
 import android.widget.TextView;
 import android.widget.Toast;
 import android.app.AlertDialog;
+import android.location.Location;
 
 import org.altusmetrum.altoslib_1.*;
 
@@ -59,6 +60,8 @@ public class AltosDroid extends FragmentActivity {
        public static final int MSG_STATE_CHANGE    = 1;
        public static final int MSG_TELEMETRY       = 2;
        public static final int MSG_UPDATE_AGE      = 3;
+       public static final int MSG_LOCATION        = 4;
+       public static final int MSG_CRC_ERROR       = 5;
 
        // Intent request codes
        private static final int REQUEST_CONNECT_DEVICE = 1;
@@ -80,13 +83,14 @@ public class AltosDroid extends FragmentActivity {
 
        // Tabs
        TabHost     mTabHost;
-       ViewPager   mViewPager;
+       AltosViewPager   mViewPager;
        TabsAdapter mTabsAdapter;
        ArrayList<AltosDroidTab> mTabs = new ArrayList<AltosDroidTab>();
 
        // Timer and Saved flight state for Age calculation
        private Timer timer = new Timer();
        AltosState saved_state;
+       Location saved_location;
 
        // Service
        private boolean mIsBound   = false;
@@ -137,6 +141,10 @@ public class AltosDroid extends FragmentActivity {
                        case MSG_TELEMETRY:
                                ad.update_ui((AltosState) msg.obj);
                                break;
+                       case MSG_LOCATION:
+                               ad.set_location((Location) msg.obj);
+                               break;
+                       case MSG_CRC_ERROR:
                        case MSG_UPDATE_AGE:
                                if (ad.saved_state != null) {
                                        ad.mAgeView.setText(String.format("%d", (System.currentTimeMillis() - ad.saved_state.report_time + 500) / 1000));
@@ -196,6 +204,13 @@ public class AltosDroid extends FragmentActivity {
                mTabs.remove(mTab);
        }
 
+       void set_location(Location location) {
+               saved_location = location;
+               if (saved_state != null) {
+                       update_ui(saved_state);
+               }
+       }
+
        void update_ui(AltosState state) {
                if (saved_state != null) {
                        if (saved_state.state != state.state) {
@@ -215,6 +230,20 @@ public class AltosDroid extends FragmentActivity {
                }
                saved_state = state;
 
+               AltosGreatCircle from_receiver = null;
+
+               if (saved_location != null && state.gps != null && state.gps.locked) {
+                       double altitude = 0;
+                       if (saved_location.hasAltitude())
+                               altitude = saved_location.getAltitude();
+                       from_receiver = new AltosGreatCircle(saved_location.getLatitude(),
+                                                            saved_location.getLongitude(),
+                                                            altitude,
+                                                            state.gps.lat,
+                                                            state.gps.lon,
+                                                            state.gps.alt);
+               }
+
                mCallsignView.setText(state.data.callsign);
                mSerialView.setText(String.format("%d", state.data.serial));
                mFlightView.setText(String.format("%d", state.data.flight));
@@ -222,7 +251,7 @@ public class AltosDroid extends FragmentActivity {
                mRSSIView.setText(String.format("%d", state.data.rssi));
 
                for (AltosDroidTab mTab : mTabs)
-                       mTab.update_ui(state);
+                       mTab.update_ui(state, from_receiver, saved_location);
 
                mAltosVoice.tell(state);
        }
@@ -272,7 +301,7 @@ public class AltosDroid extends FragmentActivity {
                mTabHost = (TabHost)findViewById(android.R.id.tabhost);
                mTabHost.setup();
 
-               mViewPager = (ViewPager)findViewById(R.id.pager);
+               mViewPager = (AltosViewPager)findViewById(R.id.pager);
                mViewPager.setOffscreenPageLimit(4);
 
                mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager);