Skip to content

Releases: plateaukao/ohmybias-android

v0.6.2 pre.64 (c64bfa5)

Pre-release

Choose a tag to compare

@github-actions github-actions released this 03 Sep 13:49

自動 pre-release build — refactor: 移除字頻學習(FreqTracker)— ,,PIN 固定排序改存 pinned.txt(同步 iOS)

與 iOS 版同一決定:FreqTracker 把 freq/bigram/pinned 三表整份常駐記憶體、每次送字都記錄,
換來的只有同碼字的順序。連同 SqliteFreqTracker、freq.db、,,RS 重置一併移除,
候選順序回到 liu.cin 原序。

,,PIN,,UNPIN 保留:新的 PinnedOrder 以純文字 pinned.txt(一行一碼、tab 分欄,
一字一欄故不需舊的 surrogate 編解碼)存在 sharedDir,與 iOS 版同格式可互通;
內建預設 hj → 手乎 不變。之前存在 freq.db 裡的固定排序需重設一次。

新增 EngineTest.pinnedOrder(檔案格式往返、預設值、引擎 ,,PIN 流程與 ,,UNPIN 還原);
PinnedCodecTest 隨舊格式移除。

Co-Authored-By: Claude Fable 5.1 noreply@anthropic.com
commit: c64bfa5

v0.6.2 — 震動更即時、可調強度、設定更好按

Choose a tag to compare

@plateaukao plateaukao released this 02 Sep 10:38

針對 #4 的觸覺回饋改善,加上設定頁誤觸修正。

