xref: /MusicFree/src/entry/bootstrap.ts (revision 9872db126a6f5247aeead667f5c213356979b843)
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';
11
12/** app加载前执行 */
13export default async function () {
14  // 检查权限
15  const [readStoragePermission, writeStoragePermission] = await Promise.all([
16    check(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE),
17    check(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE),
18  ]);
19  if (
20    !(
21      readStoragePermission === 'granted' &&
22      writeStoragePermission === 'granted'
23    )
24  ) {
25    await request(PERMISSIONS.ANDROID.READ_EXTERNAL_STORAGE);
26    await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE);
27  }
28
29  // 加载配置
30  await loadConfig();
31  // 加载插件
32
33  Promise.all([
34    await pluginManager.setupPlugins(),
35    await TrackPlayer.setupPlayer(),
36  ]);
37  await TrackPlayer.updateOptions({
38    progressUpdateEventInterval: 2,
39    stopWithApp: false,
40    alwaysPauseOnInterruption: true,
41    capabilities: [
42      Capability.Play,
43      Capability.Pause,
44      Capability.SkipToNext,
45      Capability.SkipToPrevious,
46    ],
47    compactCapabilities: [
48      Capability.Play,
49      Capability.Pause,
50      Capability.SkipToNext,
51      Capability.SkipToPrevious,
52    ],
53    notificationCapabilities: [
54      Capability.Play,
55      Capability.Pause,
56      Capability.SkipToNext,
57      Capability.SkipToPrevious,
58    ],
59  });
60  await MusicQueue.setupMusicQueue();
61  await MusicSheet.setupMusicSheet();
62  await setupFolder();
63
64  ErrorUtils.setGlobalHandler(error =>
65    ToastAndroid.show(`error: ${error?.message}`, ToastAndroid.LONG),
66  );
67  // 隐藏开屏动画
68  RNBootSplash.hide({fade: true});
69}
70
71
72const basePath =
73  (Platform.OS === 'android'
74    ? RNFS.ExternalDirectoryPath
75    : RNFS.DocumentDirectoryPath);
76
77  async function checkAndCreate(path: string) {
78    const filePath = basePath + path;
79    if(!(await exists(filePath))) {
80      await mkdir(filePath);
81    }
82  }
83  /** 初始化 */
84async function setupFolder(){
85  await Promise.all([checkAndCreate('/data/')])
86
87}