Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
c6f54fa
chore: remove duplicated lock file
maotoumao Nov 9, 2025
6b058d4
chore: 更新依赖包版本
maotoumao Nov 9, 2025
d90aa0d
feat: 重写排序列表
maotoumao Nov 11, 2025
4dc9ef2
chore: 变量重命名
maotoumao Nov 11, 2025
b906be9
chore: 禁用flashlist autolayout
maotoumao Nov 12, 2025
1f8aabb
feat: 歌单管理
maotoumao Nov 14, 2025
1315304
feat: 长按删除歌单功能
maotoumao Nov 14, 2025
727fc27
feat: 歌单编辑器默认锚定
maotoumao Nov 14, 2025
d07df58
chore: 统一常量
maotoumao Nov 14, 2025
b7c7c3b
feat: 统一歌单编辑器逻辑
maotoumao Nov 14, 2025
49c39b1
chore: 样式优化
maotoumao Nov 14, 2025
3b937b4
chore: 设置初始化时音量
maotoumao Nov 14, 2025
63c1f3a
chore: 移除多余的文案
maotoumao Nov 14, 2025
a64fa88
feat: 加载状态
maotoumao Nov 14, 2025
a8602ab
chore: 调大歌曲列表更多选项的热区范围
maotoumao Nov 14, 2025
c1c3047
chore: 调小musicBar loading大小
maotoumao Nov 15, 2025
216e53a
chore: 拖拽前后如果下标没有变化,不触发sortEnd
maotoumao Nov 15, 2025
a15cb43
feat: 优化编辑歌单信息页
maotoumao Nov 15, 2025
2f0a0f8
fix: 修复无法自定义背景的问题
maotoumao Nov 15, 2025
25c88da
fix: 修复唤起输入法时背景图片高度变化的问题
maotoumao Nov 16, 2025
bb80c6b
chore: 格式化
maotoumao Nov 16, 2025
1e07876
fix: 修复类型错误
maotoumao Nov 16, 2025
5af84b1
fix: 修复歌单排序后默认歌单歌曲数量显示错误的问题
maotoumao Nov 17, 2025
dc8bc0f
chore: 禁止修改默认歌单名
maotoumao Nov 17, 2025
c1e49ab
chore: 调整进度更新频率
maotoumao Nov 17, 2025
e8e5344
feat: 默认启用插件懒加载
maotoumao Nov 17, 2025
6443295
chore: 更新版本号
maotoumao Nov 17, 2025
e460c8a
chore: 移除lazyload配置
maotoumao Nov 20, 2025
f7a0b9a
chore: 微调左侧序号
maotoumao Nov 20, 2025
755f57d
fix: 修复切换音质面板多语言问题
maotoumao Nov 20, 2025
8a808bd
feat: 性能、异常信息上报
maotoumao Nov 23, 2025
56c93c5
chore: 修改日志字段
maotoumao Nov 23, 2025
a73f692
chore: 移除无用字段
maotoumao Nov 23, 2025
9377fd5
chore: 修改埋点信息
maotoumao Nov 23, 2025
ecce56f
chore: 调整选项顺序
maotoumao Nov 23, 2025
b029c1b
chore: 移除无用代码
maotoumao Nov 23, 2025
08afc18
fix: 修复部分情况下本地音乐无法播放的问题
maotoumao Nov 23, 2025
d75b95e
chore: 修复重复点击音乐导致播放多次的问题
maotoumao Nov 23, 2025
7588cd2
chore: 移除无用的console.log
maotoumao Nov 23, 2025
f40543d
chore: 移除多余的依赖
maotoumao Nov 25, 2025
ae9c14e
chore: 移除多余的依赖
maotoumao Nov 25, 2025
a178ce4
chore: 跳过开发阶段的性能检测
maotoumao Nov 25, 2025
f18ee45
chore: 更新版本号&暂时禁用build beta
maotoumao Nov 25, 2025
ee1aaa3
chore: 微调样式
maotoumao Nov 25, 2025
8c072e8
chore: 微调样式
maotoumao Nov 25, 2025
c1ec699
feat: 忽略电池优化权限
maotoumao Nov 25, 2025
f140572
feat: 忽略电池优化
maotoumao Nov 25, 2025
d8e65ea
fix: 存储权限弹窗文案错误
maotoumao Nov 25, 2025
a079d8f
fix: 事件监控没收到
maotoumao Dec 29, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .env
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# 用于错误日志、性能检测的 Azure Application Insights 连接字符串
EXPO_PUBLIC_AZURE_APPLICATION_INSIGHTS_CONNECTION_STRING=
1 change: 1 addition & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ module.exports = {
"semi": ["error", "always"],
"comma-dangle": ["error", "always-multiline"],
"brace-style": ["error", "1tbs"],
"react/react-in-jsx-scope": "off"
},
},
],
Expand Down
10 changes: 10 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# MusicFree 项目说明

