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 9d5b6e5ea7c989f9537b567773c7e2871b2c2c2c
truex <truex@equwal.com>
2026-09-21 12:38:51 -0700

Release 0.1.0-beta: updates through Ink Update

Rebind has no internet permission and keeps it that way. Ink Update, an
open source app of its own, looks for new versions and makes the
notification. The build for direct install carries Ink Update and Ink
Dim. Setup has an Updates row, and Hardware hacks lists Ink Dim. The
lists of carried apps are named Extensions.

Version 0.1.0-beta, version code 16. The alpha versions end here.

 CHANGELOG.md                                          |  13 ++++++++++++-
 app/src/full/assets/bundled/NOTICE.txt                |  12 ++++++++++++
 app/src/full/assets/bundled/ink-dim-0.1.0.apk         | Bin 0 -> 2238384 bytes
 app/src/full/assets/bundled/ink-update-0.1.0.apk      | Bin 0 -> 2191056 bytes
 .../full/java/dev/equwal/assistkey/bundle/Bundled.kt  |  12 +++++++++++-
 .../main/java/dev/equwal/assistkey/ui/BundledRows.kt  |   4 ++--
 .../java/dev/equwal/assistkey/ui/HacksActivity.kt     |   2 ++
 .../java/dev/equwal/assistkey/ui/SetupActivity.kt     |   5 +++++
 .../play/java/dev/equwal/assistkey/bundle/Bundled.kt  |  12 +++++++++++-
 gradle.properties                                     |   4 ++--
 10 files changed, 57 insertions(+), 7 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2df3aca..ebf785f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,17 @@
 # Changelog
 
-## Unreleased
+## 0.1.0-beta - 2026-09-21
+
+Version code 16. The first beta. The alpha versions end here.
+
+- **Updates: Ink Update.** Rebind has no internet permission, so it cannot
+  look for a new version. Ink Update, an open source app of its own, does
+  that: F-Droid first, then Google Play (it leaves an app that Google Play
+  installed to Google Play), then GitHub. It makes a notification and opens
+  the page. Setup has an "Updates" row that installs or opens it. The build
+  for direct install carries it.
+- The build for direct install carries Ink Dim too. Hardware hacks lists it.
+- The lists of carried apps are named "Extensions".
 
 - **Settings are safe across versions and across an uninstall.** An update
   always kept the settings: they are in the data of the app. An uninstall
diff --git a/app/src/full/assets/bundled/NOTICE.txt b/app/src/full/assets/bundled/NOTICE.txt
index 25f02e1..6dc1ab7 100644
--- a/app/src/full/assets/bundled/NOTICE.txt
+++ b/app/src/full/assets/bundled/NOTICE.txt
@@ -27,3 +27,15 @@ org.woheller69.whisper_37.apk
   Source code: https://github.com/woheller69/whisperIME
   Release: https://f-droid.org/packages/org.woheller69.whisper/
   SHA-256: b7efb1f4377c7ecf870688b1f7d74ad201bff2bd8991a387316db3ab71353824
