Files
react-native-omni/plugin/build/withPip.js
T
2026-07-27 22:57:03 +02:00

112 lines
5.0 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.withPip = void 0;
const config_plugins_1 = require("@expo/config-plugins");
const codeMod_1 = require("@expo/config-plugins/build/android/codeMod");
const MODE_MARKER = "OmniView.onActivityPipModeChanged(";
const UI_STATE_MARKER = "OmniView.onActivityPipTransitionToPip(";
function patchMainActivityForPip(mainActivity, language) {
const isJava = language === "java";
if (mainActivity.includes(MODE_MARKER) &&
mainActivity.includes(UI_STATE_MARKER)) {
return mainActivity;
}
const withRequiredImports = (0, codeMod_1.addImports)(mainActivity, [
"android.app.PictureInPictureUiState",
"android.os.Build",
"dev.zoriya.omni.OmniView",
], isJava);
let output = withRequiredImports;
if (!output.includes(MODE_MARKER)) {
const modeChangedBlock = isJava
? [
"\n @Override",
" public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {",
" super.onPictureInPictureModeChanged(isInPictureInPictureMode);",
" OmniView.onActivityPipModeChanged(this, isInPictureInPictureMode);",
" }\n",
]
: [
"\n override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {",
" super.onPictureInPictureModeChanged(isInPictureInPictureMode)",
" OmniView.onActivityPipModeChanged(this, isInPictureInPictureMode)",
" }\n",
];
output = (0, codeMod_1.appendContentsInsideDeclarationBlock)(output, "class MainActivity", modeChangedBlock.join("\n"));
}
if (!output.includes(UI_STATE_MARKER)) {
const uiStateChangedBlock = isJava
? [
"\n @Override",
" public void onPictureInPictureUiStateChanged(PictureInPictureUiState pipState) {",
" super.onPictureInPictureUiStateChanged(pipState);",
" if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && pipState.isTransitioningToPip()) {",
" OmniView.onActivityPipTransitionToPip(this);",
" }",
" }\n",
]
: [
"\n override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {",
" super.onPictureInPictureUiStateChanged(pipState)",
" if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && pipState.isTransitioningToPip) {",
" OmniView.onActivityPipTransitionToPip(this)",
" }",
" }\n",
];
output = (0, codeMod_1.appendContentsInsideDeclarationBlock)(output, "class MainActivity", uiStateChangedBlock.join("\n"));
}
return output;
}
function ensureUsesFeature(androidManifest, featureName, required) {
var _a;
const usesFeature = (_a = androidManifest.manifest["uses-feature"]) !== null && _a !== void 0 ? _a : [];
const existing = usesFeature.find((feature) => feature.$["android:name"] === featureName);
if (existing) {
existing.$["android:required"] = required;
}
else {
usesFeature.push({
$: {
"android:name": featureName,
"android:required": required,
},
});
}
androidManifest.manifest["uses-feature"] = usesFeature;
}
function ensureConfigChanges(mainActivity) {
var _a;
const requiredChanges = [
"screenSize",
"smallestScreenSize",
"screenLayout",
"orientation",
];
const existing = (_a = mainActivity.$["android:configChanges"]) !== null && _a !== void 0 ? _a : "";
const existingSet = new Set(existing
.split("|")
.map((item) => item.trim())
.filter(Boolean));
requiredChanges.forEach((item) => existingSet.add(item));
mainActivity.$["android:configChanges"] = Array.from(existingSet).join("|");
}
function patchManifestForPip(androidManifest) {
ensureUsesFeature(androidManifest, "android.software.picture_in_picture", "false");
const mainActivity = config_plugins_1.AndroidConfig.Manifest.getMainActivityOrThrow(androidManifest);
mainActivity.$["android:supportsPictureInPicture"] = "true";
mainActivity.$["android:resizeableActivity"] = "true";
ensureConfigChanges(mainActivity);
return androidManifest;
}
const withPip = (config) => {
const withMainActivityPatched = (0, config_plugins_1.withMainActivity)(config, (activityConfig) => {
activityConfig.modResults.contents = patchMainActivityForPip(activityConfig.modResults.contents, activityConfig.modResults.language);
return activityConfig;
});
return (0, config_plugins_1.withAndroidManifest)(withMainActivityPatched, (manifestConfig) => {
manifestConfig.modResults = patchManifestForPip(manifestConfig.modResults);
return manifestConfig;
});
};
exports.withPip = withPip;