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 1d10d271c06db0aca5534a1e153611d8041fe3ed
truex <truex@equwal.com>
2026-09-21 04:21:01 -0700

Carry inkOS and ThinkLauncher in place of CLauncher

The build for direct install carries inkOS v0.6 (gezimos, GPL-3.0) and
ThinkLauncher v3.0 (MatiasDesuu, GPL-3.0), each the release file of its
maker and not changed. CLauncher is no longer in the build. NOTICE.txt
names each maker, licence, source and SHA-256. The main screen counts
the home screens and Ink Recents that are installed.

Version 0.0.13-alpha, version code 13.

 CHANGELOG.md                                          |  10 +++++++++-
 README.md                                             |   5 +++--
 app/src/full/assets/bundled/NOTICE.txt                |  14 ++++++++++----
 app/src/full/assets/bundled/app.inkos_v0.6-Signed.apk | Bin 0 -> 5914348 bytes
 .../assets/bundled/clauncher-v5.3.0-universal.apk     | Bin 2073428 -> 0 bytes
 app/src/full/assets/bundled/thinklauncher-v3.0.apk    | Bin 0 -> 1304836 bytes
 .../full/java/dev/equwal/assistkey/bundle/Bundled.kt  |   8 ++++++--
 .../main/java/dev/equwal/assistkey/ui/MainActivity.kt |  13 ++++++++-----
 app/src/main/java/dev/equwal/assistkey/ui/Summary.kt  |  10 +++++-----
 .../play/java/dev/equwal/assistkey/bundle/Bundled.kt  |   8 ++++++--
 .../test/java/dev/equwal/assistkey/ui/SummaryTest.kt  |   6 +++---
 gradle.properties                                     |   4 ++--
 play/PRIVACY.md                                       |   2 +-
 13 files changed, 53 insertions(+), 27 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e9f68c5..ccc6cf5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,14 @@
 # Changelog
 
-## Unreleased
+## 0.0.13-alpha - 2026-09-21
+
+Version code 13.
+
+- **Home screens: inkOS and ThinkLauncher in place of CLauncher.** The build
+  for direct install carries inkOS v0.6 and ThinkLauncher v3.0, both made for
+  e-ink, both GPL-3.0, each the release file of its maker and not changed.
+  ThinkLauncher has the internet permission of its own. Rebind still has
+  none.
 
 - **Change a button from the Done step.** "Change what it does" and "Change
   how you press it" go back to those steps with the button kept. Back on the
diff --git a/README.md b/README.md
index 79746fe..f7853f0 100644
--- a/README.md
+++ b/README.md
@@ -175,8 +175,9 @@ is only that stand-in, and keeps the class name that old bindings hold.
 
 Rebind has no home screen of its own. The `full` build carries the release
 APKs of other makers, not changed, in `app/src/full/assets/bundled/`, and
-installs them with `REQUEST_INSTALL_PACKAGES`: CLauncher (home screen,
-GPL-3.0), Ink Recents (GPL-3.0) and Whisper (speech to text, MIT).
+installs them with `REQUEST_INSTALL_PACKAGES`: inkOS and ThinkLauncher (home
+screens for e-ink, GPL-3.0), Ink Recents (GPL-3.0) and Whisper (speech to
+text, MIT).
 `NOTICE.txt` in that folder names each maker, licence, source and SHA-256.
 Android asks the user before each install. The `play` build carries nothing
 and has no install permission. It opens the page of the maker.
diff --git a/app/src/full/assets/bundled/NOTICE.txt b/app/src/full/assets/bundled/NOTICE.txt
index 0b4bbc0..25f02e1 100644
--- a/app/src/full/assets/bundled/NOTICE.txt
+++ b/app/src/full/assets/bundled/NOTICE.txt
@@ -3,11 +3,17 @@ Apps of other makers in this folder
 Each file is the release APK of its maker, not changed in any way. It is a
 separate program. Rebind only hands it to the package installer of Android.
 
-clauncher-v5.3.0-universal.apk
-  CLauncher v5.3.0, by mlm-games
+app.inkos_v0.6-Signed.apk
+  inkOS v0.6, by gezimos
   Licence: GNU General Public License v3.0
-  Source code and releases: https://github.com/mlm-games/CLauncher
-  SHA-256: aedb78216822d5c8924eb125529f2dfa9140e4841b87ed309eca8f12f38956eb
+  Source code and releases: https://github.com/gezimos/inkOS
+  SHA-256: 8e09698279a857651b38590315952eb6c4bd6451f7dd22ff4f7a1893d83a051f
+
+thinklauncher-v3.0.apk
+  ThinkLauncher v3.0, by MatiasDesuu (the file app-release.apk of that release)
+  Licence: GNU General Public License v3.0
+  Source code and releases: https://github.com/MatiasDesuu/ThinkLauncher
+  SHA-256: 123cae5b3f18e0e4ddf21bf0f949c2bd20b9bd7351f334b484045f7bfc305822
 
 ink-recents-0.1.1.apk
   Ink Recents 0.1.1, by equwal
