altosdroid: fix side-to-side scrolling in map tab
[fw/altos] / altosdroid / src / org / altusmetrum / AltosDroid / AltosDroid.java
index 2777a4d4d2780afd2a3762f23d8e02def7136ead..c9ce46a0d0c8487c075d6c95e6a8b6a845e32657 100644 (file)
@@ -18,6 +18,9 @@
 package org.altusmetrum.AltosDroid;
 
 import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Timer;
+import java.util.TimerTask;
 
 import android.app.Activity;
 import android.bluetooth.BluetoothAdapter;
@@ -55,6 +58,7 @@ public class AltosDroid extends FragmentActivity {
        // Message types received by our Handler
        public static final int MSG_STATE_CHANGE    = 1;
        public static final int MSG_TELEMETRY       = 2;
+       public static final int MSG_UPDATE_AGE      = 3;
 
        // Intent request codes
        private static final int REQUEST_CONNECT_DEVICE = 1;
@@ -76,8 +80,13 @@ 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;
 
        // Service
        private boolean mIsBound   = false;
@@ -128,6 +137,11 @@ public class AltosDroid extends FragmentActivity {
                        case MSG_TELEMETRY:
                                ad.update_ui((AltosState) msg.obj);
                                break;
+                       case MSG_UPDATE_AGE:
+                               if (ad.saved_state != null) {
+                                       ad.mAgeView.setText(String.format("%d", (System.currentTimeMillis() - ad.saved_state.report_time + 500) / 1000));
+                               }
+                               break;
                        }
                }
        };
@@ -175,21 +189,51 @@ public class AltosDroid extends FragmentActivity {
        }
 
        public void registerTab(AltosDroidTab mTab) {
+               mTabs.add(mTab);
        }
 
        public void unregisterTab(AltosDroidTab mTab) {
+               mTabs.remove(mTab);
        }
 
        void update_ui(AltosState state) {
+               if (saved_state != null) {
+                       if (saved_state.state != state.state) {
+                               String currentTab = mTabHost.getCurrentTabTag();
+                               switch (state.state) {
+                               case AltosLib.ao_flight_boost:
+                                       if (currentTab.equals("pad")) mTabHost.setCurrentTabByTag("ascent");
+                                       break;
+                               case AltosLib.ao_flight_drogue:
+                                       if (currentTab.equals("ascent")) mTabHost.setCurrentTabByTag("descent");
+                                       break;
+                               case AltosLib.ao_flight_landed:
+                                       if (currentTab.equals("descent")) mTabHost.setCurrentTabByTag("landed");
+                                       break;
+                               }
+                       }
+               }
+               saved_state = state;
+
                mCallsignView.setText(state.data.callsign);
                mSerialView.setText(String.format("%d", state.data.serial));
                mFlightView.setText(String.format("%d", state.data.flight));
                mStateView.setText(state.data.state());
                mRSSIView.setText(String.format("%d", state.data.rssi));
 
+               for (AltosDroidTab mTab : mTabs)
+                       mTab.update_ui(state);
+
                mAltosVoice.tell(state);
        }
 
+       private void onTimerTick() {
+               try {
+                       mMessenger.send(Message.obtain(null, MSG_UPDATE_AGE));
+               } catch (RemoteException e) {
+               }
+       }
+
        static String pos(double p, String pos, String neg) {
                String  h = pos;
                if (p < 0) {
@@ -228,7 +272,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);
@@ -258,6 +302,8 @@ public class AltosDroid extends FragmentActivity {
                mStateView     = (TextView) findViewById(R.id.state_value);
                mAgeView       = (TextView) findViewById(R.id.age_value);
 
+               timer.scheduleAtFixedRate(new TimerTask(){ public void run() {onTimerTick();}}, 1000L, 100L);
+
                mAltosVoice = new AltosVoice(this);
        }