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 = ` `; fs.writeFileSync(xmlFilePath, xmlContent, 'utf8'); return config; }, ]); return config; }; module.exports = withKioskAdmin;