Recently Written · git

assistkey

Hardware key remapper for the Viwoods AiPaper Reader: AI key, volume keys and power, with multi-tap, hold and chords

git clone https://github.com/equwal/assistkey

Log | Files | Refs


commit 1e9dcfc6be9f2b42d66a471fd0126575c92d3453
equwal <13551856+equwal@users.noreply.github.com>
2026-09-26 15:00:48 -0700

Add a More apps section with links to the other apps

The Licence screen shows the other sites and apps of the author, after
Say thanks. A tap on an entry opens its page in the browser.

The play flavour does not show the section. It does not show the tip
link either.

Add a More projects section to the README.

 README.md                                          | 24 +++++++++
 .../dev/equwal/assistkey/ui/LicenseActivity.kt     | 14 ++++++
 .../main/java/dev/equwal/assistkey/ui/MoreApps.kt  | 58 ++++++++++++++++++++++
 .../java/dev/equwal/assistkey/ui/MoreAppsTest.kt   | 37 ++++++++++++++
 4 files changed, 133 insertions(+)
diff --git a/README.md b/README.md
index 8ebe594..ad8e320 100644
--- a/README.md
+++ b/README.md
@@ -474,3 +474,27 @@ play/      everything for the Play Console: checklist, listing, policy, graphics
 src/debug/ a debug-only hook that renders each screen to a PNG, because the
            e-ink panel defeats `adb shell screencap`
 ```
+
+## More projects
+
+- [SubRead](https://subread.space/): read along with an audiobook, in the browser.
+  Also [for Android](https://github.com/equwal/subread-android/releases/latest),
+  [for YouTube](https://github.com/equwal/subread-extension/releases/latest)
+  and [for KOReader](https://github.com/equwal/subread.koplugin).
+- [SubRead Overlay](https://github.com/equwal/subread-overlay/releases/latest): subtitle lines over any Android media player.
+- [SubRead Dictionary](https://github.com/equwal/subread-dictionary/releases/latest): a pop-up dictionary for Android that reads Yomitan dictionaries.
+- [SubRead Anki](https://github.com/equwal/subread-anki): one tap makes an Anki card from any Android app.
+- [Subrep](https://github.com/equwal/subrep-android/releases/latest): live captions of the sound of your phone.
+- [Book Simulator](https://booksimulator.com/): a reading room for Aozora Bunko and Project Gutenberg books.
+- [honjimaku.com](https://honjimaku.com/): subtitles for Japanese audiobooks.
+- [sbm Sync](https://sbmsync.com/): your bookmarks, the same on every device,
+  with [sbm](https://github.com/equwal/sbm) for dmenu,
+  [sbm for Android](https://github.com/equwal/sbm-android/releases/latest)
+  and the [sbm add-on](https://github.com/equwal/sbm-extension/releases/latest) for Firefox and Chrome.
+- [Rebind](https://github.com/equwal/rebind/releases): remap the hardware buttons of e-ink readers and Android,
+  with [Ink Recents](https://github.com/equwal/ink-recents/releases/latest),
+  [Ink Dim](https://github.com/equwal/ink-dim/releases/latest)
+  and [Ink Update](https://github.com/equwal/ink-update/releases/latest).
+- [dickt.store](https://dickt.store/): language-learning tools, flashcards and web toys.
+- [hentaibun.online](https://hentaibun.online/): learn kanbun and kobun.
+- [Recently Written](https://recentlywritten.com/): the blog, and a list of [all projects](https://recentlywritten.com/projects.html).
diff --git a/app/src/main/java/dev/equwal/assistkey/ui/LicenseActivity.kt b/app/src/main/java/dev/equwal/assistkey/ui/LicenseActivity.kt
index 2db626f..577d02c 100644
--- a/app/src/main/java/dev/equwal/assistkey/ui/LicenseActivity.kt
+++ b/app/src/main/java/dev/equwal/assistkey/ui/LicenseActivity.kt
@@ -47,9 +47,23 @@ class LicenseActivity : Activity() {
             restore(col)
         }
         tip(col)
+        moreApps(col)
         col.note("Version " + BuildConfig.VERSION_NAME)
     }
 
+    /** Links to the other sites and apps of the same author. A tap opens the page in the browser. */
+    private fun moreApps(col: LinearLayout) {
+        if (!MoreApps.shown) return
+        col.header("More apps")
+        for (app in MoreApps.ALL) {
+            col.row(app.name, app.line) {
+                runCatching {
+                    startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(app.url)))
+                }.onFailure { Toast.makeText(this, "No browser on this device", Toast.LENGTH_LONG).show() }
+            }
+        }
+    }
+
     /**
      * A link to give a tip. It unlocks nothing. It is only in the build for
      * direct install: Google Play does not allow a link to another way to pay
diff --git a/app/src/main/java/dev/equwal/assistkey/ui/MoreApps.kt b/app/src/main/java/dev/equwal/assistkey/ui/MoreApps.kt
new file mode 100644
index 0000000..662dc0f
--- /dev/null
+++ b/app/src/main/java/dev/equwal/assistkey/ui/MoreApps.kt
@@ -0,0 +1,58 @@
+package dev.equwal.assistkey.ui
+
+import dev.equwal.assistkey.license.Tip
+
+/**
+ * The other sites and apps of the same author, for the Licence screen. They are in
+ * the order of the catalog: the sites, then the Android apps, then the list of all
+ * projects. Rebind is not in it.
+ */
+object MoreApps {
+
+    /** One link: a name, one line about it, and the page that a tap opens. */
+    class App(val name: String, val line: String, val url: String)
+
+    /** The Google Play build has no tip link. It has no More apps either. */
+    val shown: Boolean get() = Tip.URL.isNotEmpty()
+
+    val ALL = listOf(
+        App("SubRead", "Read along with an audiobook.", "https://subread.space/"),
+        App("Book Simulator", "A reading room for Aozora Bunko and Project Gutenberg books.", "https://booksimulator.com/"),
+        App("honjimaku.com", "Subtitles for Japanese audiobooks.", "https://honjimaku.com/"),
+        App("sbm Sync", "Your bookmarks, the same on every device.", "https://sbmsync.com/"),
+        App(
+            "SubRead for Android", "Times an audiobook against its ebook on the device.",
+            "https://github.com/equwal/subread-android/releases/latest"
+        ),
+        App(
+            "SubRead Overlay", "Subtitle lines over any Android media player.",
+            "https://github.com/equwal/subread-overlay/releases/latest"
+        ),
+        App(
+            "SubRead Dictionary", "Pop-up dictionary that reads Yomitan dictionaries.",
+            "https://github.com/equwal/subread-dictionary/releases/latest"
+        ),
+        App("SubRead Anki", "One tap makes an Anki card from any app.", "https://github.com/equwal/subread-anki"),
+        App(
+            "Subrep", "Live captions of the sound of your phone.",
+            "https://github.com/equwal/subrep-android/releases/latest"
+        ),
+        App(
+            "sbm for Android", "Fuzzy search for your bookmarks.",
+            "https://github.com/equwal/sbm-android/releases/latest"
+        ),
+        App(
+            "Ink Recents", "A recent-apps switcher for e-ink.",
+            "https://github.com/equwal/ink-recents/releases/latest"
+        ),
+        App(
+            "Ink Dim", "Frontlight below the lowest system level.",
+            "https://github.com/equwal/ink-dim/releases/latest"
+        ),
+        App(
+            "Ink Update", "Tells you when Rebind and its extensions update.",
+            "https://github.com/equwal/ink-update/releases/latest"
+        ),
+        App("All projects", "Everything, with source code.", "https://recentlywritten.com/projects.html")
+    )
+}
diff --git a/app/src/test/java/dev/equwal/assistkey/ui/MoreAppsTest.kt b/app/src/test/java/dev/equwal/assistkey/ui/MoreAppsTest.kt
new file mode 100644
index 0000000..7dc5c6a
--- /dev/null
+++ b/app/src/test/java/dev/equwal/assistkey/ui/MoreAppsTest.kt
@@ -0,0 +1,37 @@
+package dev.equwal.assistkey.ui
+
+import dev.equwal.assistkey.BuildConfig
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Test
+
+/** The list of the More apps section on the Licence screen, and when it shows. */
+class MoreAppsTest {
+
+    @Test
+    fun `the list leaves out Rebind`() {
+        assertFalse(MoreApps.ALL.any { it.name == "Rebind" || "equwal/rebind" in it.url || "equwal/assistkey" in it.url })
+    }
+
+    @Test
+    fun `each link opens an https page`() {
+        for (app in MoreApps.ALL) assertTrue(app.url, app.url.startsWith("https://"))
+    }
+
+    @Test
+    fun `the list keeps the order of the catalog`() {
+        assertEquals(
+            listOf("SubRead", "Book Simulator", "honjimaku.com", "sbm Sync"),
+            MoreApps.ALL.take(4).map { it.name }
+        )
+        assertEquals("All projects", MoreApps.ALL.last().name)
+        // The catalog has 15 entries. Rebind is the one that is not in the list.
+        assertEquals(14, MoreApps.ALL.size)
+    }
+
+    @Test
+    fun `only the Google Play build leaves the section out`() {
+        assertEquals(BuildConfig.FLAVOR != "play", MoreApps.shown)
+    }
+}