Skip to content

feat: add android app support#56

Merged
sirily11 merged 3 commits into
mainfrom
android
May 25, 2026
Merged

feat: add android app support#56
sirily11 merged 3 commits into
mainfrom
android

Conversation

@sirily11

Copy link
Copy Markdown
Contributor

No description provided.

Copilot AI review requested due to automatic review settings May 25, 2026 14:19
@vercel

vercel Bot commented May 25, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
rxcode Ready Ready Preview, Comment May 25, 2026 2:49pm

Request Review

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR introduces first-pass Android client support for RxCode (new Gradle-based RxCodeAndroid app with a Compose UI and the necessary sync/crypto/pairing plumbing), while also tightening cross-platform mobile/desktop sync correctness (snapshot sequencing + branch/worktree race prevention) and improving desktop UX around chat archiving and stuck streams.

Changes:

  • Add a new Android application project (RxCodeAndroid) including Gradle wrapper, dependency versions, app manifest/resources, sync stack, and Compose UI screens/sheets.
  • Improve mobile sync robustness: add desktop-stamped snapshot seq and mobile-side stale snapshot dropping; add a branch-op wait to prevent worktree/session spawn races.
  • Desktop UI/behavior improvements: archive confirmations, stream inactivity watchdog, and safer stdin writing to Claude CLI.

Reviewed changes

Copilot reviewed 97 out of 125 changed files in this pull request and generated 10 comments.

