From 737108fc6e1baf6691d4d6112454a5a5fe1baa10 Mon Sep 17 00:00:00 2001 From: Jamy Bailly Date: Wed, 13 May 2026 09:39:29 +0200 Subject: [PATCH 01/16] feat: Add ic_circle_information_outlined drawable --- .../ic_circle_information_outlined.xml | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 app/src/main/res/drawable/ic_circle_information_outlined.xml diff --git a/app/src/main/res/drawable/ic_circle_information_outlined.xml b/app/src/main/res/drawable/ic_circle_information_outlined.xml new file mode 100644 index 00000000..13a5afbe --- /dev/null +++ b/app/src/main/res/drawable/ic_circle_information_outlined.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + From 5ab5b995cba340fe637ac3917f7fb5aeab56bb3f Mon Sep 17 00:00:00 2001 From: Jamy Bailly Date: Wed, 13 May 2026 09:39:49 +0200 Subject: [PATCH 02/16] chore: Add disconnectCriticalButton string resource --- app/src/main/res/values-da/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-fi/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-nb/strings.xml | 1 + app/src/main/res/values-nl/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-sv/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 13 files changed, 13 insertions(+) diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index c216b356..59f2face 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -74,6 +74,7 @@ Sørg for, at dine bekræftelses- og gendannelsesmetoder stadig er opdaterede for ikke at miste adgangen til din konto. Afbrydelse af denne konto kan svække dens sikkerhed Log ud + Afbryd forbindelsen til kontoen Konto afbrudt Færdig E-mail diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 4ba4f7ac..bf8faf48 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -75,6 +75,7 @@ Stellen Sie sicher, dass Ihre Verifizierungs- und Wiederherstellungsmethoden immer aktuell sind, um den Zugriff auf Ihr Konto nicht zu verlieren. Das Trennen dieses Kontos kann dessen Sicherheit beeinträchtigen Abmelden + Trennen Sie das Konto Konto getrennt Fertig E-Mail diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index bbc921c3..9c450121 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -74,6 +74,7 @@ Βεβαιωθείτε ότι οι μέθοδοι επαλήθευσης και ανάκτησής σας είναι ενημερωμένοι για να αποφύγετε την απώλεια πρόσβασης στον λογαριασμό σας. Η αποσύνδεση αυτού του λογαριασμού μπορεί να εξασθενήσει την ασφάλειά του Αποσύνδεση + Αποσυνδέστε το λογαριασμό Ο λογαριασμός αποσυνδέθηκε Τέλος Email diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 16e065b3..aa79fdc6 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -75,6 +75,7 @@ Verifique que sus métodos de verificación y recuperación estén siempre actualizados para no perder el acceso a su cuenta. Desconectar esta cuenta puede debilitar su seguridad Cerrar sesión + Desconectar la cuenta Cuenta desconectada Listo Correo electrónico diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index cc9b7af2..190effd0 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -74,6 +74,7 @@ Varmista että vahvistus- ja palautusmenetelmäsi ovat edelleen ajan tasalla, jotta et menetä pääsyä tiliisi. Tämän tilin yhteyden katkaiseminen voi heikentää sen turvallisuutta Kirjaudu ulos + Tilin katkaiseminen Tilin yhteys katkaistu Valmis Sähköposti diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index e85c39f4..641f9233 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -75,6 +75,7 @@ Vérifiez que vos méthodes de validation et de récupération soient toujours à jour pour ne pas perdre l’accès à votre compte. Déconnecter ce compte peut affaiblir sa sécurité Se déconnecter + Déconnecter le compte Compte déconnecté Terminer E-mail diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 978197be..a2e5f904 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -75,6 +75,7 @@ Verifica che i tuoi metodi di verifica e recupero siano sempre aggiornati per non perdere l’accesso al tuo account. Disconnettere questo account può indebolirne la sicurezza Disconnettiti + Disconnettere l’account Account disconnesso Fine Email diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index edd44f9e..fbd7223a 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -74,6 +74,7 @@ Sørg for at verifiserings- og gjenopprettingsmetodene dine fortsatt er oppdaterte for å unngå å miste tilgangen til kontoen din. Å koble fra denne kontoen kan svekke sikkerheten Logg ut + Koble fra kontoen Konto frakoblet Ferdig E-post diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 595e4832..244ebf54 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -74,6 +74,7 @@ Zorg ervoor dat uw verificatie- en herstelmethoden nog steeds up-to-date zijn om de toegang tot uw account niet te verliezen. Het loskoppelen van dit account kan de beveiliging ervan verzwakken Uitloggen + De account ontkoppelen Account losgekoppeld Gereed E-mail diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 59c5d7f3..160b5c02 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -74,6 +74,7 @@ Upewnij się, że Twoje metody weryfikacji i odzyskiwania są nadal aktualne, aby nie stracić dostępu do konta. Odłączenie tego konta może osłabić jego bezpieczeństwo Wyloguj się + Odłączenie konta Konto odłączone Gotowe E-mail diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 4fe6d3d4..2108f95e 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -74,6 +74,7 @@ Certifique-se de que seus métodos de verificação e recuperação ainda estão atualizados para evitar perder o acesso à sua conta. Desconectar esta conta pode enfraquecer sua segurança Sair + Desligar a conta Conta desconectada Concluir E-mail diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 4b053653..4dd66142 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -74,6 +74,7 @@ Se till att dina verifierings- och återställningsmetoder fortfarande är uppdaterade för att undvika att förlora åtkomst till ditt konto. Att koppla från detta konto kan försvaga dess säkerhet Logga ut + Koppla bort kontot Konto frånkopplat Klar E-post diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 74c3562e..fd0d7dc0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -75,6 +75,7 @@ Make sure your verification and recovery methods are still up to date to avoid losing access to your account. Disconnecting this account may weaken its security Log out + Disconnect the account Account disconnected Done Email From 9092df2d1bc3d310ec104234a1f0f2c73d2a5d8d Mon Sep 17 00:00:00 2001 From: Jamy Bailly Date: Wed, 13 May 2026 11:11:19 +0200 Subject: [PATCH 03/16] chore: Add disconnectAccountPartiallySecured string resources --- app/src/main/res/values-da/strings.xml | 3 +++ app/src/main/res/values-de/strings.xml | 3 +++ app/src/main/res/values-el/strings.xml | 3 +++ app/src/main/res/values-es/strings.xml | 3 +++ app/src/main/res/values-fi/strings.xml | 3 +++ app/src/main/res/values-fr/strings.xml | 3 +++ app/src/main/res/values-it/strings.xml | 3 +++ app/src/main/res/values-nb/strings.xml | 3 +++ app/src/main/res/values-nl/strings.xml | 3 +++ app/src/main/res/values-pl/strings.xml | 3 +++ app/src/main/res/values-pt/strings.xml | 3 +++ app/src/main/res/values-sv/strings.xml | 3 +++ app/src/main/res/values/strings.xml | 3 +++ 13 files changed, 39 insertions(+) diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 59f2face..451968d4 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -70,11 +70,14 @@ Enhed Din konto vil ikke længere være beskyttet af totrinsbekræftelse og vil blive sårbar over for uautoriseret adgang. Du vil ikke længere kunne godkende login på denne enhed med Authenticator. + Denne enhed er den eneste, der er autoriseret til at logge ind.\n\nTilføj en anden enhed eller login-metode, før du fortsætter. + Hvis du afbryder forbindelsen til kontoen, fjernes dens beskyttelse Afbryd denne konto Sørg for, at dine bekræftelses- og gendannelsesmetoder stadig er opdaterede for ikke at miste adgangen til din konto. Afbrydelse af denne konto kan svække dens sikkerhed Log ud Afbryd forbindelsen til kontoen + Din konto vil ikke længere være beskyttet af totrinsbekræftelse og vil være sårbar over for uautoriseret adgang. Konto afbrudt Færdig E-mail diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index bf8faf48..0e32e067 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -71,11 +71,14 @@ Gerät Ihr Konto wird nicht mehr durch die Zwei-Faktor-Verifizierung geschützt und ist anfällig für unbefugten Zugriff. Sie können die Anmeldung auf diesem Gerät nicht mehr mit Authenticator bestätigen. + Dieses Gerät ist das einzige, das zur Anmeldung berechtigt ist.\n\nFügen Sie ein anderes Gerät oder eine andere Anmeldemethode hinzu, bevor Sie fortfahren. + Durch das Trennen der Verbindung wird der Schutz des Kontos aufgehoben Dieses Konto trennen Stellen Sie sicher, dass Ihre Verifizierungs- und Wiederherstellungsmethoden immer aktuell sind, um den Zugriff auf Ihr Konto nicht zu verlieren. Das Trennen dieses Kontos kann dessen Sicherheit beeinträchtigen Abmelden Trennen Sie das Konto + Ihr Konto ist dann nicht mehr durch die zweistufige Verifizierung geschützt und anfällig für unbefugten Zugriff. Konto getrennt Fertig E-Mail diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 9c450121..74b03f70 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -70,11 +70,14 @@ Συσκευή Ο λογαριασμός σας δεν θα προστατεύεται πλέον από επαλήθευση σε δύο βήματα και θα γίνει ευάλωτος σε μη εξουσιοδοτημένη πρόσβαση. Δεν θα μπορείτε πλέον να εγκρίνετε συνδέσεις σε αυτή τη συσκευή με το Authenticator. + Αυτή η συσκευή είναι η μόνη εξουσιοδοτημένη να συνδεθεί.\n\nΠροσθέστε άλλη συσκευή ή μέθοδο σύνδεσης πριν συνεχίσετε. + Η αποσύνδεση του λογαριασμού θα καταργήσει την προστασία του Αποσύνδεση αυτού του λογαριασμού Βεβαιωθείτε ότι οι μέθοδοι επαλήθευσης και ανάκτησής σας είναι ενημερωμένοι για να αποφύγετε την απώλεια πρόσβασης στον λογαριασμό σας. Η αποσύνδεση αυτού του λογαριασμού μπορεί να εξασθενήσει την ασφάλειά του Αποσύνδεση Αποσυνδέστε το λογαριασμό + Ο λογαριασμός σας δεν θα προστατεύεται πλέον από επαλήθευση δύο βημάτων και θα είναι ευάλωτος σε μη εξουσιοδοτημένη πρόσβαση. Ο λογαριασμός αποσυνδέθηκε Τέλος Email diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index aa79fdc6..553beb3b 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -71,11 +71,14 @@ Dispositivo Su cuenta ya no estará protegida por la verificación en dos pasos y se volverá vulnerable a accesos no autorizados. Ya no podrá validar el inicio de sesión en este dispositivo con Authenticator. + Este dispositivo es el único autorizado para iniciar sesión.\n\nAñade otro dispositivo o método de inicio de sesión antes de continuar. + La desconexión de la cuenta eliminará su protección Desconectar esta cuenta Verifique que sus métodos de verificación y recuperación estén siempre actualizados para no perder el acceso a su cuenta. Desconectar esta cuenta puede debilitar su seguridad Cerrar sesión Desconectar la cuenta + Su cuenta dejará de estar protegida por la verificación en dos pasos y será vulnerable a accesos no autorizados. Cuenta desconectada Listo Correo electrónico diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 190effd0..78de63c2 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -70,11 +70,14 @@ Laite Tilisi ei ole enää suojattu kaksivaiheisella todennuksella ja se on altis luvattomalle käytölle. Et voi enää hyväksyä kirjautumisia tällä laitteella Authenticatorilla. + Tämä laite on ainoa, jolla on lupa kirjautua sisään.\n\nLisää toinen laite tai kirjautumismenetelmä ennen jatkamista. + Tilin yhteyden katkaiseminen poistaa sen suojauksen Katkaise tämän tilin yhteys Varmista että vahvistus- ja palautusmenetelmäsi ovat edelleen ajan tasalla, jotta et menetä pääsyä tiliisi. Tämän tilin yhteyden katkaiseminen voi heikentää sen turvallisuutta Kirjaudu ulos Tilin katkaiseminen + Tiliäsi ei enää suojata kaksivaiheisella vahvistuksella, ja se on altis luvattomalle käytölle. Tilin yhteys katkaistu Valmis Sähköposti diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 641f9233..947ad916 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -71,11 +71,14 @@ Appareil Votre compte ne sera plus protégé par la validation en deux étapes et deviendra vulnérable aux accès non autorisés. Vous ne pourrez plus valider la connexion sur cet appareil avec Authenticator. + Cet appareil est le seul autorisé à se connecter.\n\nAjoutez un autre appareil ou une autre méthode de connexion avant de continuer. + La déconnexion du compte supprimera sa protection Déconnecter ce compte Vérifiez que vos méthodes de validation et de récupération soient toujours à jour pour ne pas perdre l’accès à votre compte. Déconnecter ce compte peut affaiblir sa sécurité Se déconnecter Déconnecter le compte + Votre compte ne sera plus protégé par la vérification en deux étapes et sera vulnérable à un accès non autorisé. Compte déconnecté Terminer E-mail diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index a2e5f904..6e4340d6 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -71,11 +71,14 @@ Dispositivo Il tuo account non sarà più protetto dalla verifica a due passaggi e diventerà vulnerabile ad accessi non autorizzati. Non potrai più verificare l’accesso su questo dispositivo con Authenticator. + Questo dispositivo è l’unico autorizzato ad accedere.\n\nAggiungere un altro dispositivo o metodo di accesso prima di continuare. + La disconnessione dell’account ne rimuove la protezione Disconnetti questo account Verifica che i tuoi metodi di verifica e recupero siano sempre aggiornati per non perdere l’accesso al tuo account. Disconnettere questo account può indebolirne la sicurezza Disconnettiti Disconnettere l’account + Il vostro account non sarà più protetto dalla verifica in due passaggi e sarà vulnerabile ad accessi non autorizzati. Account disconnesso Fine Email diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index fbd7223a..15a31982 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -70,11 +70,14 @@ Enhet Kontoen din vil ikke lenger være beskyttet av totrinnsverifisering og vil bli sårbar for uautorisert tilgang. Du vil ikke lenger kunne godkjenne pålogginger på denne enheten med Authenticator. + Denne enheten er den eneste som er autorisert til å logge på.\n\nLegg til en annen enhet eller påloggingsmetode før du fortsetter. + Hvis du kobler fra kontoen, oppheves beskyttelsen av den Koble fra denne kontoen Sørg for at verifiserings- og gjenopprettingsmetodene dine fortsatt er oppdaterte for å unngå å miste tilgangen til kontoen din. Å koble fra denne kontoen kan svekke sikkerheten Logg ut Koble fra kontoen + Kontoen din vil ikke lenger være beskyttet av totrinnsbekreftelse og vil være sårbar for uautorisert tilgang. Konto frakoblet Ferdig E-post diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 244ebf54..ce87b126 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -70,11 +70,14 @@ Apparaat Uw account zal niet langer worden beschermd door twee-stapsverificatie en zal kwetsbaar worden voor ongeautoriseerde toegang. U kunt geen inloggen meer goedkeuren op dit apparaat met Authenticator. + Dit apparaat is het enige dat gemachtigd is om aan te melden.\n\nVoeg een ander apparaat of een andere aanmeldingsmethode toe voordat u doorgaat. + Door de verbinding met de account te verbreken, wordt de beveiliging verwijderd Dit account loskoppelen Zorg ervoor dat uw verificatie- en herstelmethoden nog steeds up-to-date zijn om de toegang tot uw account niet te verliezen. Het loskoppelen van dit account kan de beveiliging ervan verzwakken Uitloggen De account ontkoppelen + Je account wordt niet langer beschermd door verificatie in twee stappen en is kwetsbaar voor ongeautoriseerde toegang. Account losgekoppeld Gereed E-mail diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 160b5c02..b8f2e010 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -70,11 +70,14 @@ Urządzenie Twoje konto nie będzie już chronione przez weryfikację dwuetapową i stanie się podatne na nieautoryzowany dostęp. Nie będziesz już mógł zatwierdzać logowań na tym urządzeniu za pomocą Authenticatora. + To urządzenie jest jedynym uprawnionym do logowania.\n\nPrzed kontynuowaniem dodaj inne urządzenie lub metodę logowania. + Odłączenie konta spowoduje usunięcie jego ochrony Odłącz to konto Upewnij się, że Twoje metody weryfikacji i odzyskiwania są nadal aktualne, aby nie stracić dostępu do konta. Odłączenie tego konta może osłabić jego bezpieczeństwo Wyloguj się Odłączenie konta + Twoje konto nie będzie już chronione weryfikacją dwuetapową i będzie podatne na nieautoryzowany dostęp. Konto odłączone Gotowe E-mail diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 2108f95e..927862d3 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -70,11 +70,14 @@ Dispositivo Sua conta não estará mais protegida pela verificação em duas etapas e ficará vulnerável a acessos não autorizados. Você não poderá mais aprovar logins neste dispositivo com o Authenticator. + Este dispositivo é o único autorizado a iniciar sessão.\n\nAdicione outro dispositivo ou método de início de sessão antes de continuar. + A desconexão da conta removerá a sua proteção Desconectar esta conta Certifique-se de que seus métodos de verificação e recuperação ainda estão atualizados para evitar perder o acesso à sua conta. Desconectar esta conta pode enfraquecer sua segurança Sair Desligar a conta + A sua conta deixará de estar protegida pela verificação em dois passos e ficará vulnerável a acessos não autorizados. Conta desconectada Concluir E-mail diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 4dd66142..5d6f2b89 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -70,11 +70,14 @@ Enhet Ditt konto kommer inte längre att skyddas av tvåstegsverifiering och blir sårbart för obehörig åtkomst. Du kommer inte längre att kunna godkänna inloggningar på denna enhet med Authenticator. + Den här enheten är den enda som är behörig att logga in.\n\nLägg till en annan enhet eller inloggningsmetod innan du fortsätter. + Om du kopplar bort kontot tas dess skydd bort Koppla från detta konto Se till att dina verifierings- och återställningsmetoder fortfarande är uppdaterade för att undvika att förlora åtkomst till ditt konto. Att koppla från detta konto kan försvaga dess säkerhet Logga ut Koppla bort kontot + Ditt konto kommer inte längre att skyddas av tvåstegsverifiering och kommer att vara sårbart för obehörig åtkomst. Konto frånkopplat Klar E-post diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fd0d7dc0..65aa7ec0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -71,11 +71,14 @@ Device Your account will no longer be protected by two-step verification and will become vulnerable to unauthorized access. You will no longer be able to approve logins on this device with Authenticator. + This device is the only one authorized to sign in.\n\nAdd another device or sign-in method before continuing. + Disconnecting the account will remove its protection Disconnect this account Make sure your verification and recovery methods are still up to date to avoid losing access to your account. Disconnecting this account may weaken its security Log out Disconnect the account + Your account will no longer be protected by two-step verification and will be vulnerable to unauthorized access. Account disconnected Done Email From 383dd80de88adc04faea225952f6d912e6f9d81c Mon Sep 17 00:00:00 2001 From: Jamy Bailly Date: Wed, 13 May 2026 11:12:36 +0200 Subject: [PATCH 04/16] chore: Add disconnectAccountAdd2faButton string resource --- app/src/main/res/values-da/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-fi/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-nb/strings.xml | 1 + app/src/main/res/values-nl/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-sv/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 13 files changed, 13 insertions(+) diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 451968d4..6f3c11bd 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -68,6 +68,7 @@ Afvis Beskrivelse Enhed + Tilføj endnu et trin Din konto vil ikke længere være beskyttet af totrinsbekræftelse og vil blive sårbar over for uautoriseret adgang. Du vil ikke længere kunne godkende login på denne enhed med Authenticator. Denne enhed er den eneste, der er autoriseret til at logge ind.\n\nTilføj en anden enhed eller login-metode, før du fortsætter. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 0e32e067..6c9eff23 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -69,6 +69,7 @@ Ablehnen Beschreibung Gerät + Einen weiteren Schritt hinzufügen Ihr Konto wird nicht mehr durch die Zwei-Faktor-Verifizierung geschützt und ist anfällig für unbefugten Zugriff. Sie können die Anmeldung auf diesem Gerät nicht mehr mit Authenticator bestätigen. Dieses Gerät ist das einzige, das zur Anmeldung berechtigt ist.\n\nFügen Sie ein anderes Gerät oder eine andere Anmeldemethode hinzu, bevor Sie fortfahren. diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 74b03f70..df23834c 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -68,6 +68,7 @@ Άρνηση Περιγραφή Συσκευή + Προσθήκη ενός άλλου βήματος Ο λογαριασμός σας δεν θα προστατεύεται πλέον από επαλήθευση σε δύο βήματα και θα γίνει ευάλωτος σε μη εξουσιοδοτημένη πρόσβαση. Δεν θα μπορείτε πλέον να εγκρίνετε συνδέσεις σε αυτή τη συσκευή με το Authenticator. Αυτή η συσκευή είναι η μόνη εξουσιοδοτημένη να συνδεθεί.\n\nΠροσθέστε άλλη συσκευή ή μέθοδο σύνδεσης πριν συνεχίσετε. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 553beb3b..782ffef9 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -69,6 +69,7 @@ Denegar Descripción Dispositivo + Añadir otro paso Su cuenta ya no estará protegida por la verificación en dos pasos y se volverá vulnerable a accesos no autorizados. Ya no podrá validar el inicio de sesión en este dispositivo con Authenticator. Este dispositivo es el único autorizado para iniciar sesión.\n\nAñade otro dispositivo o método de inicio de sesión antes de continuar. diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 78de63c2..09719ba6 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -68,6 +68,7 @@ Hylkää Kuvaus Laite + Lisää toinen vaihe Tilisi ei ole enää suojattu kaksivaiheisella todennuksella ja se on altis luvattomalle käytölle. Et voi enää hyväksyä kirjautumisia tällä laitteella Authenticatorilla. Tämä laite on ainoa, jolla on lupa kirjautua sisään.\n\nLisää toinen laite tai kirjautumismenetelmä ennen jatkamista. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 947ad916..431fd5fc 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -69,6 +69,7 @@ Refuser Description Appareil + Ajouter une autre étape Votre compte ne sera plus protégé par la validation en deux étapes et deviendra vulnérable aux accès non autorisés. Vous ne pourrez plus valider la connexion sur cet appareil avec Authenticator. Cet appareil est le seul autorisé à se connecter.\n\nAjoutez un autre appareil ou une autre méthode de connexion avant de continuer. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 6e4340d6..f15c987f 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -69,6 +69,7 @@ Nega Descrizione Dispositivo + Aggiungi un altro passo Il tuo account non sarà più protetto dalla verifica a due passaggi e diventerà vulnerabile ad accessi non autorizzati. Non potrai più verificare l’accesso su questo dispositivo con Authenticator. Questo dispositivo è l’unico autorizzato ad accedere.\n\nAggiungere un altro dispositivo o metodo di accesso prima di continuare. diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 15a31982..1903819e 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -68,6 +68,7 @@ Avvis Beskrivelse Enhet + Legg til et nytt trinn Kontoen din vil ikke lenger være beskyttet av totrinnsverifisering og vil bli sårbar for uautorisert tilgang. Du vil ikke lenger kunne godkjenne pålogginger på denne enheten med Authenticator. Denne enheten er den eneste som er autorisert til å logge på.\n\nLegg til en annen enhet eller påloggingsmetode før du fortsetter. diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index ce87b126..1dacdeab 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -68,6 +68,7 @@ Weigeren Beschrijving Apparaat + Nog een stap toevoegen Uw account zal niet langer worden beschermd door twee-stapsverificatie en zal kwetsbaar worden voor ongeautoriseerde toegang. U kunt geen inloggen meer goedkeuren op dit apparaat met Authenticator. Dit apparaat is het enige dat gemachtigd is om aan te melden.\n\nVoeg een ander apparaat of een andere aanmeldingsmethode toe voordat u doorgaat. diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index b8f2e010..04b91ea4 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -68,6 +68,7 @@ Odmów Opis Urządzenie + Dodaj kolejny krok Twoje konto nie będzie już chronione przez weryfikację dwuetapową i stanie się podatne na nieautoryzowany dostęp. Nie będziesz już mógł zatwierdzać logowań na tym urządzeniu za pomocą Authenticatora. To urządzenie jest jedynym uprawnionym do logowania.\n\nPrzed kontynuowaniem dodaj inne urządzenie lub metodę logowania. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 927862d3..34f520c1 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -68,6 +68,7 @@ Negar Descrição Dispositivo + Adicionar outra etapa Sua conta não estará mais protegida pela verificação em duas etapas e ficará vulnerável a acessos não autorizados. Você não poderá mais aprovar logins neste dispositivo com o Authenticator. Este dispositivo é o único autorizado a iniciar sessão.\n\nAdicione outro dispositivo ou método de início de sessão antes de continuar. diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 5d6f2b89..14fbfd9e 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -68,6 +68,7 @@ Neka Beskrivning Enhet + Lägg till ytterligare ett steg Ditt konto kommer inte längre att skyddas av tvåstegsverifiering och blir sårbart för obehörig åtkomst. Du kommer inte längre att kunna godkänna inloggningar på denna enhet med Authenticator. Den här enheten är den enda som är behörig att logga in.\n\nLägg till en annan enhet eller inloggningsmetod innan du fortsätter. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 65aa7ec0..855afdcd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -69,6 +69,7 @@ Deny Description Device + Add another step Your account will no longer be protected by two-step verification and will become vulnerable to unauthorized access. You will no longer be able to approve logins on this device with Authenticator. This device is the only one authorized to sign in.\n\nAdd another device or sign-in method before continuing. From dfc84cefb5df4359060b151f888fd70e7db3a94a Mon Sep 17 00:00:00 2001 From: Jamy Bailly Date: Wed, 13 May 2026 13:54:26 +0200 Subject: [PATCH 05/16] chore: Add removeAccountWarningTitle and removeAccountWarningDescription string resources --- app/src/main/res/values-da/strings.xml | 2 ++ app/src/main/res/values-de/strings.xml | 2 ++ app/src/main/res/values-el/strings.xml | 2 ++ app/src/main/res/values-es/strings.xml | 2 ++ app/src/main/res/values-fi/strings.xml | 2 ++ app/src/main/res/values-fr/strings.xml | 2 ++ app/src/main/res/values-it/strings.xml | 2 ++ app/src/main/res/values-nb/strings.xml | 2 ++ app/src/main/res/values-nl/strings.xml | 2 ++ app/src/main/res/values-pl/strings.xml | 2 ++ app/src/main/res/values-pt/strings.xml | 2 ++ app/src/main/res/values-sv/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ 13 files changed, 26 insertions(+) diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 6f3c11bd..739a2cca 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -128,6 +128,8 @@ Du vil ikke længere kunne bekræfte dit login til denne konto med Authenticator. Konto fjernet Fjern konto + Hvis Authenticator er din eneste totrinsbekræftelse, kan du blive låst ude, næste gang du prøver at logge ind. + Fjern konto Fjern Påkrævet Ikon for sikret konto diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 6c9eff23..53fe39e7 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -129,6 +129,8 @@ Sie können sich nicht mehr mit Authenticator bei diesem Konto anmelden. Konto entfernt Konto entfernen + Wenn Authenticator Ihre einzige Methode der zweistufigen Verifizierung ist, werden Sie möglicherweise beim nächsten Anmeldeversuch gesperrt. + Konto entfernen Entfernen Erforderlich Symbol für ein gesichertes Konto diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index df23834c..09a0e952 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -128,6 +128,8 @@ Δεν θα μπορείτε πλέον να επαληθεύετε τη σύνδεσή σας σε αυτόν τον λογαριασμό με το Authenticator. Ο λογαριασμός αφαιρέθηκε Αφαίρεση λογαριασμού + Εάν ο Αυθεντικός έλεγχος είναι η μόνη μέθοδος επαλήθευσης δύο βημάτων, ενδέχεται να κλειδωθείτε την επόμενη φορά που θα προσπαθήσετε να συνδεθείτε. + Κατάργηση λογαριασμού Αφαίρεση Απαιτούμενο Εικονίδιο ασφαλισμένου λογαριασμού diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 782ffef9..d3a3838d 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -129,6 +129,8 @@ Ya no podrá verificar su inicio de sesión en esta cuenta con Authenticator. Cuenta eliminada Eliminar cuenta + Si Authenticator es su único método de verificación en dos pasos, es posible que se bloquee la próxima vez que intente iniciar sesión. + Eliminar cuenta Eliminar Requerido Icono de cuenta protegida diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 09719ba6..fb0dee5b 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -128,6 +128,8 @@ Et voi enää vahvistaa kirjautumistasi tälle tilille Authenticatorilla. Tili poistettu Poista tili + Jos Authenticator on ainoa kaksivaiheinen vahvistusmenetelmäsi, saatat jäädä ulos, kun yrität kirjautua sisään seuraavan kerran. + Poista tili Poista Vaadittu Tilin turvattu kuvake diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 431fd5fc..5e7548bc 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -129,6 +129,8 @@ Vous ne pourrez plus valider la connexion à ce compte avec Authenticator. Compte retiré Retirer le compte + Si Authenticator est votre seule méthode de vérification en deux étapes, vous risquez d’être bloqué lors de votre prochaine tentative de connexion. + Retirer le compte Retirer Requis Icône de compte sécurisé diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index f15c987f..7c5965b5 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -129,6 +129,8 @@ Non potrai più verificare l’accesso a questo account con Authenticator. Account rimosso Rimuovi account + Se Authenticator è l’unico metodo di verifica in due passaggi, è possibile che si venga bloccati al successivo tentativo di accesso. + Rimuovere l’account Rimuovi Richiesto Icona del conto protetto diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 1903819e..293ee17b 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -128,6 +128,8 @@ Du vil ikke lenger kunne verifisere påloggingen din til denne kontoen med Authenticator. Konto fjernet Fjern konto + Hvis Authenticator er din eneste totrinnsbekreftelsesmetode, kan du bli låst neste gang du prøver å logge på. + Fjern konto Fjern Nødvendig Ikon for sikret konto diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 1dacdeab..f7ae913d 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -128,6 +128,8 @@ U kunt uw inloggen naar dit account niet langer verifiëren met Authenticator. Account verwijderd Account verwijderen + Als Authenticator uw enige tweestapsverificatiemethode is, wordt u mogelijk uitgesloten wanneer u de volgende keer probeert in te loggen. + Account verwijderen Verwijderen Vereist Pictogram voor beveiligde account diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 04b91ea4..da3e809f 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -128,6 +128,8 @@ Nie będziesz już mógł weryfikować logowania do tego konta za pomocą Authenticatora. Konto usunięte Usuń konto + Jeśli Authenticator jest jedyną metodą weryfikacji dwuetapowej, możesz zostać zablokowany przy następnej próbie logowania. + Usuń konto Usuń Wymagane Ikona zabezpieczonego konta diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 34f520c1..40a2561c 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -128,6 +128,8 @@ Você não poderá mais verificar seu login nesta conta com o Authenticator. Conta removida Remover conta + Se o Authenticator for o seu único método de verificação em dois passos, poderá ficar bloqueado da próxima vez que tentar iniciar sessão. + Remover conta Remover Necessário Ícone de conta protegida diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 14fbfd9e..56bf3bd2 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -128,6 +128,8 @@ Du kommer inte längre att kunna verifiera din inloggning till detta konto med Authenticator. Konto borttaget Ta bort konto + Om Authenticator är din enda metod för tvåstegsverifiering kan du bli utelåst nästa gång du försöker logga in. + Ta bort konto Ta bort Krävs Ikon för säkrat konto diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 855afdcd..8db01770 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -129,6 +129,8 @@ You will no longer be able to verify your login to this account with Authenticator. Account removed Remove account + If Authenticator is your only two-step verification method, you may be locked out the next time you try to log in. + Remove account Remove Required Account secured icon From 33d4377a27a501fdb2b8a14e6b07f045f72fc659 Mon Sep 17 00:00:00 2001 From: Jamy Bailly Date: Wed, 13 May 2026 13:59:24 +0200 Subject: [PATCH 06/16] chore: Add removeAccountButton string resource --- app/src/main/res/values-da/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-es/strings.xml | 1 + app/src/main/res/values-fi/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-nb/strings.xml | 1 + app/src/main/res/values-nl/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-sv/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 13 files changed, 13 insertions(+) diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 739a2cca..11d2ad41 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -125,6 +125,7 @@ Glemt adgangskode? Adgangskode Opdater afventende login + Fjern konto Du vil ikke længere kunne bekræfte dit login til denne konto med Authenticator. Konto fjernet Fjern konto diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 53fe39e7..ccd07132 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -126,6 +126,7 @@ Passwort vergessen? Passwort Ausstehende Anmeldungen aktualisieren + Konto entfernen Sie können sich nicht mehr mit Authenticator bei diesem Konto anmelden. Konto entfernt Konto entfernen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 09a0e952..9ecf7a3b 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -125,6 +125,7 @@ Ξεχάσατε τον κωδικό πρόσβασης; Κωδικός πρόσβασης Ανανέωση εκκρεμών συνδέσεων + Κατάργηση λογαριασμού Δεν θα μπορείτε πλέον να επαληθεύετε τη σύνδεσή σας σε αυτόν τον λογαριασμό με το Authenticator. Ο λογαριασμός αφαιρέθηκε Αφαίρεση λογαριασμού diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index d3a3838d..66f4387f 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -126,6 +126,7 @@ ¿Olvidaste tu contraseña? Contraseña Actualizar inicios de sesión pendientes + Eliminar cuenta Ya no podrá verificar su inicio de sesión en esta cuenta con Authenticator. Cuenta eliminada Eliminar cuenta diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index fb0dee5b..e6b3be8c 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -125,6 +125,7 @@ Unohditko salasanan? Salasana Päivitä odottavat kirjautumiset + Poista tili Et voi enää vahvistaa kirjautumistasi tälle tilille Authenticatorilla. Tili poistettu Poista tili diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 5e7548bc..d2e83791 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -126,6 +126,7 @@ Mot de passe oublié ? Mot de passe Actualiser les connexions en attente + Retirer le compte Vous ne pourrez plus valider la connexion à ce compte avec Authenticator. Compte retiré Retirer le compte diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 7c5965b5..a82032c1 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -126,6 +126,7 @@ Hai dimenticato la password? Password Aggiorna accessi in sospeso + Rimuovere l’account Non potrai più verificare l’accesso a questo account con Authenticator. Account rimosso Rimuovi account diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 293ee17b..a50ebae9 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -125,6 +125,7 @@ Glemt passord? Passord Oppdater ventende pålogginger + Fjern konto Du vil ikke lenger kunne verifisere påloggingen din til denne kontoen med Authenticator. Konto fjernet Fjern konto diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index f7ae913d..0d12abd6 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -125,6 +125,7 @@ Wachtwoord vergeten? Wachtwoord In afwachting zijnde inloggen vernieuwen + Account verwijderen U kunt uw inloggen naar dit account niet langer verifiëren met Authenticator. Account verwijderd Account verwijderen diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index da3e809f..d33d80c6 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -125,6 +125,7 @@ Nie pamiętasz hasła? Hasło Odśwież oczekujące logowania + Usuń konto Nie będziesz już mógł weryfikować logowania do tego konta za pomocą Authenticatora. Konto usunięte Usuń konto diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 40a2561c..14db56de 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -125,6 +125,7 @@ Esqueceu-se da palavra-passe? Palavra-passe Atualizar logins pendentes + Remover conta Você não poderá mais verificar seu login nesta conta com o Authenticator. Conta removida Remover conta diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 56bf3bd2..507c65d2 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -125,6 +125,7 @@ Glömt lösenordet? Lösenord Uppdatera väntande inloggningar + Ta bort konto Du kommer inte längre att kunna verifiera din inloggning till detta konto med Authenticator. Konto borttaget Ta bort konto diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8db01770..3ef266ab 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -126,6 +126,7 @@ Forgot password? Password Refresh pending logins + Remove account You will no longer be able to verify your login to this account with Authenticator. Account removed Remove account From 6b234988d9af3cdb9f13d678741b51a7167122bf Mon Sep 17 00:00:00 2001 From: Jamy Bailly Date: Wed, 13 May 2026 14:00:16 +0200 Subject: [PATCH 07/16] feat: Add disconnect account dialog flow --- .../dialog/DisconnectConfirmDialog.kt | 90 ++++++++++++++ .../dialog/DisconnectWarningDialog.kt | 115 ++++++++++++++++++ .../auth/ui/navigation/NavDestination.kt | 15 +++ .../ui/navigation/NavigationEntryProvider.kt | 46 ++++++- .../accountdetails/AccountDetailsScreen.kt | 22 ++-- .../accountdetails/AccountDetailsViewModel.kt | 91 +++++++++++++- .../auth/ui/screen/main/MainScreen.kt | 4 + gradle/libs.versions.toml | 2 +- 8 files changed, 372 insertions(+), 13 deletions(-) create mode 100644 app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/DisconnectConfirmDialog.kt create mode 100644 app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/DisconnectWarningDialog.kt diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/DisconnectConfirmDialog.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/DisconnectConfirmDialog.kt new file mode 100644 index 00000000..b9ee9014 --- /dev/null +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/DisconnectConfirmDialog.kt @@ -0,0 +1,90 @@ +/* + * Infomaniak Authenticator - Android + * Copyright (C) 2026 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.auth.ui.components.dialog + +import android.annotation.SuppressLint +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import com.infomaniak.auth.R +import com.infomaniak.auth.ui.screen.accountdetails.DisconnectConfiguration +import com.infomaniak.auth.ui.theme.AuthenticatorTheme +import com.infomaniak.core.ui.compose.preview.PreviewSmallWindow + +@Composable +fun DisconnectConfirmDialog( + configuration: DisconnectConfiguration, + onDismissRequest: () -> Unit, +) { + AlertDialog( + icon = { + Icon( + painter = painterResource(R.drawable.triangle_alert), + contentDescription = null + ) + }, + onDismissRequest = onDismissRequest, + title = { + Text( + text = stringResource(configuration.confirmationTitleResId), + textAlign = TextAlign.Center + ) + }, + text = { + Text(text = stringResource(configuration.confirmationDescriptionResId)) + }, + confirmButton = { + TextButton( + onClick = { + configuration.onConfirmButton() + onDismissRequest() + }, + colors = ButtonDefaults.textButtonColors( + contentColor = MaterialTheme.colorScheme.error, + ) + ) { + Text(stringResource(configuration.criticalButtonStringResId)) + } + } + ) +} + +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +@PreviewSmallWindow +@Composable +private fun DisconnectWarningDialogPreview() { + AuthenticatorTheme { + Scaffold { _ -> + DisconnectConfirmDialog( + configuration = DisconnectConfiguration.DisconnectSecuredAccount( + onConfirmButton = {}, + accessToken = "fake_access_token", + ), + onDismissRequest = {}, + ) + } + } +} diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/DisconnectWarningDialog.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/DisconnectWarningDialog.kt new file mode 100644 index 00000000..71fd149e --- /dev/null +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/DisconnectWarningDialog.kt @@ -0,0 +1,115 @@ +/* + * Infomaniak Authenticator - Android + * Copyright (C) 2026 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.auth.ui.components.dialog + +import android.annotation.SuppressLint +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import com.infomaniak.auth.R +import com.infomaniak.auth.lib.models.UrlConstants +import com.infomaniak.auth.ui.screen.accountdetails.DisconnectConfiguration +import com.infomaniak.auth.ui.theme.AuthenticatorTheme +import com.infomaniak.core.network.ApiEnvironment +import com.infomaniak.core.ui.compose.preview.PreviewSmallWindow +import com.infomaniak.core.webview.ui.WebViewActivity + +@Composable +fun DisconnectWarningDialog( + configuration: DisconnectConfiguration, + onDismissRequest: () -> Unit, + onConfirmButton: () -> Unit, +) { + val context = LocalContext.current + val host = ApiEnvironment.current.host + + AlertDialog( + icon = { + Icon( + painter = painterResource(R.drawable.ic_circle_information_outlined), + contentDescription = null + ) + }, + onDismissRequest = onDismissRequest, + title = { + Text( + text = stringResource(configuration.warningTitleResId), + textAlign = TextAlign.Center + ) + }, + text = { + Text(text = stringResource(configuration.warningDescriptionResId)) + }, + confirmButton = { + TextButton( + onClick = onConfirmButton, + colors = ButtonDefaults.textButtonColors( + contentColor = MaterialTheme.colorScheme.error, + ) + ) { + Text(stringResource(configuration.criticalButtonStringResId)) + } + }, + dismissButton = { + if (configuration.accessToken != null) { + TextButton( + onClick = { + onDismissRequest() + WebViewActivity.startActivity( + context = context, + url = UrlConstants.autologUrl( + host = host, + UrlConstants.managerUrl(host, configuration.dismissHelpUrl) + ), + headers = mapOf("Authorization" to "Bearer ${configuration.accessToken}"), + ) + } + ) { + Text(stringResource(configuration.neutralButtonStringResId)) + } + } + } + ) +} + +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +@PreviewSmallWindow +@Composable +private fun DisconnectWarningDialogPreview() { + AuthenticatorTheme { + Scaffold { _ -> + DisconnectWarningDialog( + configuration = DisconnectConfiguration.DisconnectSecuredAccount( + onConfirmButton = {}, + accessToken = "fake_access_token", + ), + onDismissRequest = {}, + onConfirmButton = {} + ) + } + } +} diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavDestination.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavDestination.kt index 2143a237..01f3d018 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavDestination.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavDestination.kt @@ -19,6 +19,7 @@ package com.infomaniak.auth.ui.navigation import androidx.compose.runtime.Immutable import androidx.navigation3.runtime.NavKey +import com.infomaniak.auth.ui.screen.accountdetails.DisconnectConfiguration import kotlinx.serialization.Serializable @Immutable @@ -85,6 +86,20 @@ sealed interface NavDestination : NavKey { @Serializable data class AccountDetails(val accountId: Long) : NavDestination + + //region Dialog + + interface DialogDestination : NavDestination + + sealed interface DisconnectDialog : DialogDestination { + @Serializable + data class DisconnectWarning(val configuration: DisconnectConfiguration) : DisconnectDialog + + @Serializable + data class DisconnectConfirmation(val configuration: DisconnectConfiguration) : DisconnectDialog + } + + //endregion } @Immutable diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt index 6bcb22d4..a7c5e05d 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt @@ -17,10 +17,15 @@ */ package com.infomaniak.auth.ui.navigation +import androidx.compose.ui.window.DialogProperties +import androidx.navigation3.runtime.EntryProviderScope import androidx.navigation3.runtime.NavBackStack import androidx.navigation3.runtime.NavEntry import androidx.navigation3.runtime.NavKey import androidx.navigation3.runtime.entryProvider +import androidx.navigation3.scene.DialogSceneStrategy +import com.infomaniak.auth.ui.components.dialog.DisconnectConfirmDialog +import com.infomaniak.auth.ui.components.dialog.DisconnectWarningDialog import com.infomaniak.auth.ui.screen.accountdetails.AccountDetailsScreen import com.infomaniak.auth.ui.screen.accountlist.AccountListScreen import com.infomaniak.auth.ui.screen.home.HomeScreen @@ -74,7 +79,10 @@ fun baseEntryProvider( onLoginPressed = { legacyAccount -> backStack.add(NavDestination.LoginInApp.Form(legacyAccount, isOnboarding = false)) }, - onBackPressed = backStack::tryPopLast + onBackPressed = backStack::tryPopLast, + onRemoveAccountClicked = { configuration -> + backStack.add(NavDestination.DisconnectDialog.DisconnectWarning(configuration)) + } ) } entry { @@ -122,6 +130,37 @@ fun baseEntryProvider( returnToLoginScreen = backStack::tryPopLast, ) } + addDisconnectEntries(backStack) +} + +private fun EntryProviderScope.addDisconnectEntries(backStack: NavBackStack) { + entry( + metadata = DialogSceneStrategy.dialog() + ) { params -> + DisconnectWarningDialog( + params.configuration, + onDismissRequest = { + backStack.clearDialog() + }, + onConfirmButton = { + backStack.clearDialog() + backStack.add(NavDestination.DisconnectDialog.DisconnectConfirmation(params.configuration)) + } + ) + } + + entry( + metadata = DialogSceneStrategy.dialog( + DialogProperties(windowTitle = "Route B dialog") + ) + ) { params -> + DisconnectConfirmDialog( + params.configuration, + onDismissRequest = { + backStack.clearDialog() + } + ) + } } fun homeEntryProvider(rootBackStack: NavBackStack): (NavKey) -> NavEntry = entryProvider { @@ -155,6 +194,11 @@ fun NavBackStack.tryPopLast() { removeAt(lastIndex) } +fun NavBackStack.clearDialog() { + if (lastIndex == 0) return + removeAll { it is NavDestination.DialogDestination } +} + fun NavBackStack.replaceAllWith(destination: NavKey) { add(destination) removeAll { it != destination } diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsScreen.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsScreen.kt index e143162b..84627e75 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsScreen.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsScreen.kt @@ -69,6 +69,7 @@ fun AccountDetailsScreen( accountId: Long, onBackPressed: () -> Unit, onLoginPressed: (Long) -> Unit, + onRemoveAccountClicked: (DisconnectConfiguration) -> Unit, viewModel: AccountDetailsViewModel = hiltViewModel(), ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() @@ -89,9 +90,7 @@ fun AccountDetailsScreen( onChallengesRefreshClicked = { viewModel.refreshChallenges(accountId) }, - onRemoveAccountClicked = { - viewModel.removeAccount() - } + onRemoveAccountClicked = onRemoveAccountClicked ) } @@ -101,7 +100,7 @@ fun AccountDetailsScreen( onLoginPressed: (Long) -> Unit, onBackPressed: () -> Unit, onChallengesRefreshClicked: () -> Unit, - onRemoveAccountClicked: () -> Unit, + onRemoveAccountClicked: (DisconnectConfiguration) -> Unit, modifier: Modifier = Modifier ) { SinglePaneScaffold( @@ -122,7 +121,9 @@ fun AccountDetailsScreen( user = uiState.user, onLoginPressed = onLoginPressed, onChallengesRefreshClicked = onChallengesRefreshClicked, - onRemoveAccountClicked = onRemoveAccountClicked + onRemoveAccountClicked = { + onRemoveAccountClicked(uiState.disconnectConfiguration) + } ) } is AccountDetailsUiState.Loading -> Unit @@ -242,7 +243,7 @@ private fun SettingsSections( } add( OptionItemType.Default( - stringResId = R.string.disconnectButton, + stringResId = if (accountStatus is Account.Status.NotConnected) R.string.removeAccountButton else R.string.disconnectButton, textColor = AuthenticatorTheme.materialColors.error, onClick = { onRemoveAccountClicked() @@ -265,7 +266,14 @@ private fun AccountDetailsScreenPreview( ) { AuthenticatorTheme { AccountDetailsScreen( - uiState = { AccountDetailsUiState.Success(accountPairs.first, accountPairs.second) }, + uiState = { AccountDetailsUiState.Success( + account = accountPairs.first, + user = accountPairs.second, + disconnectConfiguration = DisconnectConfiguration.DisconnectSecuredAccount( + onConfirmButton = {}, + accessToken = "fake_access_token", + ) + ) }, onLoginPressed = {}, onBackPressed = {}, onChallengesRefreshClicked = {}, diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt index 77e6e572..f1be5f19 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt @@ -20,8 +20,10 @@ package com.infomaniak.auth.ui.screen.accountdetails import androidx.compose.runtime.Immutable import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.infomaniak.auth.R import com.infomaniak.auth.lib.Account import com.infomaniak.auth.lib.AuthenticatorFacade +import com.infomaniak.auth.lib.models.UrlConstants import com.infomaniak.auth.utils.AccountUtils import com.infomaniak.core.auth.models.user.User import com.infomaniak.core.twofactorauth.back.TwoFactorAuthManager @@ -59,7 +61,14 @@ class AccountDetailsViewModel @Inject constructor( val account = accounts.find { it.id == id } if (account != null) { - AccountDetailsUiState.Success(account, user) + AccountDetailsUiState.Success( + account = account, + user = user, + disconnectConfiguration = genDisconnectConfiguration( + status = account.status, + accessToken = user?.apiToken?.accessToken + ) + ) } else { AccountDetailsUiState.Error } @@ -77,18 +86,40 @@ class AccountDetailsViewModel @Inject constructor( accountIdFlow.tryEmit(accountId) } - fun removeAccount() { + private fun removeAccount() { viewModelScope.launch(Dispatchers.IO) { accountIdFlow.first() .let { accountId -> accountUtils.users.first().firstOrNull { it.id.toLong() == accountId } } ?.let { user -> - authenticatorFacade.removeAccount(user.apiToken.accessToken, user.id.toLong()) accountUtils.removeUser(user.id) + authenticatorFacade.removeAccount(user.apiToken.accessToken, user.id.toLong()) accountRemovedChannel.send(Unit) } } } + private fun genDisconnectConfiguration(status: Account.Status, accessToken: String?): DisconnectConfiguration { + return when (status) { + is Account.Status.LoggedIn -> { + if (status.isSecured) { + DisconnectConfiguration.DisconnectSecuredAccount( + onConfirmButton = { removeAccount() }, + accessToken = accessToken + + ) + } else { + DisconnectConfiguration.DisconnectPartiallySecuredAccount( + onConfirmButton = { removeAccount() }, + accessToken = accessToken + ) + } + } + else -> DisconnectConfiguration.DisconnectNotConnectedAccount( + onConfirmButton = { removeAccount() } + ) + } + } + fun refreshChallenges(userId: Long) { twoFactorAuthManager.refreshChallengeNow(userId) } @@ -97,6 +128,58 @@ class AccountDetailsViewModel @Inject constructor( @Immutable sealed interface AccountDetailsUiState { data object Loading : AccountDetailsUiState - data class Success(val account: Account, val user: User?) : AccountDetailsUiState + data class Success( + val account: Account, + val user: User?, + val disconnectConfiguration: DisconnectConfiguration + ) : AccountDetailsUiState data object Error : AccountDetailsUiState } + +sealed interface DisconnectConfiguration { + val warningTitleResId: Int + val warningDescriptionResId: Int + val confirmationTitleResId: Int + val confirmationDescriptionResId: Int + val neutralButtonStringResId: Int + val criticalButtonStringResId: Int + val dismissHelpUrl: String + val onConfirmButton: () -> Unit + val accessToken: String? + + data class DisconnectSecuredAccount( + override val warningTitleResId: Int = R.string.disconnectAccountWarningTitle, + override val warningDescriptionResId: Int = R.string.disconnectAccountWarningDescription, + override val confirmationTitleResId: Int = R.string.disconnectAccountTitle, + override val confirmationDescriptionResId: Int = R.string.disconnectAccountOnThisDeviceDescription, + override val neutralButtonStringResId: Int = R.string.checkMyMethodsButton, + override val criticalButtonStringResId: Int = R.string.disconnectCriticalButton, + override val dismissHelpUrl: String = UrlConstants.SETTINGS_ACCOUNT_SECURITY_URL, + override val onConfirmButton: () -> Unit, + override val accessToken: String?, + ) : DisconnectConfiguration + + data class DisconnectPartiallySecuredAccount( + override val warningTitleResId: Int = R.string.disconnectAccountPartiallySecuredWarningTitle, + override val warningDescriptionResId: Int = R.string.disconnectAccountPartiallySecuredWarningDescription, + override val confirmationTitleResId: Int = R.string.disconnectAccountTitle, + override val confirmationDescriptionResId: Int = R.string.disconnectPartiallySecuredDescription, + override val neutralButtonStringResId: Int = R.string.disconnectAccountAdd2faButton, + override val criticalButtonStringResId: Int = R.string.disconnectCriticalButton, + override val dismissHelpUrl: String = UrlConstants.SETTINGS_2FA_MANAGER_URL, + override val onConfirmButton: () -> Unit, + override val accessToken: String?, + ) : DisconnectConfiguration + + data class DisconnectNotConnectedAccount( + override val warningTitleResId: Int = R.string.removeAccountWarningTitle, + override val warningDescriptionResId: Int = R.string.removeAccountWarningDescription, + override val confirmationTitleResId: Int = R.string.removeAccountTitle, + override val confirmationDescriptionResId: Int = R.string.removeAccountDescription, + override val neutralButtonStringResId: Int = R.string.checkMyMethodsButton, + override val criticalButtonStringResId: Int = R.string.removeAccountTitle, + override val dismissHelpUrl: String = UrlConstants.SETTINGS_ACCOUNT_SECURITY_URL, + override val onConfirmButton: () -> Unit, + override val accessToken: String? = null, + ) : DisconnectConfiguration +} diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/main/MainScreen.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/main/MainScreen.kt index 351383bc..7a018dfd 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/main/MainScreen.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/main/MainScreen.kt @@ -35,6 +35,7 @@ import androidx.navigation3.runtime.NavEntryDecorator import androidx.navigation3.runtime.NavKey import androidx.navigation3.runtime.rememberNavBackStack import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator +import androidx.navigation3.scene.DialogSceneStrategy import androidx.navigation3.ui.NavDisplay import androidx.navigationevent.NavigationEventDispatcher import androidx.navigationevent.NavigationEventDispatcherOwner @@ -139,10 +140,13 @@ fun MainScreen( backStack: NavBackStack, entryDecorators: ImmutableList>, ) { + val dialogStrategy = remember { DialogSceneStrategy() } + NavDisplay( backStack = backStack, entryDecorators = entryDecorators, entryProvider = baseEntryProvider(backStack), + sceneStrategies = listOf(dialogStrategy), transitionSpec = { defaultEnterAnimation }, popTransitionSpec = { defaultExitAnimation }, predictivePopTransitionSpec = { defaultExitAnimation }, diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4dfb281d..65cf8c5d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ kotlin = "2.3.0" osmerionkotlinBase32 = "1.0.0" ksp = "2.3.4" lifecycleViewmodelNav3 = "2.10.0" -nav3Core = "1.0.0" +nav3Core = "1.1.1" room = "2.8.4" skie = "0.10.9" sonarqube = "7.2.3.7755" From a593e0080eeed2bfe2f8334e986154a35697defe Mon Sep 17 00:00:00 2001 From: Jamy Bailly Date: Wed, 13 May 2026 14:35:23 +0200 Subject: [PATCH 08/16] feat: Remove account without user --- .../accountdetails/AccountDetailsViewModel.kt | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt index f1be5f19..7e64208f 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt @@ -88,13 +88,11 @@ class AccountDetailsViewModel @Inject constructor( private fun removeAccount() { viewModelScope.launch(Dispatchers.IO) { - accountIdFlow.first() - .let { accountId -> accountUtils.users.first().firstOrNull { it.id.toLong() == accountId } } - ?.let { user -> - accountUtils.removeUser(user.id) - authenticatorFacade.removeAccount(user.apiToken.accessToken, user.id.toLong()) - accountRemovedChannel.send(Unit) - } + accountIdFlow.first().let { accountId -> + accountUtils.removeUser(accountId.toInt()) + authenticatorFacade.removeAccount(token = null, id = accountId) + accountRemovedChannel.send(Unit) + } } } @@ -105,7 +103,6 @@ class AccountDetailsViewModel @Inject constructor( DisconnectConfiguration.DisconnectSecuredAccount( onConfirmButton = { removeAccount() }, accessToken = accessToken - ) } else { DisconnectConfiguration.DisconnectPartiallySecuredAccount( From fc733f35f55e350a165afc149e3548dc21870b9d Mon Sep 17 00:00:00 2001 From: Jamy Bailly Date: Wed, 13 May 2026 16:02:10 +0200 Subject: [PATCH 09/16] feat: Move Dialog package --- .../auth/ui/{components => }/dialog/PasswordChangedDialog.kt | 2 +- .../ui/{components => }/dialog/VerifyAccountSecurityDialog.kt | 2 +- .../dialog => dialog/disconnect}/DisconnectConfirmDialog.kt | 2 +- .../dialog => dialog/disconnect}/DisconnectWarningDialog.kt | 2 +- .../infomaniak/auth/ui/navigation/NavigationEntryProvider.kt | 4 ++-- .../kotlin/com/infomaniak/auth/ui/screen/main/MainScreen.kt | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) rename app/src/main/kotlin/com/infomaniak/auth/ui/{components => }/dialog/PasswordChangedDialog.kt (98%) rename app/src/main/kotlin/com/infomaniak/auth/ui/{components => }/dialog/VerifyAccountSecurityDialog.kt (98%) rename app/src/main/kotlin/com/infomaniak/auth/ui/{components/dialog => dialog/disconnect}/DisconnectConfirmDialog.kt (98%) rename app/src/main/kotlin/com/infomaniak/auth/ui/{components/dialog => dialog/disconnect}/DisconnectWarningDialog.kt (98%) diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/PasswordChangedDialog.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/PasswordChangedDialog.kt similarity index 98% rename from app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/PasswordChangedDialog.kt rename to app/src/main/kotlin/com/infomaniak/auth/ui/dialog/PasswordChangedDialog.kt index e317a6b8..c8a60059 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/PasswordChangedDialog.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/PasswordChangedDialog.kt @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.infomaniak.auth.ui.components.dialog +package com.infomaniak.auth.ui.dialog import android.annotation.SuppressLint import androidx.compose.material3.AlertDialog diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/VerifyAccountSecurityDialog.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/VerifyAccountSecurityDialog.kt similarity index 98% rename from app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/VerifyAccountSecurityDialog.kt rename to app/src/main/kotlin/com/infomaniak/auth/ui/dialog/VerifyAccountSecurityDialog.kt index 93b82070..73201b10 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/VerifyAccountSecurityDialog.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/VerifyAccountSecurityDialog.kt @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.infomaniak.auth.ui.components.dialog +package com.infomaniak.auth.ui.dialog import android.annotation.SuppressLint import androidx.compose.material3.AlertDialog diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/DisconnectConfirmDialog.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt similarity index 98% rename from app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/DisconnectConfirmDialog.kt rename to app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt index b9ee9014..ca7f679a 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/DisconnectConfirmDialog.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.infomaniak.auth.ui.components.dialog +package com.infomaniak.auth.ui.dialog.disconnect import android.annotation.SuppressLint import androidx.compose.material3.AlertDialog diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/DisconnectWarningDialog.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectWarningDialog.kt similarity index 98% rename from app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/DisconnectWarningDialog.kt rename to app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectWarningDialog.kt index 71fd149e..1088dcb5 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/components/dialog/DisconnectWarningDialog.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectWarningDialog.kt @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.infomaniak.auth.ui.components.dialog +package com.infomaniak.auth.ui.dialog.disconnect import android.annotation.SuppressLint import androidx.compose.material3.AlertDialog diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt index a7c5e05d..e57b9264 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt @@ -24,8 +24,8 @@ import androidx.navigation3.runtime.NavEntry import androidx.navigation3.runtime.NavKey import androidx.navigation3.runtime.entryProvider import androidx.navigation3.scene.DialogSceneStrategy -import com.infomaniak.auth.ui.components.dialog.DisconnectConfirmDialog -import com.infomaniak.auth.ui.components.dialog.DisconnectWarningDialog +import com.infomaniak.auth.ui.dialog.disconnect.DisconnectConfirmDialog +import com.infomaniak.auth.ui.dialog.disconnect.DisconnectWarningDialog import com.infomaniak.auth.ui.screen.accountdetails.AccountDetailsScreen import com.infomaniak.auth.ui.screen.accountlist.AccountListScreen import com.infomaniak.auth.ui.screen.home.HomeScreen diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/main/MainScreen.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/main/MainScreen.kt index 92751881..5d1e69d2 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/main/MainScreen.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/main/MainScreen.kt @@ -48,8 +48,8 @@ import com.infomaniak.auth.lib.Account import com.infomaniak.auth.lib.AppStatus import com.infomaniak.auth.lib.models.UrlConstants.HELP_SUPPORT_URL import com.infomaniak.auth.lib.models.UrlConstants.RECOVER_PASSWORD_URL -import com.infomaniak.auth.ui.components.dialog.PasswordChangedDialog -import com.infomaniak.auth.ui.components.dialog.VerifyAccountSecurityDialog +import com.infomaniak.auth.ui.dialog.PasswordChangedDialog +import com.infomaniak.auth.ui.dialog.VerifyAccountSecurityDialog import com.infomaniak.auth.ui.navigation.NavDestination import com.infomaniak.auth.ui.navigation.baseEntryProvider import com.infomaniak.auth.ui.navigation.replaceAllWith From 26ba080f3fd9f4e04a27439b2985532d13b95142 Mon Sep 17 00:00:00 2001 From: Jamy Bailly Date: Mon, 18 May 2026 11:11:52 +0200 Subject: [PATCH 10/16] feat: Use viewmodel in disconnect dialog --- .../disconnect/DisconnectConfirmDialog.kt | 23 +++- .../dialog/disconnect/DisconnectViewModel.kt | 79 ++++++++++++ .../disconnect/DisconnectWarningDialog.kt | 22 +++- .../auth/ui/navigation/NavDestination.kt | 4 +- .../ui/navigation/NavigationEntryProvider.kt | 11 +- .../accountdetails/AccountDetailsScreen.kt | 13 +- .../accountdetails/AccountDetailsViewModel.kt | 117 +++++++----------- 7 files changed, 173 insertions(+), 96 deletions(-) create mode 100644 app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectViewModel.kt diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt index ca7f679a..942e5555 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt @@ -26,9 +26,11 @@ import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import com.infomaniak.auth.R import com.infomaniak.auth.ui.screen.accountdetails.DisconnectConfiguration import com.infomaniak.auth.ui.theme.AuthenticatorTheme @@ -36,9 +38,21 @@ import com.infomaniak.core.ui.compose.preview.PreviewSmallWindow @Composable fun DisconnectConfirmDialog( + accountId: Long, configuration: DisconnectConfiguration, + onAccountDisconnected: () -> Unit, onDismissRequest: () -> Unit, + viewModel: DisconnectViewModel = hiltViewModel() ) { + LaunchedEffect(Unit) { + viewModel.fetchAccountDetails(accountId) + } + + LaunchedEffect(Unit) { + viewModel.accountRemovedChannel.receive() + onAccountDisconnected() + } + AlertDialog( icon = { Icon( @@ -59,7 +73,7 @@ fun DisconnectConfirmDialog( confirmButton = { TextButton( onClick = { - configuration.onConfirmButton() + viewModel.removeAccount() onDismissRequest() }, colors = ButtonDefaults.textButtonColors( @@ -79,10 +93,9 @@ private fun DisconnectWarningDialogPreview() { AuthenticatorTheme { Scaffold { _ -> DisconnectConfirmDialog( - configuration = DisconnectConfiguration.DisconnectSecuredAccount( - onConfirmButton = {}, - accessToken = "fake_access_token", - ), + accountId = 1L, + configuration = DisconnectConfiguration.DisconnectSecuredAccount, + onAccountDisconnected = {}, onDismissRequest = {}, ) } diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectViewModel.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectViewModel.kt new file mode 100644 index 00000000..dbe76d8d --- /dev/null +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectViewModel.kt @@ -0,0 +1,79 @@ +/* + * Infomaniak Authenticator - Android + * Copyright (C) 2026 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.auth.ui.dialog.disconnect + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.infomaniak.auth.lib.AuthenticatorFacade +import com.infomaniak.auth.utils.AccountUtils +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.flatMapLatest +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch +import javax.inject.Inject + +@OptIn(ExperimentalCoroutinesApi::class) +@HiltViewModel +class DisconnectViewModel @Inject constructor( + private val accountUtils: AccountUtils, + private val authenticatorFacade: AuthenticatorFacade, +) : ViewModel() { + private val accountIdFlow = MutableSharedFlow(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST) + + val userAccessToken = accountIdFlow + .flatMapLatest { id -> + combine( + accountUtils.users, + authenticatorFacade.accounts + ) { users, accounts -> + val user = users.find { it.id.toLong() == id } + val account = accounts.find { it.id == id } + + if (account != null) user?.apiToken?.accessToken else null + } + } + .stateIn( + scope = viewModelScope, + started = SharingStarted.Eagerly, + initialValue = null + ) + + val accountRemovedChannel = Channel(Channel.CONFLATED) + + fun fetchAccountDetails(accountId: Long) { + accountIdFlow.tryEmit(accountId) + } + + fun removeAccount() { + viewModelScope.launch(Dispatchers.IO) { + accountIdFlow.first().let { accountId -> + accountUtils.removeUser(accountId.toInt()) + authenticatorFacade.removeAccount(token = null, id = accountId) + accountRemovedChannel.send(Unit) + } + } + } +} diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectWarningDialog.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectWarningDialog.kt index 1088dcb5..c267b1d7 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectWarningDialog.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectWarningDialog.kt @@ -26,10 +26,14 @@ import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.infomaniak.auth.R import com.infomaniak.auth.lib.models.UrlConstants import com.infomaniak.auth.ui.screen.accountdetails.DisconnectConfiguration @@ -40,13 +44,21 @@ import com.infomaniak.core.webview.ui.WebViewActivity @Composable fun DisconnectWarningDialog( + accountId: Long, configuration: DisconnectConfiguration, onDismissRequest: () -> Unit, onConfirmButton: () -> Unit, + viewModel: DisconnectViewModel = hiltViewModel() ) { val context = LocalContext.current val host = ApiEnvironment.current.host + val userAccessToken by viewModel.userAccessToken.collectAsStateWithLifecycle() + + LaunchedEffect(Unit) { + viewModel.fetchAccountDetails(accountId) + } + AlertDialog( icon = { Icon( @@ -75,7 +87,7 @@ fun DisconnectWarningDialog( } }, dismissButton = { - if (configuration.accessToken != null) { + if (userAccessToken != null) { TextButton( onClick = { onDismissRequest() @@ -85,7 +97,7 @@ fun DisconnectWarningDialog( host = host, UrlConstants.managerUrl(host, configuration.dismissHelpUrl) ), - headers = mapOf("Authorization" to "Bearer ${configuration.accessToken}"), + headers = mapOf("Authorization" to "Bearer $userAccessToken"), ) } ) { @@ -103,10 +115,8 @@ private fun DisconnectWarningDialogPreview() { AuthenticatorTheme { Scaffold { _ -> DisconnectWarningDialog( - configuration = DisconnectConfiguration.DisconnectSecuredAccount( - onConfirmButton = {}, - accessToken = "fake_access_token", - ), + accountId = 1L, + configuration = DisconnectConfiguration.DisconnectSecuredAccount, onDismissRequest = {}, onConfirmButton = {} ) diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavDestination.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavDestination.kt index 01f3d018..5d068113 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavDestination.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavDestination.kt @@ -93,10 +93,10 @@ sealed interface NavDestination : NavKey { sealed interface DisconnectDialog : DialogDestination { @Serializable - data class DisconnectWarning(val configuration: DisconnectConfiguration) : DisconnectDialog + data class DisconnectWarning(val accountId: Long, val configuration: DisconnectConfiguration) : DisconnectDialog @Serializable - data class DisconnectConfirmation(val configuration: DisconnectConfiguration) : DisconnectDialog + data class DisconnectConfirmation(val accountId: Long, val configuration: DisconnectConfiguration) : DisconnectDialog } //endregion diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt index e57b9264..1f87c4db 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt @@ -80,8 +80,8 @@ fun baseEntryProvider( backStack.add(NavDestination.LoginInApp.Form(legacyAccount, isOnboarding = false)) }, onBackPressed = backStack::tryPopLast, - onRemoveAccountClicked = { configuration -> - backStack.add(NavDestination.DisconnectDialog.DisconnectWarning(configuration)) + onRemoveAccountClicked = { accountId, configuration -> + backStack.add(NavDestination.DisconnectDialog.DisconnectWarning(accountId, configuration)) } ) } @@ -138,13 +138,14 @@ private fun EntryProviderScope.addDisconnectEntries(backStack: NavBackSt metadata = DialogSceneStrategy.dialog() ) { params -> DisconnectWarningDialog( + params.accountId, params.configuration, onDismissRequest = { backStack.clearDialog() }, onConfirmButton = { backStack.clearDialog() - backStack.add(NavDestination.DisconnectDialog.DisconnectConfirmation(params.configuration)) + backStack.add(NavDestination.DisconnectDialog.DisconnectConfirmation(accountId = params.accountId, params.configuration)) } ) } @@ -155,7 +156,11 @@ private fun EntryProviderScope.addDisconnectEntries(backStack: NavBackSt ) ) { params -> DisconnectConfirmDialog( + params.accountId, params.configuration, + onAccountDisconnected = { + backStack.popUntil(NavDestination.Home) + }, onDismissRequest = { backStack.clearDialog() } diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsScreen.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsScreen.kt index 84627e75..fb2a4230 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsScreen.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsScreen.kt @@ -69,7 +69,7 @@ fun AccountDetailsScreen( accountId: Long, onBackPressed: () -> Unit, onLoginPressed: (Long) -> Unit, - onRemoveAccountClicked: (DisconnectConfiguration) -> Unit, + onRemoveAccountClicked: (Long, DisconnectConfiguration) -> Unit, viewModel: AccountDetailsViewModel = hiltViewModel(), ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() @@ -100,7 +100,7 @@ fun AccountDetailsScreen( onLoginPressed: (Long) -> Unit, onBackPressed: () -> Unit, onChallengesRefreshClicked: () -> Unit, - onRemoveAccountClicked: (DisconnectConfiguration) -> Unit, + onRemoveAccountClicked: (Long, DisconnectConfiguration) -> Unit, modifier: Modifier = Modifier ) { SinglePaneScaffold( @@ -122,7 +122,7 @@ fun AccountDetailsScreen( onLoginPressed = onLoginPressed, onChallengesRefreshClicked = onChallengesRefreshClicked, onRemoveAccountClicked = { - onRemoveAccountClicked(uiState.disconnectConfiguration) + onRemoveAccountClicked(uiState.account.id, uiState.disconnectConfiguration) } ) } @@ -269,15 +269,12 @@ private fun AccountDetailsScreenPreview( uiState = { AccountDetailsUiState.Success( account = accountPairs.first, user = accountPairs.second, - disconnectConfiguration = DisconnectConfiguration.DisconnectSecuredAccount( - onConfirmButton = {}, - accessToken = "fake_access_token", - ) + disconnectConfiguration = DisconnectConfiguration.DisconnectSecuredAccount ) }, onLoginPressed = {}, onBackPressed = {}, onChallengesRefreshClicked = {}, - onRemoveAccountClicked = {}, + onRemoveAccountClicked = { _, _ -> }, ) } } diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt index 7e64208f..14e5c0dc 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt @@ -28,7 +28,6 @@ import com.infomaniak.auth.utils.AccountUtils import com.infomaniak.core.auth.models.user.User import com.infomaniak.core.twofactorauth.back.TwoFactorAuthManager import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.channels.Channel @@ -36,10 +35,9 @@ import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import kotlinx.serialization.Serializable import javax.inject.Inject @OptIn(ExperimentalCoroutinesApi::class) @@ -64,10 +62,7 @@ class AccountDetailsViewModel @Inject constructor( AccountDetailsUiState.Success( account = account, user = user, - disconnectConfiguration = genDisconnectConfiguration( - status = account.status, - accessToken = user?.apiToken?.accessToken - ) + disconnectConfiguration = genDisconnectConfiguration(status = account.status) ) } else { AccountDetailsUiState.Error @@ -86,34 +81,16 @@ class AccountDetailsViewModel @Inject constructor( accountIdFlow.tryEmit(accountId) } - private fun removeAccount() { - viewModelScope.launch(Dispatchers.IO) { - accountIdFlow.first().let { accountId -> - accountUtils.removeUser(accountId.toInt()) - authenticatorFacade.removeAccount(token = null, id = accountId) - accountRemovedChannel.send(Unit) - } - } - } - - private fun genDisconnectConfiguration(status: Account.Status, accessToken: String?): DisconnectConfiguration { + private fun genDisconnectConfiguration(status: Account.Status): DisconnectConfiguration { return when (status) { is Account.Status.LoggedIn -> { if (status.isSecured) { - DisconnectConfiguration.DisconnectSecuredAccount( - onConfirmButton = { removeAccount() }, - accessToken = accessToken - ) + DisconnectConfiguration.DisconnectSecuredAccount } else { - DisconnectConfiguration.DisconnectPartiallySecuredAccount( - onConfirmButton = { removeAccount() }, - accessToken = accessToken - ) + DisconnectConfiguration.DisconnectPartiallySecuredAccount } } - else -> DisconnectConfiguration.DisconnectNotConnectedAccount( - onConfirmButton = { removeAccount() } - ) + else -> DisconnectConfiguration.DisconnectNotConnectedAccount } } @@ -133,50 +110,46 @@ sealed interface AccountDetailsUiState { data object Error : AccountDetailsUiState } -sealed interface DisconnectConfiguration { - val warningTitleResId: Int - val warningDescriptionResId: Int - val confirmationTitleResId: Int - val confirmationDescriptionResId: Int - val neutralButtonStringResId: Int - val criticalButtonStringResId: Int +@Serializable +enum class DisconnectConfiguration( + val warningTitleResId: Int, + val warningDescriptionResId: Int, + val confirmationTitleResId: Int, + val confirmationDescriptionResId: Int, + val neutralButtonStringResId: Int, + val criticalButtonStringResId: Int, val dismissHelpUrl: String - val onConfirmButton: () -> Unit - val accessToken: String? - - data class DisconnectSecuredAccount( - override val warningTitleResId: Int = R.string.disconnectAccountWarningTitle, - override val warningDescriptionResId: Int = R.string.disconnectAccountWarningDescription, - override val confirmationTitleResId: Int = R.string.disconnectAccountTitle, - override val confirmationDescriptionResId: Int = R.string.disconnectAccountOnThisDeviceDescription, - override val neutralButtonStringResId: Int = R.string.checkMyMethodsButton, - override val criticalButtonStringResId: Int = R.string.disconnectCriticalButton, - override val dismissHelpUrl: String = UrlConstants.SETTINGS_ACCOUNT_SECURITY_URL, - override val onConfirmButton: () -> Unit, - override val accessToken: String?, - ) : DisconnectConfiguration +) { + @Serializable + DisconnectSecuredAccount( + warningTitleResId = R.string.disconnectAccountWarningTitle, + warningDescriptionResId = R.string.disconnectAccountWarningDescription, + confirmationTitleResId = R.string.disconnectAccountTitle, + confirmationDescriptionResId = R.string.disconnectAccountOnThisDeviceDescription, + neutralButtonStringResId = R.string.checkMyMethodsButton, + criticalButtonStringResId = R.string.disconnectCriticalButton, + dismissHelpUrl = UrlConstants.SETTINGS_ACCOUNT_SECURITY_URL, + ), - data class DisconnectPartiallySecuredAccount( - override val warningTitleResId: Int = R.string.disconnectAccountPartiallySecuredWarningTitle, - override val warningDescriptionResId: Int = R.string.disconnectAccountPartiallySecuredWarningDescription, - override val confirmationTitleResId: Int = R.string.disconnectAccountTitle, - override val confirmationDescriptionResId: Int = R.string.disconnectPartiallySecuredDescription, - override val neutralButtonStringResId: Int = R.string.disconnectAccountAdd2faButton, - override val criticalButtonStringResId: Int = R.string.disconnectCriticalButton, - override val dismissHelpUrl: String = UrlConstants.SETTINGS_2FA_MANAGER_URL, - override val onConfirmButton: () -> Unit, - override val accessToken: String?, - ) : DisconnectConfiguration + @Serializable + DisconnectPartiallySecuredAccount( + warningTitleResId = R.string.disconnectAccountPartiallySecuredWarningTitle, + warningDescriptionResId = R.string.disconnectAccountPartiallySecuredWarningDescription, + confirmationTitleResId = R.string.disconnectAccountTitle, + confirmationDescriptionResId = R.string.disconnectPartiallySecuredDescription, + neutralButtonStringResId = R.string.disconnectAccountAdd2faButton, + criticalButtonStringResId = R.string.disconnectCriticalButton, + dismissHelpUrl = UrlConstants.SETTINGS_2FA_MANAGER_URL, + ), - data class DisconnectNotConnectedAccount( - override val warningTitleResId: Int = R.string.removeAccountWarningTitle, - override val warningDescriptionResId: Int = R.string.removeAccountWarningDescription, - override val confirmationTitleResId: Int = R.string.removeAccountTitle, - override val confirmationDescriptionResId: Int = R.string.removeAccountDescription, - override val neutralButtonStringResId: Int = R.string.checkMyMethodsButton, - override val criticalButtonStringResId: Int = R.string.removeAccountTitle, - override val dismissHelpUrl: String = UrlConstants.SETTINGS_ACCOUNT_SECURITY_URL, - override val onConfirmButton: () -> Unit, - override val accessToken: String? = null, - ) : DisconnectConfiguration + @Serializable + DisconnectNotConnectedAccount( + warningTitleResId = R.string.removeAccountWarningTitle, + warningDescriptionResId = R.string.removeAccountWarningDescription, + confirmationTitleResId = R.string.removeAccountTitle, + confirmationDescriptionResId = R.string.removeAccountDescription, + neutralButtonStringResId = R.string.checkMyMethodsButton, + criticalButtonStringResId = R.string.removeAccountTitle, + dismissHelpUrl = UrlConstants.SETTINGS_ACCOUNT_SECURITY_URL, + ) } From da9978a71fc78869adac3a4c752d28f5b30afc99 Mon Sep 17 00:00:00 2001 From: Jamy Bailly Date: Mon, 18 May 2026 11:25:16 +0200 Subject: [PATCH 11/16] refactor: Rename DisconnectViewModel to DisconnectDialogViewModel --- .../auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt | 2 +- .../{DisconnectViewModel.kt => DisconnectDialogViewModel.kt} | 2 +- .../auth/ui/dialog/disconnect/DisconnectWarningDialog.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/{DisconnectViewModel.kt => DisconnectDialogViewModel.kt} (98%) diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt index 942e5555..789ee413 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt @@ -42,7 +42,7 @@ fun DisconnectConfirmDialog( configuration: DisconnectConfiguration, onAccountDisconnected: () -> Unit, onDismissRequest: () -> Unit, - viewModel: DisconnectViewModel = hiltViewModel() + viewModel: DisconnectDialogViewModel = hiltViewModel() ) { LaunchedEffect(Unit) { viewModel.fetchAccountDetails(accountId) diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectViewModel.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectDialogViewModel.kt similarity index 98% rename from app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectViewModel.kt rename to app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectDialogViewModel.kt index dbe76d8d..afdffe38 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectViewModel.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectDialogViewModel.kt @@ -37,7 +37,7 @@ import javax.inject.Inject @OptIn(ExperimentalCoroutinesApi::class) @HiltViewModel -class DisconnectViewModel @Inject constructor( +class DisconnectDialogViewModel @Inject constructor( private val accountUtils: AccountUtils, private val authenticatorFacade: AuthenticatorFacade, ) : ViewModel() { diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectWarningDialog.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectWarningDialog.kt index c267b1d7..a0a17821 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectWarningDialog.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectWarningDialog.kt @@ -48,7 +48,7 @@ fun DisconnectWarningDialog( configuration: DisconnectConfiguration, onDismissRequest: () -> Unit, onConfirmButton: () -> Unit, - viewModel: DisconnectViewModel = hiltViewModel() + viewModel: DisconnectDialogViewModel = hiltViewModel() ) { val context = LocalContext.current val host = ApiEnvironment.current.host From 16fd8e1a530a9c808972bf9f062e46eacb91652a Mon Sep 17 00:00:00 2001 From: Jamy Bailly Date: Mon, 18 May 2026 11:27:08 +0200 Subject: [PATCH 12/16] fix: Remove useless dialog property --- .../infomaniak/auth/ui/navigation/NavigationEntryProvider.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt index 1f87c4db..fbde0262 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt @@ -17,7 +17,6 @@ */ package com.infomaniak.auth.ui.navigation -import androidx.compose.ui.window.DialogProperties import androidx.navigation3.runtime.EntryProviderScope import androidx.navigation3.runtime.NavBackStack import androidx.navigation3.runtime.NavEntry @@ -151,9 +150,7 @@ private fun EntryProviderScope.addDisconnectEntries(backStack: NavBackSt } entry( - metadata = DialogSceneStrategy.dialog( - DialogProperties(windowTitle = "Route B dialog") - ) + metadata = DialogSceneStrategy.dialog() ) { params -> DisconnectConfirmDialog( params.accountId, From 7f4c6a61c561e063d3ad54c5cfcd4fc5afcbaa38 Mon Sep 17 00:00:00 2001 From: Jamy Bailly Date: Mon, 18 May 2026 11:28:51 +0200 Subject: [PATCH 13/16] fix: Remove useless @Serializable --- .../auth/ui/screen/accountdetails/AccountDetailsViewModel.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt index 14e5c0dc..c5627f8a 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt @@ -37,7 +37,6 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.stateIn -import kotlinx.serialization.Serializable import javax.inject.Inject @OptIn(ExperimentalCoroutinesApi::class) @@ -110,7 +109,6 @@ sealed interface AccountDetailsUiState { data object Error : AccountDetailsUiState } -@Serializable enum class DisconnectConfiguration( val warningTitleResId: Int, val warningDescriptionResId: Int, @@ -120,7 +118,6 @@ enum class DisconnectConfiguration( val criticalButtonStringResId: Int, val dismissHelpUrl: String ) { - @Serializable DisconnectSecuredAccount( warningTitleResId = R.string.disconnectAccountWarningTitle, warningDescriptionResId = R.string.disconnectAccountWarningDescription, @@ -131,7 +128,6 @@ enum class DisconnectConfiguration( dismissHelpUrl = UrlConstants.SETTINGS_ACCOUNT_SECURITY_URL, ), - @Serializable DisconnectPartiallySecuredAccount( warningTitleResId = R.string.disconnectAccountPartiallySecuredWarningTitle, warningDescriptionResId = R.string.disconnectAccountPartiallySecuredWarningDescription, @@ -142,7 +138,6 @@ enum class DisconnectConfiguration( dismissHelpUrl = UrlConstants.SETTINGS_2FA_MANAGER_URL, ), - @Serializable DisconnectNotConnectedAccount( warningTitleResId = R.string.removeAccountWarningTitle, warningDescriptionResId = R.string.removeAccountWarningDescription, From c5361ba1885a08afbbee619a5d6e256db861c546 Mon Sep 17 00:00:00 2001 From: Jamy Bailly Date: Mon, 18 May 2026 12:35:10 +0200 Subject: [PATCH 14/16] fix: Apply copilote suggestions --- .../disconnect/DisconnectConfirmDialog.kt | 1 - .../ui/navigation/NavigationEntryProvider.kt | 18 +++++++++++++++--- .../accountdetails/AccountDetailsViewModel.kt | 2 ++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt index 789ee413..8ae170e1 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt @@ -74,7 +74,6 @@ fun DisconnectConfirmDialog( TextButton( onClick = { viewModel.removeAccount() - onDismissRequest() }, colors = ButtonDefaults.textButtonColors( contentColor = MaterialTheme.colorScheme.error, diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt index fbde0262..7cbfea69 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/navigation/NavigationEntryProvider.kt @@ -76,11 +76,18 @@ fun baseEntryProvider( AccountDetailsScreen( accountId = it.accountId, onLoginPressed = { legacyAccount -> - backStack.add(NavDestination.LoginInApp.Form(legacyAccount, isOnboarding = false)) + backStack.add( + NavDestination.LoginInApp.Form(legacyAccountId = legacyAccount, isOnboarding = false) + ) }, onBackPressed = backStack::tryPopLast, onRemoveAccountClicked = { accountId, configuration -> - backStack.add(NavDestination.DisconnectDialog.DisconnectWarning(accountId, configuration)) + backStack.add( + NavDestination.DisconnectDialog.DisconnectWarning( + accountId = accountId, + configuration = configuration + ) + ) } ) } @@ -144,7 +151,12 @@ private fun EntryProviderScope.addDisconnectEntries(backStack: NavBackSt }, onConfirmButton = { backStack.clearDialog() - backStack.add(NavDestination.DisconnectDialog.DisconnectConfirmation(accountId = params.accountId, params.configuration)) + backStack.add( + NavDestination.DisconnectDialog.DisconnectConfirmation( + accountId = params.accountId, + configuration = params.configuration + ) + ) } ) } diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt index c5627f8a..14305562 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt @@ -37,6 +37,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.stateIn +import kotlinx.serialization.Serializable import javax.inject.Inject @OptIn(ExperimentalCoroutinesApi::class) @@ -109,6 +110,7 @@ sealed interface AccountDetailsUiState { data object Error : AccountDetailsUiState } +@Serializable enum class DisconnectConfiguration( val warningTitleResId: Int, val warningDescriptionResId: Int, From e0fa9b00c436e1c50f13f829ede2f7edd4901b19 Mon Sep 17 00:00:00 2001 From: Jamy Bailly Date: Mon, 18 May 2026 12:38:35 +0200 Subject: [PATCH 15/16] fix: Remove useless accountRemovedChannel --- .../auth/ui/screen/accountdetails/AccountDetailsScreen.kt | 5 ----- .../auth/ui/screen/accountdetails/AccountDetailsViewModel.kt | 5 +---- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsScreen.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsScreen.kt index fb2a4230..58a2ae0b 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsScreen.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsScreen.kt @@ -78,11 +78,6 @@ fun AccountDetailsScreen( viewModel.fetchAccountDetails(accountId) } - LaunchedEffect(Unit) { - viewModel.accountRemovedChannel.receive() - onBackPressed() - } - AccountDetailsScreen( uiState = { uiState }, onLoginPressed = onLoginPressed, diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt index 14305562..dd12d84a 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/screen/accountdetails/AccountDetailsViewModel.kt @@ -30,7 +30,6 @@ import com.infomaniak.core.twofactorauth.back.TwoFactorAuthManager import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.BufferOverflow -import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow @@ -74,9 +73,7 @@ class AccountDetailsViewModel @Inject constructor( started = SharingStarted.Eagerly, initialValue = AccountDetailsUiState.Loading ) - - val accountRemovedChannel = Channel(Channel.CONFLATED) - + fun fetchAccountDetails(accountId: Long) { accountIdFlow.tryEmit(accountId) } From 84c5821b92ace5c8ad1c286caa3e0b7955d1afc0 Mon Sep 17 00:00:00 2001 From: Vincent Te Date: Mon, 18 May 2026 13:38:34 +0200 Subject: [PATCH 16/16] chore: Remove useless Channel --- .../auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt | 7 +------ .../ui/dialog/disconnect/DisconnectDialogViewModel.kt | 9 +++------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt index 8ae170e1..f7b53473 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectConfirmDialog.kt @@ -48,11 +48,6 @@ fun DisconnectConfirmDialog( viewModel.fetchAccountDetails(accountId) } - LaunchedEffect(Unit) { - viewModel.accountRemovedChannel.receive() - onAccountDisconnected() - } - AlertDialog( icon = { Icon( @@ -73,7 +68,7 @@ fun DisconnectConfirmDialog( confirmButton = { TextButton( onClick = { - viewModel.removeAccount() + viewModel.removeAccount(onAccountRemoved = onAccountDisconnected) }, colors = ButtonDefaults.textButtonColors( contentColor = MaterialTheme.colorScheme.error, diff --git a/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectDialogViewModel.kt b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectDialogViewModel.kt index afdffe38..84a55ddd 100644 --- a/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectDialogViewModel.kt +++ b/app/src/main/kotlin/com/infomaniak/auth/ui/dialog/disconnect/DisconnectDialogViewModel.kt @@ -25,7 +25,6 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.BufferOverflow -import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.combine @@ -40,7 +39,7 @@ import javax.inject.Inject class DisconnectDialogViewModel @Inject constructor( private val accountUtils: AccountUtils, private val authenticatorFacade: AuthenticatorFacade, -) : ViewModel() { +) : ViewModel() { private val accountIdFlow = MutableSharedFlow(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST) val userAccessToken = accountIdFlow @@ -61,18 +60,16 @@ class DisconnectDialogViewModel @Inject constructor( initialValue = null ) - val accountRemovedChannel = Channel(Channel.CONFLATED) - fun fetchAccountDetails(accountId: Long) { accountIdFlow.tryEmit(accountId) } - fun removeAccount() { + fun removeAccount(onAccountRemoved: () -> Unit) { viewModelScope.launch(Dispatchers.IO) { accountIdFlow.first().let { accountId -> accountUtils.removeUser(accountId.toInt()) authenticatorFacade.removeAccount(token = null, id = accountId) - accountRemovedChannel.send(Unit) + onAccountRemoved() } } }