]> hydra-www.ietfng.org Git - acmetensortoys-ctfws-android/commitdiff
Add display of sides information
authorNathaniel Wesley Filardo <nwfilardo@gmail.com>
Sat, 27 Oct 2018 15:51:26 +0000 (16:51 +0100)
committerNathaniel Wesley Filardo <nwfilardo@gmail.com>
Sun, 28 Oct 2018 00:55:59 +0000 (01:55 +0100)
lib/src/main/java/com/acmetensortoys/ctfwstimer/lib/CtFwSGameStateManager.java
mobile/src/main/java/com/acmetensortoys/ctfwstimer/CtFwSDisplayLocal.java
mobile/src/main/res/layout-land/activity_main.xml
mobile/src/main/res/layout/activity_main.xml
mobile/src/main/res/values/strings.xml

index b765b53cc792cf004aec3400aa13649f158bce78..a0b05adb0476655d57b72a0ea754214aed618f8c 100644 (file)
@@ -17,6 +17,19 @@ public class CtFwSGameStateManager {
         mT = t;
     }
 
+    private static boolean carefulStrEq(String a, String b)
+    {
+        if (a == null) {
+            return b == null;
+        } else {
+            if (b == null) {
+                return false;
+            } else {
+                return a.equals(b);
+            }
+        }
+    }
+
     private class Game {
         // Game time
         private boolean configured = false;
@@ -28,6 +41,7 @@ public class CtFwSGameStateManager {
         private long endT = 0;   // POSIX seconds for game end (if >= startT)
 
         public int  flagsTotal;
+        public String sides_str;
 
         public boolean equals(Game g) {
             return     (this.configured == g.configured)
@@ -37,7 +51,8 @@ public class CtFwSGameStateManager {
                     && (this.roundD == g.roundD)
                     && (this.gameIx == g.gameIx)
                     && (this.endT == g.endT)
-                    && (this.flagsTotal == g.flagsTotal);
+                    && (this.flagsTotal == g.flagsTotal)
+                    && (carefulStrEq(this.sides_str, g.sides_str));
         }
     }
     private Game curstate = new Game();
@@ -50,9 +65,9 @@ public class CtFwSGameStateManager {
             case "none":
                 g.configured = false;
                 break;
-            default:
+            default: {
+                Scanner s = new Scanner(tm);
                 try {
-                    Scanner s = new Scanner(tm);
                     g.startT = s.nextLong();
                     g.setupD = s.nextInt();
                     g.rounds = s.nextInt();
@@ -63,7 +78,14 @@ public class CtFwSGameStateManager {
                 } catch (NoSuchElementException e) {
                     g.configured = false;
                 }
+
+                try {
+                    g.sides_str = s.next();
+                } catch (NoSuchElementException e) {
+                    g.sides_str = null;
+                }
                 break;
+            }
         }
         if (!curstate.equals(g)) {
             curstate = g;
@@ -161,6 +183,7 @@ public class CtFwSGameStateManager {
     public int getRounds() { return curstate.rounds; }
     public int getComputedGameDuration() { return curstate.rounds * curstate.roundD ; }
     public int getFlagsTotal() { return curstate.flagsTotal; }
+    public String getSides() { return curstate.sides_str; }
     // Leaves off the natural endT comparison so that messages can be posted after the
     // game ends and still count as part of this one (i.e. still be displayed).
     private boolean isMessageTimeWithin(long time) {
index e30eb1d879f0917ff20992d3f8c9fb25db116a1a..87bdcf9d129c32b2c1c03c894d01a150206fb1fe 100644 (file)
@@ -6,6 +6,8 @@ import android.graphics.Color;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.SystemClock;
+import android.text.Html;
+import android.text.Spanned;
 import android.text.format.DateUtils;
 import android.util.Log;
 import android.view.View;
@@ -120,9 +122,50 @@ class CtFwSDisplayLocal implements CtFwSGameStateManager.Observer {
         });
     }
 
+    private Spanned htmlFromStrResId(int id) {
+        if (Build.VERSION.SDK_INT >= 24) {
+            return Html.fromHtml(mAct.getResources().getString(id), 0);
+        } else {
+            return Html.fromHtml(mAct.getResources().getString(id));
+        }
+    }
+
+    private void doSetSidesText(final CtFwSGameStateManager gs) {
+        final TextView stv = mAct.findViewById(R.id.header_sides);
+        Runnable r = new Runnable() {
+            @Override
+            public void run() {
+                stv.setText("");
+            }
+        };
+
+        if (gs.isConfigured()) {
+            String ss = gs.getSides();
+            if (ss != null) {
+                final Spanned h;
+
+                switch(ss) {
+                    case "wd" : h = htmlFromStrResId(R.string.ctfws_sides_wd); break;
+                    case "dw" : h = htmlFromStrResId(R.string.ctfws_sides_dw); break;
+                    default   : h = htmlFromStrResId(R.string.ctfws_unknown_sides); break;
+                }
+
+                r = new Runnable() {
+                    @Override
+                    public void run() {
+                        stv.setText(h);
+                    }
+                };
+            }
+        }
+
+        stv.post(r);
+    }
+
     @Override
     public void onCtFwSConfigure(final CtFwSGameStateManager gs) {
         doSetGameStateLabelText(gs, null);
+        doSetSidesText(gs);
     }
 
     @Override
@@ -133,6 +176,7 @@ class CtFwSDisplayLocal implements CtFwSGameStateManager.Observer {
         Log.d("CtFwS", "Display game state; nowMS=" + now.wallMS + " r=" + now.round + " rs=" + now.roundStart + " re=" + now.roundEnd);
 
         doSetGameStateLabelText(gs, now);
+        doSetSidesText(gs);
 
         if (now.rationale != CtFwSGameStateManager.NowRationale.NR_GAME_IN_PROGRESS) {
             Log.d("CtFwS", "Rationale: " + now.rationale + " stop=" + now.stop);
index b2064c21d8e3c62eeb34af50335d7fefd5bfb5e3..5875ba6990da707e20bda4289324621570e4da55 100644 (file)
                 </TableLayout>
             </LinearLayout>
 
-            <TableLayout
+            <LinearLayout
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
-                android:layout_weight="1">
+                android:layout_weight="1"
+                android:orientation="vertical">
 
-                <TableRow
+                <TextView
+                    android:id="@+id/header_sides"
                     android:layout_width="match_parent"
-                    android:layout_height="match_parent">
-
-                    <Button
-                        android:id="@+id/btn_wait_short"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:text="@string/wait_short" />
+                    android:layout_height="wrap_content"
+                    android:gravity="center" />
 
-                    <ProgressBar
-                        android:id="@+id/pb_wait_short"
-                        style="@android:style/Widget.DeviceDefault.Light.ProgressBar.Horizontal"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_gravity="center_vertical"
-                        android:layout_weight="1"
-                        android:indeterminate="false"
-                        android:padding="5dp"
-                        android:rotation="180"
-                        android:visibility="invisible" />
-
-                    <Chronometer
-                        android:id="@+id/ch_wait_short"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:layout_gravity="center_vertical"
-                        android:visibility="invisible" />
-
-                </TableRow>
-
-                <TableRow
+                <TableLayout
                     android:layout_width="match_parent"
                     android:layout_height="match_parent">
 
-                    <Button
-                        android:id="@+id/btn_wait_long"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:text="@string/wait_long" />
+                    <TableRow
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent">
+
+                        <Button
+                            android:id="@+id/btn_wait_short"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/wait_short" />
 
-                    <ProgressBar
-                        android:id="@+id/pb_wait_long"
-                        style="@android:style/Widget.DeviceDefault.Light.ProgressBar.Horizontal"
+                        <ProgressBar
+                            android:id="@+id/pb_wait_short"
+                            style="@android:style/Widget.DeviceDefault.Light.ProgressBar.Horizontal"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_gravity="center_vertical"
+                            android:layout_weight="1"
+                            android:indeterminate="false"
+                            android:padding="5dp"
+                            android:rotation="180"
+                            android:visibility="invisible" />
+
+                        <Chronometer
+                            android:id="@+id/ch_wait_short"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_gravity="center_vertical"
+                            android:visibility="invisible" />
+
+                    </TableRow>
+
+                    <TableRow
                         android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:layout_gravity="center_vertical"
-                        android:layout_weight="1"
-                        android:indeterminate="false"
-                        android:padding="5dp"
-                        android:rotation="180"
-                        android:visibility="invisible" />
-
-                    <Chronometer
-                        android:id="@+id/ch_wait_long"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:layout_gravity="center_vertical"
-                        android:visibility="invisible" />
-                </TableRow>
-
-            </TableLayout>
+                        android:layout_height="match_parent">
+
+                        <Button
+                            android:id="@+id/btn_wait_long"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="@string/wait_long" />
+
+                        <ProgressBar
+                            android:id="@+id/pb_wait_long"
+                            style="@android:style/Widget.DeviceDefault.Light.ProgressBar.Horizontal"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_gravity="center_vertical"
+                            android:layout_weight="1"
+                            android:indeterminate="false"
+                            android:padding="5dp"
+                            android:rotation="180"
+                            android:visibility="invisible" />
+
+                        <Chronometer
+                            android:id="@+id/ch_wait_long"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_gravity="center_vertical"
+                            android:visibility="invisible" />
+                    </TableRow>
+
+                </TableLayout>
+            </LinearLayout>
 
 
         </LinearLayout>
index a6a86998cb0e267ad3e6fa9ef4c797265c7d8952..f3e57405b05292e430f737a6c166f3530590b0be 100644 (file)
             android:gravity="center"
             android:text="@string/header_gamestate0" />
 
+        <TextView
+            android:id="@+id/header_sides"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center" />
+
         <TableLayout
             android:layout_width="match_parent"
             android:layout_height="match_parent"
index 96fcad56d804c67fed4126af115487d246bded39..bc850800304fd271134e1dae110eaf9ae2860f00 100644 (file)
@@ -7,6 +7,14 @@
     <string name="ctfws_gamestart">Game\nStart</string>
     <string name="ctfws_jailbreak">Jailbreak\n%1$d of %2$d</string>
 
+    <string name="ctfws_sides_wd">
+        <![CDATA[<b><font color=#a94442>Red</font></b> is defending Wean; <b><font color=#8a6d3b>Yellow</font></b> is defending Doherty.]]>
+    </string>
+    <string name="ctfws_sides_dw">
+        <![CDATA[<b><font color=#a94442>Red</font></b> is defending Doherty; <b><font color=#8a6d3b>Yellow</font></b> is defending Wean.]]>
+    </string>
+    <string name="ctfws_unknown_sides">We seem to be lost; where are we?</string>
+
     <string name="dialog_reset">Default</string>
 
     <string name="header_gamestate0">Game State: %1$s</string>