feat(dev): centraliser l'IP LAN dans android/local.properties — source unique

- build.gradle : tâche generateDevConfig qui propage dev.host vers
  network_security_config.xml et lib/core/config/local_config.dart à chaque build
- environment.dart : import kDevHost depuis local_config.dart pour les URLs dev
  (apiBaseUrl, keycloakBaseUrl, wsBaseUrl) — plus de constante IP hardcodée
- local_config.dart : fichier auto-généré (ne pas éditer directement)
- network_security_config.xml : autorisation cleartext pour 192.168.1.13

Pour changer l'IP : modifier uniquement android/local.properties → dev.host
This commit is contained in:
dahoud
2026-04-12 14:51:36 +00:00
parent cf2866a0aa
commit 318195c6fd
4 changed files with 72 additions and 8 deletions

View File

@@ -5,6 +5,63 @@ plugins {
id "dev.flutter.flutter-gradle-plugin"
}
// ── Dev Host — source unique : android/local.properties → dev.host ───────────
def localProps = new Properties()
def localPropsFile = rootProject.file('local.properties')
if (localPropsFile.exists()) localPropsFile.withInputStream { localProps.load(it) }
def devHost = localProps.getProperty('dev.host', '10.0.2.2')
task generateDevConfig {
description = 'Generates network_security_config.xml and local_config.dart from local.properties'
group = 'UnionFlow'
inputs.property('devHost', devHost)
outputs.files(
file("src/main/res/xml/network_security_config.xml"),
rootProject.file("../lib/core/config/local_config.dart")
)
doLast {
def xmlContent = """\
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!-- Production: cleartext disabled by default -->
<base-config cleartextTrafficPermitted="false">
<trust-anchors>
<certificates src="system"/>
</trust-anchors>
</base-config>
<!-- Dev local - single source: android/local.properties -> dev.host -->
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">${devHost}</domain>
<domain includeSubdomains="true">localhost</domain>
<domain includeSubdomains="true">10.0.2.2</domain>
<domain includeSubdomains="true">127.0.0.1</domain>
</domain-config>
</network-security-config>"""
def dartContent = """\
// AUTO-GENERATED by build.gradle - DO NOT EDIT
// Edit android/local.properties (dev.host) instead.
// ignore_for_file: prefer_single_quotes
const String kDevHost = '${devHost}';
"""
// Write with explicit UTF-8 encoding (avoids Windows-1252 on French systems)
file("src/main/res/xml/network_security_config.xml")
.newWriter('UTF-8').withWriter { w -> w << xmlContent }
rootProject.file("../lib/core/config/local_config.dart")
.newWriter('UTF-8').withWriter { w -> w << dartContent }
}
}
preBuild.dependsOn generateDevConfig
// local_config.dart is consumed by Flutter compile tasks — declare explicit dependency
tasks.configureEach { task ->
if (task.name.startsWith('compileFlutterBuild')) {
task.dependsOn generateDevConfig
}
}
// ─────────────────────────────────────────────────────────────────────────────
android {
namespace = "dev.lions.unionflow_mobile_apps"
compileSdk = 36

View File

@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!-- Production : cleartext interdit par défaut -->
<!-- Production: cleartext disabled by default -->
<base-config cleartextTrafficPermitted="false">
<trust-anchors>
<certificates src="system"/>
</trust-anchors>
</base-config>
<!-- Exceptions pour le développement local uniquement -->
<!-- Dev local - single source: android/local.properties -> dev.host -->
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">192.168.1.9</domain>
<domain includeSubdomains="true">192.168.1.13</domain>
<domain includeSubdomains="true">localhost</domain>
<domain includeSubdomains="true">10.0.2.2</domain>
<domain includeSubdomains="true">127.0.0.1</domain>
</domain-config>
</network-security-config>
</network-security-config>

View File

@@ -1,8 +1,12 @@
import 'local_config.dart';
/// Environnements de déploiement de l'application
enum Environment { dev, staging, prod }
/// Configuration centralisée par environnement.
/// Les URLs sont injectées via --dart-define=ENV=dev|staging|prod
/// L'IP dev est définie dans android/local.properties → dev.host
/// (propagée automatiquement vers ce fichier via build.gradle).
class AppConfig {
static late final Environment _environment;
static late final String apiBaseUrl;
@@ -26,15 +30,15 @@ class AppConfig {
case Environment.dev:
apiBaseUrl = const String.fromEnvironment(
'API_URL',
defaultValue: 'http://localhost:8085',
defaultValue: 'http://$kDevHost:8085',
);
keycloakBaseUrl = const String.fromEnvironment(
'KEYCLOAK_URL',
defaultValue: 'http://localhost:8180',
defaultValue: 'http://$kDevHost:8180',
);
wsBaseUrl = const String.fromEnvironment(
'WS_URL',
defaultValue: 'ws://localhost:8085',
defaultValue: 'ws://$kDevHost:8085',
);
enableDebugMode = true;
enableLogging = true;

View File

@@ -0,0 +1,4 @@
// AUTO-GENERATED by build.gradle - DO NOT EDIT
// Edit android/local.properties (dev.host) instead.
// ignore_for_file: prefer_single_quotes
const String kDevHost = '192.168.1.13';