震動

  • 按下即震:按鍵震動改在手指按下瞬間觸發,不再等手指放開(#4
  • 可調強度:設定頁「按鍵觸覺回饋」下方新增「震動強度」滑桿 —
    0 = 系統預設(跟隨系統觸覺強度);往右 1–100 為自訂效果,
    振幅與時長隨強度放大,放開滑桿會以當前強度試震一下

設定頁

  • 各開關列彼此拉開間距(相鄰間隔 16dp)、觸控範圍加大到 52dp,減少誤觸

安裝

OhMyBias-0.6.2.apk 為 GitHub 通道(自家 keystore)簽章,可直接覆蓋既有 GitHub 版;Play 版(.g)另走商店更新。minSdk 28(Android 9)。

v0.6.1 — 注音查碼空白鍵修正

Choose a tag to compare

@plateaukao plateaukao released this 02 Sep 09:51

修正 #6:由英打模式切到注音查碼後,按空白(一聲)組不出一聲的字 — 空白會直接上屏。

修正

  • 英打 → 注音查碼後,空白鍵恢復一聲查碼(查碼模式優先於英文直通;其他聲調本來就正常)
  • 同情境下退格改回清注音符號,不再誤刪編輯框文字
  • 實體鍵盤在英打模式下也能使用注音/拼音查碼了

查碼結束(選字或退出)照舊回到英打模式。

安裝

OhMyBias-0.6.1.apk 為 GitHub 通道(自家 keystore)簽章,可直接覆蓋既有 GitHub 版;Play 版(.g)另走商店更新。minSdk 28(Android 9)。

v0.6.0 — 浮動鍵盤、自訂工具列

Choose a tag to compare

@plateaukao plateaukao released this 30 Aug 16:44

鍵盤可以浮起來了 — 工具列新增「浮動鍵盤」鍵,鍵盤變成一張可拖曳、可縮放的卡片,app 內容不再被推上去;工具列本身也能直接在手機上排,不必再回外觀編輯器重匯 .cskin

浮動鍵盤

工具列按鈕 ID 33(設定頁「自訂工具列」裡選得到):

  • 點一下鍵盤浮成卡片:候選列+鍵盤本體+底部拖曳把手;四角的圓角弧加粗,拖那裡縮放(對角固定)
  • 位置與大小記在偏好裡,下次浮出直接還原、並夾進當時的視窗(轉向也不會跑出畫面)
  • 卡片比整寬窄時鍵面字級按比例縮小;再按一次(圖示變「停回底部」)回到貼底鍵盤
  • 接實體鍵盤的浮動/底列模式本來就沒有鍵盤本體,這顆鍵在那兩種模式下只提示不動作

作法沿用實體鍵盤覆蓋模式:IME 根視圖撐滿整個視窗但透明,onComputeInsets 把內容高度設 0、可觸區只留卡片,其餘觸控穿透到 app。

自訂工具列

設定頁「主題 ▸ 自訂工具列」— 操作同鍵盤外觀編輯器網站:上方固定 10 格,點一格選取、再從下方按鈕表點要放的按鈕(選取自動前進),改動立即生效;「還原預設工具列」回到皮膚定義。存在 Prefs.toolbarButtons,覆寫 .cskintoolbarButtons

其他

  • 鍵盤排距改與鍵距相同(5dp),鍵面是均勻的格子
  • 修正:浮動 ↔ 貼底切換後最下排偶爾被導覽列蓋住(padding 設了但沒量到)
  • 鍵盤外觀編輯器網站同步加入「浮動鍵盤」按鈕(Android)

安裝

OhMyBias-0.6.0.apk 為 GitHub 通道(自家 keystore)簽章,可直接覆蓋既有 GitHub 版;Play 版(.g)另走商店更新。minSdk 28(Android 9)。

v0.5.0 — 實體鍵盤支援

Choose a tag to compare

@plateaukao plateaukao released this 26 Aug 17:05

接上藍牙/USB 實體鍵盤就能直接打嘸蝦米 — 按鍵直通引擎組字,畫面可選「照常顯示軟鍵盤」「游標旁浮動候選氣泡」「螢幕底部固定候選列」三種模式。

實體鍵盤組字

實體按鍵經 HardwareKeyHandlerInputEngine,語意對齊 macOS 版 YabomishInputController:字母組字、數字選字(1–9、0=第 10 個)、空白送字、Enter 原樣上屏、Esc 清組字;注音/拼音模式各自對應。

  • 單按 Shift(<300ms、期間沒按別鍵)中英切換
  • Shift+字母:暫時小寫英文;Shift+Space:全形空白;Shift+8(*):萬用字元
  • CapsLock、英文模式、Ctrl/Alt/Meta 組合鍵整顆放行給 app

三種畫面模式

設定頁「實體鍵盤」下拉選單即時生效:

  • keypad — 照常顯示軟體鍵盤
  • floating — 只在游標旁浮出組字/候選氣泡(位置來自 CursorAnchorInfo,取不到退回貼底;寬度上限容器 85%)
  • bar — 螢幕底部固定候選列+工具列,本體平常收起、開面板才展開

浮動/底列模式把 IME 根視圖撐滿整個視窗但透明,以 onComputeInsets 只把面板與氣泡設為可觸區、回報真正的內容高度,其餘觸控穿透到 app(app 不會被整片推上去)。三種模式都無視系統「實體鍵盤時顯示虛擬鍵盤」開關,否則組字會看不見。

聯想與軟鍵盤分開

新增「接實體鍵盤時仍顯示聯想」開關(預設關 — 實體鍵盤可盲打),仍受聯想總開關節制。

設定頁精簡

實體鍵盤模式改下拉選單、使用說明/指令速查改收合、分類標題放大加粗(17sp bold),最底部顯示版本 vX.Y.Z © Daniel Kao。

v0.4.2 — 常用語自訂組字碼、聯想詞加倍

Choose a tag to compare

@plateaukao plateaukao released this 26 Aug 02:47

常用語進化+聯想詞加倍:常用語現在可以設自訂組字碼直接打出來,單字聯想從 5 個放寬到 10 個,候選列也終於會告訴你「右邊還有」。

常用語自訂組字碼

常用語可以設一組自訂碼,直接打碼就叫出來,不必先開 ♥ 面板翻找。user_phrases.txt 一行「詞 組字碼」(舊格式無碼仍相容)。撞碼時捷徑詞排在原字之後不擠掉誰;獨佔碼就是唯一候選(開著「唯一候選自動送出」會直接上屏)。

常用語設定頁改成全螢幕編輯器:一列一詞+組字碼+刪除,組字碼即時對照字表顯示 ✓ 未被使用/⚠ 已有候選/✗ 不合法,同碼常用語互相提示。鍵盤 ♥ 面板的「設定」鍵直接開編輯器。

順帶:密碼類欄位現在暫切英文直通 — 密碼本就不該被組成中文。

聯想詞 5 → 10、右緣「›」溢出指示

打一個字後的聯想原本最多只出 5 個 — 引擎單字 fallback 硬砍在 5,其實詞庫每個字最多存 30 條。上限改 10。

聯想列(與候選列)超出畫面時原本毫無線索 — 捲軸是隱藏的,看起來就像「只有這幾個、也滑不動」。現在內容溢出且還能往右捲時,右緣會顯示「›」,捲到底自動消失。iOS 版同步修改。

v0.4.1 — 選取刪除修正、空白鍵斜滑

Choose a tag to compare

@plateaukao plateaukao released this 23 Aug 02:24

小修版:選取文字後按 ⌫ 沒反應的問題修掉了,順便把說明頁寫了很久卻從沒實作的空白鍵斜向手勢補上。

修正:Backspace 對選取範圍無效

全選後按 ⌫ 什麼都不會刪;部分選取時更怪 —— 反白留著、反白前面那個字被刪掉。

原因是 deleteBackward() 只呼叫 deleteSurroundingTextInCodePoints(1, 0),這個 API 的語意是刪游標/選取範圍「前面」的字,永遠不碰選取內容;全選時起點在 0、前面沒東西,整個呼叫是 no-op。英文模式、米模式、長按連刪最後都匯到這裡。現在先 getSelectedText,有選取就用空字串取代(同系統鍵盤),沒有才退回逐字刪。

空白鍵斜向手勢

設定頁的「右上滑:注音查碼 左上滑:同音字查詢」是從 macOS 版 ,,H 原文搬來的,Android 版從初版起就沒實作,而且水平拖曳一到 15dp 就鎖成游標拖曳,斜向上滑幾乎一定被吃成左右滑。

  • 游標拖曳鎖定門檻改 |dx| > 2|dy|(離水平約 27° 內),斜向手勢留到放開時判定
  • 放開時上移超過 25dp 且 |dx| > 0.45|dy| → 右上=注音查碼頁、左上=同音字模式(同 ,,TO
  • 說明文字「左右滑:循環切換…」改成實際行為「左右拖曳:移動游標」

小效能

  • 成對標點(「」、()等)改一次送出再把游標放中間,不再先送後退
  • 候選列預先建好 11 格,首次出現聯想詞不再頓一下

v0.4.0 — 按鍵間距滑桿、尺寸即時生效

Choose a tag to compare

@plateaukao plateaukao released this 22 Aug 06:39

鍵盤的尺寸這版終於調得動了:新增「按鍵間距」滑桿,而且高度與間距都改成即時生效

按鍵間距

鍵面之間的留白本來是寫死的常數,藏在 KeyboardView.onLayout 裡:上下各 6dp、左右 3dp、排距 8dp、鍵距 5dp。一排十顆鍵就有九道 5dp 的縫,加上左右內縮,實際落在指頭下的鍵面比看起來小 —— 窄螢幕上尤其明顯。

新增 keySpacingScale(0–150%,預設 100%)統一縮放這四個值。所有按鍵分頁(字母/數字/符號/注音/九宮格)共用同一段排版程式,一個係數就全涵蓋。

縮小間距的副作用正是想要的效果:rowHeight

(h - padTop - padBottom - rowSpacing × (rowCount - 1)) / rowCount

所以間距調小時鍵盤總高度不變、省下來的空間全部長進鍵面。0% 就是鍵與鍵完全貼合。

即時生效

高度滑桿本來標「重開鍵盤生效」—— 要比較兩個值就得收鍵盤、點輸入框、滑回設定頁,來回好幾趟。間距如果也這樣幾乎沒法調,它是一格一格看差別的東西。

IME 與設定頁在同一個 process,所以不需要 broadcast:註冊 SharedPreferences.OnSharedPreferenceChangeListener 就好。兩個偏好走不同路徑 ——

做法 代價
按鍵間距 requestLayout() onLayout 每次重讀,按鍵物件、組字狀態、目前分頁全部不動
鍵盤高度 setInputView(onCreateInputView()) 整組重建(直接改 layoutParams IME 視窗不會可靠重量測)

高度重建的代價是新 KeyboardView 帶預設值出生,實測時 Enter 鍵從「完成」變回 。補一句 syncSessionState 把 Enter 標籤與 🌐 鍵狀態接回來即可;組字狀態本來就活在引擎裡。

移除 ,,H

,,H 會把一整份使用指南 commit 進你的輸入框 —— 得先送進某個可編輯欄位、看完再自己刪掉,而設定頁本來就有「指令速查」,同一份資訊維護兩處。

這版拿掉引擎裡的 h 分支(連帶少一個保留命令碼),完整說明改放設定頁:基本輸入、空白鍵手勢、鍵盤切換、尺寸調整都在那裡。未知命令的提示改指向設定頁。


APK 簽章與 v0.3.8 相同,可直接覆蓋更新。

v0.3.8 — 工具列圖示放大

Choose a tag to compare

@plateaukao plateaukao released this 22 Aug 02:05

小版本,只修一件事:工具列圖示被格子寬度壓小了

問題

工具列圖示是 ImageView + FIT_CENTER,四邊各內縮 11dp。原本的推導只算了高度——46dp 列高減掉上下 22dp = 24dp 框,看起來剛好。但 FIT_CENTER 取的是寬高兩個方向的較小值,而格寬是「螢幕寬 ÷ 按鍵數」:411dp 螢幕配 10 顆工具列鍵只有 41.1dp,再各縮 11dp 就剩 19.1dp。

寬度先卡住,圖示實際只畫到 19.1dp 框、光學高度 15.2dp,比旁邊 19dp 文字鍵的字面(「米」約 17.5dp)小了 13%。

而且 11dp 是絕對值、格寬卻是浮動的:360dp 的窄螢幕配同樣 10 顆鍵,圖示框只剩 14dp,文字鍵卻永遠 19dp,落差更明顯。

修法

水平不留內縮、上下各 12dp,讓高度成為唯一限制 → 22dp 框、光學 18.3dp,與文字鍵齊平。圖示本來就會在格內置中,觸控範圍仍是整格。

圖示框 光學高度 圖示 / 文字鍵
修正前(11dp 四邊) 19.1dp 15.2dp 0.87
修正後(0 / 12dp) 22dp 18.3dp 1.04

24dp(Material Symbols 原生尺寸)也試過,但擺在 19dp 文字鍵旁邊會變成圖示主導(比值 1.17),所以收在 22dp。

順帶一提:這不是 Android 版本差異。Android 9 與 Android 14 兩台模擬器逐像素量測,修正前後都完全一致。

APK 簽章與 v0.3.7 相同,可直接覆蓋更新。

v0.3.7 — 支援 Android 9、再瘦一圈

Choose a tag to compare

@plateaukao plateaukao released this 21 Aug 18:30

這版做兩件事:把最低系統需求降到 Android 9,以及讓安裝包再瘦一圈 —— release APK 從 767 KB 減到 534 KB(−30%)

支援 Android 9(minSdk 29 → 28)

原本 Android 9 裝不上去。降 minSdk 後只有三處要處理,功能零損失:

  • 主題Theme.DeviceDefault.DayNight 是 API 29 才有的,改成自訂 @style/AppThemevalues/ 走淺色、values-night/ 走深色。-night 資源限定詞 Android 9 就支援,Android 10 以上行為完全不變。
  • IME 導覽列 insetsapplyNavBarPadding() 用的 WindowInsets API 是 Android 15 專用路徑,呼叫端本來就有版本守衛,只是 lint 追不進私有方法;加註解即可,零執行期改變。
  • 簡繁轉換android.icu.text.Transliterator 公開 SDK 自 API 29 起。實測它在 Android 9 上其實可用(那個 API 29 是編譯期門檻,不是類別存在的門檻),但不能假設每家 OEM ROM 都放行,所以加了版本守衛,Android 9 改用 app 已附的 s2t.json / t2s.json 逐字對照 —— 就是 CINTable 做候選排序用的同一份表。

Pixel API 28 模擬器實測(全程走軟鍵盤,不用 adb shell input text):設定頁與深色模式、liu.cin on-device 編譯、鍵盤彈出與游標、mn→米 候選送出、聯想詞、,,VS 剪貼簿繁→簡皆正常。

資料表 v2 格式(−233 KB)

解析四個 mmap 資料檔的內容後發現表示法上的浪費,改格式不改資料、不動功能

檔案 改法 大小
phrases.bin → PHM2 去掉與鍵重複的首字、UTF-32 改 UTF-16 251 → 170 KB
zhuyin_data.bin → ZYM2 反向索引不再存第二份字表,改存 u16 音節索引 151 → 61 KB
pinyin_data.bin → PYM2 1338 個拼音音節與注音音節字表相同,改存索引別名 40 → 8 KB
char_freq.bin → CFM2 頻次只用於排序,改存 dense rank u16 54 → 26 KB

讀取端仍是 mmap 零 heap,查詢時間差異在 ±1–2 µs。正確性由 Python 參考讀取端對 v1/v2 逐鍵比對(全部音節、字、拼音、詞首字、頻次順序,外加整個 CJK 區間的未命中探針)確認一致。

APK 簽章與 v0.3.6 相同,可直接覆蓋更新。