#!/usr/bin/env python3 """Patche le scaffold Android généré par `flutter create` : - permissions (internet + auto-install APK) - signature release depuis key.properties - CallbackActivity flutter_web_auth_2 (retour OIDC, schéma nfteam.gamemanager) Lancé dans la CI après `flutter create`. Idempotent.""" import os import re KSPW = os.environ["KSPW"] ALIAS = os.environ["ALIAS"] KEYSTORE_PATH = os.environ.get("KEYSTORE_PATH", os.path.abspath("gamemanager.keystore")) # 1) key.properties (chemin absolu du keystore) with open("android/key.properties", "w") as f: f.write( f"storePassword={KSPW}\n" f"keyPassword={KSPW}\n" f"keyAlias={ALIAS}\n" f"storeFile={KEYSTORE_PATH}\n" ) # 2) AndroidManifest : permissions + CallbackActivity OIDC man = "android/app/src/main/AndroidManifest.xml" s = open(man).read() perms = ( '\n' ' \n' ) if "REQUEST_INSTALL_PACKAGES" not in s: s = s.replace("\n' ' \n' ' \n' ' \n' ' \n' ' \n' ' \n' ' \n' ) if "flutter_web_auth_2.CallbackActivity" not in s: s = s.replace("", callback + " ", 1) open(man, "w").write(s) # 3) build.gradle : signature release gr = "android/app/build.gradle" s = open(gr).read() # ⚠️ Rien avant plugins {} → insérer juste avant `android {` if "keystoreProperties" not in s: s = s.replace( "android {", 'def keystoreProperties = new Properties()\n' 'def keystorePropertiesFile = rootProject.file("key.properties")\n' 'if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) }\n\n' 'android {', 1, ) if "signingConfigs {" not in s: s = re.sub( r"(\n\s*buildTypes\s*\{)", '\n signingConfigs {\n' ' release {\n' ' keyAlias = keystoreProperties["keyAlias"]\n' ' keyPassword = keystoreProperties["keyPassword"]\n' ' storeFile = file(keystoreProperties["storeFile"])\n' ' storePassword = keystoreProperties["storePassword"]\n' ' }\n }\n\\1', s, count=1, ) # Flutter 3.24 génère `signingConfig = signingConfigs.debug` (AVEC `=`). On gère # les deux formes pour ne jamais laisser le build release signé en clé debug # (sinon signature différente à chaque run CI → « conflit » à l'install de MAJ). before = s s = s.replace("signingConfig = signingConfigs.debug", "signingConfig = signingConfigs.release") s = s.replace("signingConfig signingConfigs.debug", "signingConfig signingConfigs.release") if s == before: raise SystemExit("patch_android: ERREUR — ligne 'signingConfig ... debug' introuvable, " "signature release NON appliquée (build annulé)") open(gr, "w").write(s) print("patch_android: OK (signature release appliquee)")