Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
4cedf37
test
kqnan Mar 29, 2026
005c962
feat: 创建了 SSHControlMasterInstaller 工具类,实现 SSH wrapper 自动安装、控制目录创建、二进制重…
kqnan Mar 29, 2026
b0bb3bd
feat: 修复 FileUtils API 调用错误,成功构建并部署 Termux APK,验证 SSH ControlMaster 安装流…
kqnan Mar 29, 2026
716aa77
feat: 创建了 SSHConnectionInfo 数据类和 getActiveConnections() API,可扫描 ~/.ssh/…
kqnan Mar 29, 2026
12b36c8
feat: Added F button to Extra Keys toolbar with folder icon (📁) displa…
kqnan Mar 29, 2026
73d9f21
feat: 在 TermuxTerminalExtraKeys.java 中添加了 F 按钮点击处理逻辑,调用 SSH 连接检测 API 并根…
kqnan Mar 29, 2026
5bce479
feat: 创建了 RemoteFile 数据类和 RemoteFileLister 服务,通过 SSH ControlMaster 执行 l…
kqnan Mar 29, 2026
8640cf7
feat: 创建了远程文件浏览器的 Activity 布局、文件列表项布局和 ArrayAdapter 适配器
kqnan Mar 29, 2026
1594214
feat: 创建了 RemoteFileBrowserActivity,实现 SSH 远程文件浏览的完整功能:Intent 启动、异步目录加载…
kqnan Mar 29, 2026
c984204
feat: 修改 F 按钮从显示 Toast 改为启动 RemoteFileBrowserActivity,传递 SSHConnectionI…
kqnan Mar 29, 2026
af2fb97
feat: 创建了 RemoteFileOperator 服务类,封装 cp/mv/rm/mkdir 远程文件操作,复用 AppShell 同…
kqnan Mar 29, 2026
1f02db0
feat: 集成长按上下文菜单处理删除、重命名和新建文件夹操作,使用确认对话框和输入对话框,调用 RemoteFileOperator 执行异…
kqnan Mar 29, 2026
63cced9
feat: 在底部操作栏添加新建文件夹按钮,复用 showNewFolderDialog 实现快速创建目录功能
kqnan Mar 29, 2026
1ca6409
feat: 创建了基于 SSH ControlMaster 的双向文件传输服务,支持 base64 编码的二进制安全传输和实时进度回调
kqnan Mar 29, 2026
851c10b
feat: Integrated upload and download UI with SAF file picker and progre…
kqnan Mar 29, 2026
54bbf96
feat: 创建了两个 SSH 文件读写服务类,通过 ControlMaster 执行 cat/base64 命令读写远程文件,包含完整的路径…
kqnan Mar 29, 2026
5a61aa5
feat: 创建了 CodeMirrorMode 枚举(21 种语言模式,51 个扩展名映射)和 WebView HTML 模板,包含完整的…
kqnan Mar 29, 2026
265b9fc
feat: 创建了 RemoteCodeEditorActivity,实现 WebView+CodeMirror 编辑器集成、JavaScri…
kqnan Mar 29, 2026
0fb993d
feat: 修改了 RemoteFileBrowserActivity.onFileItemClick 方法,添加代码文件检测逻辑,点击可编辑…
kqnan Mar 29, 2026
22e5ec4
feat: 添加了 PhotoView 库依赖并实现了 ImageFileType 工具类,用于判断文件是否为支持的图片格式
kqnan Mar 29, 2026
3ee76b5
feat: 实现了 RemoteImageLoader 服务类,通过 SSH ControlMaster 获取远程图片数据,支持尺寸预检和自动…
kqnan Mar 29, 2026
75d9de1
feat: 创建了 RemoteImagePreviewActivity 用于显示远程图片,支持双指缩放和平移拖拽,集成到文件浏览器点击处理逻…
kqnan Mar 29, 2026
8c7dcc8
chore: auto-commit after complete-milestone
kqnan Mar 30, 2026
411ab85
fix: 修复 SSH wrapper 递归调用和主题属性未定义问题
kqnan Mar 30, 2026
f20bb3d
feat: 在 F 按钮点击处理逻辑中添加 SSH wrapper 安装触发,为首次启动后安装 openssh 的用户提供补救安装机会
kqnan Mar 31, 2026
7a714c1
feat: 添加了 onBackPressed() 覆写方法,使返回键返回上级目录,仅在根目录时退出 Activity
kqnan Mar 31, 2026
c615d40
feat: 创建了完整的中文本地化资源文件,包含文件管理器 5 个功能模块的 50 个字符串翻译
kqnan Mar 31, 2026
4a8d6d8
feat: 创建了完整的莫兰迪色系颜色资源(20种基础色)和文件管理器主题样式,包含浅色/深色模式自动适配。
kqnan Mar 31, 2026
5393745
feat: 将 RemoteFileListAdapter.java 中的硬编码颜色替换为莫兰迪主题颜色,更新布局背景色,并配置三个文件管理器…
kqnan Mar 31, 2026
2cf0075
chore: auto-commit after complete-milestone
kqnan Mar 31, 2026
c9e7798
feat: 添加了 FileObserver 事件驱动监控,当 ssh 二进制创建时自动触发 SSH wrapper 安装
kqnan Apr 3, 2026
e89b8b4
feat: 将 TermuxApplication 中的 install() 调用改为 startWatchingSSHBinary(),实现…
kqnan Apr 3, 2026
fc4f617
feat: 编写了 12 个单元测试覆盖 SSH wrapper 事件驱动安装的核心行为:ssh 存在时的直接安装路径、监控启动/停止生命周期…
kqnan Apr 3, 2026
1f0632c
feat: 添加了 downloadChunked() 方法,使用 1MB 分片流式下载远程文件,解决大文件 OOM 问题
kqnan Apr 3, 2026
6942458
feat: 添加了 uploadChunked() 方法,使用 1MB 分片流式上传本地文件到远程服务器,解决大文件 OOM 问题
kqnan Apr 3, 2026
e2201c8
feat: 新增 5 个精确边界测试(1MB-1/1MB/1MB+1、50MB、100MB),总分片传输测试达 41 个,全部通过
kqnan Apr 3, 2026
f29b7e1
feat: 将文件管理器集成分片传输,替换上传下载方法调用以支持 100MB 大文件
kqnan Apr 3, 2026
f041c22
feat: E2E 测试受 K001 限制部分完成:构建成功、单元测试通过、分片传输代码集成确认,但 SSH 自动化测试受限
kqnan Apr 3, 2026
180f996
fix: replace FileObserver with polling for SSH wrapper installation
kqnan Apr 3, 2026
d315364
fix: handle symlinks pointing to directories in remote file browser
kqnan Apr 3, 2026
5118344
feat: 修改 RemoteFileListAdapter 使用 isDirectoryOrSymlinkToDirectory() 判断目…
kqnan Apr 3, 2026
13429c4
feat: 修改删除确认对话框逻辑,为软链接目录显示专门的确认消息
kqnan Apr 3, 2026
f565692
fix: resolve symlink directory navigation path duplication bug
kqnan Apr 4, 2026
7fc5c5c
chore: update .gitignore to exclude test artifacts and config files
kqnan Apr 8, 2026
3d391b1
chore: ignore scripts directory and '=' file
kqnan Apr 8, 2026
b1a9b99
chore: restore SECURITY.md and fastlane to version control
kqnan Apr 8, 2026
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
36 changes: 36 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,39 @@ local.properties
.swp
ehthumbs.db
Thumbs.db

