# Cyrene for Android

昔涟在安卓设备上的载体 —— 随时随地与昔涟对话、操控 IoT 设备、接收实时通知。

## 概述

Cyrene for Android 是 [Cyrene（昔涟）](https://github.com/Cyrene/Cyrene) 项目的官方 Android 客户端。Cyrene 是一个开源的基于 LLM 平台的智能体，提供多人格对话、IoT 设备操控、记忆管理、自动化规则、知识库、语音交互等功能。

Android 客户端的目标是成为用户的**默认语音助手**，完全替代系统自带的助手（Google Assistant / Bixby 等），同时提供：

- **系统级语音助手** — 注册为 `VoiceInteractionService`，可通过长按 Home / 侧滑呼出
- **语音唤醒** — 息屏热词唤醒、免提交互（类似 "Hey Google"，使用 "昔涟" 等唤醒词）
- **随时对话** — 通过文字或语音与昔涟交流
- **IoT 控制** — 远程操控家中的智能设备
- **实时通知** — 接收昔涟的主动消息、提醒、IoT 状态变更
- **后台连接** — 即使 APP 在后台，仍保持通知推送与语音服务就绪

## 开发状态

> **当前阶段**：项目初始化，尚未开始正式开发。

根据主项目的[开发路线图](../docs/dev-plan/00-development-roadmap.md)，Android 客户端计划在 **Phase 5（v1.5 → v2.0）** 开始开发，预计时间窗口为 **2027 Q2-Q3**。

## 技术栈 (规划)

| 层 | 技术 |
|----|------|
| 语言 | Kotlin |
| UI 框架 | Jetpack Compose + Material Design 3 |
| 架构 | MVVM + Repository |
| 网络 | OkHttp / Retrofit + WebSocket |
| 本地存储 | Room (SQLite) + DataStore |
| 推送 | FCM (Firebase Cloud Messaging) |
| 语音 | VoiceInteractionService + 热词唤醒 + STT + TTS |
| 构建 | Gradle (Kotlin DSL) |

## 功能路线图

- [ ] 用户认证与登录
- [ ] 实时文字对话 (WebSocket)
- [ ] VoiceInteractionService 注册（替换系统语音助手）
- [ ] 间接启动悬浮窗（VoiceInteractionSession 全屏覆盖层）
- [ ] 热词唤醒（息屏 / 亮屏）+ 唤醒词自定义
- [ ] 语音识别 (STT)
- [ ] 语音合成 (TTS)
- [ ] IoT 设备控制面板
- [ ] 推送通知 (FCM)
- [ ] 后台连接与通知
- [ ] 锁屏 / 息屏语音交互
- [ ] PWA 保底方案 (短期替代)

## 交互模式

APP 有两种界面呈现方式，根据启动来源自动切换：

| 启动方式 | 界面模式 | 说明 |
|---------|---------|------|
| 桌面图标 / 最近任务 | **全屏 Activity** | 常规 APP 模式，完整功能入口 |
| 语音唤醒 / 长按 Home / 侧滑 / 长按电源键 / 耳机按键 | **悬浮窗 (VoiceInteractionSession)** | 全屏覆盖层，半透明背景透出底层 APP，不影响当前任务栈 |

悬浮窗模式的要点：
- 借助 `VoiceInteractionSession` 系统窗口，不压入 Activity 返回栈
- 对话结束后窗口收起，用户回到触发前的界面
- 底层 APP 内容半透明可见（模糊遮罩），让用户保持上下文感知
- 窗口高度自适应对话内容，类似 Google Assistant 的卡片式覆盖

## 设计规范

- **设计语言**：Material Design 3 (Material You)
- **主题**：动态配色（Dynamic Color），跟随系统壁纸或手动选择主题色
- **暗黑模式**：支持 Light / Dark 双主题，跟随系统或手动切换
- **组件**：全面使用 `androidx.compose.material3` 组件库
- **图标**：Material Icons + 自定义图标
- **动效**：遵循 MD3 动效规范（过渡动画、涟漪效果、Shared Elements）
- **字体**：系统默认字体（Roboto / Google Sans），支持动态字体缩放

## 项目结构 (规划)

```
android/
├── app/
│   ├── src/main/
│   │   ├── java/com/cyrene/app/
│   │   │   ├── ui/           # Compose UI 层
│   │   │   ├── viewmodel/    # ViewModel 层
│   │   │   ├── repository/   # 数据仓库层
│   │   │   ├── data/         # 数据模型 & API 接口
│   │   │   ├── service/      # VoiceInteractionService & WebSocket & FCM
│   │   │   ├── voice/        # 热词唤醒 (Hotword) & STT & TTS
│   │   │   └── di/           # 依赖注入
│   │   └── res/              # 资源文件
│   └── build.gradle.kts
├── build.gradle.kts
├── settings.gradle.kts
└── gradle.properties
```

## 环境要求

- Android Studio Hedgehog (2023.1.1) 或更高版本
- Kotlin 2.0+
- JDK 17+
- Android SDK (target: 34+, min: 26+)

## 网络配置（中国大陆用户）

Gradle、Google Maven、Maven Central 等服务器在国内访问缓慢或不可达，首次同步前需配置镜像。

### Gradle Wrapper

`gradle/wrapper/gradle-wrapper.properties`：

```properties
# 将 services.gradle.org 替换为腾讯/阿里镜像
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.7-bin.zip
# 或阿里: https\://mirrors.aliyun.com/macports/distfiles/gradle/gradle-8.7-bin.zip
```

### 仓库镜像

`settings.gradle.kts` 顶部添加：

```kotlin
pluginManagement {
    repositories {
        maven { url = uri("https://mirrors.cloud.tencent.com/gradle/plugins") }
        maven { url = uri("https://mirrors.tencent.com/nexus/repository/maven-public") }
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        maven { url = uri("https://mirrors.tencent.com/nexus/repository/maven-public") }
        google()
        mavenCentral()
    }
}
```

### Gradle 属性

`gradle.properties`：

```properties
# HTTP 代理（如使用 Clash/V2Ray，通常不需要）
# systemProp.http.proxyHost=127.0.0.1
# systemProp.http.proxyPort=7890
# systemProp.https.proxyHost=127.0.0.1
# systemProp.https.proxyPort=7890
```

### Android SDK Proxy

若 Android SDK Manager 也下载缓慢，可在 Android Studio 中设置：
**Settings → Appearance & Behavior → System Settings → HTTP Proxy**

配置为 `mirrors.cloud.tencent.com` 或 `mirrors.neusoft.edu.cn`，端口 `80`。

## 快速开始

> 项目尚未包含可构建的源码，以下为后续开发的参考步骤。

1. 用 Android Studio 打开 `android/` 目录
2. 按上述"网络配置"替换国内镜像
3. 等待 Gradle 同步完成
4. 启动主项目后端服务（参考[主项目 README](../README.md)）
5. 在 `local.properties` 中配置 `baseUrl` 指向 Gateway 地址
6. 选择模拟器或设备，点击 Run

## 相关链接

- [Cyrene 主项目](../) — 后端服务、前端、部署文档
- [开发路线图](../docs/dev-plan/00-development-roadmap.md)
- [多平台接入方案](../docs/dev-plan/03-multi-platform-integration.md)
- [语音系统计划](../docs/dev-plan/04-voice-system-plan.md)

## License

Apache-2.0
