Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
e58fb0a
tools: package-samples.py - build, sign-check, badging/permission all…
Oct 8, 2026
3055ab9
merge: feat/package-samples - tools/package-samples.py (docs/next-app…
Oct 8, 2026
c0e857c
fix(alarm): 12-hour clock puts the AM/PM marker where the locale want…
Oct 8, 2026
fe86f68
feat(alarm): AlarmClock intent logic (A1) and the read-only alarm_sys…
Oct 8, 2026
40036ae
feat(sms): 短信示例 App 骨架 —— 规则层(短号/验证码遮蔽/频率/去重)、outbox 状态机、六个工具、MCP 服务、…
Oct 8, 2026
a547f53
feat(todo): new Todo sample app - SQLite repository, 8 MCP tools, Com…
Oct 8, 2026
9920505
feat(alarm): system alarm intent entry points, ring-on-time check pag…
Oct 8, 2026
4d7085d
feat(calendar): system calendar backend (CalendarContract) beside the…
Oct 8, 2026
ecf9792
feat(sms): sms_compose 的草稿留存(Android 会静默拦截后台 App 打开界面,V1 实测)、送达回执日志、r…
Oct 8, 2026
116bc9a
test(extensions): SamplePluginsConformanceTest 加入 sms(计划第 4 节的六个工具);只…
Oct 8, 2026
c7ec334
fix(todo): swipe actions fire once (onDismiss + reset), top scrim und…
Oct 8, 2026
bc6a6b6
fix(alarm): intent_choose is a plural (lint PluralsCandidate); correc…
Oct 8, 2026
65d2d06
docs(alarm): SKILL.md (own tools only, alarm_system_next, reminders b…
Oct 8, 2026
f077859
docs(alarm): screenshots retaken for the new header menu; zh 12 + en …
Oct 8, 2026
d4e6fe8
feat(calendar): permission guidance and settings screen, account-awar…
Oct 8, 2026
a1c8e68
test(todo): add the todo Spec to SamplePluginsConformanceTest (8 tool…
Oct 8, 2026
70e6448
docs(calendar): README for system/account calendars (design, C1 measu…
Oct 8, 2026
98a8cb9
docs(todo): README (features, tools, caveats, dump/reset), mcp-live s…
Oct 8, 2026
1e1d0ad
feat(sms): 界面收尾(状态栏底色、权限标签竖排、失败原因本地化、英文页签改 Agent log)、遮蔽规则的中文改 \u 转义、…
Oct 8, 2026
2f35221
Merge branch 'main' into app/calendar
Oct 8, 2026
b96d62d
Merge branch 'main' into integration/next-apps
Oct 8, 2026
dffc4a4
Merge branch 'app/alarm' into integration/next-apps
Oct 8, 2026
08fd708
Merge branch 'app/todo' into integration/next-apps
Oct 8, 2026
cadec1f
Merge branch 'app/sms' into integration/next-apps
Oct 8, 2026
b294d0a
docs+test: sample-apps.md gains todo (4.4), sms (4.5) and alarm_syste…
Oct 8, 2026
4f8f240
docs+tools: extensions.md 4.4 drops the calendar tool group (D1) and …
Oct 8, 2026
afcedc0
fix(calendar): pass tools/check-i18n.py - waive the legacy default-na…
Oct 8, 2026
50fde24
feat(notes): schedule prompt routes done-state things to todo_create;…
Oct 8, 2026
581e863
feat(notes): app language entry (locales_config, overflow menu), week…
Oct 8, 2026
e4ec4ea
docs(notes): SKILL.md - a checklist line is for items inside one note…
Oct 8, 2026
ae66647
Merge branch 'app/calendar' into integration/next-apps
Oct 8, 2026
3f0c583
docs+tools: sample-apps.md 4.2 and the dump/reset口径 follow the system…
Oct 8, 2026
f43624b
test(e2e): sample-apps lib knows todo and sms (Sample, TodoState, Sms…
Oct 8, 2026
6917003
test(notes): debug fake script success_todo (event + to-do + alarm) a…
Oct 8, 2026
3c4f7de
feat(notes): screenshots for the language entry and the to-do schedul…
Oct 8, 2026
8247a4b
docs(notes): README - to-do routing and degrade rule, language entry,…
Oct 8, 2026
937ca42
test(e2e): setup/teardown cover the five sample apps (sms only on emu…
Oct 8, 2026
88cf23a
test(e2e): scripted todo plan (create PRDs/timed/overdue/subtask, err…
Oct 8, 2026
57e9573
feat(i18n): MessageRef (key + args) from the core, Strings interface …
Oct 8, 2026
01783f0
test(e2e): scripted sms plan (emulator only: emu sms send inbox, mask…
Oct 8, 2026
9173909
test(e2e): live cases for todo, sms (declined by the driver, nothing …
Oct 8, 2026
5d384a1
docs(e2e): README and driver docstring for five apps (sms emulator-on…
Oct 8, 2026
be3093f
test(e2e): the driver logs which emulator the sms steps send to
Oct 8, 2026
8c466cf
Merge branch 'app/notes' into integration/next-apps
Oct 8, 2026
7fee707
Merge branch 'feat/e2e-driver' into integration/next-apps
Oct 8, 2026
13869a5
i18n: waive the non-UI Chinese literals of sms (code-masking patterns…
Oct 8, 2026
9d1ffb4
skills: one shared 'where things belong' block in the alarm, calendar…
Oct 8, 2026
1316d65
docs: third-party-acp.md - the notes toolScope is now three tools (to…
Oct 8, 2026
761a70c
demo: notes_to_calendar.sh covers the todo app (three PRDs as todos, …
Oct 8, 2026
f1d69b1
docs: development.md lists the five sample apps and package-samples.py
Oct 8, 2026
66eaff2
feat(i18n): confirmation dialog, authorization dialog and error messa…
Oct 8, 2026
c8918f3
test(i18n): ResStrings reads every xml of the res directory (same cha…
Oct 8, 2026
eaa4dea
feat(i18n): first-run guide, battery / security / runtime-status text…
Oct 8, 2026
6c06c1d
feat(i18n): desktop access text, notification and pairing dialogs fro…
Oct 8, 2026
820274d
feat(i18n): settings page, model & key, Jev source from resources; ap…
Oct 8, 2026
fba334c
feat(i18n): conversation notices and content placeholders from resour…
Oct 8, 2026
0de1235
feat(i18n): app language (locales_config), zh marker resource, device…
Oct 8, 2026
3363a6a
chore(i18n): drop the values-zh locale marker copied from i18n-p1
Oct 8, 2026
0972f0e
fix(i18n): shorter English labels that wrapped and clipped at 1.3x fo…
Oct 9, 2026
a57afd1
feat(i18n): core/extensions validation messages are key + args (ExtMe…
Oct 9, 2026
9c3c244
docs(i18n): P2 device evidence - first-run guide, settings, model & k…
Oct 9, 2026
7a632dd
feat(i18n): plugin management page, plugin details and authorized app…
Oct 9, 2026
7947b92
Merge branch 'feat/i18n-p1' into integration/next-apps
Oct 9, 2026
51db326
Merge branch 'feat/i18n-p2' into integration/next-apps
Oct 9, 2026
e4c2f39
fix(i18n): P3 lint tidy-up - plural for 'N more', drop an unused key,…
Oct 9, 2026
2db1d1d
Merge integration/next-apps into feat/i18n-p3 (P1, P2 and the five ap…
Oct 9, 2026
40224a0
Merge branch 'main' into integration/next-apps
Oct 9, 2026
6f40dca
fix(i18n): ext_msg_name_pattern names a literal -- on purpose, silenc…
Oct 9, 2026
f2b3b74
Merge branch 'integration/next-apps' into feat/i18n-p3
Oct 9, 2026
68bef7e
docs: bilingual release notes for the sample apps 0.1.0 (known limita…
Oct 9, 2026
fbf0876
docs: fix two stray replacement characters in the release notes
Oct 9, 2026
e11503f
docs(i18n): P3 device evidence - plugins list / details / rejected pl…
Oct 9, 2026
a6a7cf9
docs(i18n): P3 device evidence rebuilt on the merged build - en and z…
Oct 9, 2026
40c19f4
Merge branch 'feat/i18n-p3' into integration/next-apps
Oct 9, 2026
63c1976
test(e2e): the driver grants the calendar app READ_CALENDAR/WRITE_CAL…
Oct 9, 2026
5174892
test(e2e): the cross-app live prompt asks for the reminder inside the…
Oct 9, 2026
654f9d8
docs: next-apps-plan.md joins the repo with an implementation record …
Oct 9, 2026
b0f5a6a
Merge branch 'main' into integration/next-apps
Oct 9, 2026
c5ac526
docs: real-phone check on the Pixel 8 (what was run, what was left al…
Oct 9, 2026
fac2b35
merge: integration/next-apps - five sample apps (alarm/calendar itera…
Oct 9, 2026
9f84fd9
fix(tools): check-i18n skips .worktrees/ (other checkouts of the repo…
Oct 9, 2026
0ac262e
merge: fix/i18n-gate-skip-worktrees - the i18n gate no longer scans n…
Oct 9, 2026
00b461b
feat(tools): add install.sh and package-release.py for Release folders
Oct 9, 2026
31b0e75
merge: feat/release-installer - install.sh, package-release.py, docs/…
Oct 9, 2026
05a2fa3
chore: ignore dist-release/ and dist-samples/
Oct 9, 2026
57cc6f4
merge: feat/release-installer - ignore the release output folders
Oct 9, 2026
69de24b
test: wait for two races in core/runtime tests that failed in CI
Oct 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,7 @@ app/src/main/assets/model-catalog.json

# ---- 打包产物(tools/package-module.py,W7) ----
agentos-*.zip

# 发布目录(tools/package-release.py、tools/package-samples.py 的默认输出):签名后的 APK、zip、SHA256SUMS 都不进仓库
dist-release/
dist-samples/
5 changes: 4 additions & 1 deletion README.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,9 @@ Key frames, left to right: the instruction typed before sending; the Thursday 15
> [!IMPORTANT]
> You need a **rooted** Android 15–17 phone with Magisk or KernelSU installed. The combination verified on a real device is a Pixel 8 (Magisk 30.7, Android 15). Android 15 / 16 / 17 have run on emulators. KernelSU and Android 16 / 17 real devices are not verified yet.

**1. Build the module zip.** There is no published release yet, so build it from source (JDK 21, Android SDK and Node 22.19+; see the [development guide](docs/development.md), in Chinese):
**Shortest path:** download **all files** from [Releases](https://github.com/HanZijie/agentos-android/releases) into one folder and run `sh install.sh`. It verifies the files, flashes the module, reboots, and installs AgentOS and the sample apps. **What the script cannot do** (unlocking / rooting, USB debugging, granting root, the model key, enabling plugins, the SMS permission) and **what to do when something goes wrong** are listed step by step in [docs/install.md](docs/install.md) (Chinese first, English below). To package it yourself from source:

**1. Build the module zip.** Build it from source (JDK 21, Android SDK and Node 22.19+; see the [development guide](docs/development.md), in Chinese):

```bash
python3 tools/package-module.py --variant debug # output: build/module/agentos-<ver>.zip
Expand Down Expand Up @@ -335,6 +337,7 @@ Work packages start by dependency and do not wait for the previous milestone to
| [docs/development.md](docs/development.md) | Development guide: environment, common commands, packaging the module zip, modules and source layout, sample apps, the release certificate |
| [docs/implementation-plan.md](docs/implementation-plan.md) | File-level layout, build and artifacts (with pinned dependency versions), 8 validations, dependency graph, 28 work packages and M1–M6 exit criteria, migration from agenroid, risks |
| [docs/m1-acceptance.md](docs/m1-acceptance.md) | Acceptance checklist: real-device and emulator verification records, defects found and fixed, what is not verified |
| [docs/install.md](docs/install.md) | Install guide: what the script cannot do (root, USB debugging, grants, key, plugins, SMS permission), upgrading, troubleshooting |
| [docs/sample-apps.md](docs/sample-apps.md) | The alarm, calendar and notes sample apps: tool lists, data, build |
| [docs/spikes/](docs/spikes/) | Conclusions of each validation: S1 (module installs an APK), S2 (keep-alive and root supervision), S3 (ACP over Binder), S8 (Pi Agent core in QuickJS). The experiment projects live in `spikes/` and are not part of the main build |
| [core/protocol/acp-profile-v1.md](core/protocol/acp-profile-v1.md) | The external protocol; this is the source of truth |
Expand Down
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,9 @@ Agent 通过三个示例 App 提供的 MCP 工具,分别创建备忘录、日
> [!IMPORTANT]
> 需要一台**已 root** 的 Android 15–17 手机,装好 Magisk 或 KernelSU。真机验证过的组合是 Pixel 8(Magisk 30.7,Android 15);模拟器上跑过 Android 15 / 16 / 17;KernelSU 和 Android 16 / 17 真机还没验证过。

**1. 构建模块 zip。** 目前还没有发布版本,需要从源码打包(JDK 21、Android SDK、Node 22.19+,详见[开发指南](docs/development.md)):
**最短路径:** 从 [Releases](https://github.com/HanZijie/agentos-android/releases) 下载**所有文件**到同一个文件夹,运行 `sh install.sh`。它会校验文件、刷入模块、重启、装好 AgentOS 和示例 App。**脚本做不了的部分**(解锁 / root、USB 调试、授予 root、模型 key、启用插件、短信权限)和**出问题怎么办**,逐条写在 [docs/install.md](docs/install.md)。下面是从源码自己打包的方式:

**1. 构建模块 zip。** 从源码打包(JDK 21、Android SDK、Node 22.19+,详见[开发指南](docs/development.md)):

```bash
python3 tools/package-module.py --variant debug # 产物在 build/module/agentos-<ver>.zip
Expand Down Expand Up @@ -331,6 +333,7 @@ AgentOS 目前是用于验证产品形态与技术路径的原型。
| [docs/development.md](docs/development.md) | 开发指南:环境、常用命令、打包模块 zip、模块与源码位置、示例 App、项目发布证书 |
| [docs/implementation-plan.md](docs/implementation-plan.md) | 文件级目录、构建与产物(含依赖版本锁定)、8 项验证、依赖顺序图、28 个工作包与 M1–M6 出口条件、从 agenroid 迁移、风险 |
| [docs/m1-acceptance.md](docs/m1-acceptance.md) | 验收清单:真机与模拟器的验证记录、发现并修好的缺陷、没验证的部分 |
| [docs/install.md](docs/install.md) | 安装指南:脚本解决不了的部分(root、USB 调试、授权、key、插件、短信权限)、升级、故障排查 |
| [docs/sample-apps.md](docs/sample-apps.md) | 闹钟、日历、备忘录三个示例 App:工具清单、数据、构建 |
| [docs/spikes/](docs/spikes/) | 各项验证的结论:S1(模块安装 APK)、S2(保活与 root 监督)、S3(ACP over Binder)、S8(Pi Agent core 在 QuickJS 里);实验工程在 `spikes/`,不参与主构建 |
| [core/protocol/acp-profile-v1.md](core/protocol/acp-profile-v1.md) | 对外协议,以此为准 |
Expand Down
13 changes: 11 additions & 2 deletions app/src/debug/java/org/agentos/app/agent/ConsentDebugReceiver.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
import org.agentos.app.agent.consent.ConsentWire
import org.agentos.app.i18n.AndroidStrings
import org.agentos.app.i18n.Strings
import org.agentos.runtime.consent.AutoConsentResponder
import org.agentos.runtime.ports.CallerIdentity
import org.agentos.runtime.ports.CallerKind
Expand All @@ -17,6 +19,7 @@ import org.agentos.runtime.ports.ToolRisk
import org.agentos.runtime.ports.ToolSource
import org.json.JSONArray
import org.json.JSONObject
import java.util.Locale
import java.util.concurrent.ConcurrentHashMap

/**
Expand All @@ -43,6 +46,9 @@ import java.util.concurrent.ConcurrentHashMap
class ConsentDebugReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val process = AgentProcess.get(context)
// 设备测试脚本(tests/device/acp-channel/*.py)按中文整句比对 title / initiatorLine / source 等字段:这里固定用中文渲染,
// 不跟界面语言(界面切到英文时脚本的判据不能变)。线上的 wire 格式是 key + 参数,这里只是把它在测试出口展开。
val zh: Strings = AndroidStrings.forLocale(context, Locale.SIMPLIFIED_CHINESE)
val op = intent.getStringExtra("op")
val responder = process.autoConsent
val result = try {
Expand Down Expand Up @@ -70,6 +76,9 @@ class ConsentDebugReceiver : BroadcastReceiver() {
JSONArray(
process.consent.pending.value.map {
JSONObject(ConsentWire.encodeViewString(it)).put("remainingMs", it.deadlineMillis - System.currentTimeMillis())
.put("title", zh.get(it.title))
.put("initiatorLine", zh.get(it.initiatorLine))
.put("sourceLine", it.sourceLine?.let { ref -> zh.get(ref) } ?: JSONObject.NULL)
},
),
)
Expand Down Expand Up @@ -102,12 +111,12 @@ class ConsentDebugReceiver : BroadcastReceiver() {
.put("requestId", e.requestId)
.put("tool", e.toolName)
.put("risk", e.risk.name)
.put("source", e.sourceLine ?: JSONObject.NULL)
.put("source", e.sourceLine?.let { zh.get(it) } ?: JSONObject.NULL)
.put("args", e.argumentsSummary)
.put("options", JSONArray(e.options.map { it.name }))
.put("answeredWith", e.answeredWith?.name ?: JSONObject.NULL)
.put("end", e.end?.name ?: JSONObject.NULL)
.put("notice", e.notice ?: JSONObject.NULL)
.put("notice", e.notice?.let { zh.get(it) } ?: JSONObject.NULL)
},
),
)
Expand Down
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
android:name=".AgentOSApp"
android:allowBackup="false"
android:label="AgentOS"
android:localeConfig="@xml/locales_config"
android:networkSecurityConfig="@xml/network_security_config">

<!-- ================= W6::agent 进程(运行时) ================= -->
Expand Down
5 changes: 3 additions & 2 deletions app/src/main/aidl/org/agentos/internal/IExtensionHost.aidl
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,13 @@ import org.agentos.internal.IExtensionCallback;
* "status":"ready"|"unavailable"|"signature_changed"|"signature_unconfirmed"(PluginStatus),
* "unavailableReason":"assets_missing"|"manifest_rejected"|"no_usable_server"|"name_conflict"|null,
* "builtin": bool, "enabled": bool(插件级是否启用), "approval":"ask"|"always"|null(插件级审批方式,null = 没设,按 ask),
* "problems":[{"code","message"}](中文,给插件页显示), "unsupported":[{"kind","location","detail"}](PluginManifest.unsupported),
* "problems":[{"code","message":{"key","args":[…]},"location"|null}](message 是文案 key + 参数,ExtMessages;界面按自己的语言渲染,不是文字),
* "unsupported":[{"kind","location","detail":{"key","args":[…]}}](PluginManifest.unsupported;detail 同 message),
* "servers":[{"name", "service"(完整类名,Binder 服务器;否则 null), "url"(https,远端服务器;否则 null),
* "state":"idle"|"connected"|"unreachable"|"disabled", "error"(或 null), "toolCount"}],
* "rejectedServers":[{"name","service","reason":"not_in_package"|"not_exported"|"missing_permission"}],
* "toolCount", "skillCount",
* "skillProblems":[{"code","message"}](ExtensionSkillPort.problems:frontmatter 缺失 / 非法、SKILL.md 读不到等,A10)}
* "skillProblems":[{"code","message":{"key","args"},"location"}](ExtensionSkillPort.problems:frontmatter 缺失 / 非法、SKILL.md 读不到等,A10;location 是 Skill 的目录名)}
* 签名变化(signature_changed)或记忆丢失(signature_unconfirmed)时已停用,要用户先 confirmSignature 再启用。
*
* 已知工具(listTools 的一项;setToolEnabled / setToolApproval / setToolApprovalBySource 的返回值):与 core:extensions 的
Expand Down
35 changes: 18 additions & 17 deletions app/src/main/java/org/agentos/app/agent/AgentService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ import android.content.pm.ServiceInfo
import android.graphics.drawable.Icon
import android.os.IBinder
import android.util.Log
import org.agentos.app.R
import org.agentos.app.i18n.AndroidStrings
import org.agentos.app.i18n.Strings
import org.agentos.app.settings.Desktop
import org.agentos.app.settings.SettingsActivity

Expand All @@ -30,6 +33,7 @@ import org.agentos.app.settings.SettingsActivity
*/
class AgentService : Service() {
private lateinit var runtime: AgentProcess
private val strings: Strings by lazy { AndroidStrings(this) }

override fun onCreate() {
super.onCreate()
Expand Down Expand Up @@ -86,39 +90,41 @@ class AgentService : Service() {
private fun buildNotification(desktopOn: Boolean, busy: Boolean): Notification {
val nm = getSystemService(NotificationManager::class.java)
if (!desktopOn) {
ensureChannel(nm, CHANNEL, "Agent 运行时")
ensureChannel(nm, CHANNEL, strings.get(R.string.runtime_notification_channel))
return Notification.Builder(this, CHANNEL)
.setContentTitle("AgentOS 正在运行任务")
.setContentTitle(strings.get(R.string.runtime_notification_title))
.setSmallIcon(android.R.drawable.stat_notify_sync)
.setOngoing(true)
.build()
}
// 用词与设置页(D,SettingsActivity 的“电脑端接入”一节和关闭确认)一致
ensureChannel(nm, CHANNEL_DESKTOP, DESKTOP_CHANNEL_NAME)
ensureChannel(nm, CHANNEL_DESKTOP, strings.get(R.string.desktop_channel_name))
val settings = PendingIntent.getActivity(
this, 0, Intent(this, SettingsActivity::class.java).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK), PendingIntent.FLAG_IMMUTABLE,
)
val off = PendingIntent.getBroadcast(
this, 0, Intent(this, DesktopAccessOffReceiver::class.java), PendingIntent.FLAG_IMMUTABLE,
)
return Notification.Builder(this, CHANNEL_DESKTOP)
.setContentTitle(DESKTOP_TITLE)
.setContentText(DESKTOP_TEXT)
.setSubText(if (busy) DESKTOP_BUSY else null)
.setContentTitle(Desktop.notificationTitle(strings))
.setContentText(strings.get(R.string.desktop_notification_text))
// the one-line form cuts this sentence at a large font size (English is longer): the expanded form shows all of it
.setStyle(Notification.BigTextStyle().bigText(strings.get(R.string.desktop_notification_text)))
.setSubText(if (busy) strings.get(R.string.desktop_notification_busy) else null)
.setSmallIcon(android.R.drawable.stat_notify_sync)
.setOngoing(true)
.setShowWhen(false)
.setCategory(Notification.CATEGORY_SERVICE)
.setForegroundServiceBehavior(Notification.FOREGROUND_SERVICE_IMMEDIATE)
.setContentIntent(settings)
.addAction(Notification.Action.Builder(null as Icon?, DESKTOP_OFF, off).build())
.addAction(Notification.Action.Builder(null as Icon?, Desktop.notificationAction(strings), off).build())
.build()
}

private fun ensureChannel(nm: NotificationManager, id: String, name: String) {
if (nm.getNotificationChannel(id) == null) {
nm.createNotificationChannel(NotificationChannel(id, name, NotificationManager.IMPORTANCE_LOW))
}
// createNotificationChannel on an existing id only updates the name (and description): the channel list in the
// system settings follows the app language, and the user's own importance choice is kept
nm.createNotificationChannel(NotificationChannel(id, name, NotificationManager.IMPORTANCE_LOW))
}

override fun onDestroy() {
Expand All @@ -143,14 +149,9 @@ class AgentService : Service() {
private const val NOTIFICATION_ID = 1

/**
* 电脑端接入打开期间的通知(F11 第 4 点)。标题和按钮用设置页(D,Desktop.kt)的常量,开关旁的说明引用的就是它们;
* 正文沿用设置页的开关文案(“允许电脑经 adb 连接”)和关闭确认框的说法。
* 电脑端接入打开期间的通知(F11 第 4 点)。标题和按钮用设置页(D,Desktop.kt)的文案,开关旁的说明引用的就是它们;
* 正文沿用设置页的开关文案(“允许电脑经 adb 连接”)和关闭确认框的说法。文字都在 strings_p2.xml(desktop_*、runtime_*)。
*/
private const val CHANNEL_DESKTOP = "desktop_access"
const val DESKTOP_CHANNEL_NAME = "电脑端接入"
const val DESKTOP_TITLE = Desktop.NOTIFICATION_TITLE
const val DESKTOP_TEXT = "允许电脑经 adb 连接。关闭会断开连接,并作废已配对的电脑。"
const val DESKTOP_OFF = Desktop.NOTIFICATION_ACTION
const val DESKTOP_BUSY = "正在运行任务"
}
}
Loading
Loading