Files
react-native-omni/plugin/src/withCast.ts
T

65 lines
1.7 KiB
TypeScript

import {
AndroidConfig,
type ConfigPlugin,
withAndroidManifest,
} from "@expo/config-plugins";
const OPTIONS_PROVIDER_NAME =
"com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME";
const OPTIONS_PROVIDER_VALUE = "dev.zoriya.omni.OmniCastOptionsProvider";
const MEDIA_TRANSFER_RECEIVER_NAME =
"androidx.mediarouter.media.MediaTransferReceiver";
function patchManifestForCast(
androidManifest: AndroidConfig.Manifest.AndroidManifest,
): AndroidConfig.Manifest.AndroidManifest {
const mainApplication =
AndroidConfig.Manifest.getMainApplication(androidManifest);
if (!mainApplication) {
console.warn(
"AndroidManifest.xml is missing a <application> element - skipping Omni cast config.",
);
return androidManifest;
}
const metaData = mainApplication["meta-data"] ?? [];
const existing = metaData.find(
(item) => item.$["android:name"] === OPTIONS_PROVIDER_NAME,
);
if (existing) {
existing.$["android:value"] = OPTIONS_PROVIDER_VALUE;
} else {
metaData.push({
$: {
"android:name": OPTIONS_PROVIDER_NAME,
"android:value": OPTIONS_PROVIDER_VALUE,
},
});
}
mainApplication["meta-data"] = metaData;
const receivers = mainApplication.receiver ?? [];
if (
!receivers.some(
(item) => item.$["android:name"] === MEDIA_TRANSFER_RECEIVER_NAME,
)
) {
receivers.push({
$: {
"android:name": MEDIA_TRANSFER_RECEIVER_NAME,
"android:exported": "true",
},
});
}
mainApplication.receiver = receivers;
return androidManifest;
}
export const withCast: ConfigPlugin = (config) => {
return withAndroidManifest(config, (manifestConfig) => {
manifestConfig.modResults = patchManifestForCast(manifestConfig.modResults);
return manifestConfig;
});
};