#!/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)")