Files
lnreader/plugins/withAndroidCustomizations.js
T
2026-07-24 13:18:44 +05:30

110 lines
2.6 KiB
JavaScript

const {
withAppBuildGradle,
withDangerousMod,
} = require('@expo/config-plugins');
const fs = require('fs');
const path = require('path');
const BUILD_TYPES_MARKER = '// @generated by with-android-customizations';
const BUILD_TYPES_APPLY = `${BUILD_TYPES_MARKER}
apply from: new File(
rootDir,
"../gradle/android-build-types.gradle",
)
`;
const ANDROID_ASSET_VARIANTS = [
{ source: 'release', target: 'main' },
{ source: 'preview', target: 'preRelease' },
];
const LAUNCHER_RESOURCE_NAMES = [
'ic_launcher',
'ic_launcher_background',
'ic_launcher_foreground',
'ic_launcher_monochrome',
'ic_launcher_round',
];
const withBuildGradleCustomizations = config =>
withAppBuildGradle(config, config => {
const { contents } = config.modResults;
if (!contents.includes(BUILD_TYPES_MARKER)) {
config.modResults.contents = `${contents.trimEnd()}
${BUILD_TYPES_APPLY}`;
}
return config;
});
const removeGeneratedIconResources = resDir => {
if (!fs.existsSync(resDir)) {
return;
}
for (const resourceDirName of fs.readdirSync(resDir)) {
const resourceDir = path.join(resDir, resourceDirName);
if (!fs.statSync(resourceDir).isDirectory()) {
continue;
}
if (resourceDirName.startsWith('mipmap-')) {
for (const resourceName of LAUNCHER_RESOURCE_NAMES) {
for (const extension of ['png', 'webp', 'xml']) {
fs.rmSync(path.join(resourceDir, `${resourceName}.${extension}`), {
force: true,
});
}
}
}
if (resourceDirName.startsWith('drawable-')) {
for (const extension of ['png', 'webp', 'xml']) {
fs.rmSync(path.join(resourceDir, `notification_icon.${extension}`), {
force: true,
});
}
}
}
};
const withAndroidVariantAssets = config =>
withDangerousMod(config, [
'android',
config => {
const { projectRoot, platformProjectRoot } = config.modRequest;
for (const variant of ANDROID_ASSET_VARIANTS) {
const sourceResDir = path.join(
projectRoot,
'assets',
'android-icons',
variant.source,
'res',
);
const targetResDir = path.join(
platformProjectRoot,
'app',
'src',
variant.target,
'res',
);
removeGeneratedIconResources(targetResDir);
fs.mkdirSync(targetResDir, { recursive: true });
fs.cpSync(sourceResDir, targetResDir, { recursive: true });
}
return config;
},
]);
module.exports = config => {
config = withBuildGradleCustomizations(config);
return withAndroidVariantAssets(config);
};