diff --git a/docs/acceptance/b272-android-permission-copy-location.md b/docs/acceptance/b272-android-permission-copy-location.md new file mode 100644 index 0000000..cbe7e39 --- /dev/null +++ b/docs/acceptance/b272-android-permission-copy-location.md @@ -0,0 +1,104 @@ +# B-272 Android 权限、通话文案与位置功能清理 + +分支:`agent/agent/d488336b` +施工基线:B-269 建议的最新已交付 Android HEAD `092039bc1a55c3ddf853ac39d04f6171e7cb5a4c`(`review-latest` / `origin/agent/agent/2b5c0459`) +方案依据:B-269 附件 `b269-architecture-plan.md` 的 P1-1 / P1-2 +本卡只改 `mobile-next/` 与本验收记录,不改旧 `mobile/`、PC、现网服务,不发布 APK,不覆盖 Gitea Release。 + +**结论:Android release 构建通过。合并清单已去掉悬浮窗与定位权限;用户可见通话文案统一为「语音通话」;位置发送入口与定位依赖已移除,历史位置消息仍只读解析。真机登录、来电、历史位置点开未测,不得写成运行验收通过。** + +## 权限前后对比(release APK 合并清单) + +| 权限 / 组件 | 改前 | 改后 | +|---|---|---| +| `SYSTEM_ALERT_WINDOW` | 声明,同步完成后无条件申请 | `tools:node="remove"`,无申请调用 | +| 旧 `CallService`(`flutter_openim_live_alert`) | 在 app Manifest 声明 | 已删除声明;本地插件目录保留,未物理删除 | +| `ACCESS_COARSE/FINE/BACKGROUND_LOCATION`、`ACCESS_LOCATION_EXTRA_COMMANDS` | 声明,工具箱发位置会请求 | `tools:node="remove"`;去掉 `geolocator` | +| `FOREGROUND_SERVICE` / `ForegroundService` / `IsolateHolderService` | 保留 | 保留,未改通话中前台通知链路 | +| 定位发送页 `ChatWebViewMap` | 工具箱可进选点并 `createLocationMessage` | 已删除发送页与发送方法 | + +合并 APK `aapt dump permissions` 已确认不含 `SYSTEM_ALERT_WINDOW`、`ACCESS_*LOCATION`。 + +## 文案 + +只改通话可见文本,未改协议字段、`CallType`、消息类型或 SDK 枚举。相册「视频」、视频消息、视频会议字样保留。 + +| 入口 | 改前 | 改后 | +|---|---|---| +| 工具箱 `toolboxCall` | 视频通话 | 语音通话 | +| 资料页 `audioAndVideoCall` | 音视频通话 | 语音通话,图标改用 `ImageRes.callVoice` | +| 来电/邀请/群通话提示中的「视频通话」 | 视频通话 | 语音通话 | +| 通话选择面板 | 语音 + 视频两项 | 仅语音一项 | + +## 位置只读 + +- 聊天「更多」与备用输入条不再出现位置发送。 +- 历史 `MessageType.location` 仍由 `ChatLocationView` 展示;点击走只读 `MapView`,不进入发送页。 +- 描述 JSON 损坏或缺字段时显示「位置」占位,不抛异常、不渲染空白卡片。 + +## 提交主题(可逐项 `git revert`) + +从新到旧回退:先本验收记录,再代码提交。 + +| 主题 | SHA | 文件 | +|---|---|---| +| 本验收记录 | 本文件当次提交 | `docs/acceptance/b272-android-permission-copy-location.md` | +| 权限/文案/位置清理 | 见代码提交 | `mobile-next/` 见 git log | + +回退示例(新到旧): + +``` +git revert <本验收提交> +git revert <代码提交> +``` + +回退不影响 `mobile/`、`account-service/`、`config/`、`scripts/`、现网服务、PC、已发布安装包。旧悬浮窗插件目录 `mobile-next/local_plugin/flutter_openim_live_alert` 仍在仓库,仅不再接入。 + +## 环境 + +- Flutter 3.24.5 / Dart 3.5.4(`C:\flutter324`) +- Temurin JDK 17.0.20+8(`C:\devtools\jdk17`) +- Android SDK:`C:\devtools\android-sdk`(build-tools 34.0.0,compileSdk 34) +- `org.gradle.jvmargs=-Xmx4096M` + +## 检查与构建 + +``` +cd mobile-next +flutter test test/company/p1_cleanup_test.dart test/company/call_session_guard_test.dart test/company/rtc_token_mapper_test.dart test/company/call_visual_rework_test.dart test/company/user_full_info_mapper_test.dart +flutter analyze lib/core/controller/im_controller.dart lib/pages/chat/chat_logic.dart lib/pages/chat/chat_view.dart lib/company openim_common/lib/src/utils/permissions.dart openim_common/lib/src/widgets/chat/chat_toolbox.dart openim_common/lib/src/widgets/chat/chat_location_view.dart openim_common/lib/src/widgets/rich_text_input_box.dart openim_common/lib/src/widgets/button.dart openim_common/lib/src/widgets/views.dart openim_live/lib/src/live_controller.dart +flutter build apk --release +``` + +- 公司相关单测 **21 项通过**(含本卡 2 项:文案不含「视频通话/音视频通话」、位置描述损坏可解析)。 +- 定点 `flutter analyze`:**无 error**。info/warning 为存量(Token const、废弃 API、Kotlin metadata 1.8 vs 1.6 等同 B-225/B-261)。 +- Android release 构建成功。上游告警同前:Flutter Gradle apply-script 弃用;部分依赖 Kotlin metadata 1.8.0 vs 工程预期 1.6.0。 + +| 产物 | 版本 | 包名 | 大小 | SHA256 | +|---|---|---|---|---| +| Android release APK | 3.8.3+180 | `io.openim.flutter.demo` | 53,095,552 B | `A37BA10EB94D43F0B113130CE90EEE554FD9F3EC00C7C7A9D025CA1059C0E76C` | + +路径:`mobile-next/build/app/outputs/flutter-apk/app-release.apk`(APK 内嵌时间戳,哈希不可位级复现)。label `F-DEMO`,仅 `arm64-v8a`,minSdk 24 / targetSdk 33 / compileSdk 34。未发布、未覆盖 Gitea 现有 Release。 + +## 已测 / 未测 + +已测: + +- 施工基线为 `092039b`,不是 `origin/main` 的旧 `fa8584a` +- 中文通话文案静态扫描不再含「视频通话」「音视频通话」;「视频」消息字样仍在 +- 位置描述合法 JSON / 损坏 JSON / 空值解析不抛异常 +- 通话状态机、换票、视觉 Token、我的信息映射既有单测回归 +- release APK 合并清单无悬浮窗、无定位权限;无旧 `CallService`;前台通知服务仍在 +- Android release 构建通过 + +未测(不得写成已通过): + +- 公司内网真机冷启动、登录、同步完成后是否还弹出悬浮窗设置 +- 真机系统权限页是否仍列出「显示在其他应用上层」或定位 +- 语音来电、接听、通话中最小化、后台返回 +- 历史位置消息在真机会话中的展示与点击 +- 文字/图片/文件/语音消息与相册视频发送的真机回归 + +## 边界 + +未改:旧 `mobile/`、PC、`account-service/`、docker、端口、账号、数据库、LiveKit 配置、DNS/证书/推送、品牌换标、APK 发布。