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) + } +}