const { withAndroidManifest } = require('@expo/config-plugins'); const withUsbCamera = (config) => { return withAndroidManifest(config, async (config) => { const androidManifest = config.modResults; if (!androidManifest.manifest['uses-feature']) { androidManifest.manifest['uses-feature'] = []; } // Check if usb.host feature is already added const featureExists = androidManifest.manifest['uses-feature'].some( (f) => f.$['android:name'] === 'android.hardware.usb.host' ); if (!featureExists) { androidManifest.manifest['uses-feature'].push({ $: { 'android:name': 'android.hardware.usb.host', 'android:required': 'false', }, }); } // Add intent-filter to MainActivity const application = androidManifest.manifest.application[0]; const mainActivity = application.activity.find((activity) => { const isMainActivity = activity['intent-filter']?.some((filter) => { return filter.action?.some((action) => action.$['android:name'] === 'android.intent.action.MAIN'); }); return isMainActivity; }); if (mainActivity) { const hasUsbIntent = mainActivity['intent-filter']?.some((filter) => { return filter.action?.some((action) => action.$['android:name'] === 'android.hardware.usb.action.USB_DEVICE_ATTACHED'); }); if (!hasUsbIntent) { if (!mainActivity['intent-filter']) { mainActivity['intent-filter'] = []; } mainActivity['intent-filter'].push({ action: [{ $: { 'android:name': 'android.hardware.usb.action.USB_DEVICE_ATTACHED' } }], }); if (!mainActivity['meta-data']) { mainActivity['meta-data'] = []; } mainActivity['meta-data'].push({ $: { 'android:name': 'android.hardware.usb.action.USB_DEVICE_ATTACHED', 'android:resource': '@xml/device_filter', }, }); } } return config; }); }; const fs = require('fs'); const path = require('path'); const withUsbCameraXml = (config) => { return require('@expo/config-plugins').withDangerousMod(config, [ 'android', async (config) => { const resDir = path.join(config.modRequest.platformProjectRoot, 'app/src/main/res/xml'); if (!fs.existsSync(resDir)) { fs.mkdirSync(resDir, { recursive: true }); } const filterPath = path.join(resDir, 'device_filter.xml'); const xmlContent = `\n\n \n \n \n`; fs.writeFileSync(filterPath, xmlContent); return config; }, ]); }; module.exports = (config) => withUsbCameraXml(withUsbCamera(config));