Skip to content

Commit 1193bf9

Browse files
committed
v3.6.1: Dual Release (Standard/Offline) & Refined UI
:wq
1 parent 96c0849 commit 1193bf9

File tree

23 files changed

+365
-158
lines changed

23 files changed

+365
-158
lines changed

README.md

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,19 @@
66
<img alt="HeliboardL Banner" src="docs/images/heliboardl_banner_light.svg">
77
</picture>
88

9-
![Downloads](https://img.shields.io/github/downloads/LeanBitLab/HeliboardL/total)
9+
[![Download](https://img.shields.io/github/v/release/LeanBitLab/HeliboardL?label=Download&style=for-the-badge&color=7C4DFF)](https://github.com/LeanBitLab/HeliboardL/releases/latest) [![Downloads](https://img.shields.io/github/downloads/LeanBitLab/HeliboardL/total?style=for-the-badge&color=7C4DFF&label=Downloads)](https://github.com/LeanBitLab/HeliboardL/releases)
1010

1111
**HeliboardL** is a fork of [HeliBoard](https://github.com/Helium314/HeliBoard) - a privacy-conscious and customizable open-source keyboard based on AOSP/OpenBoard.
1212

1313
This fork adds **AI-powered features** using the Gemini API while maintaining the offline-first philosophy of the original.
1414

1515
## What's New in HeliboardL
1616

17-
- **🤖 Gemini AI Proofreading** - Fix grammar and spelling with one tap using toolbar key
18-
- **🌐 AI Translation** - Translate selected text via toolbar
19-
- **🎨 Enhanced Toolbar UI** - Squircle backgrounds for toolbar keys
20-
- **🕵️ Incognito Mode Indicator** - Subtle watermark on spacebar when incognito is active
17+
- **🤖 Gemini AI Proofreading** - Fix grammar and spelling with one tap (Standard only)
18+
- **🌐 AI Translation** - Translate selected text directly (Standard only)
19+
- **🎨 Modern UI** - "Squircle" key backgrounds and refined icons (incognito, etc.)
20+
- **🕵️ Clear Incognito Mode** - Distinct "Hat & Glasses" icon for clear visibility
21+
- **🔒 Privacy Choices** - Choose **Standard** (Offline-first with opt-in AI) or **Offline** (Hard-disabled network) versions
2122
- **📥 Gesture Library Downloader** - Easier setup for glide typing
2223

2324
## Screenshots
@@ -33,10 +34,25 @@ This fork adds **AI-powered features** using the Gemini API while maintaining th
3334
</tr>
3435
</table>
3536

37+
3638
## Download
3739

3840
You can download the latest release from the [GitHub Releases](https://github.com/LeanBitLab/HeliboardL/releases) page.
3941

42+
### 📦 Choose Your Version
43+
44+
We provide two distinct versions. **Note:** Both versions use the same package name (`helium314.keyboard.l`) and signature. You can only have **one** installed at a time.
45+
46+
#### 1. Standard Version (`-standard-release.apk`)
47+
* **Features:** Full suite including **AI Proofreading**, **AI Translation**, and **Gesture Library Downloader**.
48+
* **Permissions:** Request `INTERNET` permission (used *only* when you explicitly use AI features or download libraries).
49+
* **Best For:** Users who want smart features alongside privacy.
50+
51+
#### 2. Offline Version (`-offline-release.apk`)
52+
* **Features:** All UI/UX refinements (Squircle keys, new Icons) but **excludes** all AI and network features.
53+
* **Permissions:** **NO INTERNET PERMISSION** in the manifest. Guaranteed at the OS level.
54+
* **Best For:** Privacy purists who require a hard guarantee that no data can ever leave the device.
55+
4056
## Original HeliBoard Features
4157

4258
<ul>
@@ -60,9 +76,26 @@ For original feature documentation, visit the [HeliBoard Wiki](https://github.co
6076
1. Get your free API key from [Google AI Studio](https://aistudio.google.com/apikey)
6177
2. Go to HeliboardL Settings → Advanced → Gemini API Key
6278
3. Enter your API key
63-
4. Change gemini model to 2.5 flash or 3n
79+
4. Change Gemini model to **gemini-2.5-flash** or **gemini-3n-e2b-it** for best performance.
80+
81+
### AI Translation Setup
82+
1. Go to Settings → Toolbar → Customize Toolbar and add the "Translate" key.
83+
2. Go to **Settings → Advanced → Translation Target Language** and select your desired output language.
84+
85+
> [!IMPORTANT]
86+
> **Privacy Notice**: While HeliboardL itself is open-source and respects your privacy, using the **free tier** of the Google Gemini API means your input data may be used by Google to improve their models.
87+
> - Using AI features is **optional**.
88+
> - **Do not process sensitive information** (passwords, credit card numbers, private addresses) using the AI Proofreading or Translation features.
89+
> - The **Offline Version** completely removes this code and permission.
90+
6491
### Gesture/Glide Typing
65-
Use the built-in gesture library downloader in Settings → Advanced → Load Gesture Typing Library.
92+
**Standard Version:** Use the built-in downloader in Settings → Advanced → Load Gesture Typing Library.
93+
94+
**Offline Version:**
95+
Since network access is disabled, you must manually install the library:
96+
1. Download the library file: [libjni_latinimegoogle.so](https://github.com/Helium314/HeliBoard/blob/master/app/src/main/jniLibs/arm64-v8a/libjni_latinimegoogle.so) (for arm64)
97+
2. Go to Settings → Advanced → Load Gesture Typing Library.
98+
3. Select "Load from file" and pick the downloaded `.so` file.
6699

67100
## Contributing
68101

RELEASE_NOTES.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# HeliboardL v3.6.1 Release
2+
3+
This major update introduces a **dual-release strategy** to give you complete control over privacy and functionality.
4+
5+
## 📦 Choose Your Version
6+
7+
### 1. Standard Version (`-standard-release.apk`)
8+
* **Features:** Full suite including **AI Proofreading**, **AI Translation**, and **Gesture Library Downloader**.
9+
* **Permissions:** Requires `INTERNET` permission (used *only* when you explicitly use AI features or download libraries).
10+
* **Best For:** Users who want smart features alongside privacy.
11+
12+
### 2. Offline Version (`-offline-release.apk`) 🛡️
13+
* **Features:** All UI/UX refinements (Squircle keys, new Icons) but **excludes** all AI and network features.
14+
* **Permissions:** **NO INTERNET PERMISSION** in the manifest. Guaranteed at the OS level.
15+
* **Best For:** Privacy purists who require a hard guarantee that no data can ever leave the device.
16+
17+
## ✨ What's New
18+
* **🕵️ New Incognito Icon**: Distinct "Hat & Glasses" outline for clear visibility in all themes (Light/Dark).
19+
* **🎨 Modern UI**: "Squircle" key backgrounds and refined spacing key UI.
20+
* **🤖 AI Enhancements**:
21+
* **Proofreading**: Fix grammar/spelling instantly (Standard).
22+
* **Translation**: Translate selected text in-place (Standard).
23+
* **📥 Gesture Library**: Built-in downloader for Glide Typing support (Standard).
24+
25+
> **Note:** Both versions install as `helium314.keyboard.l`. You can install them alongside the original HeliBoard, but you can only have one HeliboardL version installed at a time.

app/build.gradle.kts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,25 @@ android {
2222
applicationId = "helium314.keyboardl"
2323
minSdk = 21
2424
targetSdk = 35
25-
versionCode = 3603
26-
versionName = "3.6"
25+
versionCode = 3604
26+
versionName = "3.6.1"
2727
ndk {
2828
abiFilters.clear()
2929
abiFilters.addAll(listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64"))
3030
}
3131
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
3232
}
3333

34+
flavorDimensions += "privacy"
35+
productFlavors {
36+
create("standard") {
37+
dimension = "privacy"
38+
}
39+
create("offline") {
40+
dimension = "privacy"
41+
}
42+
}
43+
3444
signingConfigs {
3545
if (keystorePropertiesFile.exists()) {
3646
create("release") {
@@ -61,7 +71,7 @@ android {
6171
debug {
6272
// "normal" debug has minify for smaller APK to fit the GitHub 25 MB limit when zipped
6373
// and for better performance in case users want to install a debug APK
64-
isMinifyEnabled = true
74+
isMinifyEnabled = false
6575
isJniDebuggable = false
6676
applicationIdSuffix = ".debug"
6777
}
@@ -159,8 +169,8 @@ dependencies {
159169
implementation("com.github.skydoves:colorpicker-compose:1.1.3") // for user-defined colors
160170

161171
// gemini ai proofreading
162-
implementation("com.google.ai.client.generativeai:generativeai:0.9.0")
163-
implementation("androidx.security:security-crypto:1.1.0-alpha06") // for encrypted API key storage
172+
"standardImplementation"("com.google.ai.client.generativeai:generativeai:0.9.0")
173+
"standardImplementation"("androidx.security:security-crypto:1.1.0-alpha06") // for encrypted API key storage
164174

165175
// test
166176
testImplementation(kotlin("test"))

app/src/main/AndroidManifest.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only
1313
<uses-permission android:name="android.permission.VIBRATE" />
1414
<uses-permission android:name="android.permission.WRITE_USER_DICTIONARY" />
1515
<uses-permission android:name="android.permission.READ_CONTACTS" />
16-
<uses-permission android:name="android.permission.INTERNET" />
1716

1817
<application android:label="@string/english_ime_name"
1918
android:name="helium314.keyboard.latin.App"

app/src/main/java/helium314/keyboard/keyboard/internal/KeyboardIconsSet.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ class KeyboardIconsSet private constructor() {
136136
ToolbarKey.CUT -> R.drawable.sym_keyboard_cut
137137
ToolbarKey.PASTE -> R.drawable.sym_keyboard_paste
138138
ToolbarKey.ONE_HANDED -> R.drawable.sym_keyboard_start_onehanded_holo
139-
ToolbarKey.INCOGNITO -> R.drawable.sym_keyboard_incognito_holo
139+
ToolbarKey.INCOGNITO -> R.drawable.ic_incognito_final
140140
ToolbarKey.AUTOCORRECT -> R.drawable.ic_autocorrect
141141
ToolbarKey.CLEAR_CLIPBOARD -> R.drawable.sym_keyboard_clear_clipboard_holo
142142
ToolbarKey.CLOSE_HISTORY -> R.drawable.ic_close
@@ -199,7 +199,7 @@ class KeyboardIconsSet private constructor() {
199199
ToolbarKey.CUT -> R.drawable.sym_keyboard_cut
200200
ToolbarKey.PASTE -> R.drawable.sym_keyboard_paste
201201
ToolbarKey.ONE_HANDED -> R.drawable.sym_keyboard_start_onehanded_lxx
202-
ToolbarKey.INCOGNITO -> R.drawable.sym_keyboard_incognito_lxx
202+
ToolbarKey.INCOGNITO -> R.drawable.ic_incognito_final
203203
ToolbarKey.AUTOCORRECT -> R.drawable.ic_autocorrect
204204
ToolbarKey.CLEAR_CLIPBOARD -> R.drawable.sym_keyboard_clear_clipboard_lxx
205205
ToolbarKey.CLOSE_HISTORY -> R.drawable.ic_close
@@ -262,7 +262,7 @@ class KeyboardIconsSet private constructor() {
262262
ToolbarKey.CUT -> R.drawable.sym_keyboard_cut_rounded
263263
ToolbarKey.PASTE -> R.drawable.sym_keyboard_paste_rounded
264264
ToolbarKey.ONE_HANDED -> R.drawable.sym_keyboard_start_onehanded_rounded
265-
ToolbarKey.INCOGNITO -> R.drawable.sym_keyboard_incognito_lxx
265+
ToolbarKey.INCOGNITO -> R.drawable.ic_incognito_final
266266
ToolbarKey.AUTOCORRECT -> R.drawable.ic_autocorrect_rounded
267267
ToolbarKey.CLEAR_CLIPBOARD -> R.drawable.sym_keyboard_clear_clipboard_rounded
268268
ToolbarKey.CLOSE_HISTORY -> R.drawable.ic_close_rounded

app/src/main/java/helium314/keyboard/latin/inputlogic/InputLogic.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -773,13 +773,8 @@ private void handleProofread() {
773773
textToProofread = selectedText != null ? selectedText.toString() : "";
774774
Log.i(TAG, "Proofreading selected text: " + textToProofread.length() + " chars");
775775
} else {
776-
// Select all text first so user sees what will be proofread
777-
mConnection.selectAll();
778-
779-
// Get entire text field content - use reasonable limit to avoid overflow in
780-
// some apps
781-
// Some Compose-based apps crash with Integer.MAX_VALUE
782-
// Reduce max chars to avoid overflow issues in some implementations
776+
// Get entire text field content FIRST to ensure we capture everything relative
777+
// to cursor
783778
final int maxChars = 60000;
784779
CharSequence textBefore = null;
785780
CharSequence textAfter = null;
@@ -805,6 +800,9 @@ private void handleProofread() {
805800
final String after = textAfter != null ? textAfter.toString() : "";
806801
textToProofread = before + after;
807802
Log.i(TAG, "Proofreading entire field: " + textToProofread.length() + " chars");
803+
804+
// Select all text NOW so user sees what will be proofread
805+
mConnection.selectAll();
808806
}
809807

810808
// Store original text for undo (via standard undo mechanism)
@@ -864,10 +862,7 @@ private void handleTranslate() {
864862
textToTranslate = selectedText != null ? selectedText.toString() : "";
865863
Log.i(TAG, "Translating selected text: " + textToTranslate.length() + " chars");
866864
} else {
867-
// Select all text first so user sees what will be translated
868-
mConnection.selectAll();
869-
870-
// Get entire text field content
865+
// Get entire text field content FIRST
871866
final int maxChars = 60000;
872867
CharSequence textBefore = null;
873868
CharSequence textAfter = null;
@@ -892,6 +887,9 @@ private void handleTranslate() {
892887
final String after = textAfter != null ? textAfter.toString() : "";
893888
textToTranslate = before + after;
894889
Log.i(TAG, "Translating entire field: " + textToTranslate.length() + " chars");
890+
891+
// Select all text NOW
892+
mConnection.selectAll();
895893
}
896894

897895
// Store original text for undo

app/src/main/java/helium314/keyboard/latin/settings/Defaults.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ object Defaults {
151151
const val PREF_SELECTED_SUBTYPE = ""
152152
const val PREF_URL_DETECTION = false
153153
const val PREF_DONT_SHOW_MISSING_DICTIONARY_DIALOG = false
154+
const val PREF_DISABLE_NETWORK = false
154155
const val PREF_TOOLBAR_MODE = "EXPANDABLE"
155156
const val PREF_TOOLBAR_HIDING_GLOBAL = true
156157
const val PREF_QUICK_PIN_TOOLBAR_KEYS = false

0 commit comments

Comments
 (0)