expo-video
Version:
A cross-platform, performant video component for React Native and Expo with Web support
58 lines (49 loc) • 1.67 kB
text/typescript
import {
AndroidConfig,
type ConfigPlugin,
withInfoPlist,
withAndroidManifest,
} from 'expo/config-plugins';
type WithExpoVideoOptions = {
supportsBackgroundPlayback?: boolean;
supportsPictureInPicture?: boolean;
};
const withExpoVideo: ConfigPlugin<WithExpoVideoOptions> = (
config,
{ supportsBackgroundPlayback, supportsPictureInPicture } = {}
) => {
withInfoPlist(config, (config) => {
const currentBackgroundModes = config.modResults.UIBackgroundModes ?? [];
const shouldEnableBackgroundAudio = supportsBackgroundPlayback || supportsPictureInPicture;
// No-op if the values are not defined
if (
typeof supportsBackgroundPlayback === 'undefined' &&
typeof supportsPictureInPicture === 'undefined'
) {
return config;
}
if (shouldEnableBackgroundAudio && !currentBackgroundModes.includes('audio')) {
config.modResults.UIBackgroundModes = [...currentBackgroundModes, 'audio'];
} else if (!shouldEnableBackgroundAudio) {
config.modResults.UIBackgroundModes = currentBackgroundModes.filter(
(mode: string) => mode !== 'audio'
);
}
return config;
});
withAndroidManifest(config, (config) => {
const activity = AndroidConfig.Manifest.getMainActivityOrThrow(config.modResults);
// No-op if the values are not defined
if (typeof supportsPictureInPicture === 'undefined') {
return config;
}
if (supportsPictureInPicture) {
activity.$['android:supportsPictureInPicture'] = 'true';
} else {
delete activity.$['android:supportsPictureInPicture'];
}
return config;
});
return config;
};
export default withExpoVideo;