## 项目简介
MusicFree 是一个基于 React Native 的音乐播放器应用。

## 常见任务
### 如何新增多语言支持
1. 在 `src/core/i18n/languages/` 目录下新增对应语言的 JSON 文件,例如 `zh-cn.json` 用于简体中文支持。
2. 在 `src/types/core/i18n/index.d.ts` 文件中添加对应的语言类型定义。
3. 确保不同语言下的含义一致,优先参考中文版本。
6 changes: 3 additions & 3 deletions .github/workflows/build-beta.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
name: Beta 构建

on:
push:
branches: [dev]
paths: ['package.json']
# push:
# branches: [dev]
# paths: ['package.json']
workflow_dispatch:
inputs:
force_build:
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ keystore.properties
.vscode/
tmp/
scripts/
.env.production.local
.env.local

*.log
# Expo
Expand Down
1 change: 1 addition & 0 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

<application
android:name=".MainApplication"
Expand Down
60 changes: 60 additions & 0 deletions android/app/src/main/java/fun/upup/musicfree/utils/UtilsModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.os.PowerManager
import android.provider.Settings
import android.util.DisplayMetrics
import android.view.WindowInsets
Expand Down Expand Up @@ -58,6 +59,65 @@ class UtilsModule(context: ReactApplicationContext) : ReactContextBaseJavaModule
reactContext.currentActivity?.startActivity(intent)
}

@ReactMethod
fun isIgnoringBatteryOptimizations(promise: Promise) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val packageName = reactContext.packageName
val pm = reactContext.getSystemService(Context.POWER_SERVICE) as PowerManager
promise.resolve(pm.isIgnoringBatteryOptimizations(packageName))
} else {
promise.resolve(true)
}
}

@ReactMethod
fun requestIgnoreBatteryOptimizations(promise: Promise) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
try {
val packageName = reactContext.packageName
val pm = reactContext.getSystemService(Context.POWER_SERVICE) as PowerManager
if (!pm.isIgnoringBatteryOptimizations(packageName)) {
val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
intent.data = Uri.parse("package:$packageName")

if (reactContext.currentActivity != null) {
reactContext.currentActivity?.startActivity(intent)
} else {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
reactContext.startActivity(intent)
}
promise.resolve(true)
} else {
promise.resolve(true)
}
} catch (e: Exception) {
promise.reject(e)
}
} else {
promise.resolve(true)
}
}

@ReactMethod
fun openBatteryOptimizationSettings(promise: Promise) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
try {
val intent = Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS)
if (reactContext.currentActivity != null) {
reactContext.currentActivity?.startActivity(intent)
} else {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
reactContext.startActivity(intent)
}
promise.resolve(true)
} catch (e: Exception) {
promise.reject(e)
}
} else {
promise.resolve(true)
}
}

@ReactMethod(isBlockingSynchronousMethod = true)
fun getWindowDimensions(): WritableMap {
val windowManager = reactApplicationContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager
Expand Down
16 changes: 16 additions & 0 deletions babel.config.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,22 @@
const path = require('path');
try {
require('dotenv').config({ path: path.resolve(__dirname, '.env.local') });
require('dotenv').config({ path: path.resolve(__dirname, '.env') });
} catch (e) {
console.warn('dotenv not found, skipping env loading');
}

module.exports = {
presets: ['babel-preset-expo'],
plugins: [
[
'transform-inline-environment-variables',
{
include: [
'EXPO_PUBLIC_AZURE_APPLICATION_INSIGHTS_CONNECTION_STRING'
]
}
],
[
'module-resolver',
{
Expand Down
Loading