react-native-audio-api
Version:
react-native-audio-api provides system for controlling audio in React Native environment compatible with Web Audio API specification
112 lines (92 loc) • 2.82 kB
text/typescript
import {
AndroidConfig,
createRunOncePlugin,
ConfigPlugin,
withInfoPlist,
withAndroidManifest,
} from '@expo/config-plugins';
const pkg = require('react-native-audio-api/package.json');
interface Options {
iosMicrophonePermission?: string;
iosBackgroundMode: boolean;
androidPermissions: string[];
androidForegroundService: boolean;
androidFSTypes: string[];
}
const withDefaultOptions = (options: Partial<Options>): Options => {
return {
iosBackgroundMode: true,
androidPermissions: [
'android.permission.FOREGROUND_SERVICE',
'android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK',
],
androidForegroundService: true,
androidFSTypes: ['mediaPlayback'],
...options,
};
};
const withBackgroundAudio: ConfigPlugin = (config) => {
return withInfoPlist(config, (iosConfig) => {
iosConfig.modResults.UIBackgroundModes = [
...Array.from(
new Set([...(iosConfig.modResults.UIBackgroundModes ?? []), 'audio'])
),
];
return iosConfig;
});
};
const withIosMicrophonePermission: ConfigPlugin<Options> = (
config,
{ iosMicrophonePermission }
) => {
return withInfoPlist(config, (iosConfig) => {
iosConfig.modResults.NSMicrophoneUsageDescription = iosMicrophonePermission;
return iosConfig;
});
};
const withAndroidPermissions: ConfigPlugin<Options> = (
config,
{ androidPermissions }: Options
) => {
return AndroidConfig.Permissions.withPermissions(config, androidPermissions);
};
const withForegroundService: ConfigPlugin<Options> = (
config,
{ androidFSTypes }: Options
) => {
return withAndroidManifest(config, (mod) => {
const manifest = mod.modResults;
const mainApplication =
AndroidConfig.Manifest.getMainApplicationOrThrow(manifest);
const SFTypes = androidFSTypes.join('|');
const serviceElement = {
$: {
'android:name':
'com.swmansion.audioapi.system.MediaNotificationManager$NotificationService',
'android:stopWithTask': 'true',
'android:foregroundServiceType': SFTypes,
},
intentFilter: [],
};
if (!mainApplication.service) {
mainApplication.service = [];
}
mainApplication.service.push(serviceElement);
return mod;
});
};
const withAudioAPI: ConfigPlugin<Options> = (config, optionsIn) => {
const options = withDefaultOptions(optionsIn ?? {});
if (options.iosBackgroundMode) {
config = withBackgroundAudio(config);
}
config = withAndroidPermissions(config, options);
if (options.androidForegroundService) {
config = withForegroundService(config, options);
}
if (options.iosMicrophonePermission) {
config = withIosMicrophonePermission(config, options);
}
return config;
};
export default createRunOncePlugin(withAudioAPI, pkg.name, pkg.version);