Show a summary per file
File Description
RxCodeMobile/Views/ThreadTodoSheet.swift Use LazyVStack for todo rendering inside the sheet scroll view.
RxCodeMobile/Views/NewThreadSheet.swift Wait for pending branch ops before spawning sessions; optimistic picked-branch UI label handling.
RxCodeMobile/State/MobileAppState+Persistence.swift Reset snapshot-seq gate when switching desktops.
RxCodeMobile/State/MobileAppState+Intents.swift Add waitForPendingBranchOps to avoid worktree/session races.
RxCodeMobile/State/MobileAppState+Inbound.swift Drop out-of-order snapshots; guard against clobbering messages with empty pages.
RxCodeMobile/State/MobileAppState.swift Add lastAppliedSnapshotSeq tracking.
RxCodeAndroid/settings.gradle.kts Android project settings + repository configuration (incl. JitPack).
RxCodeAndroid/gradlew.bat Add Windows Gradle wrapper script.
RxCodeAndroid/gradlew Add Unix Gradle wrapper script.
RxCodeAndroid/gradle/wrapper/gradle-wrapper.properties Configure Gradle wrapper distribution.
RxCodeAndroid/gradle/libs.versions.toml Centralize Android dependency/plugin versions.
RxCodeAndroid/gradle.properties Android/Gradle defaults (AndroidX, R class namespacing, JVM args).
RxCodeAndroid/build.gradle.kts Root Gradle plugin aliases.
RxCodeAndroid/app/src/main/res/xml/data_extraction_rules.xml Add baseline data extraction rules resource.
RxCodeAndroid/app/src/main/res/xml/backup_rules.xml Add baseline backup rules resource.
RxCodeAndroid/app/src/main/res/values/themes.xml Define base app theme (light).
RxCodeAndroid/app/src/main/res/values/strings.xml Add app name string resource.
RxCodeAndroid/app/src/main/res/values/colors.xml Add base colors + launcher background color.
RxCodeAndroid/app/src/main/res/values-night/themes.xml Define base app theme (dark).
RxCodeAndroid/app/src/main/res/mipmap-anydpi/ic_launcher.xml Add adaptive launcher icon definition.
RxCodeAndroid/app/src/main/res/mipmap-anydpi/ic_launcher_round.xml Add round adaptive launcher icon definition.
RxCodeAndroid/app/src/main/res/drawable/ic_launcher_foreground.xml Add launcher foreground vector.
RxCodeAndroid/app/src/main/res/drawable/ic_launcher_background.xml Add launcher background vector.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/util/Time.kt Add relative/absolute time formatting utilities.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/util/Markdown.kt Add themed Markdown rendering wrapper.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/util/KeyboardDismiss.kt Add modifier to dismiss keyboard on user scroll.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/util/Haptics.kt Add haptics abstraction for Compose UI.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/theme/Theme.kt Add Material3 theme/colors/shapes for Android app.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sync/SyncLoadingView.kt Add Android sync splash/timed-out recovery view.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/ToolCallSheet.kt Add tool-call detail bottom sheet UI.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/ThreadTodoSheet.kt Add todo+summary bottom sheet + progress badge UI.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/RunProfilesSheet.kt Add run profiles + active runs sheet UI.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/RunProfileEditorSheet.kt Add run-profile editor sheet UI.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/RenameThreadSheet.kt Add rename thread bottom sheet UI.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/QueuedMessagesSheet.kt Add queued-messages bottom sheet UI.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/QuestionSheet.kt Add AskUserQuestion UI sheet + answer submission model.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/PermissionApprovalSheet.kt Add permission approval bottom sheet UI + JSON pretty print.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/NewThreadSheet.kt Add new-thread bottom sheet UI (branch + plan mode + prompt).
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/sheets/FileDiffSheet.kt Add diff viewer sheet UI with gutter numbering and wrap/scroll toggle.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/RxCodeApp.kt Add Android root app composable + adaptive navigation + initial sync gating.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/projects/ProjectsScreen.kt Add Android projects list screen + pull-to-refresh + branch badges.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/chat/EditPreview.kt Add tool-call edit/write diff extraction utilities for chat UI.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/browser/InAppBrowserScreen.kt Add in-app browser with desktop proxy support via WebView proxy override.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/browser/BrowserUrlDetector.kt Add URL detection + localhost proxy bootstrap rewriting.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/ui/briefing/BriefingGrouping.kt Add briefing/thread grouping model for briefing UI.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/sync/SyncClient.kt Add Android sync client wrapper over relay + encryption.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/store/PairingStore.kt Add DataStore persistence for paired desktop metadata and selection.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/store/PairedDesktop.kt Add paired desktop model + stable composite id.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/state/MobileState.kt Add immutable UI state snapshot for Android app.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/RxCodeApplication.kt Add Android Application with Hilt bootstrap.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/relay/RelayClient.kt Add OkHttp WebSocket relay client w/ reconnect + ping behavior.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/proto/TodoItem.kt Add todo models + latest TodoWrite extraction from messages.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/proto/RunProfile.kt Add run profile/task/proxy models matching Swift wire format.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/proto/Models.kt Add core proto/domain models (projects, sessions, messages, etc.).
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/proto/Json.kt Add shared JSON config + Swift date/UUID serializers.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/proto/Envelope.kt Add relay envelope model + delivery failure parsing helper.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/pairing/PairingToken.kt Add QR/deeplink pairing token parsing compatible with Swift.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/MainActivity.kt Add Android entry activity, deep link handling, lifecycle wiring.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/identity/DeviceIdentity.kt Add persistent X25519 device identity using Jetpack Security.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/di/AppModule.kt Add Hilt DI module wiring identity/store/sync client.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/crypto/SessionCrypto.kt Add X25519+HKDF+ChaCha20-Poly1305 session crypto implementation.
RxCodeAndroid/app/src/main/java/app/rxlab/rxcode/crypto/Hex.kt Add hex encoding/decoding helper.
RxCodeAndroid/app/src/main/AndroidManifest.xml Add Android manifest (permissions, activity, pairing deeplinks).
RxCodeAndroid/app/src/debug/res/xml/debug_network_security_config.xml Allow cleartext traffic in debug builds.
RxCodeAndroid/app/src/debug/AndroidManifest.xml Hook debug network security config + cleartext flag.
RxCodeAndroid/app/proguard-rules.pro Add baseline ProGuard rules file.
RxCodeAndroid/app/build.gradle.kts Add Android app module Gradle configuration + dependencies.
RxCodeAndroid/app/.gitignore Ignore app build output directory.
RxCodeAndroid/.kotlin/errors/errors-1779703100049.log (Problematic) committed Kotlin incremental build error log.
RxCodeAndroid/.kotlin/errors/errors-1779703098971.log (Problematic) committed Kotlin incremental build error log.
RxCodeAndroid/.kotlin/errors/errors-1779702003413.log (Problematic) committed Kotlin incremental build error log.
RxCodeAndroid/.idea/vcs.xml Add Android Studio VCS mapping metadata.
RxCodeAndroid/.idea/runConfigurations.xml Add Android Studio run configuration producer settings.
RxCodeAndroid/.idea/misc.xml Add Android Studio project JDK/language level settings.
RxCodeAndroid/.idea/migrations.xml Add Android Studio Gradle migration settings.
RxCodeAndroid/.idea/gradle.xml Add Android Studio Gradle linkage metadata.
RxCodeAndroid/.idea/deploymentTargetSelector.xml Add Android Studio deployment target selector metadata.
RxCodeAndroid/.idea/compiler.xml Add Android Studio compiler bytecode target metadata.
RxCodeAndroid/.idea/AndroidProjectSystem.xml Add Android Studio project system metadata.
RxCodeAndroid/.idea/.gitignore Ignore selected Android Studio workspace files.
RxCodeAndroid/.gitignore Add Android project gitignore rules.
RxCode/Views/Sidebar/ProjectTreeView.swift Add archive confirmation flow for session archive actions.
RxCode/Views/Sidebar/HistoryListView.swift Add archive confirmation flow in history list.
RxCode/Views/Chat/RecentChatsSuggestionList.swift Add archive confirmation flow in recent chats list.
RxCode/Services/ClaudeService+Process.swift Improve spawn failure handling and use throwable file-handle writes to avoid crashes on broken pipe.
RxCode/Resources/Localizable.xcstrings Add archive-related localization keys (currently empty entries).
RxCode/App/AppState+Worktree.swift Add attach-worktree-for-existing-branch path for mobile branch selection.
RxCode/App/AppState+Stream.swift Add stream inactivity watchdog helpers and reset watchdog timestamp on finalize.
RxCode/App/AppState+MobileSync.swift Use worktree attach instead of main-repo checkout for mobile branch switching.
RxCode/App/AppState+MobileSnapshots.swift Stamp outgoing snapshots with seq.
RxCode/App/AppState+MobileRemote.swift Guard against overwriting non-empty messages with empty persistence loads.
RxCode/App/AppState+Messaging.swift Guard against overwriting messages with empty initialMessages.
RxCode/App/AppState+CrossProject.swift Start/maintain stream watchdog timestamp during stream processing.
RxCode/App/AppState.swift Add monotonic snapshot seq counter for mobile snapshots.
Packages/Sources/RxCodeSync/Protocol/Payload.swift Add SnapshotPayload.seq to the sync protocol.
Packages/Sources/RxCodeChatKit/TodoProgressView.swift Use LazyVStack in todo popover for better performance.
Packages/Sources/MessageList/MessageList.swift Add cooldown gating to load-more triggers to prevent rapid re-entrancy.
.github/workflows/test.yaml Add Android Gradle build job to CI workflow.
Files not reviewed (9)
  • RxCodeAndroid/.idea/.gitignore: Language not supported
  • RxCodeAndroid/.idea/AndroidProjectSystem.xml: Language not supported
  • RxCodeAndroid/.idea/compiler.xml: Language not supported
  • RxCodeAndroid/.idea/deploymentTargetSelector.xml: Language not supported
  • RxCodeAndroid/.idea/gradle.xml: Language not supported
  • RxCodeAndroid/.idea/migrations.xml: Language not supported
  • RxCodeAndroid/.idea/misc.xml: Language not supported
  • RxCodeAndroid/.idea/runConfigurations.xml: Language not supported
  • RxCodeAndroid/.idea/vcs.xml: Language not supported
