]> hydra-www.ietfng.org Git - acmetensortoys-ctfws-android/commitdiff
Further UI improvements
authorNathaniel Wesley Filardo <nwf@cs.jhu.edu>
Fri, 10 Feb 2017 07:12:47 +0000 (02:12 -0500)
committerNathaniel Wesley Filardo <nwf@cs.jhu.edu>
Fri, 10 Feb 2017 07:12:47 +0000 (02:12 -0500)
Notably, an About screen

20 files changed:
mobile/src/main/AndroidManifest.xml
mobile/src/main/ic_kgb_logo-web.png [new file with mode: 0644]
mobile/src/main/ic_shield_1-web.png [new file with mode: 0644]
mobile/src/main/java/com/acmetensortoys/ctfwstimer/AboutActivity.java [new file with mode: 0644]
mobile/src/main/java/com/acmetensortoys/ctfwstimer/MainActivity.java
mobile/src/main/res/drawable/shield1.png [new file with mode: 0644]
mobile/src/main/res/layout/activity_about.xml [new file with mode: 0644]
mobile/src/main/res/layout/activity_main.xml
mobile/src/main/res/menu/mainmenu.xml
mobile/src/main/res/mipmap-hdpi/ic_launcher.png [deleted file]
mobile/src/main/res/mipmap-hdpi/ic_shield_1.png [new file with mode: 0644]
mobile/src/main/res/mipmap-mdpi/ic_launcher.png [deleted file]
mobile/src/main/res/mipmap-mdpi/ic_shield_1.png [new file with mode: 0644]
mobile/src/main/res/mipmap-xhdpi/ic_launcher.png [deleted file]
mobile/src/main/res/mipmap-xhdpi/ic_shield_1.png [new file with mode: 0644]
mobile/src/main/res/mipmap-xxhdpi/ic_launcher.png [deleted file]
mobile/src/main/res/mipmap-xxhdpi/ic_shield_1.png [new file with mode: 0644]
mobile/src/main/res/mipmap-xxxhdpi/ic_launcher.png [deleted file]
mobile/src/main/res/mipmap-xxxhdpi/ic_shield_1.png [new file with mode: 0644]
mobile/src/main/res/values/strings.xml

index ba66053dd874c5558e1ad9acdfc51740864353f2..b23d07bd9027e023252d4e0c181fa073659e44a8 100644 (file)
@@ -9,13 +9,10 @@
     <uses-permission android:name="android.permission.WAKE_LOCK" />
 
     <!-- Seems like a reasonable idea? -->
-    <!--
-    <uses-permission android:name="android.permission.VIBRATE" />
-    -->
-
+    <!--     <uses-permission android:name="android.permission.VIBRATE" /> -->
     <application
         android:allowBackup="true"
-        android:icon="@mipmap/ic_launcher"
+        android:icon="@mipmap/ic_shield_1"
         android:label="@string/app_name"
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
@@ -28,6 +25,8 @@
         </activity>
 
         <service android:name="org.eclipse.paho.android.service.MqttService" />
+
+        <activity android:name=".AboutActivity"></activity>
     </application>
 
 </manifest>
\ No newline at end of file
diff --git a/mobile/src/main/ic_kgb_logo-web.png b/mobile/src/main/ic_kgb_logo-web.png
new file mode 100644 (file)
index 0000000..34314bb
Binary files /dev/null and b/mobile/src/main/ic_kgb_logo-web.png differ
diff --git a/mobile/src/main/ic_shield_1-web.png b/mobile/src/main/ic_shield_1-web.png
new file mode 100644 (file)
index 0000000..34314bb
Binary files /dev/null and b/mobile/src/main/ic_shield_1-web.png differ
diff --git a/mobile/src/main/java/com/acmetensortoys/ctfwstimer/AboutActivity.java b/mobile/src/main/java/com/acmetensortoys/ctfwstimer/AboutActivity.java
new file mode 100644 (file)
index 0000000..bfde6ae
--- /dev/null
@@ -0,0 +1,34 @@
+package com.acmetensortoys.ctfwstimer;
+
+import android.content.ActivityNotFoundException;
+import android.content.Intent;
+import android.net.Uri;
+import android.support.v7.app.AppCompatActivity;
+import android.os.Bundle;
+import android.view.View;
+import android.webkit.WebView;
+
+public class AboutActivity extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_about);
+
+        View iv = findViewById(R.id.about_image);
+        iv.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                try {
+                    startActivity(new Intent(Intent.ACTION_VIEW,
+                            Uri.parse("http://www.cmukgb.org/")));
+                } catch (ActivityNotFoundException anfe) {
+                    // NOP
+                }
+            }
+        });
+
+        final WebView wv = (WebView) findViewById(R.id.about_text);
+        wv.loadData(getResources().getString(R.string.about_text), "text/html", null);
+    }
+}
index 2c5c0dedc72a626449add1aaf2923d79d8cfe97f..1118c293c7759e2b27acc1083fb5e84913084658 100644 (file)
@@ -1,5 +1,7 @@
 package com.acmetensortoys.ctfwstimer;
 
