- AuthViewModel: affiche l'app immédiatement si un token existe, sans
attendre le refresh réseau — le refresh + sync se font en arrière-plan
- BonsaiAuthManager.refreshIfNeeded: ne déconnecte l'utilisateur que sur
401/403 (token invalide), pas sur erreur réseau ou timeout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
La contrainte FOREIGN KEY sur tasks.project_id causait des crashs
systématiques dans une app sync-first où les projets et tâches arrivent
de l'API sans garantie d'ordre strict. La cohérence est gérée côté
serveur Bonsai ; inutile de la dupliquer en base locale.
fallbackToDestructiveMigration() recrée la DB proprement au démarrage.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- BonsaiApiClient : optLong/optString avec fallback pour éviter JSONException
si l'API omet projectId, type, status ou priority dans la réponse
- BonsaiSyncManager : enveloppe sync() dans runCatching pour ne jamais
propager d'exception non gérée ; chaque insert de tâche est aussi isolé
pour que les erreurs individuelles ne bloquent pas toute la sync
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Si les projets ne sont pas encore en base Room au moment de l'insertion
(première connexion, sync en cours), vérifie que le projet existe avant
d'insérer la tâche localement. Sinon, déclenche une sync — la tâche est
déjà créée sur l'API et apparaîtra après rafraîchissement.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remplace le flux PKCE/Custom Tab par un formulaire username/password
natif qui appelle directement le token endpoint Keycloak (grant_type=password).
Le token et le refresh token sont stockés dans EncryptedSharedPreferences.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remplace le password grant par Authorization Code + PKCE via Custom Tab.
L'utilisateur est redirigé vers Keycloak à l'ouverture si non connecté,
le token est stocké dans EncryptedSharedPreferences et rafraîchi automatiquement.
Le deep link com.planify.mobile://auth/callback capture le code de retour.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remplace les couleurs dynamiques Android 12+ et le schéma Material3
par défaut par la palette extraite du webapp Bonsai (bleu #2563eb,
fond #f9fafb, surface blanche, contours gris). Ajoute la typographie
complète (13 styles) et renomme les libellés "Planify" en "BonsaiTask".
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Reporte les coordonnées SVG dans un viewport 108×108 avec scale ×1.286,
centré dans la safe zone (18–90). Background blanc pur.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Pour Nextcloud, bypass la chaîne PROPFIND (principal → calendar-home)
et accède directement à $baseUrl/calendars/$username/ conformément à
la doc officielle Nextcloud. Ajoute les codes HTTP dans les messages
d'erreur de la discovery générique pour faciliter le debug.
v0.0.4
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>