Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions .github/workflows/native-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
name: Native tests

# Builds and runs the native C++ engine unit tests (app/src/main/jni/tests) on a plain Linux
# host via the standalone CMake build (jni/CMakeLists.txt) — no AOSP platform tree needed. This
# covers the dictionary/suggest/geometry engine that the JVM/Robolectric suite cannot reach.
on:
push:
branches: [dev]
paths: ['app/src/main/jni/**']
pull_request:
branches: [dev, main]
paths: ['app/src/main/jni/**']

jobs:
native-host-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

# find_package(JNI) needs JDK headers (jni.h + linux/jni_md.h); setup-java sets JAVA_HOME.
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'

- name: Install build tools
run: sudo apt-get update && sudo apt-get install -y cmake g++

- name: Configure
run: cmake -S app/src/main/jni -B build-host-tests -DCMAKE_BUILD_TYPE=Release

- name: Build native tests
run: cmake --build build-host-tests -j"$(nproc)"

- name: Run native unit tests
# FormatUtilsTest.TestDetectFormatVersion is quarantined: a host-toolchain anomaly in code
# that works on-device (the suite had never run in CI before). Tracked in #80.
run: ctest --test-dir build-host-tests --output-on-failure -E 'FormatUtilsTest\.TestDetectFormatVersion'
78 changes: 0 additions & 78 deletions .github/workflows/update-badges.yml

This file was deleted.