# ── GSD baseline (auto-generated) ──
.gsd
.agents/
.claude/
.trae/
.bg-shell/
e2e-evidence/
.mcp.json
skills-lock.json
vision.md
github_key
问题收集.md
clear_and_stream.sh
screenshot_folder.png
=
scripts/
*~
.vscode/
*.code-workspace
.env
.env.*
!.env.example
node_modules/
.next/
dist/
__pycache__/
*.pyc
.venv/
venv/
target/
vendor/
*.log
coverage/
.cache/
tmp/
3 changes: 3 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ android {
implementation "io.noties.markwon:recycler:$markwonVersion"
implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'

// PhotoView for image preview with pinch-to-zoom and pan support
implementation 'com.github.chrisbanes:PhotoView:2.3.0'

implementation project(":terminal-view")
implementation project(":termux-shared")
}
Expand Down
28 changes: 28 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,34 @@
android:label="@string/title_activity_termux_settings"
android:theme="@style/Theme.TermuxApp.DayNight.NoActionBar" />

<activity
android:name=".app.activities.RemoteFileBrowserActivity"
android:exported="false"
android:label="@string/title_remote_file_browser"
android:parentActivityName=".app.TermuxActivity"
android:resizeableActivity="true"
android:theme="@style/Theme.RemoteFileBrowser.DayNight.NoActionBar"
tools:targetApi="n" />

<activity
android:name=".app.activities.RemoteCodeEditorActivity"
android:exported="false"
android:label="@string/title_code_editor"
android:parentActivityName=".app.activities.RemoteFileBrowserActivity"
android:resizeableActivity="true"
android:windowSoftInputMode="adjustResize"
android:theme="@style/Theme.RemoteFileBrowser.DayNight.NoActionBar"
tools:targetApi="n" />

<activity
android:name=".app.activities.RemoteImagePreviewActivity"
android:exported="false"
android:label="@string/title_image_preview"
android:parentActivityName=".app.activities.RemoteFileBrowserActivity"
android:resizeableActivity="true"
android:theme="@style/Theme.RemoteFileBrowser.DayNight.NoActionBar"
tools:targetApi="n" />

<activity
android:name=".shared.activities.ReportActivity"
android:theme="@style/Theme.MarkdownViewActivity.DayNight"
Expand Down
Loading