Comments suppressed due to low confidence (2)

RxCode/Resources/Localizable.xcstrings:1051

  • This localization entry is currently an empty object. Please add the expected localizations structure (at least the base en value) so the key resolves predictably at runtime and stays consistent with the rest of the file.
    },
    "Archive Chat" : {

    },

RxCode/Resources/Localizable.xcstrings:6798

  • This localization key is added but has no localizations payload. Please add the base localization (and any required translations) or remove the entry if you intend to use the key string itself as the UI text.
    },
    "This chat will be archived. Archived chats are hidden from the active list and can be restored from Archived." : {

    },

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +1 to +5
kotlin version: 2.0.21
error message: java.io.EOFException
at java.base/java.io.DataInputStream.readUnsignedByte(Unknown Source)
at org.jetbrains.kotlin.com.intellij.openapi.util.io.DataInputOutputUtilRt.readINT(DataInputOutputUtilRt.java:16)
at org.jetbrains.kotlin.com.intellij.util.io.DataInputOutputUtil.readINT(DataInputOutputUtil.java:23)
Comment on lines +1 to +5
kotlin version: 2.0.21
error message: java.nio.file.NoSuchFileException: /Users/qiweili/Desktop/rxlab/RxCode/RxCodeAndroid/app/build/generated/ksp/debug/java/byRounds/1/dagger
at java.base/sun.nio.fs.UnixException.translateToIOException(Unknown Source)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)
Comment on lines +1 to +5
kotlin version: 2.0.21
error message: java.nio.file.NoSuchFileException: /Users/qiweili/Desktop/rxlab/RxCode/RxCodeAndroid/app/build/kspCaches/debug/backups/java
at java.base/sun.nio.fs.UnixException.translateToIOException(Unknown Source)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="21" />
Comment on lines +3 to +9
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="RxCode">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
</selectionStates>
</component>
Comment thread RxCodeAndroid/.gitignore
Comment on lines +1 to +6
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
}
},
"\"%@\" will be archived. Archived chats are hidden from the active list and can be restored from Archived." : {

Comment on lines +16 to +27
fun relativeTime(instant: Instant, now: Instant = Instant.now()): String {
val delta = Duration.between(instant, now)
val absSeconds = abs(delta.seconds)
val past = delta.seconds >= 0

fun word(noun: String, count: Long) = if (count == 1L) "1 $noun" else "$count ${noun}s"
fun phrase(text: String) = if (past) "$text ago" else "in $text"

return when {
absSeconds < 5 -> "just now"
absSeconds < 60 -> phrase("$absSeconds sec")
absSeconds < 3_600 -> phrase(word("min", absSeconds / 60))
Comment on lines +126 to +140
Row(horizontalArrangement = Arrangement.spacedBy(8.dp), modifier = Modifier.fillMaxWidth()) {
TextButton(
onClick = onDismiss,
modifier = Modifier.padding(vertical = 4.dp),
) { Text("Cancel") }
Spacer(Modifier.weight(1f))
Button(
onClick = {
haptics.play(HapticEvent.LightTap)
onSubmit(planMode, prompt.trim(), selectedBranch)
},
enabled = true,
colors = ButtonDefaults.buttonColors(),
) { Text("Start") }
}
useblacksmith/setup-gradle@v6 doesn't exist and resolves to gradle/actions
(the org root, not a valid action), so the Android job failed in "Setup
Gradle". Switch to the official gradle/actions/setup-gradle@v4 and the
standard actions/setup-java@v5; keep the Blacksmith runner.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@sirily11 sirily11 merged commit a21646d into main May 25, 2026
11 checks passed
@sirily11 sirily11 deleted the android branch May 25, 2026 15:02
@sirily11

Copy link
Copy Markdown
Contributor Author

🎉 This PR is included in version 1.12.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request released

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants