79 lines
2.4 KiB
JavaScript
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;
|