xref: /MusicFree/src/entry/bootstrap.ts (revision be0a365064716334289552edb9464015f29f2c5d)
1import MusicQueue from '@/common/musicQueue';
2import MusicSheet from '@/common/musicSheetManager';
3import {check, PERMISSIONS, request} from 'react-native-permissions';
4import TrackPlayer, {Capability} from 'react-native-track-player';
5import {pluginManager} from '../common/pluginManager';
6import 'react-native-get-random-values';
7import {Platform, ToastAndroid} from 'react-native';
8import {loadConfig} from '@/common/localConfigManager';
9import RNBootSplash from 'react-native-bootsplash';
10import RNFS, {exists, mkdir} from 'react-native-fs';
11import DownloadManager from '@/common/downloadManager';
12import pathConst from '@/constants/pathConst';
13import { checkAndCreateDir } from '@/utils/fileUtils';
14
15/** app加载前执行 */
16export default async function () {
17  // 检查权限
18  const [readStoragePermission, writeStoragePermission] = await Promise.all([
19    check(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE),
20    check(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE),
21  ]);
22  if (
23    !(
24      readStoragePermission === 'granted' &&
25      writeStoragePermission === 'granted'
26    )
27  ) {
28    await request(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE);
29    await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);
30  }
31
32  /** 初始化路径 */
33  await setupFolder();
34  // 加载配置
35  await loadConfig();
36  // 加载插件
37
38  Promise.all([
39    await pluginManager.setupPlugins(),
40    await TrackPlayer.setupPlayer(),
41  ]);
42  await TrackPlayer.updateOptions({
43    progressUpdateEventInterval: 2,
44    stopWithApp: false,
45    alwaysPauseOnInterruption: true,
46    capabilities: [
47      Capability.Play,
48      Capability.Pause,
49      Capability.SkipToNext,
50      Capability.SkipToPrevious,
51    ],
52    compactCapabilities: [
53      Capability.Play,
54      Capability.Pause,
55      Capability.SkipToNext,
56      Capability.SkipToPrevious,
57    ],
58    notificationCapabilities: [
59      Capability.Play,
60      Capability.Pause,
61      Capability.SkipToNext,
62      Capability.SkipToPrevious,
63    ],
64  });
65  await MusicQueue.setupMusicQueue();
66  await MusicSheet.setupMusicSheet();
67  await DownloadManager.setupDownload();
68
69  ErrorUtils.setGlobalHandler(error =>
70    ToastAndroid.show(`error: ${error?.message}`, ToastAndroid.LONG),
71  );
72  // 隐藏开屏动画
73  RNBootSplash.hide({fade: true});
74}
75
76
77/** 初始化 */
78async function setupFolder() {
79  await Promise.all([
80    checkAndCreateDir(pathConst.dataPath),
81    checkAndCreateDir(pathConst.storagePath),
82    checkAndCreateDir(pathConst.pluginPath)
83  ]);
84}
85