Clean project: remove test files, debug logs, and add documentation
8
.gitignore
vendored
@@ -25,6 +25,14 @@ logs/
|
|||||||
# Quarkus
|
# Quarkus
|
||||||
.quarkus/
|
.quarkus/
|
||||||
|
|
||||||
|
# Temporary files
|
||||||
|
*.bak
|
||||||
|
*.tmp
|
||||||
|
*.temp
|
||||||
|
*~
|
||||||
|
AUDIT.md
|
||||||
|
|
||||||
|
# Claude
|
||||||
.claude/
|
.claude/
|
||||||
.dockerignore
|
.dockerignore
|
||||||
.env.example
|
.env.example
|
||||||
|
|||||||
481
AUDIT_FINAL_UNIONFLOW_MOBILE_2025.md
Normal file
@@ -0,0 +1,481 @@
|
|||||||
|
# 📋 AUDIT COMPLET & PLAN D'ACTION - UNIONFLOW MOBILE 2025
|
||||||
|
|
||||||
|
**Date:** 30 Septembre 2025
|
||||||
|
**Version:** 1.0.0+1
|
||||||
|
**Framework:** Flutter 3.5.3 / Dart 3.5.3
|
||||||
|
**Architecture:** Clean Architecture + BLoC Pattern
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 RÉSUMÉ EXÉCUTIF
|
||||||
|
|
||||||
|
### État Actuel du Projet
|
||||||
|
|
||||||
|
L'application **Unionflow Mobile** est une application Flutter sophistiquée pour la gestion d'associations et organisations. Le projet présente une **architecture solide** avec des fondations bien établies, mais nécessite des travaux de finalisation pour être prête pour la production.
|
||||||
|
|
||||||
|
### Points Forts ✅
|
||||||
|
|
||||||
|
1. **Architecture Clean & BLoC** - Structure modulaire bien organisée
|
||||||
|
2. **Authentification Keycloak** - Implémentation OAuth2/OIDC complète avec WebView
|
||||||
|
3. **Design System Sophistiqué** - Tokens de design cohérents, thème Material 3
|
||||||
|
4. **Système de Permissions** - Matrice de permissions granulaire avec 6 niveaux de rôles
|
||||||
|
5. **Module Organisations** - Implémentation avancée avec CRUD complet
|
||||||
|
6. **Navigation Adaptative** - Dashboards morphiques basés sur les rôles utilisateurs
|
||||||
|
7. **Configuration Android** - Deep links, permissions, network security configurés
|
||||||
|
|
||||||
|
### Points d'Amélioration 🔧
|
||||||
|
|
||||||
|
1. **Intégration Backend Incomplète** - Modules Membres et Événements utilisent des données mock
|
||||||
|
2. **Tests Insuffisants** - Couverture de tests quasi inexistante
|
||||||
|
3. **Gestion d'Erreurs** - Pas de système global de gestion d'erreurs
|
||||||
|
4. **Environnements** - Configuration multi-environnements manquante
|
||||||
|
5. **Internationalisation** - i18n non implémentée (hardcodé en français)
|
||||||
|
6. **Mode Offline** - Synchronisation offline-first non implémentée
|
||||||
|
7. **CI/CD** - Pipeline d'intégration continue absent
|
||||||
|
8. **Documentation** - Documentation technique limitée
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 MÉTRIQUES TECHNIQUES
|
||||||
|
|
||||||
|
### Dépendances (pubspec.yaml)
|
||||||
|
|
||||||
|
**Production:** 29 packages
|
||||||
|
**Développement:** 7 packages
|
||||||
|
|
||||||
|
#### Packages Clés
|
||||||
|
- **State Management:** `flutter_bloc: ^8.1.6`
|
||||||
|
- **Networking:** `dio: ^5.7.0`, `http: ^1.1.0`
|
||||||
|
- **Authentication:** `flutter_appauth: ^6.0.2`, `flutter_secure_storage: ^9.2.2`
|
||||||
|
- **DI:** `get_it: ^7.7.0`, `injectable: ^2.4.4`
|
||||||
|
- **Navigation:** `go_router: ^15.1.2`
|
||||||
|
- **Charts:** `fl_chart: ^0.66.2`
|
||||||
|
- **Exports:** `excel: ^4.0.6`, `pdf: ^3.11.1`, `csv: ^6.0.0`
|
||||||
|
|
||||||
|
### Structure du Projet
|
||||||
|
|
||||||
|
```
|
||||||
|
lib/
|
||||||
|
├── core/ # Fonctionnalités transversales
|
||||||
|
│ ├── auth/ # Authentification Keycloak
|
||||||
|
│ ├── cache/ # Gestion du cache
|
||||||
|
│ ├── design_system/ # Design tokens & thème
|
||||||
|
│ ├── di/ # Injection de dépendances
|
||||||
|
│ ├── models/ # Modèles partagés
|
||||||
|
│ ├── navigation/ # Navigation & routing
|
||||||
|
│ ├── network/ # Client HTTP Dio
|
||||||
|
│ ├── presentation/ # Composants UI partagés
|
||||||
|
│ └── widgets/ # Widgets réutilisables
|
||||||
|
├── features/ # Modules métier
|
||||||
|
│ ├── about/
|
||||||
|
│ ├── auth/
|
||||||
|
│ ├── backup/
|
||||||
|
│ ├── dashboard/
|
||||||
|
│ ├── events/
|
||||||
|
│ ├── help/
|
||||||
|
│ ├── logs/
|
||||||
|
│ ├── members/
|
||||||
|
│ ├── notifications/
|
||||||
|
│ ├── organisations/
|
||||||
|
│ ├── profile/
|
||||||
|
│ ├── reports/
|
||||||
|
│ ├── search/
|
||||||
|
│ └── system_settings/
|
||||||
|
├── shared/ # Ressources partagées
|
||||||
|
│ └── theme/
|
||||||
|
└── main.dart # Point d'entrée
|
||||||
|
```
|
||||||
|
|
||||||
|
### Modules Implémentés
|
||||||
|
|
||||||
|
| Module | État | Backend | Tests | Complexité |
|
||||||
|
|--------|------|---------|-------|------------|
|
||||||
|
| **Authentification** | ✅ Complet | ✅ Keycloak | ❌ 0% | Élevée |
|
||||||
|
| **Organisations** | ✅ Avancé | ⚠️ Partiel | ❌ 0% | Moyenne |
|
||||||
|
| **Dashboard** | ✅ Complet | ❌ Mock | ❌ 0% | Élevée |
|
||||||
|
| **Membres** | ⚠️ UI Only | ❌ Mock | ❌ 0% | Élevée |
|
||||||
|
| **Événements** | ⚠️ UI Only | ❌ Mock | ❌ 0% | Élevée |
|
||||||
|
| **Notifications** | ⚠️ UI Only | ❌ Mock | ❌ 0% | Moyenne |
|
||||||
|
| **Rapports** | ⚠️ UI Only | ❌ Mock | ❌ 0% | Élevée |
|
||||||
|
| **Backup** | ⚠️ UI Only | ❌ Non impl. | ❌ 0% | Moyenne |
|
||||||
|
| **Profil** | ✅ Basique | ⚠️ Partiel | ❌ 0% | Faible |
|
||||||
|
| **Paramètres** | ✅ Basique | ❌ Local | ❌ 0% | Faible |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏗️ ARCHITECTURE DÉTAILLÉE
|
||||||
|
|
||||||
|
### Pattern Architectural
|
||||||
|
|
||||||
|
**Clean Architecture** avec séparation en couches :
|
||||||
|
|
||||||
|
```
|
||||||
|
Presentation Layer (UI)
|
||||||
|
↓ (BLoC Events)
|
||||||
|
Business Logic Layer (BLoC)
|
||||||
|
↓ (Use Cases)
|
||||||
|
Domain Layer (Entities, Repositories)
|
||||||
|
↓ (Data Sources)
|
||||||
|
Data Layer (API, Local DB)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Gestion d'État
|
||||||
|
|
||||||
|
**BLoC Pattern** (Business Logic Component)
|
||||||
|
- `AuthBloc` - Authentification et sessions
|
||||||
|
- `OrganisationsBloc` - Gestion des organisations
|
||||||
|
- Autres BLoCs à implémenter pour chaque module
|
||||||
|
|
||||||
|
### Injection de Dépendances
|
||||||
|
|
||||||
|
**GetIt** avec architecture modulaire :
|
||||||
|
- `AppDI` - Configuration globale
|
||||||
|
- `OrganisationsDI` - Module organisations
|
||||||
|
- Modules DI à créer pour autres features
|
||||||
|
|
||||||
|
### Authentification
|
||||||
|
|
||||||
|
**Keycloak OAuth2/OIDC** avec deux implémentations :
|
||||||
|
1. `KeycloakAuthService` - flutter_appauth (HTTPS uniquement)
|
||||||
|
2. `KeycloakWebViewAuthService` - WebView custom (HTTP/HTTPS)
|
||||||
|
|
||||||
|
**Configuration actuelle :**
|
||||||
|
- Realm: `unionflow`
|
||||||
|
- Client ID: `unionflow-mobile`
|
||||||
|
- Redirect URI: `dev.lions.unionflow-mobile://auth/callback`
|
||||||
|
- Backend: `http://192.168.1.11:8180`
|
||||||
|
|
||||||
|
### Système de Permissions
|
||||||
|
|
||||||
|
**6 Niveaux de Rôles Hiérarchiques :**
|
||||||
|
|
||||||
|
1. **Super Admin** (niveau 100) - Accès système complet
|
||||||
|
2. **Org Admin** (niveau 80) - Administration organisation
|
||||||
|
3. **Moderator** (niveau 60) - Modération contenu
|
||||||
|
4. **Active Member** (niveau 40) - Membre actif
|
||||||
|
5. **Simple Member** (niveau 20) - Membre basique
|
||||||
|
6. **Visitor** (niveau 10) - Visiteur
|
||||||
|
|
||||||
|
**Matrice de Permissions :** 50+ permissions atomiques (format `domain.action.scope`)
|
||||||
|
|
||||||
|
### Design System
|
||||||
|
|
||||||
|
**Tokens de Design Cohérents :**
|
||||||
|
- **Couleurs** - Palette sophistiquée Material 3
|
||||||
|
- **Typographie** - Échelle typographique complète
|
||||||
|
- **Espacement** - Système de grille 4px
|
||||||
|
- **Rayons** - Bordures arrondies standardisées
|
||||||
|
- **Élévations** - Système d'ombres
|
||||||
|
|
||||||
|
**Composants Réutilisables :**
|
||||||
|
- `DashboardStatsCard` - Cartes de statistiques
|
||||||
|
- `DashboardQuickActionButton` - Boutons d'action rapide
|
||||||
|
- `UFHeader` - En-têtes harmonisés
|
||||||
|
- `AdaptiveWidget` - Widgets morphiques par rôle
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔴 TÂCHES CRITIQUES (Bloquantes Production)
|
||||||
|
|
||||||
|
### 1. Configuration Multi-Environnements
|
||||||
|
**Priorité:** CRITIQUE | **Complexité:** MOYENNE | **Durée estimée:** 3-5 jours
|
||||||
|
|
||||||
|
**Objectif:** Séparer les configurations dev/staging/production
|
||||||
|
|
||||||
|
**Actions:**
|
||||||
|
- Créer fichiers `.env` par environnement
|
||||||
|
- Implémenter flavors Android (`dev`, `staging`, `prod`)
|
||||||
|
- Configurer schemes iOS
|
||||||
|
- Variables d'environnement pour URLs backend/Keycloak
|
||||||
|
- Scripts de build par environnement
|
||||||
|
|
||||||
|
**Livrables:**
|
||||||
|
- `lib/config/env_config.dart`
|
||||||
|
- `android/app/build.gradle` avec flavors
|
||||||
|
- Scripts `build_dev.sh`, `build_prod.sh`
|
||||||
|
|
||||||
|
### 2. Gestion Globale des Erreurs
|
||||||
|
**Priorité:** CRITIQUE | **Complexité:** MOYENNE | **Durée estimée:** 2-3 jours
|
||||||
|
|
||||||
|
**Objectif:** Capturer et gérer toutes les erreurs de l'application
|
||||||
|
|
||||||
|
**Actions:**
|
||||||
|
- Implémenter `ErrorHandler` global
|
||||||
|
- Configurer `FlutterError.onError`
|
||||||
|
- Configurer `PlatformDispatcher.instance.onError`
|
||||||
|
- Logging structuré des erreurs
|
||||||
|
- UI d'erreur utilisateur-friendly
|
||||||
|
|
||||||
|
**Livrables:**
|
||||||
|
- `lib/core/error/error_handler.dart`
|
||||||
|
- `lib/core/error/app_exception.dart`
|
||||||
|
- Widget `ErrorScreen`
|
||||||
|
|
||||||
|
### 3. Crash Reporting
|
||||||
|
**Priorité:** CRITIQUE | **Complexité:** MOYENNE | **Durée estimée:** 2 jours
|
||||||
|
|
||||||
|
**Objectif:** Suivre les crashes en production
|
||||||
|
|
||||||
|
**Actions:**
|
||||||
|
- Intégrer Firebase Crashlytics OU Sentry
|
||||||
|
- Configuration par environnement
|
||||||
|
- Test des rapports de crash
|
||||||
|
- Dashboards de monitoring
|
||||||
|
|
||||||
|
**Livrables:**
|
||||||
|
- Configuration Firebase/Sentry
|
||||||
|
- Documentation monitoring
|
||||||
|
|
||||||
|
### 4. Service de Logging
|
||||||
|
**Priorité:** CRITIQUE | **Complexité:** FAIBLE | **Durée estimée:** 1-2 jours
|
||||||
|
|
||||||
|
**Objectif:** Logging structuré pour debugging
|
||||||
|
|
||||||
|
**Actions:**
|
||||||
|
- Créer `LoggerService` avec niveaux (debug, info, warning, error)
|
||||||
|
- Rotation des logs
|
||||||
|
- Export pour debugging
|
||||||
|
- Intégration avec analytics
|
||||||
|
|
||||||
|
**Livrables:**
|
||||||
|
- `lib/core/logging/logger_service.dart`
|
||||||
|
|
||||||
|
### 5. Analytics et Monitoring
|
||||||
|
**Priorité:** CRITIQUE | **Complexité:** MOYENNE | **Durée estimée:** 3 jours
|
||||||
|
|
||||||
|
**Objectif:** Suivre l'utilisation et les performances
|
||||||
|
|
||||||
|
**Actions:**
|
||||||
|
- Intégrer Firebase Analytics
|
||||||
|
- Définir events métier clés
|
||||||
|
- Tracking parcours utilisateurs
|
||||||
|
- Dashboards de monitoring
|
||||||
|
|
||||||
|
**Livrables:**
|
||||||
|
- Configuration Firebase Analytics
|
||||||
|
- Documentation des events
|
||||||
|
|
||||||
|
### 6. Finaliser Architecture DI
|
||||||
|
**Priorité:** CRITIQUE | **Complexité:** MOYENNE | **Durée estimée:** 3-4 jours
|
||||||
|
|
||||||
|
**Objectif:** Compléter l'injection de dépendances pour tous les modules
|
||||||
|
|
||||||
|
**Actions:**
|
||||||
|
- Créer DI modules pour chaque feature
|
||||||
|
- Enregistrer tous les repositories/services
|
||||||
|
- Tester l'isolation des modules
|
||||||
|
- Documentation architecture DI
|
||||||
|
|
||||||
|
**Livrables:**
|
||||||
|
- `*_di.dart` pour chaque module
|
||||||
|
- Tests d'intégration DI
|
||||||
|
|
||||||
|
### 7. Standardiser BLoC Pattern
|
||||||
|
**Priorité:** CRITIQUE | **Complexité:** ÉLEVÉE | **Durée estimée:** 5-7 jours
|
||||||
|
|
||||||
|
**Objectif:** Gestion d'état cohérente dans toute l'app
|
||||||
|
|
||||||
|
**Actions:**
|
||||||
|
- Créer BLoCs pour tous les modules
|
||||||
|
- States/Events standardisés
|
||||||
|
- Error handling dans BLoCs
|
||||||
|
- Loading states cohérents
|
||||||
|
|
||||||
|
**Livrables:**
|
||||||
|
- BLoCs complets pour chaque module
|
||||||
|
- Documentation pattern BLoC
|
||||||
|
|
||||||
|
### 8. Configuration CI/CD
|
||||||
|
**Priorité:** CRITIQUE | **Complexité:** ÉLEVÉE | **Durée estimée:** 5-7 jours
|
||||||
|
|
||||||
|
**Objectif:** Automatiser tests et déploiements
|
||||||
|
|
||||||
|
**Actions:**
|
||||||
|
- Pipeline GitHub Actions ou GitLab CI
|
||||||
|
- Tests automatiques
|
||||||
|
- Analyse statique
|
||||||
|
- Build Android/iOS
|
||||||
|
- Déploiement stores de test
|
||||||
|
|
||||||
|
**Livrables:**
|
||||||
|
- `.github/workflows/` ou `.gitlab-ci.yml`
|
||||||
|
- Documentation CI/CD
|
||||||
|
|
||||||
|
### 9. Sécuriser Stockage et Secrets
|
||||||
|
**Priorité:** CRITIQUE | **Complexité:** MOYENNE | **Durée estimée:** 2-3 jours
|
||||||
|
|
||||||
|
**Objectif:** Protection des données sensibles
|
||||||
|
|
||||||
|
**Actions:**
|
||||||
|
- Auditer FlutterSecureStorage
|
||||||
|
- Chiffrement données sensibles
|
||||||
|
- Obfuscation des secrets
|
||||||
|
- Rotation des clés
|
||||||
|
|
||||||
|
**Livrables:**
|
||||||
|
- `lib/core/security/secure_storage_service.dart`
|
||||||
|
- Documentation sécurité
|
||||||
|
|
||||||
|
### 10. Configuration iOS Complète
|
||||||
|
**Priorité:** CRITIQUE | **Complexité:** FAIBLE | **Durée estimée:** 1-2 jours
|
||||||
|
|
||||||
|
**Objectif:** Finaliser configuration iOS
|
||||||
|
|
||||||
|
**Actions:**
|
||||||
|
- Permissions manquantes dans Info.plist
|
||||||
|
- URL schemes Keycloak
|
||||||
|
- Test deep links iOS
|
||||||
|
- Configuration signing
|
||||||
|
|
||||||
|
**Livrables:**
|
||||||
|
- `ios/Runner/Info.plist` complet
|
||||||
|
- Documentation iOS
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🟠 TÂCHES HAUTE PRIORITÉ (Fonctionnalités Core)
|
||||||
|
|
||||||
|
### 11-20. Intégrations Backend
|
||||||
|
|
||||||
|
**Modules à connecter au backend réel :**
|
||||||
|
|
||||||
|
1. **Membres** (Complexité: ÉLEVÉE, 7-10 jours)
|
||||||
|
2. **Événements** (Complexité: ÉLEVÉE, 7-10 jours)
|
||||||
|
3. **Organisations** - Finaliser (Complexité: MOYENNE, 3-4 jours)
|
||||||
|
4. **Rapports** (Complexité: ÉLEVÉE, 7-10 jours)
|
||||||
|
5. **Notifications Push** (Complexité: MOYENNE, 4-5 jours)
|
||||||
|
6. **Synchronisation Offline** (Complexité: ÉLEVÉE, 10-14 jours)
|
||||||
|
7. **Backup/Restore** (Complexité: MOYENNE, 4-5 jours)
|
||||||
|
8. **Gestion Fichiers** (Complexité: MOYENNE, 4-5 jours)
|
||||||
|
9. **Refresh Token Optimisé** (Complexité: MOYENNE, 2-3 jours)
|
||||||
|
10. **Recherche Globale** (Complexité: MOYENNE, 4-5 jours)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🟡 TÂCHES MOYENNE PRIORITÉ (Qualité & Tests)
|
||||||
|
|
||||||
|
### 21-30. Tests et Validation
|
||||||
|
|
||||||
|
1. **Tests Unitaires BLoCs** (Complexité: MOYENNE, 5-7 jours)
|
||||||
|
2. **Tests Unitaires Services** (Complexité: MOYENNE, 5-7 jours)
|
||||||
|
3. **Tests Widgets** (Complexité: MOYENNE, 5-7 jours)
|
||||||
|
4. **Tests Intégration E2E** (Complexité: ÉLEVÉE, 7-10 jours)
|
||||||
|
5. **Validation Formulaires** (Complexité: FAIBLE, 2-3 jours)
|
||||||
|
6. **Gestion Erreurs Réseau** (Complexité: MOYENNE, 3-4 jours)
|
||||||
|
7. **Analyse Statique Avancée** (Complexité: FAIBLE, 1-2 jours)
|
||||||
|
8. **Sécurité OWASP** (Complexité: MOYENNE, 3-4 jours)
|
||||||
|
9. **Documentation Technique** (Complexité: FAIBLE, 3-5 jours)
|
||||||
|
10. **Code Coverage** (Complexité: FAIBLE, 1-2 jours)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🟢 TÂCHES BASSE PRIORITÉ (UX/UI)
|
||||||
|
|
||||||
|
### 31-40. Améliorations Expérience Utilisateur
|
||||||
|
|
||||||
|
1. **Internationalisation i18n** (Complexité: MOYENNE, 5-7 jours)
|
||||||
|
2. **Optimisation Performances** (Complexité: MOYENNE, 5-7 jours)
|
||||||
|
3. **Animations Fluides** (Complexité: FAIBLE, 3-4 jours)
|
||||||
|
4. **Accessibilité a11y** (Complexité: MOYENNE, 5-7 jours)
|
||||||
|
5. **Mode Sombre** (Complexité: FAIBLE, 2-3 jours)
|
||||||
|
6. **UX Formulaires** (Complexité: FAIBLE, 2-3 jours)
|
||||||
|
7. **Feedback Utilisateur** (Complexité: FAIBLE, 2-3 jours)
|
||||||
|
8. **Onboarding** (Complexité: MOYENNE, 4-5 jours)
|
||||||
|
9. **Navigation Optimisée** (Complexité: MOYENNE, 3-4 jours)
|
||||||
|
10. **Pull-to-Refresh** (Complexité: FAIBLE, 1-2 jours)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔵 TÂCHES OPTIONNELLES (Features Avancées)
|
||||||
|
|
||||||
|
### 41-50. Fonctionnalités Nice-to-Have
|
||||||
|
|
||||||
|
1. **Authentification Biométrique** (Complexité: MOYENNE)
|
||||||
|
2. **Chat/Messagerie** (Complexité: ÉLEVÉE)
|
||||||
|
3. **Multi-Organisations** (Complexité: ÉLEVÉE)
|
||||||
|
4. **Paiements Wave Money** (Complexité: ÉLEVÉE)
|
||||||
|
5. **Calendrier Avancé** (Complexité: MOYENNE)
|
||||||
|
6. **Géolocalisation** (Complexité: MOYENNE)
|
||||||
|
7. **QR Code Scanner** (Complexité: FAIBLE)
|
||||||
|
8. **Widgets Home Screen** (Complexité: MOYENNE)
|
||||||
|
9. **Mode Offline Complet** (Complexité: ÉLEVÉE)
|
||||||
|
10. **Analytics Avancés** (Complexité: ÉLEVÉE)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📅 PLANNING RECOMMANDÉ
|
||||||
|
|
||||||
|
### Phase 1 : Fondations (3-4 semaines)
|
||||||
|
- Tâches CRITIQUES (1-10)
|
||||||
|
- Configuration infrastructure
|
||||||
|
- Sécurité et monitoring
|
||||||
|
|
||||||
|
### Phase 2 : Intégrations Backend (6-8 semaines)
|
||||||
|
- Tâches HAUTE PRIORITÉ (11-20)
|
||||||
|
- Connexion modules au backend
|
||||||
|
- Synchronisation offline
|
||||||
|
|
||||||
|
### Phase 3 : Qualité (4-6 semaines)
|
||||||
|
- Tâches MOYENNE PRIORITÉ (21-30)
|
||||||
|
- Tests complets
|
||||||
|
- Documentation
|
||||||
|
|
||||||
|
### Phase 4 : Polish (3-4 semaines)
|
||||||
|
- Tâches BASSE PRIORITÉ (31-40)
|
||||||
|
- UX/UI améliorations
|
||||||
|
- Optimisations
|
||||||
|
|
||||||
|
### Phase 5 : Features Avancées (optionnel)
|
||||||
|
- Tâches OPTIONNELLES (41-50)
|
||||||
|
- Selon roadmap produit
|
||||||
|
|
||||||
|
**DURÉE TOTALE ESTIMÉE:** 16-22 semaines (4-5.5 mois)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 RECOMMANDATIONS STRATÉGIQUES
|
||||||
|
|
||||||
|
### Priorités Immédiates
|
||||||
|
|
||||||
|
1. ✅ **Configurer environnements** - Bloquer pour dev/staging/prod
|
||||||
|
2. ✅ **Implémenter error handling** - Essentiel pour stabilité
|
||||||
|
3. ✅ **Ajouter crash reporting** - Visibilité production
|
||||||
|
4. ✅ **Finaliser architecture** - DI + BLoC cohérents
|
||||||
|
5. ✅ **Connecter backend** - Membres et Événements en priorité
|
||||||
|
|
||||||
|
### Meilleures Pratiques 2025
|
||||||
|
|
||||||
|
- ✅ **Material Design 3** - Déjà implémenté
|
||||||
|
- ✅ **Clean Architecture** - Structure solide
|
||||||
|
- ⚠️ **Tests** - À implémenter (objectif 80%+ coverage)
|
||||||
|
- ⚠️ **CI/CD** - Pipeline automatisé requis
|
||||||
|
- ⚠️ **Monitoring** - Analytics + Crashlytics essentiels
|
||||||
|
- ⚠️ **i18n** - Internationalisation pour scalabilité
|
||||||
|
- ⚠️ **Offline-first** - Expérience utilisateur optimale
|
||||||
|
|
||||||
|
### Points de Vigilance
|
||||||
|
|
||||||
|
- **Sécurité** - Audit OWASP, chiffrement, sanitization
|
||||||
|
- **Performances** - Profiling, lazy loading, optimisation
|
||||||
|
- **Accessibilité** - WCAG AA compliance
|
||||||
|
- **Documentation** - Technique + utilisateur
|
||||||
|
- **Versioning** - Semantic versioning, changelog
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📝 CONCLUSION
|
||||||
|
|
||||||
|
Le projet **Unionflow Mobile** dispose d'**excellentes fondations** avec une architecture moderne et un design system sophistiqué. Les **50 tâches identifiées** permettront de transformer cette base solide en une application production-ready conforme aux meilleures pratiques Flutter 2025.
|
||||||
|
|
||||||
|
**Prochaines étapes recommandées :**
|
||||||
|
1. Valider ce plan avec l'équipe
|
||||||
|
2. Prioriser selon contraintes business
|
||||||
|
3. Démarrer Phase 1 (Fondations)
|
||||||
|
4. Itérer avec feedback continu
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Document généré le:** 30 Septembre 2025
|
||||||
|
**Par:** Audit Technique Unionflow Mobile
|
||||||
|
**Version:** 1.0
|
||||||
|
|
||||||
@@ -254,7 +254,7 @@ public class OrganisationRepository implements PanacheRepository<Organisation> {
|
|||||||
|
|
||||||
**Keycloak OIDC Intégré**
|
**Keycloak OIDC Intégré**
|
||||||
```properties
|
```properties
|
||||||
quarkus.oidc.auth-server-url=http://192.168.1.145:8180/realms/unionflow
|
quarkus.oidc.auth-server-url=http://192.168.1.11:8180/realms/unionflow
|
||||||
quarkus.oidc.client-id=unionflow-server
|
quarkus.oidc.client-id=unionflow-server
|
||||||
quarkus.oidc.credentials.secret=unionflow-secret-2025
|
quarkus.oidc.credentials.secret=unionflow-secret-2025
|
||||||
```
|
```
|
||||||
|
|||||||
671
GUIDE_IMPLEMENTATION_DETAILLE.md
Normal file
@@ -0,0 +1,671 @@
|
|||||||
|
# 🛠️ GUIDE D'IMPLÉMENTATION DÉTAILLÉ - UNIONFLOW MOBILE
|
||||||
|
|
||||||
|
Ce document fournit des instructions techniques détaillées pour chaque catégorie de tâches identifiées dans l'audit.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔴 SECTION 1 : TÂCHES CRITIQUES
|
||||||
|
|
||||||
|
### 1.1 Configuration Multi-Environnements
|
||||||
|
|
||||||
|
#### Packages requis
|
||||||
|
```yaml
|
||||||
|
dependencies:
|
||||||
|
flutter_dotenv: ^5.1.0
|
||||||
|
|
||||||
|
dev_dependencies:
|
||||||
|
flutter_flavorizr: ^2.2.3
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Structure des fichiers
|
||||||
|
```
|
||||||
|
.env.dev
|
||||||
|
.env.staging
|
||||||
|
.env.production
|
||||||
|
|
||||||
|
lib/config/
|
||||||
|
├── env_config.dart
|
||||||
|
├── app_config.dart
|
||||||
|
└── flavor_config.dart
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Exemple env_config.dart
|
||||||
|
```dart
|
||||||
|
class EnvConfig {
|
||||||
|
static const String keycloakUrl = String.fromEnvironment(
|
||||||
|
'KEYCLOAK_URL',
|
||||||
|
defaultValue: 'http://192.168.1.11:8180',
|
||||||
|
);
|
||||||
|
|
||||||
|
static const String apiUrl = String.fromEnvironment(
|
||||||
|
'API_URL',
|
||||||
|
defaultValue: 'http://192.168.1.11:8080',
|
||||||
|
);
|
||||||
|
|
||||||
|
static const String environment = String.fromEnvironment(
|
||||||
|
'ENVIRONMENT',
|
||||||
|
defaultValue: 'dev',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Configuration Android flavors (build.gradle)
|
||||||
|
```gradle
|
||||||
|
android {
|
||||||
|
flavorDimensions "environment"
|
||||||
|
|
||||||
|
productFlavors {
|
||||||
|
dev {
|
||||||
|
dimension "environment"
|
||||||
|
applicationIdSuffix ".dev"
|
||||||
|
versionNameSuffix "-dev"
|
||||||
|
resValue "string", "app_name", "UnionFlow Dev"
|
||||||
|
}
|
||||||
|
|
||||||
|
staging {
|
||||||
|
dimension "environment"
|
||||||
|
applicationIdSuffix ".staging"
|
||||||
|
versionNameSuffix "-staging"
|
||||||
|
resValue "string", "app_name", "UnionFlow Staging"
|
||||||
|
}
|
||||||
|
|
||||||
|
prod {
|
||||||
|
dimension "environment"
|
||||||
|
resValue "string", "app_name", "UnionFlow"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Scripts de build
|
||||||
|
```bash
|
||||||
|
# build_dev.sh
|
||||||
|
flutter build apk --flavor dev --dart-define=ENVIRONMENT=dev
|
||||||
|
|
||||||
|
# build_prod.sh
|
||||||
|
flutter build apk --flavor prod --dart-define=ENVIRONMENT=production --release
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 1.2 Gestion Globale des Erreurs
|
||||||
|
|
||||||
|
#### Structure
|
||||||
|
```
|
||||||
|
lib/core/error/
|
||||||
|
├── error_handler.dart
|
||||||
|
├── app_exception.dart
|
||||||
|
├── error_logger.dart
|
||||||
|
└── ui/
|
||||||
|
└── error_screen.dart
|
||||||
|
```
|
||||||
|
|
||||||
|
#### error_handler.dart
|
||||||
|
```dart
|
||||||
|
class ErrorHandler {
|
||||||
|
static void initialize() {
|
||||||
|
// Erreurs Flutter
|
||||||
|
FlutterError.onError = (FlutterErrorDetails details) {
|
||||||
|
FlutterError.presentError(details);
|
||||||
|
_logError(details.exception, details.stack);
|
||||||
|
_reportToCrashlytics(details.exception, details.stack);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Erreurs Dart asynchrones
|
||||||
|
PlatformDispatcher.instance.onError = (error, stack) {
|
||||||
|
_logError(error, stack);
|
||||||
|
_reportToCrashlytics(error, stack);
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _logError(Object error, StackTrace? stack) {
|
||||||
|
debugPrint('❌ Error: $error');
|
||||||
|
debugPrint('Stack trace: $stack');
|
||||||
|
LoggerService.error(error.toString(), stackTrace: stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _reportToCrashlytics(Object error, StackTrace? stack) {
|
||||||
|
if (EnvConfig.environment != 'dev') {
|
||||||
|
FirebaseCrashlytics.instance.recordError(error, stack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### app_exception.dart
|
||||||
|
```dart
|
||||||
|
abstract class AppException implements Exception {
|
||||||
|
final String message;
|
||||||
|
final String? code;
|
||||||
|
final dynamic originalError;
|
||||||
|
|
||||||
|
const AppException(this.message, {this.code, this.originalError});
|
||||||
|
}
|
||||||
|
|
||||||
|
class NetworkException extends AppException {
|
||||||
|
const NetworkException(String message, {String? code})
|
||||||
|
: super(message, code: code);
|
||||||
|
}
|
||||||
|
|
||||||
|
class AuthenticationException extends AppException {
|
||||||
|
const AuthenticationException(String message) : super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
class ValidationException extends AppException {
|
||||||
|
final Map<String, String> errors;
|
||||||
|
|
||||||
|
const ValidationException(String message, this.errors) : super(message);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 1.3 Crash Reporting (Firebase Crashlytics)
|
||||||
|
|
||||||
|
#### Configuration Firebase
|
||||||
|
```yaml
|
||||||
|
dependencies:
|
||||||
|
firebase_core: ^2.24.2
|
||||||
|
firebase_crashlytics: ^3.4.9
|
||||||
|
firebase_analytics: ^10.8.0
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Initialisation (main.dart)
|
||||||
|
```dart
|
||||||
|
void main() async {
|
||||||
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
||||||
|
// Firebase
|
||||||
|
await Firebase.initializeApp(
|
||||||
|
options: DefaultFirebaseOptions.currentPlatform,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Crashlytics
|
||||||
|
if (EnvConfig.environment != 'dev') {
|
||||||
|
await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
|
||||||
|
FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error Handler
|
||||||
|
ErrorHandler.initialize();
|
||||||
|
|
||||||
|
runApp(const UnionFlowApp());
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 1.4 Service de Logging
|
||||||
|
|
||||||
|
#### logger_service.dart
|
||||||
|
```dart
|
||||||
|
enum LogLevel { debug, info, warning, error }
|
||||||
|
|
||||||
|
class LoggerService {
|
||||||
|
static final List<LogEntry> _logs = [];
|
||||||
|
static const int _maxLogs = 1000;
|
||||||
|
|
||||||
|
static void debug(String message, {Map<String, dynamic>? data}) {
|
||||||
|
_log(LogLevel.debug, message, data: data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void info(String message, {Map<String, dynamic>? data}) {
|
||||||
|
_log(LogLevel.info, message, data: data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void warning(String message, {Map<String, dynamic>? data}) {
|
||||||
|
_log(LogLevel.warning, message, data: data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void error(
|
||||||
|
String message, {
|
||||||
|
Object? error,
|
||||||
|
StackTrace? stackTrace,
|
||||||
|
Map<String, dynamic>? data,
|
||||||
|
}) {
|
||||||
|
_log(
|
||||||
|
LogLevel.error,
|
||||||
|
message,
|
||||||
|
error: error,
|
||||||
|
stackTrace: stackTrace,
|
||||||
|
data: data,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _log(
|
||||||
|
LogLevel level,
|
||||||
|
String message, {
|
||||||
|
Object? error,
|
||||||
|
StackTrace? stackTrace,
|
||||||
|
Map<String, dynamic>? data,
|
||||||
|
}) {
|
||||||
|
final entry = LogEntry(
|
||||||
|
level: level,
|
||||||
|
message: message,
|
||||||
|
timestamp: DateTime.now(),
|
||||||
|
error: error,
|
||||||
|
stackTrace: stackTrace,
|
||||||
|
data: data,
|
||||||
|
);
|
||||||
|
|
||||||
|
_logs.add(entry);
|
||||||
|
if (_logs.length > _maxLogs) {
|
||||||
|
_logs.removeAt(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Console output
|
||||||
|
if (kDebugMode || level == LogLevel.error) {
|
||||||
|
debugPrint('[${level.name.toUpperCase()}] $message');
|
||||||
|
if (error != null) debugPrint('Error: $error');
|
||||||
|
if (stackTrace != null) debugPrint('Stack: $stackTrace');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Analytics
|
||||||
|
if (level == LogLevel.error) {
|
||||||
|
FirebaseAnalytics.instance.logEvent(
|
||||||
|
name: 'app_error',
|
||||||
|
parameters: {
|
||||||
|
'message': message,
|
||||||
|
'error': error?.toString() ?? '',
|
||||||
|
...?data,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<LogEntry> getLogs({LogLevel? level}) {
|
||||||
|
if (level == null) return List.unmodifiable(_logs);
|
||||||
|
return _logs.where((log) => log.level == level).toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<void> exportLogs() async {
|
||||||
|
final json = jsonEncode(_logs.map((e) => e.toJson()).toList());
|
||||||
|
// Implémenter export vers fichier ou partage
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class LogEntry {
|
||||||
|
final LogLevel level;
|
||||||
|
final String message;
|
||||||
|
final DateTime timestamp;
|
||||||
|
final Object? error;
|
||||||
|
final StackTrace? stackTrace;
|
||||||
|
final Map<String, dynamic>? data;
|
||||||
|
|
||||||
|
LogEntry({
|
||||||
|
required this.level,
|
||||||
|
required this.message,
|
||||||
|
required this.timestamp,
|
||||||
|
this.error,
|
||||||
|
this.stackTrace,
|
||||||
|
this.data,
|
||||||
|
});
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
'level': level.name,
|
||||||
|
'message': message,
|
||||||
|
'timestamp': timestamp.toIso8601String(),
|
||||||
|
'error': error?.toString(),
|
||||||
|
'data': data,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 1.5 Analytics et Monitoring
|
||||||
|
|
||||||
|
#### Configuration Firebase Analytics
|
||||||
|
```dart
|
||||||
|
class AnalyticsService {
|
||||||
|
static final FirebaseAnalytics _analytics = FirebaseAnalytics.instance;
|
||||||
|
static final FirebaseAnalyticsObserver observer =
|
||||||
|
FirebaseAnalyticsObserver(analytics: _analytics);
|
||||||
|
|
||||||
|
// Events métier
|
||||||
|
static Future<void> logLogin(String method) async {
|
||||||
|
await _analytics.logLogin(loginMethod: method);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<void> logScreenView(String screenName) async {
|
||||||
|
await _analytics.logScreenView(screenName: screenName);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<void> logMemberCreated() async {
|
||||||
|
await _analytics.logEvent(name: 'member_created');
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<void> logEventCreated(String eventType) async {
|
||||||
|
await _analytics.logEvent(
|
||||||
|
name: 'event_created',
|
||||||
|
parameters: {'event_type': eventType},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<void> logOrganisationJoined(String orgId) async {
|
||||||
|
await _analytics.logEvent(
|
||||||
|
name: 'organisation_joined',
|
||||||
|
parameters: {'organisation_id': orgId},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// User properties
|
||||||
|
static Future<void> setUserRole(String role) async {
|
||||||
|
await _analytics.setUserProperty(name: 'user_role', value: role);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<void> setUserId(String userId) async {
|
||||||
|
await _analytics.setUserId(id: userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 1.6 Architecture DI Complète
|
||||||
|
|
||||||
|
#### Structure DI par module
|
||||||
|
```
|
||||||
|
lib/features/members/di/
|
||||||
|
└── members_di.dart
|
||||||
|
|
||||||
|
lib/features/events/di/
|
||||||
|
└── events_di.dart
|
||||||
|
|
||||||
|
lib/features/reports/di/
|
||||||
|
└── reports_di.dart
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Exemple members_di.dart
|
||||||
|
```dart
|
||||||
|
class MembersDI {
|
||||||
|
static final GetIt _getIt = GetIt.instance;
|
||||||
|
|
||||||
|
static void registerDependencies() {
|
||||||
|
// Repository
|
||||||
|
_getIt.registerLazySingleton<MemberRepository>(
|
||||||
|
() => MemberRepositoryImpl(_getIt<Dio>()),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Service
|
||||||
|
_getIt.registerLazySingleton<MemberService>(
|
||||||
|
() => MemberService(_getIt<MemberRepository>()),
|
||||||
|
);
|
||||||
|
|
||||||
|
// BLoC (Factory pour créer nouvelle instance à chaque fois)
|
||||||
|
_getIt.registerFactory<MembersBloc>(
|
||||||
|
() => MembersBloc(_getIt<MemberService>()),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void unregisterDependencies() {
|
||||||
|
_getIt.unregister<MembersBloc>();
|
||||||
|
_getIt.unregister<MemberService>();
|
||||||
|
_getIt.unregister<MemberRepository>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### app_di.dart mis à jour
|
||||||
|
```dart
|
||||||
|
class AppDI {
|
||||||
|
static Future<void> initialize() async {
|
||||||
|
await _setupNetworking();
|
||||||
|
await _setupModules();
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<void> _setupModules() async {
|
||||||
|
OrganisationsDI.registerDependencies();
|
||||||
|
MembersDI.registerDependencies();
|
||||||
|
EventsDI.registerDependencies();
|
||||||
|
ReportsDI.registerDependencies();
|
||||||
|
NotificationsDI.registerDependencies();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 1.7 Standardisation BLoC Pattern
|
||||||
|
|
||||||
|
#### Template BLoC standard
|
||||||
|
```dart
|
||||||
|
// Events
|
||||||
|
abstract class MembersEvent extends Equatable {
|
||||||
|
const MembersEvent();
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class LoadMembers extends MembersEvent {
|
||||||
|
final int page;
|
||||||
|
final int size;
|
||||||
|
const LoadMembers({this.page = 0, this.size = 20});
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [page, size];
|
||||||
|
}
|
||||||
|
|
||||||
|
// States
|
||||||
|
abstract class MembersState extends Equatable {
|
||||||
|
const MembersState();
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class MembersInitial extends MembersState {
|
||||||
|
const MembersInitial();
|
||||||
|
}
|
||||||
|
|
||||||
|
class MembersLoading extends MembersState {
|
||||||
|
const MembersLoading();
|
||||||
|
}
|
||||||
|
|
||||||
|
class MembersLoaded extends MembersState {
|
||||||
|
final List<Member> members;
|
||||||
|
final bool hasMore;
|
||||||
|
final int currentPage;
|
||||||
|
|
||||||
|
const MembersLoaded({
|
||||||
|
required this.members,
|
||||||
|
this.hasMore = false,
|
||||||
|
this.currentPage = 0,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [members, hasMore, currentPage];
|
||||||
|
}
|
||||||
|
|
||||||
|
class MembersError extends MembersState {
|
||||||
|
final String message;
|
||||||
|
final AppException? exception;
|
||||||
|
|
||||||
|
const MembersError(this.message, {this.exception});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [message, exception];
|
||||||
|
}
|
||||||
|
|
||||||
|
// BLoC
|
||||||
|
class MembersBloc extends Bloc<MembersEvent, MembersState> {
|
||||||
|
final MemberService _service;
|
||||||
|
|
||||||
|
MembersBloc(this._service) : super(const MembersInitial()) {
|
||||||
|
on<LoadMembers>(_onLoadMembers);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _onLoadMembers(
|
||||||
|
LoadMembers event,
|
||||||
|
Emitter<MembersState> emit,
|
||||||
|
) async {
|
||||||
|
try {
|
||||||
|
emit(const MembersLoading());
|
||||||
|
|
||||||
|
final members = await _service.getMembers(
|
||||||
|
page: event.page,
|
||||||
|
size: event.size,
|
||||||
|
);
|
||||||
|
|
||||||
|
emit(MembersLoaded(
|
||||||
|
members: members,
|
||||||
|
hasMore: members.length >= event.size,
|
||||||
|
currentPage: event.page,
|
||||||
|
));
|
||||||
|
} on NetworkException catch (e) {
|
||||||
|
emit(MembersError('Erreur réseau: ${e.message}', exception: e));
|
||||||
|
} catch (e) {
|
||||||
|
emit(MembersError('Erreur inattendue: $e'));
|
||||||
|
LoggerService.error('Error loading members', error: e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 1.8 Configuration CI/CD
|
||||||
|
|
||||||
|
#### .github/workflows/flutter_ci.yml
|
||||||
|
```yaml
|
||||||
|
name: Flutter CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main, develop ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ main, develop ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analyze:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: subosito/flutter-action@v2
|
||||||
|
with:
|
||||||
|
flutter-version: '3.5.3'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: flutter pub get
|
||||||
|
|
||||||
|
- name: Analyze code
|
||||||
|
run: flutter analyze
|
||||||
|
|
||||||
|
- name: Check formatting
|
||||||
|
run: dart format --set-exit-if-changed .
|
||||||
|
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: subosito/flutter-action@v2
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: flutter pub get
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: flutter test --coverage
|
||||||
|
|
||||||
|
- name: Upload coverage
|
||||||
|
uses: codecov/codecov-action@v3
|
||||||
|
with:
|
||||||
|
files: ./coverage/lcov.info
|
||||||
|
|
||||||
|
build-android:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [analyze, test]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: subosito/flutter-action@v2
|
||||||
|
- uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
distribution: 'zulu'
|
||||||
|
java-version: '17'
|
||||||
|
|
||||||
|
- name: Build APK
|
||||||
|
run: flutter build apk --flavor dev --dart-define=ENVIRONMENT=dev
|
||||||
|
|
||||||
|
- name: Upload APK
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: app-dev.apk
|
||||||
|
path: build/app/outputs/flutter-apk/app-dev-release.apk
|
||||||
|
|
||||||
|
build-ios:
|
||||||
|
runs-on: macos-latest
|
||||||
|
needs: [analyze, test]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- uses: subosito/flutter-action@v2
|
||||||
|
|
||||||
|
- name: Build iOS
|
||||||
|
run: flutter build ios --no-codesign --flavor dev
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🟠 SECTION 2 : INTÉGRATIONS BACKEND
|
||||||
|
|
||||||
|
### 2.1 Module Membres - Intégration Complète
|
||||||
|
|
||||||
|
#### member_repository.dart
|
||||||
|
```dart
|
||||||
|
abstract class MemberRepository {
|
||||||
|
Future<List<Member>> getMembers({int page = 0, int size = 20});
|
||||||
|
Future<Member?> getMemberById(String id);
|
||||||
|
Future<Member> createMember(Member member);
|
||||||
|
Future<Member> updateMember(String id, Member member);
|
||||||
|
Future<void> deleteMember(String id);
|
||||||
|
Future<List<Member>> searchMembers(MemberSearchCriteria criteria);
|
||||||
|
}
|
||||||
|
|
||||||
|
class MemberRepositoryImpl implements MemberRepository {
|
||||||
|
final Dio _dio;
|
||||||
|
static const String _baseUrl = '/api/membres';
|
||||||
|
|
||||||
|
MemberRepositoryImpl(this._dio);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<List<Member>> getMembers({int page = 0, int size = 20}) async {
|
||||||
|
try {
|
||||||
|
final response = await _dio.get(
|
||||||
|
_baseUrl,
|
||||||
|
queryParameters: {'page': page, 'size': size},
|
||||||
|
);
|
||||||
|
|
||||||
|
if (response.statusCode == 200) {
|
||||||
|
final List<dynamic> data = response.data;
|
||||||
|
return data.map((json) => Member.fromJson(json)).toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
throw NetworkException('Failed to load members: ${response.statusCode}');
|
||||||
|
} on DioException catch (e) {
|
||||||
|
throw _handleDioError(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AppException _handleDioError(DioException e) {
|
||||||
|
if (e.type == DioExceptionType.connectionTimeout) {
|
||||||
|
return const NetworkException('Connection timeout');
|
||||||
|
}
|
||||||
|
if (e.response?.statusCode == 401) {
|
||||||
|
return const AuthenticationException('Unauthorized');
|
||||||
|
}
|
||||||
|
return NetworkException(e.message ?? 'Network error');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*[Le document continue avec les sections suivantes...]*
|
||||||
|
|
||||||
|
## 🟡 SECTION 3 : TESTS
|
||||||
|
|
||||||
|
## 🟢 SECTION 4 : UX/UI
|
||||||
|
|
||||||
|
## 🔵 SECTION 5 : FEATURES AVANCÉES
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Note:** Ce document sera complété avec les détails techniques de toutes les sections dans les prochaines itérations.
|
||||||
|
|
||||||
@@ -51,7 +51,7 @@
|
|||||||
```
|
```
|
||||||
|
|
||||||
### 2. **Vérifier la Configuration Keycloak**
|
### 2. **Vérifier la Configuration Keycloak**
|
||||||
- Ouvrez l'interface admin Keycloak : http://192.168.1.145:8180
|
- Ouvrez l'interface admin Keycloak : http://192.168.1.11:8180
|
||||||
- Connectez-vous avec admin/admin
|
- Connectez-vous avec admin/admin
|
||||||
- Vérifiez que les rôles et utilisateurs ont été créés
|
- Vérifiez que les rôles et utilisateurs ont été créés
|
||||||
|
|
||||||
@@ -70,12 +70,12 @@
|
|||||||
### Tester l'Authentification
|
### Tester l'Authentification
|
||||||
```bash
|
```bash
|
||||||
# Test avec le compte existant
|
# Test avec le compte existant
|
||||||
curl -X POST "http://192.168.1.145:8180/realms/unionflow/protocol/openid-connect/token" \
|
curl -X POST "http://192.168.1.11:8180/realms/unionflow/protocol/openid-connect/token" \
|
||||||
-H "Content-Type: application/x-www-form-urlencoded" \
|
-H "Content-Type: application/x-www-form-urlencoded" \
|
||||||
-d "username=test@unionflow.dev&password=test123&grant_type=password&client_id=unionflow-mobile"
|
-d "username=test@unionflow.dev&password=test123&grant_type=password&client_id=unionflow-mobile"
|
||||||
|
|
||||||
# Test avec un nouveau compte
|
# Test avec un nouveau compte
|
||||||
curl -X POST "http://192.168.1.145:8180/realms/unionflow/protocol/openid-connect/token" \
|
curl -X POST "http://192.168.1.11:8180/realms/unionflow/protocol/openid-connect/token" \
|
||||||
-H "Content-Type: application/x-www-form-urlencoded" \
|
-H "Content-Type: application/x-www-form-urlencoded" \
|
||||||
-d "username=marie.active&password=Marie123!&grant_type=password&client_id=unionflow-mobile"
|
-d "username=marie.active&password=Marie123!&grant_type=password&client_id=unionflow-mobile"
|
||||||
```
|
```
|
||||||
@@ -83,11 +83,11 @@ curl -X POST "http://192.168.1.145:8180/realms/unionflow/protocol/openid-connect
|
|||||||
### Vérifier les Rôles
|
### Vérifier les Rôles
|
||||||
```bash
|
```bash
|
||||||
# Obtenir un token admin
|
# Obtenir un token admin
|
||||||
curl -X POST "http://192.168.1.145:8180/realms/master/protocol/openid-connect/token" \
|
curl -X POST "http://192.168.1.11:8180/realms/master/protocol/openid-connect/token" \
|
||||||
-d "username=admin&password=admin&grant_type=password&client_id=admin-cli"
|
-d "username=admin&password=admin&grant_type=password&client_id=admin-cli"
|
||||||
|
|
||||||
# Lister les rôles
|
# Lister les rôles
|
||||||
curl -X GET "http://192.168.1.145:8180/admin/realms/unionflow/roles" \
|
curl -X GET "http://192.168.1.11:8180/admin/realms/unionflow/roles" \
|
||||||
-H "Authorization: Bearer [TOKEN]"
|
-H "Authorization: Bearer [TOKEN]"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ VISITEUR (0) ← Personne intéressée/Non-membre
|
|||||||
## 📦 Prérequis
|
## 📦 Prérequis
|
||||||
|
|
||||||
### Environnement
|
### Environnement
|
||||||
- **Keycloak** : Accessible sur `http://192.168.1.145:8180`
|
- **Keycloak** : Accessible sur `http://192.168.1.11:8180`
|
||||||
- **Realm** : `unionflow` (doit exister)
|
- **Realm** : `unionflow` (doit exister)
|
||||||
- **Client** : `unionflow-mobile` (doit être configuré)
|
- **Client** : `unionflow-mobile` (doit être configuré)
|
||||||
- **Admin** : `admin/admin`
|
- **Admin** : `admin/admin`
|
||||||
@@ -62,7 +62,7 @@ chmod +x *.sh
|
|||||||
```bash
|
```bash
|
||||||
# 1. Cloner ou télécharger les scripts
|
# 1. Cloner ou télécharger les scripts
|
||||||
# 2. Vérifier que Keycloak est accessible
|
# 2. Vérifier que Keycloak est accessible
|
||||||
curl -I http://192.168.1.145:8180
|
curl -I http://192.168.1.11:8180
|
||||||
|
|
||||||
# 3. Lancer la configuration complète
|
# 3. Lancer la configuration complète
|
||||||
./setup-unionflow-keycloak.sh
|
./setup-unionflow-keycloak.sh
|
||||||
@@ -105,7 +105,7 @@ curl -I http://192.168.1.145:8180
|
|||||||
```dart
|
```dart
|
||||||
// Configuration Keycloak dans l'app mobile
|
// Configuration Keycloak dans l'app mobile
|
||||||
const keycloakConfig = {
|
const keycloakConfig = {
|
||||||
'serverUrl': 'http://192.168.1.145:8180',
|
'serverUrl': 'http://192.168.1.11:8180',
|
||||||
'realm': 'unionflow',
|
'realm': 'unionflow',
|
||||||
'clientId': 'unionflow-mobile',
|
'clientId': 'unionflow-mobile',
|
||||||
'redirectUri': 'dev.lions.unionflow-mobile://auth/callback',
|
'redirectUri': 'dev.lions.unionflow-mobile://auth/callback',
|
||||||
@@ -167,7 +167,7 @@ Chaque rôle a accès à son dashboard spécifique :
|
|||||||
#### 1. Erreur de connexion Keycloak
|
#### 1. Erreur de connexion Keycloak
|
||||||
```bash
|
```bash
|
||||||
# Vérifier que Keycloak est accessible
|
# Vérifier que Keycloak est accessible
|
||||||
curl -I http://192.168.1.145:8180
|
curl -I http://192.168.1.11:8180
|
||||||
|
|
||||||
# Si erreur, vérifier l'IP et le port
|
# Si erreur, vérifier l'IP et le port
|
||||||
```
|
```
|
||||||
@@ -175,7 +175,7 @@ curl -I http://192.168.1.145:8180
|
|||||||
#### 2. Token d'administration invalide
|
#### 2. Token d'administration invalide
|
||||||
```bash
|
```bash
|
||||||
# Vérifier les credentials admin
|
# Vérifier les credentials admin
|
||||||
curl -X POST "http://192.168.1.145:8180/realms/master/protocol/openid-connect/token" \
|
curl -X POST "http://192.168.1.11:8180/realms/master/protocol/openid-connect/token" \
|
||||||
-d "username=admin&password=admin&grant_type=password&client_id=admin-cli"
|
-d "username=admin&password=admin&grant_type=password&client_id=admin-cli"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
221
README.md
Normal file
@@ -0,0 +1,221 @@
|
|||||||
|
# UnionFlow
|
||||||
|
|
||||||
|
Système de gestion intégré pour les unions et associations Lions Club de Côte d'Ivoire.
|
||||||
|
|
||||||
|
## 📋 Description
|
||||||
|
|
||||||
|
UnionFlow est une plateforme complète de gestion pour les organisations Lions Club, comprenant :
|
||||||
|
- Gestion des membres et cotisations
|
||||||
|
- Organisation d'événements
|
||||||
|
- Système de solidarité
|
||||||
|
- Gestion des organisations
|
||||||
|
- Authentification sécurisée via Keycloak
|
||||||
|
|
||||||
|
## 🏗️ Architecture
|
||||||
|
|
||||||
|
Le projet est composé de deux applications principales :
|
||||||
|
|
||||||
|
### Backend - Quarkus (Java)
|
||||||
|
- **Framework** : Quarkus 3.x
|
||||||
|
- **Base de données** : PostgreSQL
|
||||||
|
- **Authentification** : Keycloak (OIDC)
|
||||||
|
- **API** : REST (JAX-RS)
|
||||||
|
- **ORM** : Hibernate avec Panache
|
||||||
|
|
||||||
|
### Mobile - Flutter
|
||||||
|
- **Framework** : Flutter 3.x
|
||||||
|
- **Architecture** : Clean Architecture + BLoC
|
||||||
|
- **Authentification** : Keycloak WebView
|
||||||
|
- **HTTP Client** : Dio
|
||||||
|
- **State Management** : flutter_bloc
|
||||||
|
|
||||||
|
## 🚀 Démarrage Rapide
|
||||||
|
|
||||||
|
### Prérequis
|
||||||
|
|
||||||
|
- Java 17+
|
||||||
|
- Maven 3.8+
|
||||||
|
- PostgreSQL 14+
|
||||||
|
- Keycloak 23+
|
||||||
|
- Flutter 3.x
|
||||||
|
- Dart 3.x
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd unionflow-server-impl-quarkus
|
||||||
|
|
||||||
|
# Configuration de la base de données
|
||||||
|
# Créer une base PostgreSQL nommée 'unionflow'
|
||||||
|
# Modifier src/main/resources/application.properties si nécessaire
|
||||||
|
|
||||||
|
# Démarrage en mode développement
|
||||||
|
mvn clean quarkus:dev
|
||||||
|
|
||||||
|
# L'API sera disponible sur http://localhost:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
### Mobile
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd unionflow-mobile-apps
|
||||||
|
|
||||||
|
# Installation des dépendances
|
||||||
|
flutter pub get
|
||||||
|
|
||||||
|
# Génération du code (models, etc.)
|
||||||
|
flutter pub run build_runner build --delete-conflicting-outputs
|
||||||
|
|
||||||
|
# Lancement de l'application
|
||||||
|
flutter run
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📦 Configuration
|
||||||
|
|
||||||
|
### Backend - application.properties
|
||||||
|
|
||||||
|
```properties
|
||||||
|
# Base de données
|
||||||
|
quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/unionflow
|
||||||
|
quarkus.datasource.username=unionflow
|
||||||
|
quarkus.datasource.password=unionflow123
|
||||||
|
|
||||||
|
# Keycloak
|
||||||
|
quarkus.oidc.auth-server-url=http://localhost:8180/realms/unionflow
|
||||||
|
quarkus.oidc.client-id=unionflow-server
|
||||||
|
quarkus.oidc.credentials.secret=unionflow-secret-2025
|
||||||
|
```
|
||||||
|
|
||||||
|
### Mobile - Configuration
|
||||||
|
|
||||||
|
Modifier `lib/core/network/dio_client.dart` pour l'URL du backend :
|
||||||
|
```dart
|
||||||
|
static const String _baseUrl = 'http://192.168.1.11:8080';
|
||||||
|
```
|
||||||
|
|
||||||
|
Modifier `lib/core/auth/keycloak_config.dart` pour Keycloak :
|
||||||
|
```dart
|
||||||
|
static const String authority = 'http://192.168.1.11:8180/realms/unionflow';
|
||||||
|
static const String clientId = 'unionflow-mobile';
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🗄️ Base de Données
|
||||||
|
|
||||||
|
### Mode Développement
|
||||||
|
|
||||||
|
Pour charger les données initiales (membres, cotisations, événements) :
|
||||||
|
|
||||||
|
1. Modifier `application.properties` :
|
||||||
|
```properties
|
||||||
|
quarkus.hibernate-orm.database.generation=drop-and-create
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Redémarrer Quarkus - Le fichier `import.sql` sera exécuté automatiquement
|
||||||
|
|
||||||
|
3. Remettre en mode production :
|
||||||
|
```properties
|
||||||
|
quarkus.hibernate-orm.database.generation=update
|
||||||
|
```
|
||||||
|
|
||||||
|
### Mode Production
|
||||||
|
|
||||||
|
En production, utilisez toujours `update` pour préserver les données.
|
||||||
|
|
||||||
|
## 📱 Fonctionnalités
|
||||||
|
|
||||||
|
### Gestion des Membres
|
||||||
|
- Inscription et profils des membres
|
||||||
|
- Gestion des statuts (actif, inactif, suspendu)
|
||||||
|
- Historique des adhésions
|
||||||
|
|
||||||
|
### Cotisations
|
||||||
|
- Différents types : mensuelle, annuelle, adhésion, événement, formation, projet, solidarité
|
||||||
|
- Suivi des paiements (payée, en attente, en retard, partiellement payée)
|
||||||
|
- Rappels automatiques
|
||||||
|
|
||||||
|
### Événements
|
||||||
|
- Types variés : assemblée générale, réunion, formation, conférence, atelier, séminaire, événement social, manifestation, célébration
|
||||||
|
- Gestion des inscriptions
|
||||||
|
- Capacité et tarification
|
||||||
|
- Statuts : planifié, confirmé, en cours, terminé, annulé, reporté
|
||||||
|
|
||||||
|
### Organisations
|
||||||
|
- Gestion des clubs et unions
|
||||||
|
- Hiérarchie organisationnelle
|
||||||
|
- Statistiques et rapports
|
||||||
|
|
||||||
|
## 🔐 Sécurité
|
||||||
|
|
||||||
|
- Authentification via Keycloak (OAuth 2.0 / OIDC)
|
||||||
|
- Tokens JWT stockés de manière sécurisée (FlutterSecureStorage)
|
||||||
|
- Contrôle d'accès basé sur les rôles (RBAC)
|
||||||
|
- Refresh automatique des tokens
|
||||||
|
|
||||||
|
## 🛠️ Développement
|
||||||
|
|
||||||
|
### Structure du Backend
|
||||||
|
|
||||||
|
```
|
||||||
|
unionflow-server-impl-quarkus/
|
||||||
|
├── src/main/java/dev/lions/unionflow/server/
|
||||||
|
│ ├── entity/ # Entités JPA
|
||||||
|
│ ├── resource/ # Endpoints REST
|
||||||
|
│ ├── service/ # Logique métier
|
||||||
|
│ ├── dto/ # Data Transfer Objects
|
||||||
|
│ └── repository/ # Repositories (si nécessaire)
|
||||||
|
└── src/main/resources/
|
||||||
|
├── application.properties
|
||||||
|
├── import.sql # Données initiales
|
||||||
|
└── db/migration/ # Migrations Flyway (si utilisé)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Structure du Mobile
|
||||||
|
|
||||||
|
```
|
||||||
|
unionflow-mobile-apps/
|
||||||
|
├── lib/
|
||||||
|
│ ├── core/ # Configuration, réseau, auth
|
||||||
|
│ ├── features/ # Modules par fonctionnalité
|
||||||
|
│ │ ├── auth/
|
||||||
|
│ │ ├── members/
|
||||||
|
│ │ ├── events/
|
||||||
|
│ │ ├── cotisations/
|
||||||
|
│ │ └── organisations/
|
||||||
|
│ └── main.dart
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📝 API Documentation
|
||||||
|
|
||||||
|
Une fois le backend démarré, la documentation OpenAPI est disponible sur :
|
||||||
|
- Swagger UI : http://localhost:8080/q/swagger-ui
|
||||||
|
- OpenAPI JSON : http://localhost:8080/q/openapi
|
||||||
|
|
||||||
|
## 🧪 Tests
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
```bash
|
||||||
|
mvn test
|
||||||
|
```
|
||||||
|
|
||||||
|
### Mobile
|
||||||
|
```bash
|
||||||
|
flutter test
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📄 Licence
|
||||||
|
|
||||||
|
Propriétaire - Lions Club Côte d'Ivoire
|
||||||
|
|
||||||
|
## 👥 Équipe
|
||||||
|
|
||||||
|
UnionFlow Team - Lions Club Côte d'Ivoire
|
||||||
|
|
||||||
|
## 📞 Support
|
||||||
|
|
||||||
|
Pour toute question ou problème, contactez l'équipe de développement.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Version** : 1.0.0
|
||||||
|
**Dernière mise à jour** : 2025-10-05
|
||||||
|
|
||||||
@@ -66,7 +66,7 @@ Pour votre application Android UnionFlow, utilisez ces paramètres :
|
|||||||
|
|
||||||
```kotlin
|
```kotlin
|
||||||
// Configuration Keycloak
|
// Configuration Keycloak
|
||||||
val keycloakUrl = "http://192.168.1.145:8180" // Remplacez par votre IP
|
val keycloakUrl = "http://192.168.1.11:8180" // Remplacez par votre IP
|
||||||
val realm = "unionflow"
|
val realm = "unionflow"
|
||||||
val clientId = "unionflow-mobile"
|
val clientId = "unionflow-mobile"
|
||||||
|
|
||||||
|
|||||||
386
SYNTHESE_EXECUTIVE_AUDIT_2025.md
Normal file
@@ -0,0 +1,386 @@
|
|||||||
|
# 📊 SYNTHÈSE EXÉCUTIVE - AUDIT UNIONFLOW MOBILE 2025
|
||||||
|
|
||||||
|
**Date:** 30 Septembre 2025
|
||||||
|
**Application:** Unionflow Mobile (Flutter)
|
||||||
|
**Version actuelle:** 1.0.0+1
|
||||||
|
**Statut:** En développement - Prêt à 60%
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 RÉSUMÉ EN 1 MINUTE
|
||||||
|
|
||||||
|
L'application **Unionflow Mobile** est une application Flutter sophistiquée pour la gestion d'associations. Elle dispose d'**excellentes fondations architecturales** (Clean Architecture + BLoC) et d'un **design system moderne**, mais nécessite **50 tâches de finalisation** réparties sur **4-5 mois** pour être production-ready.
|
||||||
|
|
||||||
|
### Verdict Global : ⭐⭐⭐⭐☆ (4/5)
|
||||||
|
|
||||||
|
**Points forts majeurs :**
|
||||||
|
- ✅ Architecture Clean solide
|
||||||
|
- ✅ Authentification Keycloak complète
|
||||||
|
- ✅ Design system sophistiqué
|
||||||
|
- ✅ Système de permissions granulaire
|
||||||
|
|
||||||
|
**Points critiques à adresser :**
|
||||||
|
- ❌ Tests quasi inexistants (0% coverage)
|
||||||
|
- ❌ Intégrations backend incomplètes
|
||||||
|
- ❌ Pas de gestion d'erreurs globale
|
||||||
|
- ❌ Configuration multi-environnements manquante
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📈 MÉTRIQUES CLÉS
|
||||||
|
|
||||||
|
| Métrique | Valeur | Cible | Statut |
|
||||||
|
|----------|--------|-------|--------|
|
||||||
|
| **Couverture tests** | 0% | 80%+ | 🔴 Critique |
|
||||||
|
| **Modules backend** | 30% | 100% | 🟠 En cours |
|
||||||
|
| **Documentation** | 40% | 90%+ | 🟡 Insuffisant |
|
||||||
|
| **Architecture** | 85% | 90%+ | 🟢 Bon |
|
||||||
|
| **Design System** | 90% | 95%+ | 🟢 Excellent |
|
||||||
|
| **Sécurité** | 60% | 95%+ | 🟠 À améliorer |
|
||||||
|
| **Performance** | 70% | 90%+ | 🟡 Optimisable |
|
||||||
|
| **Accessibilité** | 30% | 80%+ | 🔴 Insuffisant |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🏗️ ÉTAT DES MODULES
|
||||||
|
|
||||||
|
### Modules Complets ✅
|
||||||
|
1. **Authentification Keycloak** - OAuth2/OIDC avec WebView
|
||||||
|
2. **Design System** - Tokens cohérents, thème Material 3
|
||||||
|
3. **Navigation** - Routing adaptatif par rôle
|
||||||
|
4. **Permissions** - Matrice granulaire 6 niveaux
|
||||||
|
|
||||||
|
### Modules Avancés ⚠️
|
||||||
|
1. **Organisations** - UI complète, backend partiel (70%)
|
||||||
|
2. **Dashboard** - Dashboards morphiques par rôle (80%)
|
||||||
|
3. **Profil** - Gestion basique utilisateur (60%)
|
||||||
|
|
||||||
|
### Modules UI Only 🔶
|
||||||
|
1. **Membres** - Interface riche, données mock
|
||||||
|
2. **Événements** - Calendrier, filtres, données mock
|
||||||
|
3. **Notifications** - UI complète, pas de push
|
||||||
|
4. **Rapports** - Templates, pas de génération
|
||||||
|
5. **Backup** - UI basique, pas d'implémentation
|
||||||
|
|
||||||
|
### Modules Manquants ❌
|
||||||
|
1. **Tests** - Aucun test unitaire/widget/intégration
|
||||||
|
2. **CI/CD** - Pas de pipeline automatisé
|
||||||
|
3. **Monitoring** - Pas de crash reporting
|
||||||
|
4. **i18n** - Pas d'internationalisation
|
||||||
|
5. **Offline** - Pas de synchronisation offline
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 PLAN D'ACTION PRIORITAIRE
|
||||||
|
|
||||||
|
### Phase 1 : CRITIQUE (3-4 semaines) 🔴
|
||||||
|
|
||||||
|
**Objectif:** Stabiliser l'infrastructure et la sécurité
|
||||||
|
|
||||||
|
**Tâches bloquantes (10) :**
|
||||||
|
1. Configuration multi-environnements (dev/staging/prod)
|
||||||
|
2. Gestion globale des erreurs et exceptions
|
||||||
|
3. Crash reporting (Firebase Crashlytics)
|
||||||
|
4. Service de logging structuré
|
||||||
|
5. Analytics et monitoring (Firebase Analytics)
|
||||||
|
6. Finaliser architecture DI (tous modules)
|
||||||
|
7. Standardiser BLoC pattern (tous modules)
|
||||||
|
8. Configuration CI/CD (GitHub Actions)
|
||||||
|
9. Sécuriser stockage et secrets
|
||||||
|
10. Compléter configuration iOS
|
||||||
|
|
||||||
|
**Livrables Phase 1 :**
|
||||||
|
- ✅ App stable avec error handling
|
||||||
|
- ✅ Monitoring production actif
|
||||||
|
- ✅ Pipeline CI/CD fonctionnel
|
||||||
|
- ✅ Configuration multi-env opérationnelle
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Phase 2 : HAUTE PRIORITÉ (6-8 semaines) 🟠
|
||||||
|
|
||||||
|
**Objectif:** Connecter tous les modules au backend
|
||||||
|
|
||||||
|
**Tâches essentielles (10) :**
|
||||||
|
1. Intégration backend Membres (CRUD complet)
|
||||||
|
2. Intégration backend Événements (calendrier, inscriptions)
|
||||||
|
3. Finaliser Organisations (tous endpoints)
|
||||||
|
4. Module Rapports (génération PDF/Excel)
|
||||||
|
5. Notifications push (Firebase Cloud Messaging)
|
||||||
|
6. Synchronisation offline-first (sqflite + queue)
|
||||||
|
7. Module Backup/Restore (local + cloud)
|
||||||
|
8. Gestion fichiers et médias (upload/download)
|
||||||
|
9. Optimiser refresh token automatique
|
||||||
|
10. Recherche globale multi-modules
|
||||||
|
|
||||||
|
**Livrables Phase 2 :**
|
||||||
|
- ✅ Tous les modules connectés au backend
|
||||||
|
- ✅ Fonctionnalités offline opérationnelles
|
||||||
|
- ✅ Notifications push actives
|
||||||
|
- ✅ Génération de rapports fonctionnelle
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Phase 3 : QUALITÉ (4-6 semaines) 🟡
|
||||||
|
|
||||||
|
**Objectif:** Atteindre 80%+ de couverture de tests
|
||||||
|
|
||||||
|
**Tâches qualité (10) :**
|
||||||
|
1. Tests unitaires BLoCs (80%+ coverage)
|
||||||
|
2. Tests unitaires Services (80%+ coverage)
|
||||||
|
3. Tests widgets UI (golden tests)
|
||||||
|
4. Tests intégration E2E (parcours critiques)
|
||||||
|
5. Validation formulaires robuste
|
||||||
|
6. Gestion erreurs réseau avancée
|
||||||
|
7. Analyse statique stricte (lints)
|
||||||
|
8. Sécurité OWASP (sanitization, XSS)
|
||||||
|
9. Documentation technique complète
|
||||||
|
10. Code coverage et rapports qualité
|
||||||
|
|
||||||
|
**Livrables Phase 3 :**
|
||||||
|
- ✅ 80%+ code coverage
|
||||||
|
- ✅ Tests E2E parcours critiques
|
||||||
|
- ✅ Documentation complète
|
||||||
|
- ✅ Audit sécurité OWASP validé
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Phase 4 : UX/UI (3-4 semaines) 🟢
|
||||||
|
|
||||||
|
**Objectif:** Optimiser l'expérience utilisateur
|
||||||
|
|
||||||
|
**Tâches UX (10) :**
|
||||||
|
1. Internationalisation i18n (FR/EN)
|
||||||
|
2. Optimisation performances (lazy loading)
|
||||||
|
3. Animations et transitions fluides
|
||||||
|
4. Accessibilité a11y (WCAG AA)
|
||||||
|
5. Mode sombre (dark theme)
|
||||||
|
6. UX formulaires optimisée
|
||||||
|
7. Feedback utilisateur amélioré
|
||||||
|
8. Onboarding et tutoriels
|
||||||
|
9. Navigation et deep linking optimisés
|
||||||
|
10. Pull-to-refresh et infinite scroll
|
||||||
|
|
||||||
|
**Livrables Phase 4 :**
|
||||||
|
- ✅ App multilingue (FR/EN)
|
||||||
|
- ✅ Mode sombre complet
|
||||||
|
- ✅ Accessibilité WCAG AA
|
||||||
|
- ✅ Performances optimisées
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 💰 ESTIMATION BUDGÉTAIRE
|
||||||
|
|
||||||
|
### Ressources Recommandées
|
||||||
|
|
||||||
|
**Équipe minimale :**
|
||||||
|
- 2 développeurs Flutter senior (full-time)
|
||||||
|
- 1 développeur backend (support API)
|
||||||
|
- 1 QA engineer (tests)
|
||||||
|
- 1 DevOps (CI/CD, infrastructure)
|
||||||
|
|
||||||
|
### Durée et Coûts
|
||||||
|
|
||||||
|
| Phase | Durée | Effort (j/h) | Coût estimé* |
|
||||||
|
|-------|-------|--------------|--------------|
|
||||||
|
| Phase 1 - Critique | 3-4 sem | 240-320h | 18-24k€ |
|
||||||
|
| Phase 2 - Backend | 6-8 sem | 480-640h | 36-48k€ |
|
||||||
|
| Phase 3 - Qualité | 4-6 sem | 320-480h | 24-36k€ |
|
||||||
|
| Phase 4 - UX/UI | 3-4 sem | 240-320h | 18-24k€ |
|
||||||
|
| **TOTAL** | **16-22 sem** | **1280-1760h** | **96-132k€** |
|
||||||
|
|
||||||
|
*Basé sur taux moyen 75€/h développeur senior
|
||||||
|
|
||||||
|
### Options d'Optimisation
|
||||||
|
|
||||||
|
**Budget serré :**
|
||||||
|
- Phases 1+2 uniquement (MVP production) : 54-72k€
|
||||||
|
- Externaliser tests (Phase 3) : -15k€
|
||||||
|
- Reporter Phase 4 (post-lancement) : -18-24k€
|
||||||
|
|
||||||
|
**Budget confortable :**
|
||||||
|
- Ajouter Phase 5 (features avancées) : +40-60k€
|
||||||
|
- Renforcer équipe (3 devs) : -30% temps
|
||||||
|
- Audit sécurité externe : +10k€
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 RECOMMANDATIONS STRATÉGIQUES
|
||||||
|
|
||||||
|
### Priorités Immédiates (Semaine 1-2)
|
||||||
|
|
||||||
|
1. **Décision environnements** - Valider stratégie dev/staging/prod
|
||||||
|
2. **Choix crash reporting** - Firebase Crashlytics vs Sentry
|
||||||
|
3. **Configuration CI/CD** - GitHub Actions vs GitLab CI
|
||||||
|
4. **Stratégie tests** - Définir objectifs coverage
|
||||||
|
5. **Roadmap backend** - Prioriser endpoints API
|
||||||
|
|
||||||
|
### Décisions Techniques Clés
|
||||||
|
|
||||||
|
**À valider rapidement :**
|
||||||
|
- ✅ Stratégie offline (sqflite vs drift vs hive)
|
||||||
|
- ✅ Solution analytics (Firebase vs Mixpanel)
|
||||||
|
- ✅ Gestion fichiers (Firebase Storage vs S3)
|
||||||
|
- ✅ Notifications (FCM vs OneSignal)
|
||||||
|
- ✅ Paiements (Wave Money intégration)
|
||||||
|
|
||||||
|
### Risques Identifiés
|
||||||
|
|
||||||
|
| Risque | Impact | Probabilité | Mitigation |
|
||||||
|
|--------|--------|-------------|------------|
|
||||||
|
| **Retard backend API** | Élevé | Moyenne | Mock data + contrats API |
|
||||||
|
| **Complexité offline** | Moyen | Élevée | POC synchronisation |
|
||||||
|
| **Tests insuffisants** | Élevé | Moyenne | TDD dès Phase 1 |
|
||||||
|
| **Dérive scope** | Moyen | Élevée | Backlog priorisé strict |
|
||||||
|
| **Turnover équipe** | Élevé | Faible | Documentation continue |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 CHECKLIST PRODUCTION
|
||||||
|
|
||||||
|
### Avant Lancement (Must-Have)
|
||||||
|
|
||||||
|
**Infrastructure :**
|
||||||
|
- [ ] Environnements dev/staging/prod configurés
|
||||||
|
- [ ] CI/CD pipeline opérationnel
|
||||||
|
- [ ] Crash reporting actif
|
||||||
|
- [ ] Analytics configuré
|
||||||
|
- [ ] Monitoring performances
|
||||||
|
|
||||||
|
**Sécurité :**
|
||||||
|
- [ ] Audit sécurité OWASP validé
|
||||||
|
- [ ] Secrets et clés sécurisés
|
||||||
|
- [ ] Chiffrement données sensibles
|
||||||
|
- [ ] Authentification robuste
|
||||||
|
- [ ] Gestion permissions testée
|
||||||
|
|
||||||
|
**Qualité :**
|
||||||
|
- [ ] 80%+ code coverage
|
||||||
|
- [ ] Tests E2E parcours critiques
|
||||||
|
- [ ] Performance profiling validé
|
||||||
|
- [ ] Accessibilité WCAG AA
|
||||||
|
- [ ] Documentation complète
|
||||||
|
|
||||||
|
**Fonctionnel :**
|
||||||
|
- [ ] Tous modules backend connectés
|
||||||
|
- [ ] Synchronisation offline testée
|
||||||
|
- [ ] Notifications push fonctionnelles
|
||||||
|
- [ ] Gestion erreurs robuste
|
||||||
|
- [ ] UX validée utilisateurs
|
||||||
|
|
||||||
|
**Stores :**
|
||||||
|
- [ ] App Store Connect configuré
|
||||||
|
- [ ] Google Play Console configuré
|
||||||
|
- [ ] Screenshots et descriptions
|
||||||
|
- [ ] Politique confidentialité
|
||||||
|
- [ ] Conditions d'utilisation
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎓 MEILLEURES PRATIQUES 2025
|
||||||
|
|
||||||
|
### Conformité Standards
|
||||||
|
|
||||||
|
**Architecture :**
|
||||||
|
- ✅ Clean Architecture (couches séparées)
|
||||||
|
- ✅ SOLID principles
|
||||||
|
- ✅ Design patterns (BLoC, Repository)
|
||||||
|
- ⚠️ Dependency Injection (à compléter)
|
||||||
|
|
||||||
|
**Code Quality :**
|
||||||
|
- ⚠️ Tests (0% → objectif 80%+)
|
||||||
|
- ✅ Linting (flutter_lints)
|
||||||
|
- ⚠️ Documentation (à améliorer)
|
||||||
|
- ❌ Code review process (à établir)
|
||||||
|
|
||||||
|
**UX/UI :**
|
||||||
|
- ✅ Material Design 3
|
||||||
|
- ⚠️ Accessibilité (à améliorer)
|
||||||
|
- ❌ Internationalisation (à implémenter)
|
||||||
|
- ⚠️ Dark mode (à implémenter)
|
||||||
|
|
||||||
|
**DevOps :**
|
||||||
|
- ❌ CI/CD (à configurer)
|
||||||
|
- ❌ Monitoring (à implémenter)
|
||||||
|
- ⚠️ Versioning (semantic versioning)
|
||||||
|
- ❌ Changelog (à maintenir)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📞 PROCHAINES ÉTAPES
|
||||||
|
|
||||||
|
### Actions Immédiates (Cette Semaine)
|
||||||
|
|
||||||
|
1. **Réunion validation** - Présenter audit à l'équipe
|
||||||
|
2. **Priorisation** - Valider roadmap et budget
|
||||||
|
3. **Ressources** - Confirmer équipe disponible
|
||||||
|
4. **Kickoff Phase 1** - Démarrer tâches critiques
|
||||||
|
5. **Setup outils** - Firebase, CI/CD, monitoring
|
||||||
|
|
||||||
|
### Jalons Clés
|
||||||
|
|
||||||
|
| Date | Jalon | Livrables |
|
||||||
|
|------|-------|-----------|
|
||||||
|
| **Sem 4** | Fin Phase 1 | Infrastructure stable |
|
||||||
|
| **Sem 12** | Fin Phase 2 | Backend complet |
|
||||||
|
| **Sem 18** | Fin Phase 3 | Tests 80%+ |
|
||||||
|
| **Sem 22** | Fin Phase 4 | App production-ready |
|
||||||
|
| **Sem 24** | **LANCEMENT** | 🚀 App stores |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 CONCLUSION
|
||||||
|
|
||||||
|
### Synthèse Finale
|
||||||
|
|
||||||
|
Le projet **Unionflow Mobile** est sur de **très bonnes bases** avec une architecture moderne et un design sophistiqué. Les **50 tâches identifiées** sont **réalisables en 4-5 mois** avec une équipe compétente.
|
||||||
|
|
||||||
|
**Niveau de confiance : 85%** ✅
|
||||||
|
|
||||||
|
### Facteurs de Succès
|
||||||
|
|
||||||
|
1. ✅ **Architecture solide** - Fondations excellentes
|
||||||
|
2. ✅ **Équipe compétente** - Maîtrise Flutter/Dart
|
||||||
|
3. ✅ **Vision claire** - Objectifs bien définis
|
||||||
|
4. ⚠️ **Ressources** - À confirmer (équipe + budget)
|
||||||
|
5. ⚠️ **Backend** - Dépendance API à gérer
|
||||||
|
|
||||||
|
### Recommandation Finale
|
||||||
|
|
||||||
|
**GO pour production** sous conditions :
|
||||||
|
- ✅ Compléter Phase 1 (critique) avant tout
|
||||||
|
- ✅ Valider intégrations backend Phase 2
|
||||||
|
- ✅ Atteindre 80%+ tests Phase 3
|
||||||
|
- ⚠️ Phase 4 peut être post-lancement si budget serré
|
||||||
|
|
||||||
|
**Timeline réaliste : 5 mois** (avec équipe de 2-3 devs)
|
||||||
|
**Budget recommandé : 100-130k€** (qualité production)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Document préparé par :** Équipe Audit Technique Unionflow
|
||||||
|
**Contact :** Pour questions ou clarifications sur cet audit
|
||||||
|
**Version :** 1.0 - 30 Septembre 2025
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📎 ANNEXES
|
||||||
|
|
||||||
|
### Documents Complémentaires
|
||||||
|
|
||||||
|
1. **AUDIT_FINAL_UNIONFLOW_MOBILE_2025.md** - Audit détaillé complet
|
||||||
|
2. **GUIDE_IMPLEMENTATION_DETAILLE.md** - Guide technique d'implémentation
|
||||||
|
3. **Task List** - 50 tâches dans le système de gestion
|
||||||
|
|
||||||
|
### Ressources Utiles
|
||||||
|
|
||||||
|
- [Flutter Best Practices 2025](https://flutter.dev/docs/development/best-practices)
|
||||||
|
- [Material Design 3](https://m3.material.io/)
|
||||||
|
- [Clean Architecture Flutter](https://resocoder.com/flutter-clean-architecture/)
|
||||||
|
- [BLoC Pattern Guide](https://bloclibrary.dev/)
|
||||||
|
- [Firebase Flutter Setup](https://firebase.google.com/docs/flutter/setup)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**FIN DU DOCUMENT**
|
||||||
|
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
# - 8 comptes de test avec rôles assignés
|
# - 8 comptes de test avec rôles assignés
|
||||||
# - Attributs utilisateur et permissions
|
# - Attributs utilisateur et permissions
|
||||||
#
|
#
|
||||||
# Prérequis : Keycloak accessible sur http://192.168.1.145:8180
|
# Prérequis : Keycloak accessible sur http://192.168.1.11:8180
|
||||||
# Realm : unionflow
|
# Realm : unionflow
|
||||||
# Admin : admin/admin
|
# Admin : admin/admin
|
||||||
#
|
#
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
# Configuration
|
# Configuration
|
||||||
$KEYCLOAK_URL = "http://192.168.1.145:8180"
|
$KEYCLOAK_URL = "http://192.168.1.11:8180"
|
||||||
$REALM = "unionflow"
|
$REALM = "unionflow"
|
||||||
$ADMIN_USER = "admin"
|
$ADMIN_USER = "admin"
|
||||||
$ADMIN_PASSWORD = "admin"
|
$ADMIN_PASSWORD = "admin"
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
set -e
|
set -e
|
||||||
|
|
||||||
# Configuration
|
# Configuration
|
||||||
KEYCLOAK_URL="http://192.168.1.145:8180"
|
KEYCLOAK_URL="http://192.168.1.11:8180"
|
||||||
REALM="unionflow"
|
REALM="unionflow"
|
||||||
ADMIN_USER="admin"
|
ADMIN_USER="admin"
|
||||||
ADMIN_PASSWORD="admin"
|
ADMIN_PASSWORD="admin"
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ echo ===========================================================================
|
|||||||
|
|
||||||
REM Obtenir un nouveau token
|
REM Obtenir un nouveau token
|
||||||
echo [INFO] Obtention du token...
|
echo [INFO] Obtention du token...
|
||||||
curl -s -X POST "http://192.168.1.145:8180/realms/master/protocol/openid-connect/token" -H "Content-Type: application/x-www-form-urlencoded" -d "username=admin&password=admin&grant_type=password&client_id=admin-cli" > token.json
|
curl -s -X POST "http://192.168.1.11:8180/realms/master/protocol/openid-connect/token" -H "Content-Type: application/x-www-form-urlencoded" -d "username=admin&password=admin&grant_type=password&client_id=admin-cli" > token.json
|
||||||
|
|
||||||
REM Extraire le token
|
REM Extraire le token
|
||||||
for /f "tokens=2 delims=:," %%a in ('findstr "access_token" token.json') do set TOKEN_RAW=%%a
|
for /f "tokens=2 delims=:," %%a in ('findstr "access_token" token.json') do set TOKEN_RAW=%%a
|
||||||
@@ -26,14 +26,14 @@ echo {"name":"VISITEUR","description":"Visiteur","attributes":{"level":["0"]}} >
|
|||||||
|
|
||||||
REM Créer tous les rôles
|
REM Créer tous les rôles
|
||||||
echo [INFO] Création des rôles...
|
echo [INFO] Création des rôles...
|
||||||
curl -s -X POST "http://192.168.1.145:8180/admin/realms/unionflow/roles" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @role_super.json
|
curl -s -X POST "http://192.168.1.11:8180/admin/realms/unionflow/roles" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @role_super.json
|
||||||
curl -s -X POST "http://192.168.1.145:8180/admin/realms/unionflow/roles" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @role_admin.json
|
curl -s -X POST "http://192.168.1.11:8180/admin/realms/unionflow/roles" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @role_admin.json
|
||||||
curl -s -X POST "http://192.168.1.145:8180/admin/realms/unionflow/roles" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @role_tech.json
|
curl -s -X POST "http://192.168.1.11:8180/admin/realms/unionflow/roles" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @role_tech.json
|
||||||
curl -s -X POST "http://192.168.1.145:8180/admin/realms/unionflow/roles" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @role_finance.json
|
curl -s -X POST "http://192.168.1.11:8180/admin/realms/unionflow/roles" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @role_finance.json
|
||||||
curl -s -X POST "http://192.168.1.145:8180/admin/realms/unionflow/roles" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @role_membres.json
|
curl -s -X POST "http://192.168.1.11:8180/admin/realms/unionflow/roles" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @role_membres.json
|
||||||
curl -s -X POST "http://192.168.1.145:8180/admin/realms/unionflow/roles" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @role_actif.json
|
curl -s -X POST "http://192.168.1.11:8180/admin/realms/unionflow/roles" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @role_actif.json
|
||||||
curl -s -X POST "http://192.168.1.145:8180/admin/realms/unionflow/roles" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @role_simple.json
|
curl -s -X POST "http://192.168.1.11:8180/admin/realms/unionflow/roles" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @role_simple.json
|
||||||
curl -s -X POST "http://192.168.1.145:8180/admin/realms/unionflow/roles" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @role_visiteur.json
|
curl -s -X POST "http://192.168.1.11:8180/admin/realms/unionflow/roles" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @role_visiteur.json
|
||||||
|
|
||||||
echo [SUCCESS] Rôles créés
|
echo [SUCCESS] Rôles créés
|
||||||
echo.
|
echo.
|
||||||
@@ -50,14 +50,14 @@ echo {"username":"visiteur","email":"visiteur@example.com","firstName":"Visiteur
|
|||||||
|
|
||||||
REM Créer tous les utilisateurs
|
REM Créer tous les utilisateurs
|
||||||
echo [INFO] Création des utilisateurs...
|
echo [INFO] Création des utilisateurs...
|
||||||
curl -s -X POST "http://192.168.1.145:8180/admin/realms/unionflow/users" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @user_super.json
|
curl -s -X POST "http://192.168.1.11:8180/admin/realms/unionflow/users" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @user_super.json
|
||||||
curl -s -X POST "http://192.168.1.145:8180/admin/realms/unionflow/users" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @user_admin.json
|
curl -s -X POST "http://192.168.1.11:8180/admin/realms/unionflow/users" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @user_admin.json
|
||||||
curl -s -X POST "http://192.168.1.145:8180/admin/realms/unionflow/users" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @user_tech.json
|
curl -s -X POST "http://192.168.1.11:8180/admin/realms/unionflow/users" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @user_tech.json
|
||||||
curl -s -X POST "http://192.168.1.145:8180/admin/realms/unionflow/users" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @user_finance.json
|
curl -s -X POST "http://192.168.1.11:8180/admin/realms/unionflow/users" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @user_finance.json
|
||||||
curl -s -X POST "http://192.168.1.145:8180/admin/realms/unionflow/users" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @user_membres.json
|
curl -s -X POST "http://192.168.1.11:8180/admin/realms/unionflow/users" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @user_membres.json
|
||||||
curl -s -X POST "http://192.168.1.145:8180/admin/realms/unionflow/users" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @user_actif.json
|
curl -s -X POST "http://192.168.1.11:8180/admin/realms/unionflow/users" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @user_actif.json
|
||||||
curl -s -X POST "http://192.168.1.145:8180/admin/realms/unionflow/users" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @user_simple.json
|
curl -s -X POST "http://192.168.1.11:8180/admin/realms/unionflow/users" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @user_simple.json
|
||||||
curl -s -X POST "http://192.168.1.145:8180/admin/realms/unionflow/users" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @user_visiteur.json
|
curl -s -X POST "http://192.168.1.11:8180/admin/realms/unionflow/users" -H "Authorization: Bearer %TOKEN%" -H "Content-Type: application/json" -d @user_visiteur.json
|
||||||
|
|
||||||
echo [SUCCESS] Utilisateurs créés
|
echo [SUCCESS] Utilisateurs créés
|
||||||
echo.
|
echo.
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ services:
|
|||||||
KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
|
KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
|
||||||
KC_DB_USERNAME: keycloak
|
KC_DB_USERNAME: keycloak
|
||||||
KC_DB_PASSWORD: keycloak123
|
KC_DB_PASSWORD: keycloak123
|
||||||
KC_HOSTNAME: 192.168.1.145
|
KC_HOSTNAME: 192.168.1.11
|
||||||
KC_HOSTNAME_PORT: 8180
|
KC_HOSTNAME_PORT: 8180
|
||||||
KC_HTTP_ENABLED: true
|
KC_HTTP_ENABLED: true
|
||||||
KC_HTTP_PORT: 8180
|
KC_HTTP_PORT: 8180
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ echo ""
|
|||||||
# Obtenir le token admin
|
# Obtenir le token admin
|
||||||
echo "[INFO] Obtention du token d'administration..."
|
echo "[INFO] Obtention du token d'administration..."
|
||||||
token_response=$(curl -s -X POST \
|
token_response=$(curl -s -X POST \
|
||||||
"http://192.168.1.145:8180/realms/master/protocol/openid-connect/token" \
|
"http://192.168.1.11:8180/realms/master/protocol/openid-connect/token" \
|
||||||
-H "Content-Type: application/x-www-form-urlencoded" \
|
-H "Content-Type: application/x-www-form-urlencoded" \
|
||||||
-d "username=admin&password=admin&grant_type=password&client_id=admin-cli")
|
-d "username=admin&password=admin&grant_type=password&client_id=admin-cli")
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ echo ""
|
|||||||
get_user_id() {
|
get_user_id() {
|
||||||
local username="$1"
|
local username="$1"
|
||||||
local response=$(curl -s -X GET \
|
local response=$(curl -s -X GET \
|
||||||
"http://192.168.1.145:8180/admin/realms/unionflow/users?username=${username}" \
|
"http://192.168.1.11:8180/admin/realms/unionflow/users?username=${username}" \
|
||||||
-H "Authorization: Bearer ${token}")
|
-H "Authorization: Bearer ${token}")
|
||||||
|
|
||||||
echo "$response" | grep -o '"id":"[^"]*' | head -1 | cut -d'"' -f4
|
echo "$response" | grep -o '"id":"[^"]*' | head -1 | cut -d'"' -f4
|
||||||
@@ -51,7 +51,7 @@ reset_password() {
|
|||||||
|
|
||||||
# Réinitialiser le mot de passe
|
# Réinitialiser le mot de passe
|
||||||
local response=$(curl -s -w "%{http_code}" -X PUT \
|
local response=$(curl -s -w "%{http_code}" -X PUT \
|
||||||
"http://192.168.1.145:8180/admin/realms/unionflow/users/${user_id}/reset-password" \
|
"http://192.168.1.11:8180/admin/realms/unionflow/users/${user_id}/reset-password" \
|
||||||
-H "Authorization: Bearer ${token}" \
|
-H "Authorization: Bearer ${token}" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-d "{\"type\":\"password\",\"value\":\"${password}\",\"temporary\":false}")
|
-d "{\"type\":\"password\",\"value\":\"${password}\",\"temporary\":false}")
|
||||||
@@ -101,7 +101,7 @@ if [ $success_count -gt 0 ]; then
|
|||||||
echo "🧪 Test d'authentification avec marie.active..."
|
echo "🧪 Test d'authentification avec marie.active..."
|
||||||
|
|
||||||
auth_response=$(curl -s -X POST \
|
auth_response=$(curl -s -X POST \
|
||||||
"http://192.168.1.145:8180/realms/unionflow/protocol/openid-connect/token" \
|
"http://192.168.1.11:8180/realms/unionflow/protocol/openid-connect/token" \
|
||||||
-H "Content-Type: application/x-www-form-urlencoded" \
|
-H "Content-Type: application/x-www-form-urlencoded" \
|
||||||
-d "username=marie.active&password=Marie123!&grant_type=password&client_id=unionflow-mobile")
|
-d "username=marie.active&password=Marie123!&grant_type=password&client_id=unionflow-mobile")
|
||||||
|
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ class ClientRedirectFixer:
|
|||||||
"redirectUris": [
|
"redirectUris": [
|
||||||
"http://localhost:*",
|
"http://localhost:*",
|
||||||
"http://127.0.0.1:*",
|
"http://127.0.0.1:*",
|
||||||
"http://192.168.1.145:*",
|
"http://192.168.1.11:*",
|
||||||
"unionflow://oauth/callback",
|
"unionflow://oauth/callback",
|
||||||
"unionflow://login",
|
"unionflow://login",
|
||||||
"com.unionflow.mobile://oauth",
|
"com.unionflow.mobile://oauth",
|
||||||
@@ -91,7 +91,7 @@ class ClientRedirectFixer:
|
|||||||
"webOrigins": [
|
"webOrigins": [
|
||||||
"http://localhost",
|
"http://localhost",
|
||||||
"http://127.0.0.1",
|
"http://127.0.0.1",
|
||||||
"http://192.168.1.145",
|
"http://192.168.1.11",
|
||||||
"+"
|
"+"
|
||||||
],
|
],
|
||||||
"notBefore": 0,
|
"notBefore": 0,
|
||||||
@@ -246,7 +246,7 @@ class ClientRedirectFixer:
|
|||||||
print("📱 REDIRECT URIs CONFIGURÉES :")
|
print("📱 REDIRECT URIs CONFIGURÉES :")
|
||||||
print(" • http://localhost:* (pour tests locaux)")
|
print(" • http://localhost:* (pour tests locaux)")
|
||||||
print(" • http://127.0.0.1:* (pour tests locaux)")
|
print(" • http://127.0.0.1:* (pour tests locaux)")
|
||||||
print(" • http://192.168.1.145:* (pour votre réseau)")
|
print(" • http://192.168.1.11:* (pour votre réseau)")
|
||||||
print(" • unionflow://oauth/callback (pour l'app mobile)")
|
print(" • unionflow://oauth/callback (pour l'app mobile)")
|
||||||
print(" • unionflow://login (pour l'app mobile)")
|
print(" • unionflow://login (pour l'app mobile)")
|
||||||
print(" • com.unionflow.mobile://oauth (pour l'app mobile)")
|
print(" • com.unionflow.mobile://oauth (pour l'app mobile)")
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ class CorrectRedirectFixer:
|
|||||||
# Pour les tests locaux
|
# Pour les tests locaux
|
||||||
"http://localhost:*",
|
"http://localhost:*",
|
||||||
"http://127.0.0.1:*",
|
"http://127.0.0.1:*",
|
||||||
"http://192.168.1.145:*",
|
"http://192.168.1.11:*",
|
||||||
# OAuth out-of-band
|
# OAuth out-of-band
|
||||||
"urn:ietf:wg:oauth:2.0:oob"
|
"urn:ietf:wg:oauth:2.0:oob"
|
||||||
],
|
],
|
||||||
@@ -96,7 +96,7 @@ class CorrectRedirectFixer:
|
|||||||
"webOrigins": [
|
"webOrigins": [
|
||||||
"http://localhost",
|
"http://localhost",
|
||||||
"http://127.0.0.1",
|
"http://127.0.0.1",
|
||||||
"http://192.168.1.145",
|
"http://192.168.1.11",
|
||||||
"+"
|
"+"
|
||||||
],
|
],
|
||||||
"notBefore": 0,
|
"notBefore": 0,
|
||||||
@@ -216,7 +216,7 @@ class CorrectRedirectFixer:
|
|||||||
print(" 🎯 dev.lions.unionflow-mobile://auth/callback/*")
|
print(" 🎯 dev.lions.unionflow-mobile://auth/callback/*")
|
||||||
print(" ✓ com.unionflow.mobile://login-callback (compatibilité)")
|
print(" ✓ com.unionflow.mobile://login-callback (compatibilité)")
|
||||||
print(" ✓ http://localhost:* (tests locaux)")
|
print(" ✓ http://localhost:* (tests locaux)")
|
||||||
print(" ✓ http://192.168.1.145:* (votre réseau)")
|
print(" ✓ http://192.168.1.11:* (votre réseau)")
|
||||||
print()
|
print()
|
||||||
print("📱 VOTRE APPLICATION MOBILE PEUT MAINTENANT :")
|
print("📱 VOTRE APPLICATION MOBILE PEUT MAINTENANT :")
|
||||||
print(" • S'authentifier sans erreur de redirect_uri")
|
print(" • S'authentifier sans erreur de redirect_uri")
|
||||||
|
|||||||
43
keycloak_test_app/.gitignore
vendored
@@ -1,43 +0,0 @@
|
|||||||
# Miscellaneous
|
|
||||||
*.class
|
|
||||||
*.log
|
|
||||||
*.pyc
|
|
||||||
*.swp
|
|
||||||
.DS_Store
|
|
||||||
.atom/
|
|
||||||
.buildlog/
|
|
||||||
.history
|
|
||||||
.svn/
|
|
||||||
migrate_working_dir/
|
|
||||||
|
|
||||||
# IntelliJ related
|
|
||||||
*.iml
|
|
||||||
*.ipr
|
|
||||||
*.iws
|
|
||||||
.idea/
|
|
||||||
|
|
||||||
# The .vscode folder contains launch configuration and tasks you configure in
|
|
||||||
# VS Code which you may wish to be included in version control, so this line
|
|
||||||
# is commented out by default.
|
|
||||||
#.vscode/
|
|
||||||
|
|
||||||
# Flutter/Dart/Pub related
|
|
||||||
**/doc/api/
|
|
||||||
**/ios/Flutter/.last_build_id
|
|
||||||
.dart_tool/
|
|
||||||
.flutter-plugins
|
|
||||||
.flutter-plugins-dependencies
|
|
||||||
.pub-cache/
|
|
||||||
.pub/
|
|
||||||
/build/
|
|
||||||
|
|
||||||
# Symbolication related
|
|
||||||
app.*.symbols
|
|
||||||
|
|
||||||
# Obfuscation related
|
|
||||||
app.*.map.json
|
|
||||||
|
|
||||||
# Android Studio will place build artifacts here
|
|
||||||
/android/app/debug
|
|
||||||
/android/app/profile
|
|
||||||
/android/app/release
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
# This file tracks properties of this Flutter project.
|
|
||||||
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
|
||||||
#
|
|
||||||
# This file should be version controlled and should not be manually edited.
|
|
||||||
|
|
||||||
version:
|
|
||||||
revision: "2663184aa79047d0a33a14a3b607954f8fdd8730"
|
|
||||||
channel: "stable"
|
|
||||||
|
|
||||||
project_type: app
|
|
||||||
|
|
||||||
# Tracks metadata for the flutter migrate command
|
|
||||||
migration:
|
|
||||||
platforms:
|
|
||||||
- platform: root
|
|
||||||
create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
|
||||||
base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
|
||||||
- platform: android
|
|
||||||
create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
|
||||||
base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
|
||||||
- platform: ios
|
|
||||||
create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
|
||||||
base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
|
||||||
- platform: linux
|
|
||||||
create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
|
||||||
base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
|
||||||
- platform: macos
|
|
||||||
create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
|
||||||
base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
|
||||||
- platform: web
|
|
||||||
create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
|
||||||
base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
|
||||||
- platform: windows
|
|
||||||
create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
|
||||||
base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
|
|
||||||
|
|
||||||
# User provided section
|
|
||||||
|
|
||||||
# List of Local paths (relative to this file) that should be
|
|
||||||
# ignored by the migrate tool.
|
|
||||||
#
|
|
||||||
# Files that are not part of the templates will be ignored by default.
|
|
||||||
unmanaged_files:
|
|
||||||
- 'lib/main.dart'
|
|
||||||
- 'ios/Runner.xcodeproj/project.pbxproj'
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
# keycloak_test_app
|
|
||||||
|
|
||||||
A new Flutter project.
|
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
This project is a starting point for a Flutter application.
|
|
||||||
|
|
||||||
A few resources to get you started if this is your first Flutter project:
|
|
||||||
|
|
||||||
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
|
|
||||||
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
|
|
||||||
|
|
||||||
For help getting started with Flutter development, view the
|
|
||||||
[online documentation](https://docs.flutter.dev/), which offers tutorials,
|
|
||||||
samples, guidance on mobile development, and a full API reference.
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
# This file configures the analyzer, which statically analyzes Dart code to
|
|
||||||
# check for errors, warnings, and lints.
|
|
||||||
#
|
|
||||||
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
|
|
||||||
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
|
|
||||||
# invoked from the command line by running `flutter analyze`.
|
|
||||||
|
|
||||||
# The following line activates a set of recommended lints for Flutter apps,
|
|
||||||
# packages, and plugins designed to encourage good coding practices.
|
|
||||||
include: package:flutter_lints/flutter.yaml
|
|
||||||
|
|
||||||
linter:
|
|
||||||
# The lint rules applied to this project can be customized in the
|
|
||||||
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
|
|
||||||
# included above or to enable additional rules. A list of all available lints
|
|
||||||
# and their documentation is published at https://dart.dev/lints.
|
|
||||||
#
|
|
||||||
# Instead of disabling a lint rule for the entire project in the
|
|
||||||
# section below, it can also be suppressed for a single line of code
|
|
||||||
# or a specific dart file by using the `// ignore: name_of_lint` and
|
|
||||||
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
|
|
||||||
# producing the lint.
|
|
||||||
rules:
|
|
||||||
# avoid_print: false # Uncomment to disable the `avoid_print` rule
|
|
||||||
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
|
|
||||||
|
|
||||||
# Additional information about this file can be found at
|
|
||||||
# https://dart.dev/guides/language/analysis-options
|
|
||||||
13
keycloak_test_app/android/.gitignore
vendored
@@ -1,13 +0,0 @@
|
|||||||
gradle-wrapper.jar
|
|
||||||
/.gradle
|
|
||||||
/captures/
|
|
||||||
/gradlew
|
|
||||||
/gradlew.bat
|
|
||||||
/local.properties
|
|
||||||
GeneratedPluginRegistrant.java
|
|
||||||
|
|
||||||
# Remember to never publicly share your keystore.
|
|
||||||
# See https://flutter.dev/to/reference-keystore
|
|
||||||
key.properties
|
|
||||||
**/*.keystore
|
|
||||||
**/*.jks
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
plugins {
|
|
||||||
id "com.android.application"
|
|
||||||
id "kotlin-android"
|
|
||||||
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
|
|
||||||
id "dev.flutter.flutter-gradle-plugin"
|
|
||||||
}
|
|
||||||
|
|
||||||
android {
|
|
||||||
namespace = "com.example.keycloak_test_app"
|
|
||||||
compileSdk = flutter.compileSdkVersion
|
|
||||||
ndkVersion = flutter.ndkVersion
|
|
||||||
|
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
|
||||||
}
|
|
||||||
|
|
||||||
kotlinOptions {
|
|
||||||
jvmTarget = JavaVersion.VERSION_1_8
|
|
||||||
}
|
|
||||||
|
|
||||||
defaultConfig {
|
|
||||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
|
||||||
applicationId = "com.example.keycloak_test_app"
|
|
||||||
// You can update the following values to match your application needs.
|
|
||||||
// For more information, see: https://flutter.dev/to/review-gradle-config.
|
|
||||||
minSdk = flutter.minSdkVersion
|
|
||||||
targetSdk = flutter.targetSdkVersion
|
|
||||||
versionCode = flutter.versionCode
|
|
||||||
versionName = flutter.versionName
|
|
||||||
}
|
|
||||||
|
|
||||||
buildTypes {
|
|
||||||
release {
|
|
||||||
// TODO: Add your own signing config for the release build.
|
|
||||||
// Signing with the debug keys for now, so `flutter run --release` works.
|
|
||||||
signingConfig = signingConfigs.debug
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
flutter {
|
|
||||||
source = "../.."
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<!-- The INTERNET permission is required for development. Specifically,
|
|
||||||
the Flutter tool needs it to communicate with the running application
|
|
||||||
to allow setting breakpoints, to provide hot reload, etc.
|
|
||||||
-->
|
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
|
||||||
</manifest>
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<application
|
|
||||||
android:label="keycloak_test_app"
|
|
||||||
android:name="${applicationName}"
|
|
||||||
android:icon="@mipmap/ic_launcher">
|
|
||||||
<activity
|
|
||||||
android:name=".MainActivity"
|
|
||||||
android:exported="true"
|
|
||||||
android:launchMode="singleTop"
|
|
||||||
android:taskAffinity=""
|
|
||||||
android:theme="@style/LaunchTheme"
|
|
||||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
|
||||||
android:hardwareAccelerated="true"
|
|
||||||
android:windowSoftInputMode="adjustResize">
|
|
||||||
<!-- Specifies an Android theme to apply to this Activity as soon as
|
|
||||||
the Android process has started. This theme is visible to the user
|
|
||||||
while the Flutter UI initializes. After that, this theme continues
|
|
||||||
to determine the Window background behind the Flutter UI. -->
|
|
||||||
<meta-data
|
|
||||||
android:name="io.flutter.embedding.android.NormalTheme"
|
|
||||||
android:resource="@style/NormalTheme"
|
|
||||||
/>
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.MAIN"/>
|
|
||||||
<category android:name="android.intent.category.LAUNCHER"/>
|
|
||||||
</intent-filter>
|
|
||||||
</activity>
|
|
||||||
<!-- Don't delete the meta-data below.
|
|
||||||
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
|
||||||
<meta-data
|
|
||||||
android:name="flutterEmbedding"
|
|
||||||
android:value="2" />
|
|
||||||
</application>
|
|
||||||
<!-- Required to query activities that can process text, see:
|
|
||||||
https://developer.android.com/training/package-visibility and
|
|
||||||
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
|
|
||||||
|
|
||||||
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
|
|
||||||
<queries>
|
|
||||||
<intent>
|
|
||||||
<action android:name="android.intent.action.PROCESS_TEXT"/>
|
|
||||||
<data android:mimeType="text/plain"/>
|
|
||||||
</intent>
|
|
||||||
</queries>
|
|
||||||
</manifest>
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
package com.example.keycloak_test_app
|
|
||||||
|
|
||||||
import io.flutter.embedding.android.FlutterActivity
|
|
||||||
|
|
||||||
class MainActivity: FlutterActivity()
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Modify this file to customize your launch splash screen -->
|
|
||||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<item android:drawable="?android:colorBackground" />
|
|
||||||
|
|
||||||
<!-- You can insert your own image assets here -->
|
|
||||||
<!-- <item>
|
|
||||||
<bitmap
|
|
||||||
android:gravity="center"
|
|
||||||
android:src="@mipmap/launch_image" />
|
|
||||||
</item> -->
|
|
||||||
</layer-list>
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Modify this file to customize your launch splash screen -->
|
|
||||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<item android:drawable="@android:color/white" />
|
|
||||||
|
|
||||||
<!-- You can insert your own image assets here -->
|
|
||||||
<!-- <item>
|
|
||||||
<bitmap
|
|
||||||
android:gravity="center"
|
|
||||||
android:src="@mipmap/launch_image" />
|
|
||||||
</item> -->
|
|
||||||
</layer-list>
|
|
||||||
|
Before Width: | Height: | Size: 544 B |
|
Before Width: | Height: | Size: 442 B |
|
Before Width: | Height: | Size: 721 B |
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
@@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
|
|
||||||
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
|
||||||
<!-- Show a splash screen on the activity. Automatically removed when
|
|
||||||
the Flutter engine draws its first frame -->
|
|
||||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
|
||||||
</style>
|
|
||||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
|
||||||
This theme determines the color of the Android Window while your
|
|
||||||
Flutter UI initializes, as well as behind your Flutter UI while its
|
|
||||||
running.
|
|
||||||
|
|
||||||
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
|
||||||
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
|
||||||
<item name="android:windowBackground">?android:colorBackground</item>
|
|
||||||
</style>
|
|
||||||
</resources>
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
|
|
||||||
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
|
||||||
<!-- Show a splash screen on the activity. Automatically removed when
|
|
||||||
the Flutter engine draws its first frame -->
|
|
||||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
|
||||||
</style>
|
|
||||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
|
||||||
This theme determines the color of the Android Window while your
|
|
||||||
Flutter UI initializes, as well as behind your Flutter UI while its
|
|
||||||
running.
|
|
||||||
|
|
||||||
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
|
||||||
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
|
||||||
<item name="android:windowBackground">?android:colorBackground</item>
|
|
||||||
</style>
|
|
||||||
</resources>
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<!-- The INTERNET permission is required for development. Specifically,
|
|
||||||
the Flutter tool needs it to communicate with the running application
|
|
||||||
to allow setting breakpoints, to provide hot reload, etc.
|
|
||||||
-->
|
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
|
||||||
</manifest>
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
allprojects {
|
|
||||||
repositories {
|
|
||||||
google()
|
|
||||||
mavenCentral()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rootProject.buildDir = "../build"
|
|
||||||
subprojects {
|
|
||||||
project.buildDir = "${rootProject.buildDir}/${project.name}"
|
|
||||||
}
|
|
||||||
subprojects {
|
|
||||||
project.evaluationDependsOn(":app")
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.register("clean", Delete) {
|
|
||||||
delete rootProject.buildDir
|
|
||||||
}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError
|
|
||||||
android.useAndroidX=true
|
|
||||||
android.enableJetifier=true
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
|
||||||
distributionPath=wrapper/dists
|
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
|
||||||
zipStorePath=wrapper/dists
|
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
pluginManagement {
|
|
||||||
def flutterSdkPath = {
|
|
||||||
def properties = new Properties()
|
|
||||||
file("local.properties").withInputStream { properties.load(it) }
|
|
||||||
def flutterSdkPath = properties.getProperty("flutter.sdk")
|
|
||||||
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
|
|
||||||
return flutterSdkPath
|
|
||||||
}()
|
|
||||||
|
|
||||||
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
|
|
||||||
|
|
||||||
repositories {
|
|
||||||
google()
|
|
||||||
mavenCentral()
|
|
||||||
gradlePluginPortal()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
plugins {
|
|
||||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
|
||||||
id "com.android.application" version "8.1.0" apply false
|
|
||||||
id "org.jetbrains.kotlin.android" version "1.8.22" apply false
|
|
||||||
}
|
|
||||||
|
|
||||||
include ":app"
|
|
||||||
34
keycloak_test_app/ios/.gitignore
vendored
@@ -1,34 +0,0 @@
|
|||||||
**/dgph
|
|
||||||
*.mode1v3
|
|
||||||
*.mode2v3
|
|
||||||
*.moved-aside
|
|
||||||
*.pbxuser
|
|
||||||
*.perspectivev3
|
|
||||||
**/*sync/
|
|
||||||
.sconsign.dblite
|
|
||||||
.tags*
|
|
||||||
**/.vagrant/
|
|
||||||
**/DerivedData/
|
|
||||||
Icon?
|
|
||||||
**/Pods/
|
|
||||||
**/.symlinks/
|
|
||||||
profile
|
|
||||||
xcuserdata
|
|
||||||
**/.generated/
|
|
||||||
Flutter/App.framework
|
|
||||||
Flutter/Flutter.framework
|
|
||||||
Flutter/Flutter.podspec
|
|
||||||
Flutter/Generated.xcconfig
|
|
||||||
Flutter/ephemeral/
|
|
||||||
Flutter/app.flx
|
|
||||||
Flutter/app.zip
|
|
||||||
Flutter/flutter_assets/
|
|
||||||
Flutter/flutter_export_environment.sh
|
|
||||||
ServiceDefinitions.json
|
|
||||||
Runner/GeneratedPluginRegistrant.*
|
|
||||||
|
|
||||||
# Exceptions to above rules.
|
|
||||||
!default.mode1v3
|
|
||||||
!default.mode2v3
|
|
||||||
!default.pbxuser
|
|
||||||
!default.perspectivev3
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
|
||||||
<string>en</string>
|
|
||||||
<key>CFBundleExecutable</key>
|
|
||||||
<string>App</string>
|
|
||||||
<key>CFBundleIdentifier</key>
|
|
||||||
<string>io.flutter.flutter.app</string>
|
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
|
||||||
<string>6.0</string>
|
|
||||||
<key>CFBundleName</key>
|
|
||||||
<string>App</string>
|
|
||||||
<key>CFBundlePackageType</key>
|
|
||||||
<string>FMWK</string>
|
|
||||||
<key>CFBundleShortVersionString</key>
|
|
||||||
<string>1.0</string>
|
|
||||||
<key>CFBundleSignature</key>
|
|
||||||
<string>????</string>
|
|
||||||
<key>CFBundleVersion</key>
|
|
||||||
<string>1.0</string>
|
|
||||||
<key>MinimumOSVersion</key>
|
|
||||||
<string>12.0</string>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
#include "Generated.xcconfig"
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
#include "Generated.xcconfig"
|
|
||||||
@@ -1,616 +0,0 @@
|
|||||||
// !$*UTF8*$!
|
|
||||||
{
|
|
||||||
archiveVersion = 1;
|
|
||||||
classes = {
|
|
||||||
};
|
|
||||||
objectVersion = 54;
|
|
||||||
objects = {
|
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
|
||||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
|
||||||
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
|
|
||||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
|
||||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
|
||||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
|
||||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
|
||||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
|
||||||
/* End PBXBuildFile section */
|
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
|
||||||
331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
|
|
||||||
isa = PBXContainerItemProxy;
|
|
||||||
containerPortal = 97C146E61CF9000F007C117D /* Project object */;
|
|
||||||
proxyType = 1;
|
|
||||||
remoteGlobalIDString = 97C146ED1CF9000F007C117D;
|
|
||||||
remoteInfo = Runner;
|
|
||||||
};
|
|
||||||
/* End PBXContainerItemProxy section */
|
|
||||||
|
|
||||||
/* Begin PBXCopyFilesBuildPhase section */
|
|
||||||
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
|
|
||||||
isa = PBXCopyFilesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
dstPath = "";
|
|
||||||
dstSubfolderSpec = 10;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
name = "Embed Frameworks";
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXCopyFilesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
|
||||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
|
|
||||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
|
|
||||||
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
|
|
||||||
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
|
||||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
|
||||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
|
||||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
|
||||||
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
|
|
||||||
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
|
|
||||||
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
|
|
||||||
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
|
||||||
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
|
||||||
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
|
||||||
/* End PBXFileReference section */
|
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
|
||||||
97C146EB1CF9000F007C117D /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXFrameworksBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
|
||||||
331C8082294A63A400263BE5 /* RunnerTests */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
331C807B294A618700263BE5 /* RunnerTests.swift */,
|
|
||||||
);
|
|
||||||
path = RunnerTests;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
9740EEB11CF90186004384FC /* Flutter */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
|
|
||||||
9740EEB21CF90195004384FC /* Debug.xcconfig */,
|
|
||||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
|
|
||||||
9740EEB31CF90195004384FC /* Generated.xcconfig */,
|
|
||||||
);
|
|
||||||
name = Flutter;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
97C146E51CF9000F007C117D = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
9740EEB11CF90186004384FC /* Flutter */,
|
|
||||||
97C146F01CF9000F007C117D /* Runner */,
|
|
||||||
97C146EF1CF9000F007C117D /* Products */,
|
|
||||||
331C8082294A63A400263BE5 /* RunnerTests */,
|
|
||||||
);
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
97C146EF1CF9000F007C117D /* Products */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
97C146EE1CF9000F007C117D /* Runner.app */,
|
|
||||||
331C8081294A63A400263BE5 /* RunnerTests.xctest */,
|
|
||||||
);
|
|
||||||
name = Products;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
97C146F01CF9000F007C117D /* Runner */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
97C146FA1CF9000F007C117D /* Main.storyboard */,
|
|
||||||
97C146FD1CF9000F007C117D /* Assets.xcassets */,
|
|
||||||
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
|
|
||||||
97C147021CF9000F007C117D /* Info.plist */,
|
|
||||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
|
|
||||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
|
|
||||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
|
|
||||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
|
|
||||||
);
|
|
||||||
path = Runner;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXGroup section */
|
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
|
||||||
331C8080294A63A400263BE5 /* RunnerTests */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
|
|
||||||
buildPhases = (
|
|
||||||
331C807D294A63A400263BE5 /* Sources */,
|
|
||||||
331C807F294A63A400263BE5 /* Resources */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
331C8086294A63A400263BE5 /* PBXTargetDependency */,
|
|
||||||
);
|
|
||||||
name = RunnerTests;
|
|
||||||
productName = RunnerTests;
|
|
||||||
productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
|
|
||||||
productType = "com.apple.product-type.bundle.unit-test";
|
|
||||||
};
|
|
||||||
97C146ED1CF9000F007C117D /* Runner */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
|
||||||
buildPhases = (
|
|
||||||
9740EEB61CF901F6004384FC /* Run Script */,
|
|
||||||
97C146EA1CF9000F007C117D /* Sources */,
|
|
||||||
97C146EB1CF9000F007C117D /* Frameworks */,
|
|
||||||
97C146EC1CF9000F007C117D /* Resources */,
|
|
||||||
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
|
||||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = Runner;
|
|
||||||
productName = Runner;
|
|
||||||
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
|
|
||||||
productType = "com.apple.product-type.application";
|
|
||||||
};
|
|
||||||
/* End PBXNativeTarget section */
|
|
||||||
|
|
||||||
/* Begin PBXProject section */
|
|
||||||
97C146E61CF9000F007C117D /* Project object */ = {
|
|
||||||
isa = PBXProject;
|
|
||||||
attributes = {
|
|
||||||
BuildIndependentTargetsInParallel = YES;
|
|
||||||
LastUpgradeCheck = 1510;
|
|
||||||
ORGANIZATIONNAME = "";
|
|
||||||
TargetAttributes = {
|
|
||||||
331C8080294A63A400263BE5 = {
|
|
||||||
CreatedOnToolsVersion = 14.0;
|
|
||||||
TestTargetID = 97C146ED1CF9000F007C117D;
|
|
||||||
};
|
|
||||||
97C146ED1CF9000F007C117D = {
|
|
||||||
CreatedOnToolsVersion = 7.3.1;
|
|
||||||
LastSwiftMigration = 1100;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
|
|
||||||
compatibilityVersion = "Xcode 9.3";
|
|
||||||
developmentRegion = en;
|
|
||||||
hasScannedForEncodings = 0;
|
|
||||||
knownRegions = (
|
|
||||||
en,
|
|
||||||
Base,
|
|
||||||
);
|
|
||||||
mainGroup = 97C146E51CF9000F007C117D;
|
|
||||||
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
|
|
||||||
projectDirPath = "";
|
|
||||||
projectRoot = "";
|
|
||||||
targets = (
|
|
||||||
97C146ED1CF9000F007C117D /* Runner */,
|
|
||||||
331C8080294A63A400263BE5 /* RunnerTests */,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
/* End PBXProject section */
|
|
||||||
|
|
||||||
/* Begin PBXResourcesBuildPhase section */
|
|
||||||
331C807F294A63A400263BE5 /* Resources */ = {
|
|
||||||
isa = PBXResourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
97C146EC1CF9000F007C117D /* Resources */ = {
|
|
||||||
isa = PBXResourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
|
|
||||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
|
|
||||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
|
|
||||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXResourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXShellScriptBuildPhase section */
|
|
||||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
alwaysOutOfDate = 1;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
|
|
||||||
);
|
|
||||||
name = "Thin Binary";
|
|
||||||
outputPaths = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
|
|
||||||
};
|
|
||||||
9740EEB61CF901F6004384FC /* Run Script */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
alwaysOutOfDate = 1;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
);
|
|
||||||
name = "Run Script";
|
|
||||||
outputPaths = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
|
|
||||||
};
|
|
||||||
/* End PBXShellScriptBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
|
||||||
331C807D294A63A400263BE5 /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
97C146EA1CF9000F007C117D /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
|
|
||||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXSourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXTargetDependency section */
|
|
||||||
331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
|
|
||||||
isa = PBXTargetDependency;
|
|
||||||
target = 97C146ED1CF9000F007C117D /* Runner */;
|
|
||||||
targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
|
|
||||||
};
|
|
||||||
/* End PBXTargetDependency section */
|
|
||||||
|
|
||||||
/* Begin PBXVariantGroup section */
|
|
||||||
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
97C146FB1CF9000F007C117D /* Base */,
|
|
||||||
);
|
|
||||||
name = Main.storyboard;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
97C147001CF9000F007C117D /* Base */,
|
|
||||||
);
|
|
||||||
name = LaunchScreen.storyboard;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXVariantGroup section */
|
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
|
||||||
249021D3217E4FDB00AE95B9 /* Profile */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_COMMA = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
|
||||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
||||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
|
||||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
|
||||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
|
||||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
|
||||||
ENABLE_USER_SCRIPT_SANDBOXING = NO;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
||||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
|
||||||
SDKROOT = iphoneos;
|
|
||||||
SUPPORTED_PLATFORMS = iphoneos;
|
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
|
||||||
VALIDATE_PRODUCT = YES;
|
|
||||||
};
|
|
||||||
name = Profile;
|
|
||||||
};
|
|
||||||
249021D4217E4FDB00AE95B9 /* Profile */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
|
||||||
ENABLE_BITCODE = NO;
|
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/Frameworks",
|
|
||||||
);
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.keycloakTestApp;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
|
||||||
};
|
|
||||||
name = Profile;
|
|
||||||
};
|
|
||||||
331C8088294A63A400263BE5 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
|
||||||
MARKETING_VERSION = 1.0;
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.keycloakTestApp.RunnerTests;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
331C8089294A63A400263BE5 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
|
||||||
MARKETING_VERSION = 1.0;
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.keycloakTestApp.RunnerTests;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
331C808A294A63A400263BE5 /* Profile */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
|
||||||
MARKETING_VERSION = 1.0;
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.keycloakTestApp.RunnerTests;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
|
|
||||||
};
|
|
||||||
name = Profile;
|
|
||||||
};
|
|
||||||
97C147031CF9000F007C117D /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_COMMA = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
|
||||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
||||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
|
||||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
|
||||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
|
||||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
|
||||||
ENABLE_TESTABILITY = YES;
|
|
||||||
ENABLE_USER_SCRIPT_SANDBOXING = NO;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
|
||||||
"DEBUG=1",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
||||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
|
||||||
MTL_ENABLE_DEBUG_INFO = YES;
|
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
|
||||||
SDKROOT = iphoneos;
|
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
97C147041CF9000F007C117D /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_COMMA = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
|
||||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
||||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
|
||||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
|
||||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
|
||||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
|
||||||
ENABLE_USER_SCRIPT_SANDBOXING = NO;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
||||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
|
||||||
SDKROOT = iphoneos;
|
|
||||||
SUPPORTED_PLATFORMS = iphoneos;
|
|
||||||
SWIFT_COMPILATION_MODE = wholemodule;
|
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
|
||||||
VALIDATE_PRODUCT = YES;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
97C147061CF9000F007C117D /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
|
||||||
ENABLE_BITCODE = NO;
|
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/Frameworks",
|
|
||||||
);
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.keycloakTestApp;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
97C147071CF9000F007C117D /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
|
||||||
ENABLE_BITCODE = NO;
|
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/Frameworks",
|
|
||||||
);
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.keycloakTestApp;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
/* End XCBuildConfiguration section */
|
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
|
||||||
331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
331C8088294A63A400263BE5 /* Debug */,
|
|
||||||
331C8089294A63A400263BE5 /* Release */,
|
|
||||||
331C808A294A63A400263BE5 /* Profile */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
97C147031CF9000F007C117D /* Debug */,
|
|
||||||
97C147041CF9000F007C117D /* Release */,
|
|
||||||
249021D3217E4FDB00AE95B9 /* Profile */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
97C147061CF9000F007C117D /* Debug */,
|
|
||||||
97C147071CF9000F007C117D /* Release */,
|
|
||||||
249021D4217E4FDB00AE95B9 /* Profile */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
/* End XCConfigurationList section */
|
|
||||||
};
|
|
||||||
rootObject = 97C146E61CF9000F007C117D /* Project object */;
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Workspace
|
|
||||||
version = "1.0">
|
|
||||||
<FileRef
|
|
||||||
location = "self:">
|
|
||||||
</FileRef>
|
|
||||||
</Workspace>
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>IDEDidComputeMac32BitWarning</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>PreviewsEnabled</key>
|
|
||||||
<false/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
@@ -1,98 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Scheme
|
|
||||||
LastUpgradeVersion = "1510"
|
|
||||||
version = "1.3">
|
|
||||||
<BuildAction
|
|
||||||
parallelizeBuildables = "YES"
|
|
||||||
buildImplicitDependencies = "YES">
|
|
||||||
<BuildActionEntries>
|
|
||||||
<BuildActionEntry
|
|
||||||
buildForTesting = "YES"
|
|
||||||
buildForRunning = "YES"
|
|
||||||
buildForProfiling = "YES"
|
|
||||||
buildForArchiving = "YES"
|
|
||||||
buildForAnalyzing = "YES">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
|
||||||
BuildableName = "Runner.app"
|
|
||||||
BlueprintName = "Runner"
|
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</BuildActionEntry>
|
|
||||||
</BuildActionEntries>
|
|
||||||
</BuildAction>
|
|
||||||
<TestAction
|
|
||||||
buildConfiguration = "Debug"
|
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
|
||||||
<MacroExpansion>
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
|
||||||
BuildableName = "Runner.app"
|
|
||||||
BlueprintName = "Runner"
|
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</MacroExpansion>
|
|
||||||
<Testables>
|
|
||||||
<TestableReference
|
|
||||||
skipped = "NO"
|
|
||||||
parallelizable = "YES">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "331C8080294A63A400263BE5"
|
|
||||||
BuildableName = "RunnerTests.xctest"
|
|
||||||
BlueprintName = "RunnerTests"
|
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</TestableReference>
|
|
||||||
</Testables>
|
|
||||||
</TestAction>
|
|
||||||
<LaunchAction
|
|
||||||
buildConfiguration = "Debug"
|
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
||||||
launchStyle = "0"
|
|
||||||
useCustomWorkingDirectory = "NO"
|
|
||||||
ignoresPersistentStateOnLaunch = "NO"
|
|
||||||
debugDocumentVersioning = "YES"
|
|
||||||
debugServiceExtension = "internal"
|
|
||||||
allowLocationSimulation = "YES">
|
|
||||||
<BuildableProductRunnable
|
|
||||||
runnableDebuggingMode = "0">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
|
||||||
BuildableName = "Runner.app"
|
|
||||||
BlueprintName = "Runner"
|
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</BuildableProductRunnable>
|
|
||||||
</LaunchAction>
|
|
||||||
<ProfileAction
|
|
||||||
buildConfiguration = "Profile"
|
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
||||||
savedToolIdentifier = ""
|
|
||||||
useCustomWorkingDirectory = "NO"
|
|
||||||
debugDocumentVersioning = "YES">
|
|
||||||
<BuildableProductRunnable
|
|
||||||
runnableDebuggingMode = "0">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
|
||||||
BuildableName = "Runner.app"
|
|
||||||
BlueprintName = "Runner"
|
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</BuildableProductRunnable>
|
|
||||||
</ProfileAction>
|
|
||||||
<AnalyzeAction
|
|
||||||
buildConfiguration = "Debug">
|
|
||||||
</AnalyzeAction>
|
|
||||||
<ArchiveAction
|
|
||||||
buildConfiguration = "Release"
|
|
||||||
revealArchiveInOrganizer = "YES">
|
|
||||||
</ArchiveAction>
|
|
||||||
</Scheme>
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Workspace
|
|
||||||
version = "1.0">
|
|
||||||
<FileRef
|
|
||||||
location = "group:Runner.xcodeproj">
|
|
||||||
</FileRef>
|
|
||||||
</Workspace>
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>IDEDidComputeMac32BitWarning</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>PreviewsEnabled</key>
|
|
||||||
<false/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
import Flutter
|
|
||||||
import UIKit
|
|
||||||
|
|
||||||
@main
|
|
||||||
@objc class AppDelegate: FlutterAppDelegate {
|
|
||||||
override func application(
|
|
||||||
_ application: UIApplication,
|
|
||||||
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
|
||||||
) -> Bool {
|
|
||||||
GeneratedPluginRegistrant.register(with: self)
|
|
||||||
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,122 +0,0 @@
|
|||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"size" : "20x20",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-20x20@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "20x20",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-20x20@3x.png",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-29x29@1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-29x29@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-29x29@3x.png",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "40x40",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-40x40@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "40x40",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-40x40@3x.png",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "60x60",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-60x60@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "60x60",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-60x60@3x.png",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "20x20",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-20x20@1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "20x20",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-20x20@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-29x29@1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-29x29@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "40x40",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-40x40@1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "40x40",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-40x40@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "76x76",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-76x76@1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "76x76",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-76x76@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "83.5x83.5",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-83.5x83.5@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "1024x1024",
|
|
||||||
"idiom" : "ios-marketing",
|
|
||||||
"filename" : "Icon-App-1024x1024@1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 295 B |
|
Before Width: | Height: | Size: 406 B |
|
Before Width: | Height: | Size: 450 B |
|
Before Width: | Height: | Size: 282 B |
|
Before Width: | Height: | Size: 462 B |
|
Before Width: | Height: | Size: 704 B |
|
Before Width: | Height: | Size: 406 B |
|
Before Width: | Height: | Size: 586 B |
|
Before Width: | Height: | Size: 862 B |
|
Before Width: | Height: | Size: 862 B |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 762 B |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
@@ -1,23 +0,0 @@
|
|||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "LaunchImage.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "LaunchImage@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"idiom" : "universal",
|
|
||||||
"filename" : "LaunchImage@3x.png",
|
|
||||||
"scale" : "3x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 68 B |
|
Before Width: | Height: | Size: 68 B |
|
Before Width: | Height: | Size: 68 B |
@@ -1,5 +0,0 @@
|
|||||||
# Launch Screen Assets
|
|
||||||
|
|
||||||
You can customize the launch screen with your own desired assets by replacing the image files in this directory.
|
|
||||||
|
|
||||||
You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
|
||||||
<dependencies>
|
|
||||||
<deployment identifier="iOS"/>
|
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
|
|
||||||
</dependencies>
|
|
||||||
<scenes>
|
|
||||||
<!--View Controller-->
|
|
||||||
<scene sceneID="EHf-IW-A2E">
|
|
||||||
<objects>
|
|
||||||
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
|
|
||||||
<layoutGuides>
|
|
||||||
<viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
|
|
||||||
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
|
|
||||||
</layoutGuides>
|
|
||||||
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
|
||||||
<subviews>
|
|
||||||
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
|
|
||||||
</imageView>
|
|
||||||
</subviews>
|
|
||||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
|
|
||||||
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
|
|
||||||
</constraints>
|
|
||||||
</view>
|
|
||||||
</viewController>
|
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
|
||||||
</objects>
|
|
||||||
<point key="canvasLocation" x="53" y="375"/>
|
|
||||||
</scene>
|
|
||||||
</scenes>
|
|
||||||
<resources>
|
|
||||||
<image name="LaunchImage" width="168" height="185"/>
|
|
||||||
</resources>
|
|
||||||
</document>
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
|
|
||||||
<dependencies>
|
|
||||||
<deployment identifier="iOS"/>
|
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
|
|
||||||
</dependencies>
|
|
||||||
<scenes>
|
|
||||||
<!--Flutter View Controller-->
|
|
||||||
<scene sceneID="tne-QT-ifu">
|
|
||||||
<objects>
|
|
||||||
<viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
|
|
||||||
<layoutGuides>
|
|
||||||
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
|
|
||||||
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
|
|
||||||
</layoutGuides>
|
|
||||||
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
|
||||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
|
||||||
</view>
|
|
||||||
</viewController>
|
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
|
|
||||||
</objects>
|
|
||||||
</scene>
|
|
||||||
</scenes>
|
|
||||||
</document>
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
|
||||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
|
||||||
<key>CFBundleDisplayName</key>
|
|
||||||
<string>Keycloak Test App</string>
|
|
||||||
<key>CFBundleExecutable</key>
|
|
||||||
<string>$(EXECUTABLE_NAME)</string>
|
|
||||||
<key>CFBundleIdentifier</key>
|
|
||||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
|
||||||
<string>6.0</string>
|
|
||||||
<key>CFBundleName</key>
|
|
||||||
<string>keycloak_test_app</string>
|
|
||||||
<key>CFBundlePackageType</key>
|
|
||||||
<string>APPL</string>
|
|
||||||
<key>CFBundleShortVersionString</key>
|
|
||||||
<string>$(FLUTTER_BUILD_NAME)</string>
|
|
||||||
<key>CFBundleSignature</key>
|
|
||||||
<string>????</string>
|
|
||||||
<key>CFBundleVersion</key>
|
|
||||||
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
|
||||||
<key>LSRequiresIPhoneOS</key>
|
|
||||||
<true/>
|
|
||||||
<key>UILaunchStoryboardName</key>
|
|
||||||
<string>LaunchScreen</string>
|
|
||||||
<key>UIMainStoryboardFile</key>
|
|
||||||
<string>Main</string>
|
|
||||||
<key>UISupportedInterfaceOrientations</key>
|
|
||||||
<array>
|
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
|
||||||
</array>
|
|
||||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
|
||||||
<array>
|
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
|
||||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
|
||||||
</array>
|
|
||||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
|
||||||
<true/>
|
|
||||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
#import "GeneratedPluginRegistrant.h"
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
import Flutter
|
|
||||||
import UIKit
|
|
||||||
import XCTest
|
|
||||||
|
|
||||||
class RunnerTests: XCTestCase {
|
|
||||||
|
|
||||||
func testExample() {
|
|
||||||
// If you add code to the Runner application, consider adding tests here.
|
|
||||||
// See https://developer.apple.com/documentation/xctest for more information about using XCTest.
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
1
keycloak_test_app/linux/.gitignore
vendored
@@ -1 +0,0 @@
|
|||||||
flutter/ephemeral
|
|
||||||
@@ -1,145 +0,0 @@
|
|||||||
# Project-level configuration.
|
|
||||||
cmake_minimum_required(VERSION 3.10)
|
|
||||||
project(runner LANGUAGES CXX)
|
|
||||||
|
|
||||||
# The name of the executable created for the application. Change this to change
|
|
||||||
# the on-disk name of your application.
|
|
||||||
set(BINARY_NAME "keycloak_test_app")
|
|
||||||
# The unique GTK application identifier for this application. See:
|
|
||||||
# https://wiki.gnome.org/HowDoI/ChooseApplicationID
|
|
||||||
set(APPLICATION_ID "com.example.keycloak_test_app")
|
|
||||||
|
|
||||||
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
|
|
||||||
# versions of CMake.
|
|
||||||
cmake_policy(SET CMP0063 NEW)
|
|
||||||
|
|
||||||
# Load bundled libraries from the lib/ directory relative to the binary.
|
|
||||||
set(CMAKE_INSTALL_RPATH "$ORIGIN/lib")
|
|
||||||
|
|
||||||
# Root filesystem for cross-building.
|
|
||||||
if(FLUTTER_TARGET_PLATFORM_SYSROOT)
|
|
||||||
set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT})
|
|
||||||
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
|
|
||||||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
|
||||||
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
|
|
||||||
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
|
||||||
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Define build configuration options.
|
|
||||||
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|
||||||
set(CMAKE_BUILD_TYPE "Debug" CACHE
|
|
||||||
STRING "Flutter build mode" FORCE)
|
|
||||||
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
|
|
||||||
"Debug" "Profile" "Release")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Compilation settings that should be applied to most targets.
|
|
||||||
#
|
|
||||||
# Be cautious about adding new options here, as plugins use this function by
|
|
||||||
# default. In most cases, you should add new options to specific targets instead
|
|
||||||
# of modifying this function.
|
|
||||||
function(APPLY_STANDARD_SETTINGS TARGET)
|
|
||||||
target_compile_features(${TARGET} PUBLIC cxx_std_14)
|
|
||||||
target_compile_options(${TARGET} PRIVATE -Wall -Werror)
|
|
||||||
target_compile_options(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:-O3>")
|
|
||||||
target_compile_definitions(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:NDEBUG>")
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
# Flutter library and tool build rules.
|
|
||||||
set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
|
|
||||||
add_subdirectory(${FLUTTER_MANAGED_DIR})
|
|
||||||
|
|
||||||
# System-level dependencies.
|
|
||||||
find_package(PkgConfig REQUIRED)
|
|
||||||
pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
|
|
||||||
|
|
||||||
add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}")
|
|
||||||
|
|
||||||
# Define the application target. To change its name, change BINARY_NAME above,
|
|
||||||
# not the value here, or `flutter run` will no longer work.
|
|
||||||
#
|
|
||||||
# Any new source files that you add to the application should be added here.
|
|
||||||
add_executable(${BINARY_NAME}
|
|
||||||
"main.cc"
|
|
||||||
"my_application.cc"
|
|
||||||
"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Apply the standard set of build settings. This can be removed for applications
|
|
||||||
# that need different build settings.
|
|
||||||
apply_standard_settings(${BINARY_NAME})
|
|
||||||
|
|
||||||
# Add dependency libraries. Add any application-specific dependencies here.
|
|
||||||
target_link_libraries(${BINARY_NAME} PRIVATE flutter)
|
|
||||||
target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)
|
|
||||||
|
|
||||||
# Run the Flutter tool portions of the build. This must not be removed.
|
|
||||||
add_dependencies(${BINARY_NAME} flutter_assemble)
|
|
||||||
|
|
||||||
# Only the install-generated bundle's copy of the executable will launch
|
|
||||||
# correctly, since the resources must in the right relative locations. To avoid
|
|
||||||
# people trying to run the unbundled copy, put it in a subdirectory instead of
|
|
||||||
# the default top-level location.
|
|
||||||
set_target_properties(${BINARY_NAME}
|
|
||||||
PROPERTIES
|
|
||||||
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# Generated plugin build rules, which manage building the plugins and adding
|
|
||||||
# them to the application.
|
|
||||||
include(flutter/generated_plugins.cmake)
|
|
||||||
|
|
||||||
|
|
||||||
# === Installation ===
|
|
||||||
# By default, "installing" just makes a relocatable bundle in the build
|
|
||||||
# directory.
|
|
||||||
set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle")
|
|
||||||
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
|
||||||
set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Start with a clean build bundle directory every time.
|
|
||||||
install(CODE "
|
|
||||||
file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\")
|
|
||||||
" COMPONENT Runtime)
|
|
||||||
|
|
||||||
set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
|
|
||||||
set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib")
|
|
||||||
|
|
||||||
install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
|
|
||||||
COMPONENT Runtime)
|
|
||||||
|
|
||||||
install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
|
|
||||||
COMPONENT Runtime)
|
|
||||||
|
|
||||||
install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
|
|
||||||
COMPONENT Runtime)
|
|
||||||
|
|
||||||
foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES})
|
|
||||||
install(FILES "${bundled_library}"
|
|
||||||
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
|
|
||||||
COMPONENT Runtime)
|
|
||||||
endforeach(bundled_library)
|
|
||||||
|
|
||||||
# Copy the native assets provided by the build.dart from all packages.
|
|
||||||
set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/")
|
|
||||||
install(DIRECTORY "${NATIVE_ASSETS_DIR}"
|
|
||||||
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
|
|
||||||
COMPONENT Runtime)
|
|
||||||
|
|
||||||
# Fully re-copy the assets directory on each build to avoid having stale files
|
|
||||||
# from a previous install.
|
|
||||||
set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
|
|
||||||
install(CODE "
|
|
||||||
file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
|
|
||||||
" COMPONENT Runtime)
|
|
||||||
install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
|
|
||||||
DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
|
|
||||||
|
|
||||||
# Install the AOT library on non-Debug builds only.
|
|
||||||
if(NOT CMAKE_BUILD_TYPE MATCHES "Debug")
|
|
||||||
install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
|
|
||||||
COMPONENT Runtime)
|
|
||||||
endif()
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
# This file controls Flutter-level build steps. It should not be edited.
|
|
||||||
cmake_minimum_required(VERSION 3.10)
|
|
||||||
|
|
||||||
set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
|
|
||||||
|
|
||||||
# Configuration provided via flutter tool.
|
|
||||||
include(${EPHEMERAL_DIR}/generated_config.cmake)
|
|
||||||
|
|
||||||
# TODO: Move the rest of this into files in ephemeral. See
|
|
||||||
# https://github.com/flutter/flutter/issues/57146.
|
|
||||||
|
|
||||||
# Serves the same purpose as list(TRANSFORM ... PREPEND ...),
|
|
||||||
# which isn't available in 3.10.
|
|
||||||
function(list_prepend LIST_NAME PREFIX)
|
|
||||||
set(NEW_LIST "")
|
|
||||||
foreach(element ${${LIST_NAME}})
|
|
||||||
list(APPEND NEW_LIST "${PREFIX}${element}")
|
|
||||||
endforeach(element)
|
|
||||||
set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE)
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
# === Flutter Library ===
|
|
||||||
# System-level dependencies.
|
|
||||||
find_package(PkgConfig REQUIRED)
|
|
||||||
pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
|
|
||||||
pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0)
|
|
||||||
pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0)
|
|
||||||
|
|
||||||
set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so")
|
|
||||||
|
|
||||||
# Published to parent scope for install step.
|
|
||||||
set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)
|
|
||||||
set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE)
|
|
||||||
set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE)
|
|
||||||
set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE)
|
|
||||||
|
|
||||||
list(APPEND FLUTTER_LIBRARY_HEADERS
|
|
||||||
"fl_basic_message_channel.h"
|
|
||||||
"fl_binary_codec.h"
|
|
||||||
"fl_binary_messenger.h"
|
|
||||||
"fl_dart_project.h"
|
|
||||||
"fl_engine.h"
|
|
||||||
"fl_json_message_codec.h"
|
|
||||||
"fl_json_method_codec.h"
|
|
||||||
"fl_message_codec.h"
|
|
||||||
"fl_method_call.h"
|
|
||||||
"fl_method_channel.h"
|
|
||||||
"fl_method_codec.h"
|
|
||||||
"fl_method_response.h"
|
|
||||||
"fl_plugin_registrar.h"
|
|
||||||
"fl_plugin_registry.h"
|
|
||||||
"fl_standard_message_codec.h"
|
|
||||||
"fl_standard_method_codec.h"
|
|
||||||
"fl_string_codec.h"
|
|
||||||
"fl_value.h"
|
|
||||||
"fl_view.h"
|
|
||||||
"flutter_linux.h"
|
|
||||||
)
|
|
||||||
list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/")
|
|
||||||
add_library(flutter INTERFACE)
|
|
||||||
target_include_directories(flutter INTERFACE
|
|
||||||
"${EPHEMERAL_DIR}"
|
|
||||||
)
|
|
||||||
target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}")
|
|
||||||
target_link_libraries(flutter INTERFACE
|
|
||||||
PkgConfig::GTK
|
|
||||||
PkgConfig::GLIB
|
|
||||||
PkgConfig::GIO
|
|
||||||
)
|
|
||||||
add_dependencies(flutter flutter_assemble)
|
|
||||||
|
|
||||||
# === Flutter tool backend ===
|
|
||||||
# _phony_ is a non-existent file to force this command to run every time,
|
|
||||||
# since currently there's no way to get a full input/output list from the
|
|
||||||
# flutter tool.
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/_phony_
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E env
|
|
||||||
${FLUTTER_TOOL_ENVIRONMENT}
|
|
||||||
"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh"
|
|
||||||
${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE}
|
|
||||||
VERBATIM
|
|
||||||
)
|
|
||||||
add_custom_target(flutter_assemble DEPENDS
|
|
||||||
"${FLUTTER_LIBRARY}"
|
|
||||||
${FLUTTER_LIBRARY_HEADERS}
|
|
||||||
)
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
//
|
|
||||||
// Generated file. Do not edit.
|
|
||||||
//
|
|
||||||
|
|
||||||
// clang-format off
|
|
||||||
|
|
||||||
#include "generated_plugin_registrant.h"
|
|
||||||
|
|
||||||
#include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h>
|
|
||||||
|
|
||||||
void fl_register_plugins(FlPluginRegistry* registry) {
|
|
||||||
g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar =
|
|
||||||
fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin");
|
|
||||||
flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar);
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
//
|
|
||||||
// Generated file. Do not edit.
|
|
||||||
//
|
|
||||||
|
|
||||||
// clang-format off
|
|
||||||
|
|
||||||
#ifndef GENERATED_PLUGIN_REGISTRANT_
|
|
||||||
#define GENERATED_PLUGIN_REGISTRANT_
|
|
||||||
|
|
||||||
#include <flutter_linux/flutter_linux.h>
|
|
||||||
|
|
||||||
// Registers Flutter plugins.
|
|
||||||
void fl_register_plugins(FlPluginRegistry* registry);
|
|
||||||
|
|
||||||
#endif // GENERATED_PLUGIN_REGISTRANT_
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
#
|
|
||||||
# Generated file, do not edit.
|
|
||||||
#
|
|
||||||
|
|
||||||
list(APPEND FLUTTER_PLUGIN_LIST
|
|
||||||
flutter_secure_storage_linux
|
|
||||||
)
|
|
||||||
|
|
||||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
|
||||||
)
|
|
||||||
|
|
||||||
set(PLUGIN_BUNDLED_LIBRARIES)
|
|
||||||
|
|
||||||
foreach(plugin ${FLUTTER_PLUGIN_LIST})
|
|
||||||
add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin})
|
|
||||||
target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)
|
|
||||||
list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)
|
|
||||||
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
|
|
||||||
endforeach(plugin)
|
|
||||||
|
|
||||||
foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
|
|
||||||
add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin})
|
|
||||||
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
|
|
||||||
endforeach(ffi_plugin)
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
#include "my_application.h"
|
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
|
||||||
g_autoptr(MyApplication) app = my_application_new();
|
|
||||||
return g_application_run(G_APPLICATION(app), argc, argv);
|
|
||||||
}
|
|
||||||
@@ -1,124 +0,0 @@
|
|||||||
#include "my_application.h"
|
|
||||||
|
|
||||||
#include <flutter_linux/flutter_linux.h>
|
|
||||||
#ifdef GDK_WINDOWING_X11
|
|
||||||
#include <gdk/gdkx.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "flutter/generated_plugin_registrant.h"
|
|
||||||
|
|
||||||
struct _MyApplication {
|
|
||||||
GtkApplication parent_instance;
|
|
||||||
char** dart_entrypoint_arguments;
|
|
||||||
};
|
|
||||||
|
|
||||||
G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)
|
|
||||||
|
|
||||||
// Implements GApplication::activate.
|
|
||||||
static void my_application_activate(GApplication* application) {
|
|
||||||
MyApplication* self = MY_APPLICATION(application);
|
|
||||||
GtkWindow* window =
|
|
||||||
GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
|
|
||||||
|
|
||||||
// Use a header bar when running in GNOME as this is the common style used
|
|
||||||
// by applications and is the setup most users will be using (e.g. Ubuntu
|
|
||||||
// desktop).
|
|
||||||
// If running on X and not using GNOME then just use a traditional title bar
|
|
||||||
// in case the window manager does more exotic layout, e.g. tiling.
|
|
||||||
// If running on Wayland assume the header bar will work (may need changing
|
|
||||||
// if future cases occur).
|
|
||||||
gboolean use_header_bar = TRUE;
|
|
||||||
#ifdef GDK_WINDOWING_X11
|
|
||||||
GdkScreen* screen = gtk_window_get_screen(window);
|
|
||||||
if (GDK_IS_X11_SCREEN(screen)) {
|
|
||||||
const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen);
|
|
||||||
if (g_strcmp0(wm_name, "GNOME Shell") != 0) {
|
|
||||||
use_header_bar = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (use_header_bar) {
|
|
||||||
GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new());
|
|
||||||
gtk_widget_show(GTK_WIDGET(header_bar));
|
|
||||||
gtk_header_bar_set_title(header_bar, "keycloak_test_app");
|
|
||||||
gtk_header_bar_set_show_close_button(header_bar, TRUE);
|
|
||||||
gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));
|
|
||||||
} else {
|
|
||||||
gtk_window_set_title(window, "keycloak_test_app");
|
|
||||||
}
|
|
||||||
|
|
||||||
gtk_window_set_default_size(window, 1280, 720);
|
|
||||||
gtk_widget_show(GTK_WIDGET(window));
|
|
||||||
|
|
||||||
g_autoptr(FlDartProject) project = fl_dart_project_new();
|
|
||||||
fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);
|
|
||||||
|
|
||||||
FlView* view = fl_view_new(project);
|
|
||||||
gtk_widget_show(GTK_WIDGET(view));
|
|
||||||
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));
|
|
||||||
|
|
||||||
fl_register_plugins(FL_PLUGIN_REGISTRY(view));
|
|
||||||
|
|
||||||
gtk_widget_grab_focus(GTK_WIDGET(view));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Implements GApplication::local_command_line.
|
|
||||||
static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) {
|
|
||||||
MyApplication* self = MY_APPLICATION(application);
|
|
||||||
// Strip out the first argument as it is the binary name.
|
|
||||||
self->dart_entrypoint_arguments = g_strdupv(*arguments + 1);
|
|
||||||
|
|
||||||
g_autoptr(GError) error = nullptr;
|
|
||||||
if (!g_application_register(application, nullptr, &error)) {
|
|
||||||
g_warning("Failed to register: %s", error->message);
|
|
||||||
*exit_status = 1;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_application_activate(application);
|
|
||||||
*exit_status = 0;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Implements GApplication::startup.
|
|
||||||
static void my_application_startup(GApplication* application) {
|
|
||||||
//MyApplication* self = MY_APPLICATION(object);
|
|
||||||
|
|
||||||
// Perform any actions required at application startup.
|
|
||||||
|
|
||||||
G_APPLICATION_CLASS(my_application_parent_class)->startup(application);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Implements GApplication::shutdown.
|
|
||||||
static void my_application_shutdown(GApplication* application) {
|
|
||||||
//MyApplication* self = MY_APPLICATION(object);
|
|
||||||
|
|
||||||
// Perform any actions required at application shutdown.
|
|
||||||
|
|
||||||
G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Implements GObject::dispose.
|
|
||||||
static void my_application_dispose(GObject* object) {
|
|
||||||
MyApplication* self = MY_APPLICATION(object);
|
|
||||||
g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev);
|
|
||||||
G_OBJECT_CLASS(my_application_parent_class)->dispose(object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void my_application_class_init(MyApplicationClass* klass) {
|
|
||||||
G_APPLICATION_CLASS(klass)->activate = my_application_activate;
|
|
||||||
G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line;
|
|
||||||
G_APPLICATION_CLASS(klass)->startup = my_application_startup;
|
|
||||||
G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown;
|
|
||||||
G_OBJECT_CLASS(klass)->dispose = my_application_dispose;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void my_application_init(MyApplication* self) {}
|
|
||||||
|
|
||||||
MyApplication* my_application_new() {
|
|
||||||
return MY_APPLICATION(g_object_new(my_application_get_type(),
|
|
||||||
"application-id", APPLICATION_ID,
|
|
||||||
"flags", G_APPLICATION_NON_UNIQUE,
|
|
||||||
nullptr));
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
#ifndef FLUTTER_MY_APPLICATION_H_
|
|
||||||
#define FLUTTER_MY_APPLICATION_H_
|
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
|
||||||
|
|
||||||
G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION,
|
|
||||||
GtkApplication)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* my_application_new:
|
|
||||||
*
|
|
||||||
* Creates a new Flutter-based application.
|
|
||||||
*
|
|
||||||
* Returns: a new #MyApplication.
|
|
||||||
*/
|
|
||||||
MyApplication* my_application_new();
|
|
||||||
|
|
||||||
#endif // FLUTTER_MY_APPLICATION_H_
|
|
||||||
7
keycloak_test_app/macos/.gitignore
vendored
@@ -1,7 +0,0 @@
|
|||||||
# Flutter-related
|
|
||||||
**/Flutter/ephemeral/
|
|
||||||
**/Pods/
|
|
||||||
|
|
||||||
# Xcode-related
|
|
||||||
**/dgph
|
|
||||||
**/xcuserdata/
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
#include "ephemeral/Flutter-Generated.xcconfig"
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
#include "ephemeral/Flutter-Generated.xcconfig"
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
//
|
|
||||||
// Generated file. Do not edit.
|
|
||||||
//
|
|
||||||
|
|
||||||
import FlutterMacOS
|
|
||||||
import Foundation
|
|
||||||
|
|
||||||
import flutter_appauth
|
|
||||||
import flutter_secure_storage_macos
|
|
||||||
import path_provider_foundation
|
|
||||||
|
|
||||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
|
||||||
FlutterAppauthPlugin.register(with: registry.registrar(forPlugin: "FlutterAppauthPlugin"))
|
|
||||||
FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin"))
|
|
||||||
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
|
||||||
}
|
|
||||||
@@ -1,705 +0,0 @@
|
|||||||
// !$*UTF8*$!
|
|
||||||
{
|
|
||||||
archiveVersion = 1;
|
|
||||||
classes = {
|
|
||||||
};
|
|
||||||
objectVersion = 54;
|
|
||||||
objects = {
|
|
||||||
|
|
||||||
/* Begin PBXAggregateTarget section */
|
|
||||||
33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {
|
|
||||||
isa = PBXAggregateTarget;
|
|
||||||
buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */;
|
|
||||||
buildPhases = (
|
|
||||||
33CC111E2044C6BF0003C045 /* ShellScript */,
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = "Flutter Assemble";
|
|
||||||
productName = FLX;
|
|
||||||
};
|
|
||||||
/* End PBXAggregateTarget section */
|
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
|
||||||
331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; };
|
|
||||||
335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
|
|
||||||
33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
|
|
||||||
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
|
|
||||||
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
|
|
||||||
33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
|
|
||||||
/* End PBXBuildFile section */
|
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
|
||||||
331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = {
|
|
||||||
isa = PBXContainerItemProxy;
|
|
||||||
containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
|
|
||||||
proxyType = 1;
|
|
||||||
remoteGlobalIDString = 33CC10EC2044A3C60003C045;
|
|
||||||
remoteInfo = Runner;
|
|
||||||
};
|
|
||||||
33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {
|
|
||||||
isa = PBXContainerItemProxy;
|
|
||||||
containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
|
|
||||||
proxyType = 1;
|
|
||||||
remoteGlobalIDString = 33CC111A2044C6BA0003C045;
|
|
||||||
remoteInfo = FLX;
|
|
||||||
};
|
|
||||||
/* End PBXContainerItemProxy section */
|
|
||||||
|
|
||||||
/* Begin PBXCopyFilesBuildPhase section */
|
|
||||||
33CC110E2044A8840003C045 /* Bundle Framework */ = {
|
|
||||||
isa = PBXCopyFilesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
dstPath = "";
|
|
||||||
dstSubfolderSpec = 10;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
name = "Bundle Framework";
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXCopyFilesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
|
||||||
331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
|
|
||||||
333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
|
|
||||||
335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
|
|
||||||
33CC10ED2044A3C60003C045 /* keycloak_test_app.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "keycloak_test_app.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
|
||||||
33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; };
|
|
||||||
33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
|
|
||||||
33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = "<group>"; };
|
|
||||||
33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = "<group>"; };
|
|
||||||
33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = "<group>"; };
|
|
||||||
33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = "<group>"; };
|
|
||||||
33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = "<group>"; };
|
|
||||||
33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; };
|
|
||||||
33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
|
|
||||||
33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
|
|
||||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
|
|
||||||
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
|
|
||||||
/* End PBXFileReference section */
|
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
|
||||||
331C80D2294CF70F00263BE5 /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
33CC10EA2044A3C60003C045 /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXFrameworksBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
|
||||||
331C80D6294CF71000263BE5 /* RunnerTests */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
331C80D7294CF71000263BE5 /* RunnerTests.swift */,
|
|
||||||
);
|
|
||||||
path = RunnerTests;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
33BA886A226E78AF003329D5 /* Configs */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
33E5194F232828860026EE4D /* AppInfo.xcconfig */,
|
|
||||||
9740EEB21CF90195004384FC /* Debug.xcconfig */,
|
|
||||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
|
|
||||||
333000ED22D3DE5D00554162 /* Warnings.xcconfig */,
|
|
||||||
);
|
|
||||||
path = Configs;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
33CC10E42044A3C60003C045 = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
33FAB671232836740065AC1E /* Runner */,
|
|
||||||
33CEB47122A05771004F2AC0 /* Flutter */,
|
|
||||||
331C80D6294CF71000263BE5 /* RunnerTests */,
|
|
||||||
33CC10EE2044A3C60003C045 /* Products */,
|
|
||||||
D73912EC22F37F3D000D13A0 /* Frameworks */,
|
|
||||||
);
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
33CC10EE2044A3C60003C045 /* Products */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
33CC10ED2044A3C60003C045 /* keycloak_test_app.app */,
|
|
||||||
331C80D5294CF71000263BE5 /* RunnerTests.xctest */,
|
|
||||||
);
|
|
||||||
name = Products;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
33CC11242044D66E0003C045 /* Resources */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
33CC10F22044A3C60003C045 /* Assets.xcassets */,
|
|
||||||
33CC10F42044A3C60003C045 /* MainMenu.xib */,
|
|
||||||
33CC10F72044A3C60003C045 /* Info.plist */,
|
|
||||||
);
|
|
||||||
name = Resources;
|
|
||||||
path = ..;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
33CEB47122A05771004F2AC0 /* Flutter */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,
|
|
||||||
33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
|
|
||||||
33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,
|
|
||||||
33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,
|
|
||||||
);
|
|
||||||
path = Flutter;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
33FAB671232836740065AC1E /* Runner */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
33CC10F02044A3C60003C045 /* AppDelegate.swift */,
|
|
||||||
33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,
|
|
||||||
33E51913231747F40026EE4D /* DebugProfile.entitlements */,
|
|
||||||
33E51914231749380026EE4D /* Release.entitlements */,
|
|
||||||
33CC11242044D66E0003C045 /* Resources */,
|
|
||||||
33BA886A226E78AF003329D5 /* Configs */,
|
|
||||||
);
|
|
||||||
path = Runner;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
D73912EC22F37F3D000D13A0 /* Frameworks */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
);
|
|
||||||
name = Frameworks;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXGroup section */
|
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
|
||||||
331C80D4294CF70F00263BE5 /* RunnerTests */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
|
|
||||||
buildPhases = (
|
|
||||||
331C80D1294CF70F00263BE5 /* Sources */,
|
|
||||||
331C80D2294CF70F00263BE5 /* Frameworks */,
|
|
||||||
331C80D3294CF70F00263BE5 /* Resources */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
331C80DA294CF71000263BE5 /* PBXTargetDependency */,
|
|
||||||
);
|
|
||||||
name = RunnerTests;
|
|
||||||
productName = RunnerTests;
|
|
||||||
productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */;
|
|
||||||
productType = "com.apple.product-type.bundle.unit-test";
|
|
||||||
};
|
|
||||||
33CC10EC2044A3C60003C045 /* Runner */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
|
|
||||||
buildPhases = (
|
|
||||||
33CC10E92044A3C60003C045 /* Sources */,
|
|
||||||
33CC10EA2044A3C60003C045 /* Frameworks */,
|
|
||||||
33CC10EB2044A3C60003C045 /* Resources */,
|
|
||||||
33CC110E2044A8840003C045 /* Bundle Framework */,
|
|
||||||
3399D490228B24CF009A79C7 /* ShellScript */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
33CC11202044C79F0003C045 /* PBXTargetDependency */,
|
|
||||||
);
|
|
||||||
name = Runner;
|
|
||||||
productName = Runner;
|
|
||||||
productReference = 33CC10ED2044A3C60003C045 /* keycloak_test_app.app */;
|
|
||||||
productType = "com.apple.product-type.application";
|
|
||||||
};
|
|
||||||
/* End PBXNativeTarget section */
|
|
||||||
|
|
||||||
/* Begin PBXProject section */
|
|
||||||
33CC10E52044A3C60003C045 /* Project object */ = {
|
|
||||||
isa = PBXProject;
|
|
||||||
attributes = {
|
|
||||||
BuildIndependentTargetsInParallel = YES;
|
|
||||||
LastSwiftUpdateCheck = 0920;
|
|
||||||
LastUpgradeCheck = 1510;
|
|
||||||
ORGANIZATIONNAME = "";
|
|
||||||
TargetAttributes = {
|
|
||||||
331C80D4294CF70F00263BE5 = {
|
|
||||||
CreatedOnToolsVersion = 14.0;
|
|
||||||
TestTargetID = 33CC10EC2044A3C60003C045;
|
|
||||||
};
|
|
||||||
33CC10EC2044A3C60003C045 = {
|
|
||||||
CreatedOnToolsVersion = 9.2;
|
|
||||||
LastSwiftMigration = 1100;
|
|
||||||
ProvisioningStyle = Automatic;
|
|
||||||
SystemCapabilities = {
|
|
||||||
com.apple.Sandbox = {
|
|
||||||
enabled = 1;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
33CC111A2044C6BA0003C045 = {
|
|
||||||
CreatedOnToolsVersion = 9.2;
|
|
||||||
ProvisioningStyle = Manual;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */;
|
|
||||||
compatibilityVersion = "Xcode 9.3";
|
|
||||||
developmentRegion = en;
|
|
||||||
hasScannedForEncodings = 0;
|
|
||||||
knownRegions = (
|
|
||||||
en,
|
|
||||||
Base,
|
|
||||||
);
|
|
||||||
mainGroup = 33CC10E42044A3C60003C045;
|
|
||||||
productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
|
|
||||||
projectDirPath = "";
|
|
||||||
projectRoot = "";
|
|
||||||
targets = (
|
|
||||||
33CC10EC2044A3C60003C045 /* Runner */,
|
|
||||||
331C80D4294CF70F00263BE5 /* RunnerTests */,
|
|
||||||
33CC111A2044C6BA0003C045 /* Flutter Assemble */,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
/* End PBXProject section */
|
|
||||||
|
|
||||||
/* Begin PBXResourcesBuildPhase section */
|
|
||||||
331C80D3294CF70F00263BE5 /* Resources */ = {
|
|
||||||
isa = PBXResourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
33CC10EB2044A3C60003C045 /* Resources */ = {
|
|
||||||
isa = PBXResourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
|
|
||||||
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXResourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXShellScriptBuildPhase section */
|
|
||||||
3399D490228B24CF009A79C7 /* ShellScript */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
alwaysOutOfDate = 1;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
);
|
|
||||||
outputFileListPaths = (
|
|
||||||
);
|
|
||||||
outputPaths = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n";
|
|
||||||
};
|
|
||||||
33CC111E2044C6BF0003C045 /* ShellScript */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
Flutter/ephemeral/FlutterInputs.xcfilelist,
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
Flutter/ephemeral/tripwire,
|
|
||||||
);
|
|
||||||
outputFileListPaths = (
|
|
||||||
Flutter/ephemeral/FlutterOutputs.xcfilelist,
|
|
||||||
);
|
|
||||||
outputPaths = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire";
|
|
||||||
};
|
|
||||||
/* End PBXShellScriptBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
|
||||||
331C80D1294CF70F00263BE5 /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
33CC10E92044A3C60003C045 /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,
|
|
||||||
33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,
|
|
||||||
335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXSourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXTargetDependency section */
|
|
||||||
331C80DA294CF71000263BE5 /* PBXTargetDependency */ = {
|
|
||||||
isa = PBXTargetDependency;
|
|
||||||
target = 33CC10EC2044A3C60003C045 /* Runner */;
|
|
||||||
targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */;
|
|
||||||
};
|
|
||||||
33CC11202044C79F0003C045 /* PBXTargetDependency */ = {
|
|
||||||
isa = PBXTargetDependency;
|
|
||||||
target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;
|
|
||||||
targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;
|
|
||||||
};
|
|
||||||
/* End PBXTargetDependency section */
|
|
||||||
|
|
||||||
/* Begin PBXVariantGroup section */
|
|
||||||
33CC10F42044A3C60003C045 /* MainMenu.xib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
33CC10F52044A3C60003C045 /* Base */,
|
|
||||||
);
|
|
||||||
name = MainMenu.xib;
|
|
||||||
path = Runner;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXVariantGroup section */
|
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
|
||||||
331C80DB294CF71000263BE5 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
|
||||||
MARKETING_VERSION = 1.0;
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.keycloakTestApp.RunnerTests;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/keycloak_test_app.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/keycloak_test_app";
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
331C80DC294CF71000263BE5 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
|
||||||
MARKETING_VERSION = 1.0;
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.keycloakTestApp.RunnerTests;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/keycloak_test_app.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/keycloak_test_app";
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
331C80DD294CF71000263BE5 /* Profile */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
|
||||||
MARKETING_VERSION = 1.0;
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.keycloakTestApp.RunnerTests;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/keycloak_test_app.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/keycloak_test_app";
|
|
||||||
};
|
|
||||||
name = Profile;
|
|
||||||
};
|
|
||||||
338D0CE9231458BD00FA5F75 /* Profile */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
||||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
||||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
|
||||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
|
||||||
CODE_SIGN_IDENTITY = "-";
|
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
DEAD_CODE_STRIPPING = YES;
|
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
|
||||||
ENABLE_USER_SCRIPT_SANDBOXING = NO;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
|
||||||
SDKROOT = macosx;
|
|
||||||
SWIFT_COMPILATION_MODE = wholemodule;
|
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
|
||||||
};
|
|
||||||
name = Profile;
|
|
||||||
};
|
|
||||||
338D0CEA231458BD00FA5F75 /* Profile */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
|
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/../Frameworks",
|
|
||||||
);
|
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
};
|
|
||||||
name = Profile;
|
|
||||||
};
|
|
||||||
338D0CEB231458BD00FA5F75 /* Profile */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CODE_SIGN_STYLE = Manual;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
};
|
|
||||||
name = Profile;
|
|
||||||
};
|
|
||||||
33CC10F92044A3C60003C045 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
||||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
||||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
|
||||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
|
||||||
CODE_SIGN_IDENTITY = "-";
|
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
DEAD_CODE_STRIPPING = YES;
|
|
||||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
|
||||||
ENABLE_TESTABILITY = YES;
|
|
||||||
ENABLE_USER_SCRIPT_SANDBOXING = NO;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
|
||||||
"DEBUG=1",
|
|
||||||
"$(inherited)",
|
|
||||||
);
|
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
|
||||||
MTL_ENABLE_DEBUG_INFO = YES;
|
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
|
||||||
SDKROOT = macosx;
|
|
||||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
33CC10FA2044A3C60003C045 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
|
||||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
|
||||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
|
||||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
|
||||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
|
||||||
CODE_SIGN_IDENTITY = "-";
|
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
DEAD_CODE_STRIPPING = YES;
|
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
|
||||||
ENABLE_USER_SCRIPT_SANDBOXING = NO;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.14;
|
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
|
||||||
SDKROOT = macosx;
|
|
||||||
SWIFT_COMPILATION_MODE = wholemodule;
|
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
33CC10FC2044A3C60003C045 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
|
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/../Frameworks",
|
|
||||||
);
|
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
33CC10FD2044A3C60003C045 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
CLANG_ENABLE_MODULES = YES;
|
|
||||||
CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
|
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/../Frameworks",
|
|
||||||
);
|
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
33CC111C2044C6BA0003C045 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CODE_SIGN_STYLE = Manual;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
33CC111D2044C6BA0003C045 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
/* End XCBuildConfiguration section */
|
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
|
||||||
331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
331C80DB294CF71000263BE5 /* Debug */,
|
|
||||||
331C80DC294CF71000263BE5 /* Release */,
|
|
||||||
331C80DD294CF71000263BE5 /* Profile */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
33CC10F92044A3C60003C045 /* Debug */,
|
|
||||||
33CC10FA2044A3C60003C045 /* Release */,
|
|
||||||
338D0CE9231458BD00FA5F75 /* Profile */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
33CC10FC2044A3C60003C045 /* Debug */,
|
|
||||||
33CC10FD2044A3C60003C045 /* Release */,
|
|
||||||
338D0CEA231458BD00FA5F75 /* Profile */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
33CC111C2044C6BA0003C045 /* Debug */,
|
|
||||||
33CC111D2044C6BA0003C045 /* Release */,
|
|
||||||
338D0CEB231458BD00FA5F75 /* Profile */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
/* End XCConfigurationList section */
|
|
||||||
};
|
|
||||||
rootObject = 33CC10E52044A3C60003C045 /* Project object */;
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>IDEDidComputeMac32BitWarning</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
@@ -1,98 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Scheme
|
|
||||||
LastUpgradeVersion = "1510"
|
|
||||||
version = "1.3">
|
|
||||||
<BuildAction
|
|
||||||
parallelizeBuildables = "YES"
|
|
||||||
buildImplicitDependencies = "YES">
|
|
||||||
<BuildActionEntries>
|
|
||||||
<BuildActionEntry
|
|
||||||
buildForTesting = "YES"
|
|
||||||
buildForRunning = "YES"
|
|
||||||
buildForProfiling = "YES"
|
|
||||||
buildForArchiving = "YES"
|
|
||||||
buildForAnalyzing = "YES">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
|
||||||
BuildableName = "keycloak_test_app.app"
|
|
||||||
BlueprintName = "Runner"
|
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</BuildActionEntry>
|
|
||||||
</BuildActionEntries>
|
|
||||||
</BuildAction>
|
|
||||||
<TestAction
|
|
||||||
buildConfiguration = "Debug"
|
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
|
||||||
<MacroExpansion>
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
|
||||||
BuildableName = "keycloak_test_app.app"
|
|
||||||
BlueprintName = "Runner"
|
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</MacroExpansion>
|
|
||||||
<Testables>
|
|
||||||
<TestableReference
|
|
||||||
skipped = "NO"
|
|
||||||
parallelizable = "YES">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "331C80D4294CF70F00263BE5"
|
|
||||||
BuildableName = "RunnerTests.xctest"
|
|
||||||
BlueprintName = "RunnerTests"
|
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</TestableReference>
|
|
||||||
</Testables>
|
|
||||||
</TestAction>
|
|
||||||
<LaunchAction
|
|
||||||
buildConfiguration = "Debug"
|
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
||||||
launchStyle = "0"
|
|
||||||
useCustomWorkingDirectory = "NO"
|
|
||||||
ignoresPersistentStateOnLaunch = "NO"
|
|
||||||
debugDocumentVersioning = "YES"
|
|
||||||
debugServiceExtension = "internal"
|
|
||||||
allowLocationSimulation = "YES">
|
|
||||||
<BuildableProductRunnable
|
|
||||||
runnableDebuggingMode = "0">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
|
||||||
BuildableName = "keycloak_test_app.app"
|
|
||||||
BlueprintName = "Runner"
|
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</BuildableProductRunnable>
|
|
||||||
</LaunchAction>
|
|
||||||
<ProfileAction
|
|
||||||
buildConfiguration = "Profile"
|
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
||||||
savedToolIdentifier = ""
|
|
||||||
useCustomWorkingDirectory = "NO"
|
|
||||||
debugDocumentVersioning = "YES">
|
|
||||||
<BuildableProductRunnable
|
|
||||||
runnableDebuggingMode = "0">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
|
||||||
BuildableName = "keycloak_test_app.app"
|
|
||||||
BlueprintName = "Runner"
|
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</BuildableProductRunnable>
|
|
||||||
</ProfileAction>
|
|
||||||
<AnalyzeAction
|
|
||||||
buildConfiguration = "Debug">
|
|
||||||
</AnalyzeAction>
|
|
||||||
<ArchiveAction
|
|
||||||
buildConfiguration = "Release"
|
|
||||||
revealArchiveInOrganizer = "YES">
|
|
||||||
</ArchiveAction>
|
|
||||||
</Scheme>
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Workspace
|
|
||||||
version = "1.0">
|
|
||||||
<FileRef
|
|
||||||
location = "group:Runner.xcodeproj">
|
|
||||||
</FileRef>
|
|
||||||
</Workspace>
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>IDEDidComputeMac32BitWarning</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
import Cocoa
|
|
||||||
import FlutterMacOS
|
|
||||||
|
|
||||||
@main
|
|
||||||
class AppDelegate: FlutterAppDelegate {
|
|
||||||
override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"size" : "16x16",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_16.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "16x16",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_32.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "32x32",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_32.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "32x32",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_64.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "128x128",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_128.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "128x128",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_256.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "256x256",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_256.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "256x256",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_512.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "512x512",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_512.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "512x512",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "app_icon_1024.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 5.5 KiB |