diff --git a/app/src/full/assets/bundled/app.inkos_v0.6-Signed.apk b/app/src/full/assets/bundled/app.inkos_v0.6-Signed.apk
new file mode 100644
index 0000000..3f6c5ee
Binary files /dev/null and b/app/src/full/assets/bundled/app.inkos_v0.6-Signed.apk differ
diff --git a/app/src/full/assets/bundled/clauncher-v5.3.0-universal.apk b/app/src/full/assets/bundled/clauncher-v5.3.0-universal.apk
deleted file mode 100644
index c5051cd..0000000
Binary files a/app/src/full/assets/bundled/clauncher-v5.3.0-universal.apk and /dev/null differ
diff --git a/app/src/full/assets/bundled/thinklauncher-v3.0.apk b/app/src/full/assets/bundled/thinklauncher-v3.0.apk
new file mode 100644
index 0000000..9152d24
Binary files /dev/null and b/app/src/full/assets/bundled/thinklauncher-v3.0.apk differ
diff --git a/app/src/full/java/dev/equwal/assistkey/bundle/Bundled.kt b/app/src/full/java/dev/equwal/assistkey/bundle/Bundled.kt
index d46ab37..d28ed3e 100644
--- a/app/src/full/java/dev/equwal/assistkey/bundle/Bundled.kt
+++ b/app/src/full/java/dev/equwal/assistkey/bundle/Bundled.kt
@@ -40,8 +40,12 @@ object Bundled {
 
     val items = listOf(
         Item(
-            HOME, "CLauncher", "Minimal home screen", "app.clauncher", "v5.3.0", "GPL-3.0",
-            "https://github.com/mlm-games/CLauncher", "bundled/clauncher-v5.3.0-universal.apk"
+            HOME, "inkOS", "Text home screen for e-ink", "app.inkos", "v0.6", "GPL-3.0",
+            "https://github.com/gezimos/inkOS", "bundled/app.inkos_v0.6-Signed.apk"
+        ),
+        Item(
+            HOME, "ThinkLauncher", "Minimal home screen for e-ink", "org.matiasdesu.thinklauncherv2", "v3.0", "GPL-3.0",
+            "https://github.com/MatiasDesuu/ThinkLauncher", "bundled/thinklauncher-v3.0.apk"
         ),
         Item(
             HOME, "Ink Recents", "Recent apps, drawn for e-ink", "dev.equwal.inkrecents", "0.1.1", "GPL-3.0",
diff --git a/app/src/main/java/dev/equwal/assistkey/ui/MainActivity.kt b/app/src/main/java/dev/equwal/assistkey/ui/MainActivity.kt
index 1b69096..a45e622 100644
--- a/app/src/main/java/dev/equwal/assistkey/ui/MainActivity.kt
+++ b/app/src/main/java/dev/equwal/assistkey/ui/MainActivity.kt
@@ -11,6 +11,7 @@ import android.view.ViewGroup.LayoutParams.MATCH_PARENT
 import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
 import android.widget.LinearLayout
 import android.widget.TextView
+import dev.equwal.assistkey.bundle.Bundled
 import dev.equwal.assistkey.channel.Channel
 import dev.equwal.assistkey.channel.Channels
 import dev.equwal.assistkey.device.Detect
@@ -173,11 +174,13 @@ class MainActivity : Activity() {
         )
     }
 
-    private fun homeSummary(): String = Summary.homeAndRecents(
-        listOf("app.clauncher", "dev.equwal.inkrecents").count { pkg ->
-            runCatching { packageManager.getPackageInfo(pkg, 0) }.isSuccess
-        }
-    )
+    private fun homeSummary(): String {
+        val home = Bundled.items.filter { it.group == Bundled.HOME }
+        return Summary.homeAndRecents(
+            home.count { runCatching { packageManager.getPackageInfo(it.pkg, 0) }.isSuccess },
+            home.size
+        )
+    }
 
     private fun setupSummary(): String {
         val granted = PermissionsActivity.granted(this)
diff --git a/app/src/main/java/dev/equwal/assistkey/ui/Summary.kt b/app/src/main/java/dev/equwal/assistkey/ui/Summary.kt
index 216e3cd..60ec04e 100644
--- a/app/src/main/java/dev/equwal/assistkey/ui/Summary.kt
+++ b/app/src/main/java/dev/equwal/assistkey/ui/Summary.kt
@@ -50,11 +50,11 @@ object Summary {
         else -> "Ready"
     }
 
-    /** CLauncher and Ink Recents: how many of the two are installed. */
-    fun homeAndRecents(installed: Int): String = when (installed) {
-        0 -> "CLauncher, Ink Recents"
-        2 -> "Both installed"
-        else -> "1 of 2 installed"
+    /** The home screens and Ink Recents: how many of them are installed. */
+    fun homeAndRecents(installed: Int, offered: Int): String = when (installed) {
+        0 -> "Home screens, Ink Recents"
+        offered -> "All installed"
+        else -> installed.toString() + " of " + offered + " installed"
     }
 
     /**
diff --git a/app/src/play/java/dev/equwal/assistkey/bundle/Bundled.kt b/app/src/play/java/dev/equwal/assistkey/bundle/Bundled.kt
index c1d2477..10e3405 100644
--- a/app/src/play/java/dev/equwal/assistkey/bundle/Bundled.kt
+++ b/app/src/play/java/dev/equwal/assistkey/bundle/Bundled.kt
@@ -29,8 +29,12 @@ object Bundled {
 
     val items = listOf(
         Item(
-            HOME, "CLauncher", "Minimal home screen", "app.clauncher", "v5.3.0", "GPL-3.0",
-            "https://github.com/mlm-games/CLauncher"
+            HOME, "inkOS", "Text home screen for e-ink", "app.inkos", "v0.6", "GPL-3.0",
+            "https://github.com/gezimos/inkOS"
+        ),
+        Item(
+            HOME, "ThinkLauncher", "Minimal home screen for e-ink", "org.matiasdesu.thinklauncherv2", "v3.0", "GPL-3.0",
+            "https://github.com/MatiasDesuu/ThinkLauncher"
         ),
         Item(
             HOME, "Ink Recents", "Recent apps, drawn for e-ink", "dev.equwal.inkrecents", "0.1.1", "GPL-3.0",
diff --git a/app/src/test/java/dev/equwal/assistkey/ui/SummaryTest.kt b/app/src/test/java/dev/equwal/assistkey/ui/SummaryTest.kt
index 3dcebdd..13f8341 100644
--- a/app/src/test/java/dev/equwal/assistkey/ui/SummaryTest.kt
+++ b/app/src/test/java/dev/equwal/assistkey/ui/SummaryTest.kt
@@ -55,9 +55,9 @@ class SummaryTest {
 
     @Test
     fun `home and recents says what is in use`() {
-        assertEquals("CLauncher, Ink Recents", Summary.homeAndRecents(0))
-        assertEquals("1 of 2 installed", Summary.homeAndRecents(1))
-        assertEquals("Both installed", Summary.homeAndRecents(2))
+        assertEquals("Home screens, Ink Recents", Summary.homeAndRecents(0, 3))
+        assertEquals("1 of 3 installed", Summary.homeAndRecents(1, 3))
+        assertEquals("All installed", Summary.homeAndRecents(3, 3))
     }
 
     @Test
diff --git a/gradle.properties b/gradle.properties
index 8f7de54..d2dc4af 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -6,8 +6,8 @@ android.nonTransitiveRClass=true
 kotlin.code.style=official
 
 # Release identity. versionCode must rise with every upload to Play.
-assistkey.versionName=0.0.12-alpha
-assistkey.versionCode=12
+assistkey.versionName=0.0.13-alpha
+assistkey.versionCode=13
 
 # The free beta ends on this date (UTC) at the latest. It is the backstop for
 # installs that cannot reach Google Play; the real switch is the
diff --git a/play/PRIVACY.md b/play/PRIVACY.md
index ede5cec..2473fa0 100644
--- a/play/PRIVACY.md
+++ b/play/PRIVACY.md
@@ -36,7 +36,7 @@ password fields.
 
 **Recent apps.** Rebind has no recent-apps list of its own. The Recent apps action opens Ink Recents, a separate app with a privacy policy of its own.
 
-**Apps of other makers.** The build for direct install carries the release files of three other apps (CLauncher, Ink Recents, Whisper) and can hand them to the installer of Android, which asks you first. Rebind downloads nothing. Each of those apps has its own policy. The Google Play build carries none of them.
+**Apps of other makers.** The build for direct install carries the release files of other apps (inkOS, ThinkLauncher, Ink Recents, Whisper) and can hand them to the installer of Android, which asks you first. Rebind downloads nothing. Each of those apps has its own policy. The Google Play build carries none of them.
 
 **The on-screen button.** If you give the on-screen button an action, the accessibility service draws a small round button over other apps. It reads nothing from the screen. It remembers only where you put it.