15 changes: 15 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,3 +96,18 @@ Before merging a non-trivial change — correctness-sensitive input/dictionary l
- Use `effort: high` for correctness/design passes; lower tiers for quick sanity checks.
- Treat its output as adversarial input, not gospel: it sees the conversation but not tool/scout internals, so verify its claims against the code before acting (it has caught real bugs and unverified assertions in this repo's PRs).
- Especially worth running before merging changes to `InputLogic`, `DictionaryFacilitatorImpl`/`Suggest`, or anything touching the two-thumb/spacing state machine.

## Project Board & Issue Tracking
The roadmap lives in GitHub Project #3 ("Two-Thumb & Keyboard Roadmap", `gh project … --owner AsafMah`), with a `Status` field (`Todo` / `In Progress` / `Done`) and epics (`[Epic]` issues) parenting sub-issues. **Keep it current as you work — it is the single source of truth, not a chat promise:**
- When you **open a PR** for an issue, set that issue (and its PR, once added) to **In Progress**, and bump the parent epic to **In Progress** if it was `Todo`.
- When a PR **merges** (and its issue closes), move both the issue and PR to **Done**; if every sub-issue of an epic is `Done`, move the epic to `Done`.
- **Add** any issue/PR you create to the project, and close issues a merged PR resolves (use `Fixes #N` in the PR body, or `gh issue close` if the squash/merge message only referenced `(#N)`).
- Field/option IDs for scripting: project `PVT_kwHOAGIGz84BZwMC`, Status field `PVTSSF_lAHOAGIGz84BZwMCzhUsrio` (Todo `f75ad846`, In Progress `47fc9ee4`, Done `98236657`); set via `gh project item-edit --id <itemId> --field-id <fieldId> --single-select-option-id <optId> --project-id <projId>`.
This convention is loaded every session, so any agent (and future-you) is expected to follow it without being re-told.

## Changelog & Releases
Keep `CHANGELOG.md` current — it is LeanTypeDual's own history, not a per-line provenance log.
- **Every user-facing or notable change** gets a line under `## [Unreleased]` (or the in-progress version), grouped `Added` / `Changed` / `Fixed` / `Reliability & testing`, with the `(#N)` issue/PR ref. Internal-only refactors go under `Changed`/`Reliability`; do not enumerate them in the user-facing fastlane note.
- **Provenance is coarse, not per-entry.** Do NOT tag each line ours/LeanType/HeliBoard. When upstream code is merged in, add a single `Upstream` marker line under that release (e.g. `Upstream — merged HeliBoard 3.9`). Everything not under an `Upstream` marker is original to this fork by default. The fork-only feature set lives in the README, not the changelog.
- **Versioning:** SemVer `versionName` in `app/build.gradle.kts`; `versionCode` follows `major*1000 + minor*100 + patch*10` (e.g. `3.9.0` → `3900`). On release, also add `fastlane/metadata/android/en-US/changelogs/<versionCode>.txt` (terse, user-facing bullets only). Release chores: `tools/release.py`.
- On cutting a release, rename `[Unreleased]` to the version + date and start a fresh `[Unreleased]`.
109 changes: 109 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
# Changelog

All notable changes to **LeanTypeDual** are documented here.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

> **Lineage & provenance.** LeanTypeDual is a fork of
> [LeanBitLab/LeanType](https://github.com/LeanBitLab) (the AI layer), which is itself a fork of
> [Helium314/HeliBoard](https://github.com/Helium314/HeliBoard) (the keyboard engine), based on
> AOSP/OpenBoard. Rather than re-list every inherited HeliBoard/LeanType version, this changelog
> records **LeanTypeDual's own releases**. Points where upstream code was merged in are noted as
> **`Upstream`** markers; everything else is original to this fork.

## [Unreleased]

## [3.9.0] - 2026-06-10

### Added
- **HCESAR keyboard layout** for Latin-script subtypes. (#74)
- **Touchpad edge-scroll** — holding a finger near the touchpad edge auto-repeats cursor movement
with acceleration. (#74)
- **Toolbar: swipe down to hide the keyboard.** (#74)
- **Toolbar: show only the toolbar when a hardware keyboard is connected.** (#74)
- **Undo-word toolbar key** — reverts the last committed word back to its suggestion
alternatives. (#35)
- **Pointer-trace recorder** (opt-in) — captures gesture traces + keyboard geometry to JSON for
debugging/recognition work. (#20)

### Changed
- **Graduated trust for newly-learned words** — a just-learned word is held below real-dictionary
suggestions until you've used it a few times, reducing premature autocorrect to half-typed
words. (#39)
- Two-thumb down-swipe shortcut popup now tiles its icons proportionally across the usable
row. (#36)
- README status badges switched to live shields.io badges (auto-updating; no CI). (#76)
- Backspace bookkeeping consolidated into a single, unit-tested `BackspaceUnitStack` (internal
refactor, behaviour-preserving). (#31)

### Reliability & testing
- **Native C++ engine tests now run in CI.** A standalone host build (`app/src/main/jni/CMakeLists.txt`)
compiles and runs the dictionary/suggest/geometry gtest suite on every change to the native
engine — coverage the JVM/Robolectric tests cannot reach. (#78)
- Added a golden-master **backspace regression corpus** to the JVM suite, and the **unit-test gate
is now blocking** on every PR. (#21, #12)

## [3.8.6] - 2026-06
### Added
- Flag learned/typed words that aren't in a dictionary; long-press to **Add** or **Block** them,
plus a new **Blocklist** settings screen.
### Changed
- Two-thumb: the down-swipe shortcut popup now aligns to the letter row (swiping down on a key
selects the icon above it).
### Fixed
- Two-thumb ghost-merge: a deleted or cancelled gesture trail no longer fuses into the next swipe.

## [3.8.5]
### Added
- Enable or disable individual dictionaries (built-in and custom) in settings.
### Fixed
- Toolbar key customization toggles not persisting.
- Emoji-search keyboard not splitting in landscape when split keyboard is enabled.

## [3.8.4]
### Added
- Double-tap touchpad gesture to delete selected words.
- Clipboard screenshot compression toggle; duplicate screenshots prevented.
- Text Expander: backspace-to-revert, and `%cursor%` / `%greeting%` / `%tomorrow%` / list
placeholders (with optional custom count, e.g. `%list_5%`).
### Changed
- Gboard dictionary import performance; settings/editor performance, stability and memory.
### Fixed
- Missing words on import; corrupted imports (ZIP signatures pre-verified, streams closed).

## [3.8.3]
### Added
- Custom "Clear clipboard" toolbar key icon styles (bin, sweep, slanted, legacy).
- Custom drawable picker highlights in the Customize Icons grid; instant icon updates without
restart; quick clipboard-item clear on long-press.
### Fixed
- Swipe-to-delete clipboard crash; pinned-section styling.
- Double-space-period countdown cancellation on Korean & combiner layouts.

## [3.8.2]
### Added
- **Text Expander** with placeholders (`%clipboard%`, `%day%`, `%time12%`, …) and a guide.
- Customizable tags for Custom AI Keys (themed capsules).
- Option to fold pinned clipboard items by default.
- Redesigned Sponsor dialog.
### Fixed
- F-Droid reproducible-build packaging discrepancy.
- Large clipboard-text truncation (native paste); clipboard suggestion in split-toolbar mode.

## [3.8.1]
### Added
- Fine-grained vibration strength (amplitude) control for keypress haptics.
- "Clear All" + confirmation in the personal-dictionary settings screen.
### Fixed
- `Resources$NotFoundException` crash from obsolete custom-icon overrides.
- Spacebar cursor-move and delete swipe in the emoji-search input field.
- Center-crop scaling for custom keyboard background images (no more squishing).

## Baseline

`Upstream` — Forked from **LeanBitLab/LeanType** (AI proofreading/translation, floating keyboard,
custom AI keys) on top of **HeliBoard 3.8.x** (the keyboard engine: dictionaries, layouts,
multilingual typing, glide typing, clipboard history, themes). LeanTypeDual ships as a distinct app
(`com.asafmah.leantypedual`) and adds, on top of that base, **two-thumb (dual-thumb) typing** and
the per-release changes above. See the [README](README.md) for the full feature set.
Loading
Loading