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
3 changes: 3 additions & 0 deletions .github/workflows/build-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ jobs:
npm ci --ignore-scripts
npm run build

- name: Check event-driven power behavior
run: ./tools/check-power-behavior.sh

- name: Prepare signing key
if: github.event_name != 'pull_request'
env:
Expand Down
11 changes: 7 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ Root-first Android voice typing that stays available, transcribes through Wispr

## Architecture

- **Floating APK service:** draggable tap-to-record bubble using a foreground service.
- **Gboard trigger:** in-process, event-driven mic interception and transcription. It does not ping or wake Gboard in the background.
- **Optional floating APK service:** draggable tap-to-record bubble using a foreground service only while the bubble is enabled.
- **Wispr client:** email login or session JSON import, automatic refresh-token renewal, HTTP transcription fallback.
- **Selectable insertion:**
- **Auto:** direct `InputConnection.commitText()` through an LSPosed IME bridge, then root clipboard + `KEYCODE_PASTE` fallback.
- **LSPosed:** direct InputConnection only.
- **Clipboard/root paste:** compatibility fallback.
- **KernelSU module:** grants the overlay AppOp, keeps the service alive, lowers its OOM score, and checks releases.
- **Hot update:** the KernelSU Action downloads a SHA-256-verified runtime release, installs the APK in place, restarts the service, and does not request a reboot.
- **KernelSU module:** grants required permissions once at boot and restores the bubble only when it was enabled. It does not run a persistent watchdog or adjust the app's OOM score.
- **Manual hot update:** the KernelSU Action downloads a SHA-256-verified runtime release, installs the APK in place, and restores the bubble only when enabled. It does not request a reboot.

## First install

Expand All @@ -20,7 +21,9 @@ Root-first Android voice typing that stays available, transcribes through Wispr
3. For direct insertion, enable betterFlow in LSPosed and scope it to your current keyboard. Gboard and AOSP LatinIME are predeclared.
4. Choose **Auto** in betterFlow. If the LSPosed bridge is unavailable, it falls back to root paste.

KernelSU's **Action** button is the fast-update button. It fetches and applies the newest release without rebooting. The watchdog also checks every six hours by default.
KernelSU's **Action** button checks for and applies the newest release without rebooting. Updates are manual, so betterFlow performs no periodic network or process polling.

With the floating microphone disabled, betterFlow has no long-running app service. Gboard voice typing remains available through the LSPosed hook and only does work in response to keyboard lifecycle and touch events.

## CI

Expand Down
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ dependencies {
implementation(libs.compose.ui)
implementation(libs.compose.ui.tooling.preview)
debugImplementation(libs.compose.ui.tooling)
testImplementation("junit:junit:4.13.2")
}

protobuf {
Expand Down
23 changes: 0 additions & 23 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

<permission
android:name="com.jadenjsj.betterflow.permission.COMMIT_TEXT"
Expand Down Expand Up @@ -41,28 +40,6 @@
</intent-filter>
</activity>

<activity
android:name=".WakeActivity"
android:excludeFromRecents="true"
android:exported="true"
android:noHistory="true"
android:permission="com.jadenjsj.betterflow.permission.CONTROL_SERVICE"
android:theme="@android:style/Theme.NoDisplay" />

<provider
android:name=".GboardBridgeProvider"
android:authorities="com.jadenjsj.betterflow.gboard-bridge"
android:exported="true"
android:grantUriPermissions="false" />

<receiver
android:name=".GboardBridgeReceiver"
android:exported="true" />

<service
android:name=".GboardBridgeService"
android:exported="true" />

<service
android:name=".OverlayService"
android:exported="true"
Expand Down
87 changes: 0 additions & 87 deletions app/src/main/java/com/jadenjsj/betterflow/GboardBridgeProvider.kt

This file was deleted.

109 changes: 0 additions & 109 deletions app/src/main/java/com/jadenjsj/betterflow/GboardBridgeReceiver.kt

This file was deleted.

109 changes: 0 additions & 109 deletions app/src/main/java/com/jadenjsj/betterflow/GboardBridgeService.kt

This file was deleted.

Loading
Loading