Add biometric lock and rate limit handling

Biometric lock: opt-in Face ID/Touch ID/fingerprint app lock with toggle
in ProfileScreen. Locks on background, requires auth on foreground return.
Platform implementations: BiometricPrompt (Android), LAContext (iOS).

Rate limit: 429 responses parsed with Retry-After header, user-friendly
error messages in all 10 locales, retry plugin respects 429.
ErrorMessageParser updated for both iOS Swift and KMM.
This commit is contained in:
Trey T
2026-03-26 14:37:04 -05:00
parent 334767cee7
commit 0d80df07f6
31 changed files with 871 additions and 7 deletions

View File

@@ -421,6 +421,8 @@
<string name="error_network">Netzwerkfehler. Uberprufen Sie Ihre Verbindung.</string>
<string name="error_timeout">Zeituberschreitung. Bitte versuchen Sie es erneut.</string>
<string name="error_server">Serverfehler. Bitte versuchen Sie es spater erneut.</string>
<string name="error_rate_limit">Zu viele Anfragen. Bitte versuchen Sie es spater erneut.</string>
<string name="error_rate_limit_with_delay">Zu viele Anfragen. Bitte versuchen Sie es in %1$d Sekunden erneut.</string>
<string name="error_unauthorized">Sitzung abgelaufen. Bitte melden Sie sich erneut an.</string>
<string name="error_not_found">Nicht gefunden</string>
<string name="error_invalid_input">Bitte uberprufen Sie Ihre Eingabe</string>

View File

@@ -421,6 +421,8 @@
<string name="error_network">Error de red. Verifica tu conexion.</string>
<string name="error_timeout">Tiempo de espera agotado. Intenta de nuevo.</string>
<string name="error_server">Error del servidor. Intenta mas tarde.</string>
<string name="error_rate_limit">Demasiadas solicitudes. Intenta de nuevo mas tarde.</string>
<string name="error_rate_limit_with_delay">Demasiadas solicitudes. Intenta de nuevo en %1$d segundos.</string>
<string name="error_unauthorized">Sesion expirada. Inicia sesion de nuevo.</string>
<string name="error_not_found">No encontrado</string>
<string name="error_invalid_input">Verifica los datos ingresados</string>

View File

@@ -421,6 +421,8 @@
<string name="error_network">Erreur reseau. Verifiez votre connexion.</string>
<string name="error_timeout">Delai d\'attente depasse. Veuillez reessayer.</string>
<string name="error_server">Erreur serveur. Veuillez reessayer plus tard.</string>
<string name="error_rate_limit">Trop de requetes. Veuillez reessayer plus tard.</string>
<string name="error_rate_limit_with_delay">Trop de requetes. Veuillez reessayer dans %1$d secondes.</string>
<string name="error_unauthorized">Session expiree. Veuillez vous reconnecter.</string>
<string name="error_not_found">Non trouve</string>
<string name="error_invalid_input">Veuillez verifier vos donnees</string>

View File

@@ -421,6 +421,8 @@
<string name="error_network">Errore di rete. Controlla la tua connessione.</string>
<string name="error_timeout">Richiesta scaduta. Riprova.</string>
<string name="error_server">Errore del server. Riprova più tardi.</string>
<string name="error_rate_limit">Troppe richieste. Riprova più tardi.</string>
<string name="error_rate_limit_with_delay">Troppe richieste. Riprova tra %1$d secondi.</string>
<string name="error_unauthorized">Sessione scaduta. Effettua nuovamente l\'accesso.</string>
<string name="error_not_found">Non trovato</string>
<string name="error_invalid_input">Controlla i tuoi dati inseriti</string>

View File

@@ -421,6 +421,8 @@
<string name="error_network">ネットワークエラー。接続を確認してください。</string>
<string name="error_timeout">リクエストがタイムアウトしました。もう一度お試しください。</string>
<string name="error_server">サーバーエラー。後でもう一度お試しください。</string>
<string name="error_rate_limit">リクエストが多すぎます。しばらくしてからもう一度お試しください。</string>
<string name="error_rate_limit_with_delay">リクエストが多すぎます。%1$d秒後にもう一度お試しください。</string>
<string name="error_unauthorized">セッションが期限切れです。再度ログインしてください。</string>
<string name="error_not_found">見つかりません</string>
<string name="error_invalid_input">入力内容を確認してください</string>

