]> hydra-www.ietfng.org Git - acmetensortoys-ctfws-android/commitdiff
Add support for timesync messages
authorNathaniel Wesley Filardo <nwfilardo@gmail.com>
Sun, 28 Oct 2018 14:12:48 +0000 (14:12 +0000)
committerNathaniel Wesley Filardo <nwfilardo@gmail.com>
Sun, 28 Oct 2018 15:16:12 +0000 (15:16 +0000)
mobile/src/main/java/com/acmetensortoys/ctfwstimer/MainActivity.java
mobile/src/main/java/com/acmetensortoys/ctfwstimer/MainService.java
mobile/src/main/res/values/strings.xml

index 5bcf9232e2916e5657c7f3376c18b07d505f3da9..2720b3eb287e7b89ab98e98381a2d948af2776f6 100644 (file)
@@ -43,7 +43,14 @@ public class MainActivity extends AppCompatActivity {
             switch(mse) {
                 case MSE_CONN: setServerStateText(R.string.mqtt_conn); break;
                 case MSE_DISCONN: setServerStateText(R.string.mqtt_disconn); break;
-                case MSE_SUB: setServerStateText(R.string.mqtt_subbed);
+                case MSE_SUB: {
+                    long lstde = b.getLastServerTimeDeltaEstimate();
+                    if (Math.abs(lstde) <= 5) {
+                        setServerStateText(R.string.mqtt_subbed);
+                    } else {
+                        setServerStateText(R.string.mqtt_subbed_tdelta, lstde);
+                    }
+                }
             }
         }
     };
index 313af236a3d4c4509ef19913a739268953fd6f05..63d6046d91d050e41da48f8165317f5c616fb54e 100644 (file)
@@ -18,6 +18,7 @@ import org.eclipse.paho.android.service.MqttTraceHandler;
 import org.eclipse.paho.client.mqttv3.IMqttActionListener;
 import org.eclipse.paho.client.mqttv3.IMqttAsyncClient;
 import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
+import org.eclipse.paho.client.mqttv3.IMqttMessageListener;
 import org.eclipse.paho.client.mqttv3.IMqttToken;
 import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
 import org.eclipse.paho.client.mqttv3.MqttClient;
@@ -106,6 +107,29 @@ public class MainService extends Service {
                 mMqc.subscribe(p + "flags", 2, null, subal, mCtfwscbs.onFlags);
                 mMqc.subscribe(p + "message", 2, null, subal, mCtfwscbs.onMessage);
                 mMqc.subscribe(p + "message/player", 2, null, subal, mCtfwscbs.onPlayerMessage);
+
+                /* This one isn't really about the game state so much, so handle it ourselves. */
+                mMqc.subscribe(p + "timesync", 2, null, subal, new IMqttMessageListener() {
+                    @Override
+                    public void messageArrived(String topic, MqttMessage message) throws Exception {
+                        // Retained timesync messages wouldn't make any sense; they are,
+                        // by definition, stale.  Just skip 'em.
+                        if (message.isRetained()) {
+                            return;
+                        }
+                        long rxtime = System.currentTimeMillis() / 1000;
+                        long mtime;
+                        String msg = message.toString();
+                        Log.d("CtFws", "time msg=" + msg);
+                        try {
+                            mtime = Long.parseLong(msg);
+                        } catch (NumberFormatException e) {
+                            return;
+                        }
+                        lastServerTimeDeltaEstimate = rxtime - mtime;
+                        setMSE(MqttServerEvent.MSE_SUB);
+                    }
+                });
             } catch (MqttException e) {
                 Log.e("CtFwS", "Exn Sub", e);
             }
@@ -178,7 +202,7 @@ public class MainService extends Service {
             try {
                 String p = "ctfws/game/";
                 mMqc.unsubscribe(new String[]{
-                        p + "config", p + "endtime", p + "flags",
+                        p + "config", p + "endtime", p + "flags", p + "timesync",
                         p + "message", p + "message/player"
                 });
             } catch (MqttException me) {
@@ -229,6 +253,8 @@ public class MainService extends Service {
             return;
         }
 
+        lastServerTimeDeltaEstimate = 0;
+
         // Make our MQTT client and grab callbacks on *everything in sight*
         //
         // XXX For reasons beyond my understanding, we have to use a new client ID every time
@@ -274,6 +300,7 @@ public class MainService extends Service {
         MSE_SUB,        /* Subscriptions have been registered */
     }
     private MqttServerEvent mMSE = MqttServerEvent.MSE_DISCONN;
+    private long lastServerTimeDeltaEstimate = 0;
     public interface Observer {
         void onMqttServerChanged(LocalBinder b, String sURL);
         void onMqttServerEvent(LocalBinder b, MqttServerEvent mse);
@@ -303,6 +330,7 @@ public class MainService extends Service {
         CtFwSGameStateManager getGameState() {
             return mCgs;
         }
+        long getLastServerTimeDeltaEstimate() { return lastServerTimeDeltaEstimate; }
 
         // It should not be necessary to call this except at the beginning or to force a reconnect;
         // most everything else you might want in a connect method is handled by the
index d274f35d0c24e21b702957663fc9c84436fcd6f0..1c3640ebd39fc2ec934e26c9dfc0d498b68bd5ff 100644 (file)
@@ -46,6 +46,7 @@
     <string name="mqtt_conn">Connected but not subscribed</string>
     <string name="mqtt_disconn">Disconnected (tap to retry now)</string>
     <string name="mqtt_subbed">Subscribed</string>
+    <string name="mqtt_subbed_tdelta" tools:ignore="PluralsCandidate">Subscribed (est. %1$d sec. diff.)</string>
 
     <string name="preftext_mqtt">Set MQTT Server</string>
     <string name="preftext_vibrate_jb">Vibrate on Jailbreak?</string>