+import android.annotation.SuppressLint;
+import android.content.Intent;
 import android.content.SharedPreferences;
 import android.os.Handler;
 import android.support.annotation.Nullable;
@@ -11,6 +13,7 @@ import android.util.Log;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
+import android.view.View;
 import android.widget.TextView;
 
 import org.eclipse.paho.android.service.MqttAndroidClient;
@@ -189,6 +192,19 @@ public class MainActivity extends AppCompatActivity {
         }
     }
 
+    private boolean egg = false;
+    @SuppressLint({"SetTextI18n"})
+    public void onclick_gamestate(View v) {
+        TextView tv = (TextView) v;
+        if (egg) {
+            tv.setText(R.string.header_gamestate);
+        } else {
+            ((TextView) v).setText("DO NOT TAP ON GLASS");
+        }
+        egg = !egg;
+    }
+
+    // TODO should we be using onClick instead for routing?
     @Override
     public boolean onOptionsItemSelected(MenuItem mi) {
         switch(mi.getItemId()) {
@@ -198,6 +214,9 @@ public class MainActivity extends AppCompatActivity {
                                 R.layout.server_dialog, R.id.server_text, "server");
                 d.show(getSupportFragmentManager(),"serverdialog");
                 return true;
+            case R.id.menu_about :
+                startActivity(new Intent(this, AboutActivity.class));
+                return true;
             default:
                 return super.onOptionsItemSelected(mi);
         }
diff --git a/mobile/src/main/res/drawable/shield1.png b/mobile/src/main/res/drawable/shield1.png
new file mode 100644 (file)
index 0000000..309ca72
Binary files /dev/null and b/mobile/src/main/res/drawable/shield1.png differ
diff --git a/mobile/src/main/res/layout/activity_about.xml b/mobile/src/main/res/layout/activity_about.xml
new file mode 100644 (file)
index 0000000..029c524
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/activity_about"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:paddingBottom="@dimen/activity_vertical_margin"
+    android:paddingLeft="@dimen/activity_horizontal_margin"
+    android:paddingRight="@dimen/activity_horizontal_margin"
+    android:paddingTop="@dimen/activity_vertical_margin"
+    tools:context="com.acmetensortoys.ctfwstimer.AboutActivity">
+
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:srcCompat="@drawable/shield1"
+        android:id="@+id/about_image"
+        android:layout_above="@+id/about_text" />
+
+    <WebView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:id="@+id/about_text"
+        android:layout_alignParentBottom="true" />
+
+</RelativeLayout>
index 349ad30d59d5a47ca67f06b5e2fd7936eb167241..a6cb6347d2ca77b0a2b2679f7656a8ab18d3b2c7 100644 (file)
     <LinearLayout
         android:orientation="vertical"
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="wrap_content">
 
-        <LinearLayout
-            android:orientation="vertical"
+        <!--
+        <TableLayout
             android:layout_width="match_parent"
-            android:layout_height="wrap_content">
+            android:layout_height="match_parent"
+            android:id="@+id/tbl_opts"
+            android:stretchColumns="1">
 
-            <TextView
-                android:text="@string/header_gamestate"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:gravity="center" />
+            <TableRow
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent" >
 
-            <TableLayout
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:stretchColumns="1">
+                <TextView
+                    android:text="Notifications\nDuring\nGame"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:gravity="center" />
 
-                <TableRow
+                <LinearLayout
+                    android:orientation="horizontal"
                     android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    android:gravity="center"
-                    android:paddingBottom="1dp">
-
-                    <TextView
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:id="@+id/tv_jailbreak"
-                        android:text="@string/ctfws_gamestart"
-                        android:gravity="center" />
+                    android:layout_height="match_parent">
 
-                    <ProgressBar
-                        style="@android:style/Widget.DeviceDefault.ProgressBar.Horizontal"
+                    <CheckBox
+                        android:text="Wear"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:id="@+id/pb_jailbreak"
-                        android:layout_weight="1"
-                        android:indeterminate="false"
-                        android:max="100"
-                        android:progress="0"
-                        android:padding="5dp"
-                        android:rotation="180" />
-
-                    <Chronometer
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:id="@+id/ch_jailbreak"
-                        android:countDown="true" />
-
-                </TableRow>
-
-                <TableRow
-                    android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    android:gravity="center"
-                    android:paddingBottom="1dp"
-                    android:paddingTop="1dp">
-
-                    <TextView
-                        android:text="@string/header_gametimeela"
-                        android:layout_height="wrap_content"
-                        android:id="@+id/tv_gameProgress"
-                        android:layout_weight="1"
-                        android:gravity="center"
-                        android:layout_width="wrap_content" />
+                        android:id="@+id/notif_wear"
+                        android:layout_weight="1" />
 
-                    <ProgressBar
-                        style="@android:style/Widget.DeviceDefault.Light.ProgressBar.Horizontal"
+                    <CheckBox
+                        android:text="Here"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:id="@+id/pb_gameProgress"
-                        android:layout_weight="1"
-                        android:indeterminate="false"
-                        android:padding="5dp" />
-
-                    <Chronometer
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:id="@+id/ch_gameProgress" />
-
-                </TableRow>
-
-                <TableRow
-                    android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    android:id="@+id/tr_flags"
-                    android:paddingTop="1dp">
+                        android:id="@+id/notif_here"
+                        android:layout_weight="1" />
+                </LinearLayout>
 
-                    <TextView
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:gravity="center"
-                        android:id="@+id/tv_flags_label" />
+            </TableRow>
 
-                    <TextView
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:id="@+id/tv_flags"
-                        android:gravity="center" />
+            <TableRow
+                android:layout_width="match_parent"
+                android:layout_height="match_parent" />
 
-                </TableRow>
+        </TableLayout>
+        -->
 
-            </TableLayout>
-        </LinearLayout>
+        <TextView
+            android:text="@string/header_gamestate"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:clickable="true"
+            android:onClick="onclick_gamestate" />
 
-        <LinearLayout
-            android:orientation="vertical"
+        <TableLayout
             android:layout_width="match_parent"
-            android:layout_height="wrap_content">
+            android:layout_height="match_parent"
+            android:stretchColumns="1">
 
-            <TextView
+            <TableRow
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content"
+                android:layout_height="match_parent"
                 android:gravity="center"
-                android:text="@string/header_messages" />
+                android:paddingBottom="1dp">
 
-            <TextView
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:inputType="none"
-                android:ems="10"
-                android:id="@+id/msgs"
-                android:lines="10"
-                android:scrollbars="vertical"
-                android:gravity="bottom" />
-
-        </LinearLayout>
-
-        <LinearLayout
-            android:orientation="vertical"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent">
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:id="@+id/tv_jailbreak"
+                    android:text="@string/ctfws_gamestart"
+                    android:gravity="center" />
 
-            <TextView
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:gravity="center"
-                android:text="@string/mqtt_header" />
+                <ProgressBar
+                    style="@android:style/Widget.DeviceDefault.ProgressBar.Horizontal"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:id="@+id/pb_jailbreak"
+                    android:layout_weight="1"
+                    android:indeterminate="false"
+                    android:max="100"
+                    android:progress="0"
+                    android:padding="5dp"
+                    android:rotation="180" />
+
+                <Chronometer
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:id="@+id/ch_jailbreak"
+                    android:countDown="true" />
 
-            <TableLayout
+            </TableRow>
+
+            <TableRow
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
-                android:stretchColumns="1">
+                android:gravity="center"
+                android:paddingBottom="1dp"
+                android:paddingTop="1dp">
+
+                <TextView
+                    android:text="@string/header_gametimeela"
+                    android:layout_height="wrap_content"
+                    android:id="@+id/tv_gameProgress"
+                    android:layout_weight="1"
+                    android:gravity="center"
+                    android:layout_width="wrap_content" />
 
-                <TableRow
+                <ProgressBar
+                    style="@android:style/Widget.DeviceDefault.Light.ProgressBar.Horizontal"
                     android:layout_width="match_parent"
-                    android:layout_height="match_parent">
+                    android:layout_height="wrap_content"
+                    android:id="@+id/pb_gameProgress"
+                    android:layout_weight="1"
+                    android:indeterminate="false"
+                    android:padding="5dp" />
 
-                    <TextView
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:text="@string/menutext_mqtt_label"
-                        android:gravity="center" />
+                <Chronometer
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:id="@+id/ch_gameProgress" />
 
-                    <TextView
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:id="@+id/tv_mqtt_server_uri"
-                        android:gravity="center" />
-                </TableRow>
+            </TableRow>
+
+            <TableRow
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:id="@+id/tr_flags"
+                android:paddingTop="1dp">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:gravity="center"
+                    android:id="@+id/tv_flags_label" />
 
-                <TableRow
+                <TextView
                     android:layout_width="match_parent"
-                    android:layout_height="match_parent">
+                    android:layout_height="wrap_content"
+                    android:id="@+id/tv_flags"
+                    android:gravity="center" />
 
-                    <TextView
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:text="@string/mqtt_state_label"
-                        android:gravity="center" />
+            </TableRow>
 
-                    <TextView
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:id="@+id/tv_mqtt_state"
-                        android:gravity="center" />
+        </TableLayout>
 
-                </TableRow>
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:text="@string/header_messages" />
 
-            </TableLayout>
-        </LinearLayout>
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:inputType="none"
+            android:ems="10"
+            android:id="@+id/msgs"
+            android:lines="10"
+            android:scrollbars="vertical"
+            android:gravity="bottom" />
+    </LinearLayout>
+
+    <LinearLayout
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true">
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center"
+            android:text="@string/mqtt_header" />
 
-        <!--
         <TableLayout
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:id="@+id/tbl_opts"
             android:stretchColumns="1">
 
             <TableRow
-                android:layout_width="wrap_content"
-                android:layout_height="match_parent" >
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/menutext_mqtt_label"
+                    android:gravity="right" />
 
                 <TextView
-                    android:text="Notifications\nDuring\nGame"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
+                    android:id="@+id/tv_mqtt_server_uri"
                     android:gravity="center" />
+            </TableRow>
 
-                <LinearLayout
-                    android:orientation="horizontal"
-                    android:layout_width="match_parent"
-                    android:layout_height="match_parent">
+            <TableRow
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
 
-                    <CheckBox
-                        android:text="Wear"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:id="@+id/notif_wear"
-                        android:layout_weight="1" />
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/mqtt_state_label"
+                    android:gravity="right" />
 
-                    <CheckBox
-                        android:text="Here"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:id="@+id/notif_here"
-                        android:layout_weight="1" />
-                </LinearLayout>
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:id="@+id/tv_mqtt_state"
+                    android:gravity="center" />
 
             </TableRow>
 
-            <TableRow
-                android:layout_width="match_parent"
-                android:layout_height="match_parent" />
-
         </TableLayout>
-        -->
-
     </LinearLayout>
 
 </RelativeLayout>
index 04f1e79e9a9798ca92171f6e0e080bfee94a8f21..0c6a9f0e93278685fe0cac786a6e000c4bb91d70 100644 (file)
@@ -6,5 +6,12 @@
         android:enabled="true"
         android:title="@string/menutext_mqtt"
         android:id="@+id/menu_mqtt"
-        android:icon="@android:drawable/ic_menu_manage" />
+        android:icon="@android:drawable/ic_menu_manage"
+        android:checkable="false" />
+    <item android:title="@string/menutext_about"
+        android:id="@+id/menu_about"
+        android:icon="@android:drawable/ic_menu_compass"
+        android:visible="true"
+        android:enabled="true"
+        android:checkable="false" />
 </menu>
\ No newline at end of file
diff --git a/mobile/src/main/res/mipmap-hdpi/ic_launcher.png b/mobile/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644 (file)
index cde69bc..0000000
Binary files a/mobile/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/mobile/src/main/res/mipmap-hdpi/ic_shield_1.png b/mobile/src/main/res/mipmap-hdpi/ic_shield_1.png
new file mode 100644 (file)
index 0000000..0e349f1
Binary files /dev/null and b/mobile/src/main/res/mipmap-hdpi/ic_shield_1.png differ
diff --git a/mobile/src/main/res/mipmap-mdpi/ic_launcher.png b/mobile/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644 (file)
index c133a0c..0000000
Binary files a/mobile/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/mobile/src/main/res/mipmap-mdpi/ic_shield_1.png b/mobile/src/main/res/mipmap-mdpi/ic_shield_1.png
new file mode 100644 (file)
index 0000000..7f7efda
Binary files /dev/null and b/mobile/src/main/res/mipmap-mdpi/ic_shield_1.png differ
diff --git a/mobile/src/main/res/mipmap-xhdpi/ic_launcher.png b/mobile/src/main/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644 (file)
index bfa42f0..0000000
Binary files a/mobile/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/mobile/src/main/res/mipmap-xhdpi/ic_shield_1.png b/mobile/src/main/res/mipmap-xhdpi/ic_shield_1.png
new file mode 100644 (file)
index 0000000..6058a1f
Binary files /dev/null and b/mobile/src/main/res/mipmap-xhdpi/ic_shield_1.png differ
diff --git a/mobile/src/main/res/mipmap-xxhdpi/ic_launcher.png b/mobile/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644 (file)
index 324e72c..0000000
Binary files a/mobile/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/mobile/src/main/res/mipmap-xxhdpi/ic_shield_1.png b/mobile/src/main/res/mipmap-xxhdpi/ic_shield_1.png
new file mode 100644 (file)
index 0000000..4e07e72
Binary files /dev/null and b/mobile/src/main/res/mipmap-xxhdpi/ic_shield_1.png differ
diff --git a/mobile/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/mobile/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644 (file)
index aee44e1..0000000
Binary files a/mobile/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/mobile/src/main/res/mipmap-xxxhdpi/ic_shield_1.png b/mobile/src/main/res/mipmap-xxxhdpi/ic_shield_1.png
new file mode 100644 (file)
index 0000000..4cd7cbb
Binary files /dev/null and b/mobile/src/main/res/mipmap-xxxhdpi/ic_shield_1.png differ
index 82df3b7c3f7962ee96e48e7ff440175e5eb4e0fb..8d98c32aec28d77658915f78e7d2b77046e4685d 100644 (file)
@@ -13,6 +13,7 @@
     <string name="dialog_ok">OK</string>
     <string name="dialog_cancel">Cancel</string>
 
+    <string name="menutext_about">About</string>
     <string name="menutext_mqtt">Set MQTT Server</string>
     <string name="menutext_mqtt_label">Server URI:</string>
 
     <string name="mqtt_subbed">Subscribed</string>
 
     <string name="string_null">&lt;&lt;null&gt;&gt;</string>
+
+    <string name="about_text"><![CDATA[
+        <center>
+          <a href="http://www.cmukgb.org/activities/ctfws.php">Capture The Flag With Stuff Rules</a>
+          <br/>
+          This project is open source under AGPLv3; see the
+            <a href="https://github.com/AcmeTensorToys/ctfws-android">GitHub Project Page</a>
+          <br/>
+          &#169; 2017 Nathaniel Wesley Filardo and others
+        </center>
+        ]]>
+    </string>
 </resources>