+
+ink-dim-0.1.0.apk
+  Ink Dim 0.1.0, by equwal
+  Licence: GNU General Public License v3.0 or later
+  Source code and releases: https://github.com/equwal/ink-dim
+  SHA-256: 251c028ceb0c15a1fb08fffef20e130a85f6ab1d092eeae49e7fb497361f3c39
+
+ink-update-0.1.0.apk
+  Ink Update 0.1.0, by equwal
+  Licence: GNU General Public License v3.0 or later
+  Source code and releases: https://github.com/equwal/ink-update
+  SHA-256: 57223b0ab1145727ebacb15e16bca0abb31a2d94c8ced37c696be2d8fb3aeaf3
diff --git a/app/src/full/assets/bundled/ink-dim-0.1.0.apk b/app/src/full/assets/bundled/ink-dim-0.1.0.apk
new file mode 100644
index 0000000..84358bd
Binary files /dev/null and b/app/src/full/assets/bundled/ink-dim-0.1.0.apk differ
diff --git a/app/src/full/assets/bundled/ink-update-0.1.0.apk b/app/src/full/assets/bundled/ink-update-0.1.0.apk
new file mode 100644
index 0000000..784154e
Binary files /dev/null and b/app/src/full/assets/bundled/ink-update-0.1.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 d28ed3e..9a9e0e9 100644
--- a/app/src/full/java/dev/equwal/assistkey/bundle/Bundled.kt
+++ b/app/src/full/java/dev/equwal/assistkey/bundle/Bundled.kt
@@ -23,7 +23,7 @@ object Bundled {
     const val SUPPORTED = true
 
     class Item(
-        /** The screen that lists the app: HOME or VOICE. */
+        /** The screen that lists the app: HOME, VOICE, UPDATE or HACKS. */
         val group: String,
         val title: String,
         val hint: String,
@@ -37,6 +37,8 @@ object Bundled {
 
     const val HOME = "home"
     const val VOICE = "voice"
+    const val UPDATE = "update"
+    const val HACKS = "hacks"
 
     val items = listOf(
         Item(
@@ -54,6 +56,14 @@ object Bundled {
         Item(
             VOICE, "Whisper", "Speech to text on the device", "org.woheller69.whisper", "3.7", "MIT",
             "https://f-droid.org/packages/org.woheller69.whisper/", "bundled/org.woheller69.whisper_37.apk"
+        ),
+        Item(
+            HACKS, "Ink Dim", "Tap an icon for the lowest light", "dev.equwal.inkdim", "0.1.0", "GPL-3.0",
+            "https://github.com/equwal/ink-dim", "bundled/ink-dim-0.1.0.apk"
+        ),
+        Item(
+            UPDATE, "Ink Update", "Finds new versions and tells you", "dev.equwal.inkupdate", "0.1.0", "GPL-3.0",
+            "https://github.com/equwal/ink-update", "bundled/ink-update-0.1.0.apk"
         )
     )
 
diff --git a/app/src/main/java/dev/equwal/assistkey/ui/BundledRows.kt b/app/src/main/java/dev/equwal/assistkey/ui/BundledRows.kt
index 7bc8329..3ae0d6c 100644
--- a/app/src/main/java/dev/equwal/assistkey/ui/BundledRows.kt
+++ b/app/src/main/java/dev/equwal/assistkey/ui/BundledRows.kt
@@ -6,13 +6,13 @@ import dev.equwal.assistkey.bundle.Bundled
 import dev.equwal.assistkey.ui.Ui.header
 import dev.equwal.assistkey.ui.Ui.row
 
-/** The apps of other makers that belong on one screen: installed, or one tap to get. */
+/** The extensions that belong on one screen: installed, or one tap to get. */
 object BundledRows {
 
     fun add(a: Activity, col: LinearLayout, group: String) {
         val items = Bundled.items.filter { it.group == group }
         if (items.isEmpty()) return
-        col.header("Apps of other makers")
+        col.header(if (group == Bundled.UPDATE) "Updates" else "Extensions")
         items.forEach { item ->
             val installed = runCatching { a.packageManager.getPackageInfo(item.pkg, 0) }.isSuccess
             col.row(
diff --git a/app/src/main/java/dev/equwal/assistkey/ui/HacksActivity.kt b/app/src/main/java/dev/equwal/assistkey/ui/HacksActivity.kt
index f82e7a0..1d18d5c 100644
--- a/app/src/main/java/dev/equwal/assistkey/ui/HacksActivity.kt
+++ b/app/src/main/java/dev/equwal/assistkey/ui/HacksActivity.kt
@@ -2,6 +2,7 @@ package dev.equwal.assistkey.ui
 
 import android.app.Activity
 import android.content.Intent
+import dev.equwal.assistkey.bundle.Bundled
 import dev.equwal.assistkey.channel.Channel
 import dev.equwal.assistkey.channel.Channels
 import dev.equwal.assistkey.device.Detect
@@ -65,5 +66,6 @@ class HacksActivity : Activity() {
                 state = if (hidden.isEmpty()) null else "Hiding a button"
             ) { startActivity(Intent(this, ViwoodsActivity::class.java)) }
         }
+        BundledRows.add(this, col, Bundled.HACKS)
     }
 }
diff --git a/app/src/main/java/dev/equwal/assistkey/ui/SetupActivity.kt b/app/src/main/java/dev/equwal/assistkey/ui/SetupActivity.kt
index 950d70e..9e2bcf8 100644
--- a/app/src/main/java/dev/equwal/assistkey/ui/SetupActivity.kt
+++ b/app/src/main/java/dev/equwal/assistkey/ui/SetupActivity.kt
@@ -3,6 +3,7 @@ package dev.equwal.assistkey.ui
 import android.app.Activity
 import android.content.Intent
 import android.widget.Toast
+import dev.equwal.assistkey.bundle.Bundled
 import dev.equwal.assistkey.channel.Channel
 import dev.equwal.assistkey.channel.Channels
 import dev.equwal.assistkey.license.License
@@ -58,6 +59,10 @@ class SetupActivity : Activity() {
             "Licence",
             state = Summary.licenceChip(s.tier, s.trialDaysLeft)
         ) { startActivity(Intent(this, LicenseActivity::class.java)) }
+
+        // Rebind has no internet permission, so it cannot look for a new version.
+        // Ink Update, an app of its own, does that and tells the user.
+        BundledRows.add(this, col, Bundled.UPDATE)
     }
 
     private fun claim(ch: Channel) {
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 10e3405..7bb7c91 100644
--- a/app/src/play/java/dev/equwal/assistkey/bundle/Bundled.kt
+++ b/app/src/play/java/dev/equwal/assistkey/bundle/Bundled.kt
@@ -14,7 +14,7 @@ object Bundled {
     const val SUPPORTED = false
 
     class Item(
-        /** The screen that lists the app: HOME or VOICE. */
+        /** The screen that lists the app: HOME, VOICE, UPDATE or HACKS. */
         val group: String,
         val title: String,
         val hint: String,
@@ -26,6 +26,8 @@ object Bundled {
 
     const val HOME = "home"
     const val VOICE = "voice"
+    const val UPDATE = "update"
+    const val HACKS = "hacks"
 
     val items = listOf(
         Item(
@@ -43,6 +45,14 @@ object Bundled {
         Item(
             VOICE, "Whisper", "Speech to text on the device", "org.woheller69.whisper", "3.7", "MIT",
             "https://f-droid.org/packages/org.woheller69.whisper/"
+        ),
+        Item(
+            HACKS, "Ink Dim", "Tap an icon for the lowest light", "dev.equwal.inkdim", "0.1.0", "GPL-3.0",
+            "https://github.com/equwal/ink-dim"
+        ),
+        Item(
+            UPDATE, "Ink Update", "Finds new versions and tells you", "dev.equwal.inkupdate", "0.1.0", "GPL-3.0",
+            "https://github.com/equwal/ink-update"
         )
     )
 
diff --git a/gradle.properties b/gradle.properties
index ecedcea..e313c3b 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.15-alpha
-assistkey.versionCode=15
+assistkey.versionName=0.1.0-beta
+assistkey.versionCode=16
 
 # 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