Initial import: Music_Server, MusicFree, catalog-sync
This commit is contained in:
+89
@@ -0,0 +1,89 @@
|
||||
# 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
|
||||
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
||||
```
|
||||
|
||||
- [ ] **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<boolean>;
|
||||
requestIgnoreBatteryOptimizations: () => Promise<boolean>;
|
||||
```
|
||||
|
||||
- [ ] **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`
|
||||
Reference in New Issue
Block a user