# Ignore Battery Optimization Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 补齐 Android 忽略电池优化权限链路,减少锁屏后一段时间被系统回收导致的停播问题。
**Architecture:** 复用现有 `NativeUtils` 原生模块承接 Android 电池优化查询与申请能力,在权限页增加对应入口和状态展示。JS 层先补回归测试,再用最小改动补 Manifest、原生模块、类型声明与文案。
**Tech Stack:** React Native, Kotlin Android module, Jest, react-test-renderer
---
### Task 1: Permissions Page Regression Test
**Files:**
- Create: `src/pages/permissions/index.test.tsx`
- Modify: `src/pages/permissions/index.tsx`
- [ ] **Step 1: Write the failing test**
```tsx
it("renders ignore battery optimization entry and calls native request handler", async () => {
// mock NativeUtils.isIgnoringBatteryOptimizations -> true
// render Permissions
// assert translated entry exists
// trigger onPress
// expect NativeUtils.requestIgnoreBatteryOptimizations toHaveBeenCalled()
});
```
- [ ] **Step 2: Run test to verify it fails**
Run: `npx jest src/pages/permissions/index.test.tsx --runInBand`
Expected: FAIL because the current page does not render or call battery optimization APIs.
- [ ] **Step 3: Write minimal implementation**
```tsx
type IPermissionTypes = "floatingWindow" | "fileStorage" | "batteryOptimization";
updates.batteryOptimization = await NativeUtils.isIgnoringBatteryOptimizations();
onPress={() => NativeUtils.requestIgnoreBatteryOptimizations()}
```
- [ ] **Step 4: Run test to verify it passes**
Run: `npx jest src/pages/permissions/index.test.tsx --runInBand`
Expected: PASS
### Task 2: Android Native Bridge
**Files:**
- Modify: `android/app/src/main/AndroidManifest.xml`
- Modify: `android/app/src/main/java/fun/upup/musicfree/utils/UtilsModule.kt`
- Modify: `src/native/utils/index.ts`
- Modify: `src/types/core/i18n/index.d.ts`
- Modify: `src/core/i18n/languages/zh-cn.json`
- Modify: `src/core/i18n/languages/en-us.json`
- Modify: `src/core/i18n/languages/zh-tw.json`
- [ ] **Step 1: Add Android permission declaration**
```xml
```
- [ ] **Step 2: Add native query and request methods**
```kotlin
@ReactMethod
fun isIgnoringBatteryOptimizations(promise: Promise) { ... }
@ReactMethod
fun requestIgnoreBatteryOptimizations(promise: Promise) { ... }
```
- [ ] **Step 3: Expose methods to JS and add i18n keys**
```ts
isIgnoringBatteryOptimizations: () => Promise;
requestIgnoreBatteryOptimizations: () => Promise;
```
- [ ] **Step 4: Run targeted verification**
Run: `npx jest src/pages/permissions/index.test.tsx --runInBand`
Expected: PASS
Run: `npx eslint src/pages/permissions/index.tsx src/pages/permissions/index.test.tsx src/native/utils/index.ts`
Expected: exit code `0`