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