Files

79 lines
2.4 KiB
JavaScript

const { withAndroidManifest, withDangerousMod } = require('@expo/config-plugins');
const fs = require('fs');
const path = require('path');
const withKioskAdmin = (config) => {
// 1. Modify AndroidManifest.xml
config = withAndroidManifest(config, async (config) => {
const androidManifest = config.modResults;
const mainApplication = androidManifest.manifest.application[0];
if (!mainApplication.receiver) {
mainApplication.receiver = [];
}
// Check if receiver is already added to avoid duplication
const receiverExists = mainApplication.receiver.some(
(r) => r.$['android:name'] === 'expo.modules.kioskmode.AdminReceiver'
);
if (!receiverExists) {
mainApplication.receiver.push({
$: {
'android:name': 'expo.modules.kioskmode.AdminReceiver',
'android:label': 'Schnappix Kiosk Admin',
'android:permission': 'android.permission.BIND_DEVICE_ADMIN',
'android:exported': 'true',
},
'meta-data': [
{
$: {
'android:name': 'android.app.device_admin',
'android:resource': '@xml/device_admin_receiver',
},
},
],
'intent-filter': [
{
action: [
{ $: { 'android:name': 'android.app.action.DEVICE_ADMIN_ENABLED' } },
{ $: { 'android:name': 'android.app.action.DEVICE_ADMIN_DISABLED' } },
],
},
],
});
}
return config;
});
// 2. Create the device_admin_receiver.xml resource file in android/app/src/main/res/xml/
config = withDangerousMod(config, [
'android',
async (config) => {
const { projectRoot } = config.modRequest;
const resXmlDir = path.join(projectRoot, 'android/app/src/main/res/xml');
// Ensure res/xml directory exists
if (!fs.existsSync(resXmlDir)) {
fs.mkdirSync(resXmlDir, { recursive: true });
}
const xmlFilePath = path.join(resXmlDir, 'device_admin_receiver.xml');
const xmlContent = `<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<force-lock />
</uses-policies>
</device-admin>`;
fs.writeFileSync(xmlFilePath, xmlContent, 'utf8');
return config;
},
]);
return config;
};
module.exports = withKioskAdmin;