mirror of
https://github.com/zoriya/react-native-omni.git
synced 2026-08-16 02:44:51 +00:00
65 lines
1.7 KiB
TypeScript
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;
|
|
});
|
|
};
|