fix(android): generate missing a11y service resources in plugin

Plugin referenced @string/accessibility_service_summary +
@xml/accessibility_service_config in AndroidManifest but never created the
underlying resource files. EAS Cloud prebuild --clean exposed this — local
dev worked because resources were sometimes already there from previous builds.

- withStringsXml: adds accessibility_service_summary string (DE)
- withDangerousMod: writes res/xml/accessibility_service_config.xml at prebuild
- Config flags match native service (TYPE_WINDOW_CONTENT_CHANGED + STATE_CHANGED,
  canRetrieveWindowContent for URL-bar reading)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
chahinebrini 2026-05-11 04:32:16 +02:00
parent 5eebda4b6b
commit eccc04b1e3

View File

@ -27,8 +27,12 @@
const {
withAndroidManifest,
withStringsXml,
withDangerousMod,
AndroidConfig,
} = require('@expo/config-plugins');
const fs = require('fs');
const path = require('path');
const VPN_SERVICE_CLASS =
'expo.modules.rebreakprotection.vpn.RebreakVpnService';
@ -113,15 +117,69 @@ function ensureAccessibilityService(manifest) {
});
}
// ─── 4) String resource für a11y-service-summary ────────────────────────────
const A11Y_SUMMARY_TEXT =
'ReBreak schützt vor Glücksspiel-Seiten in Browsern. Liest URLs in der Adressleiste, um Casino-Domains zu erkennen und zu blocken.';
function withA11yStringResource(config) {
return withStringsXml(config, (cfg) => {
cfg.modResults = AndroidConfig.Strings.setStringItem(
[
{
$: { name: 'accessibility_service_summary', translatable: 'false' },
_: A11Y_SUMMARY_TEXT,
},
],
cfg.modResults,
);
return cfg;
});
}
// ─── 5) XML-config für AccessibilityService ─────────────────────────────────
const A11Y_CONFIG_XML = `<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeWindowContentChanged|typeWindowStateChanged"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault|flagReportViewIds"
android:canRetrieveWindowContent="true"
android:notificationTimeout="100"
android:description="@string/accessibility_service_summary" />
`;
function withA11yConfigXml(config) {
return withDangerousMod(config, [
'android',
async (cfg) => {
const xmlDir = path.join(
cfg.modRequest.platformProjectRoot,
'app/src/main/res/xml',
);
fs.mkdirSync(xmlDir, { recursive: true });
fs.writeFileSync(
path.join(xmlDir, 'accessibility_service_config.xml'),
A11Y_CONFIG_XML,
'utf8',
);
return cfg;
},
]);
}
// ─── Composition ────────────────────────────────────────────────────────────
function withRebreakProtectionAndroid(config) {
return withAndroidManifest(config, (cfg) => {
config = withAndroidManifest(config, (cfg) => {
ensureToolsNamespace(cfg.modResults);
ensureVpnService(cfg.modResults);
ensureAccessibilityService(cfg.modResults);
return cfg;
});
config = withA11yStringResource(config);
config = withA11yConfigXml(config);
return config;
}
module.exports = withRebreakProtectionAndroid;