View File

@@ -421,6 +421,8 @@
<string name="error_network">네트워크 오류가 발생했습니다. 연결을 확인하세요.</string>
<string name="error_timeout">요청 시간이 초과되었습니다. 다시 시도해 주세요.</string>
<string name="error_server">서버 오류가 발생했습니다. 나중에 다시 시도해 주세요.</string>
<string name="error_rate_limit">요청이 너무 많습니다. 나중에 다시 시도해 주세요.</string>
<string name="error_rate_limit_with_delay">요청이 너무 많습니다. %1$d초 후에 다시 시도해 주세요.</string>
<string name="error_unauthorized">세션이 만료되었습니다. 다시 로그인해 주세요.</string>
<string name="error_not_found">찾을 수 없음</string>
<string name="error_invalid_input">입력 내용을 확인해 주세요</string>

View File

@@ -421,6 +421,8 @@
<string name="error_network">Netwerkfout. Controleer uw verbinding.</string>
<string name="error_timeout">Verzoek verlopen. Probeer het opnieuw.</string>
<string name="error_server">Serverfout. Probeer het later opnieuw.</string>
<string name="error_rate_limit">Te veel verzoeken. Probeer het later opnieuw.</string>
<string name="error_rate_limit_with_delay">Te veel verzoeken. Probeer het over %1$d seconden opnieuw.</string>
<string name="error_unauthorized">Sessie verlopen. Log opnieuw in.</string>
<string name="error_not_found">Niet gevonden</string>
<string name="error_invalid_input">Controleer uw invoer</string>

View File

@@ -421,6 +421,8 @@
<string name="error_network">Erro de rede. Verifique sua conexao.</string>
<string name="error_timeout">Tempo esgotado. Tente novamente.</string>
<string name="error_server">Erro do servidor. Tente mais tarde.</string>
<string name="error_rate_limit">Muitas solicitacoes. Tente novamente mais tarde.</string>
<string name="error_rate_limit_with_delay">Muitas solicitacoes. Tente novamente em %1$d segundos.</string>
<string name="error_unauthorized">Sessao expirada. Entre novamente.</string>
<string name="error_not_found">Nao encontrado</string>
<string name="error_invalid_input">Verifique os dados informados</string>

View File

@@ -421,6 +421,8 @@
<string name="error_network">网络错误,请检查您的连接。</string>
<string name="error_timeout">请求超时,请重试。</string>
<string name="error_server">服务器错误,请稍后重试。</string>
<string name="error_rate_limit">请求过多,请稍后重试。</string>
<string name="error_rate_limit_with_delay">请求过多,请在%1$d秒后重试。</string>
<string name="error_unauthorized">会话已过期,请重新登录。</string>
<string name="error_not_found">未找到</string>
<string name="error_invalid_input">请检查您的输入</string>

View File

@@ -654,6 +654,8 @@
<string name="error_network">Network error. Please check your connection.</string>
<string name="error_timeout">Request timed out. Please try again.</string>
<string name="error_server">Server error. Please try again later.</string>
<string name="error_rate_limit">Too many requests. Please try again later.</string>
<string name="error_rate_limit_with_delay">Too many requests. Please try again in %1$d seconds.</string>
<string name="error_unauthorized">Session expired. Please log in again.</string>
<string name="error_not_found">Not found</string>
<string name="error_invalid_input">Please check your input</string>
@@ -810,4 +812,15 @@
<string name="onboarding_subscription_start_trial">Start 7-Day Free Trial</string>
<string name="onboarding_subscription_continue_free">Continue with Free</string>
<string name="onboarding_subscription_trial_terms">7-day free trial, then %1$s. Cancel anytime.</string>
<!-- Biometric Lock -->
<string name="biometric_lock_title">App Locked</string>
<string name="biometric_lock_description">Authenticate to unlock honeyDue</string>
<string name="biometric_lock_setting_title">Biometric Lock</string>
<string name="biometric_lock_setting_subtitle">Require authentication when opening the app</string>
<string name="biometric_prompt_title">Unlock honeyDue</string>
<string name="biometric_prompt_subtitle">Verify your identity to continue</string>
<string name="biometric_unlock_button">Unlock with Biometrics</string>
<string name="biometric_auth_failed">Authentication failed</string>
<string name="biometric_not_available">Biometric authentication is not available on this device</string>
</resources>