From eccc04b1e3f2284dae93514f1a6d6b4c9a4d90ae Mon Sep 17 00:00:00 2001 From: chahinebrini Date: Mon, 11 May 2026 04:32:16 +0200 Subject: [PATCH] fix(android): generate missing a11y service resources in plugin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- .../with-rebreak-protection-android.js | 60 ++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/apps/rebreak-native/plugins/with-rebreak-protection-android.js b/apps/rebreak-native/plugins/with-rebreak-protection-android.js index f9b3111..d8e9ff8 100644 --- a/apps/rebreak-native/plugins/with-rebreak-protection-android.js +++ b/apps/rebreak-native/plugins/with-rebreak-protection-android.js @@ -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 = ` + +`; + +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;