Compare commits

..

1 Commits

Author SHA1 Message Date
Sarah Jamie Lewis 1baa0ca31e Autofill Hints for Password Fields (#40) 2021-06-27 08:16:31 -07:00
3 changed files with 77 additions and 72 deletions

View File

@ -1,68 +1,68 @@
{ {
"@@locale": "de", "@@locale": "de",
"@@last_modified": "2021-06-25T18:57:59+02:00", "@@last_modified": "2021-06-25T18:57:59+02:00",
"notificationNewMessageFromGroup": "Neue Nachricht in einer Gruppe!", "notificationNewMessageFromGroup": "New message in a group!",
"notificationNewMessageFromPeer": "Neue Nachricht von einem Kontakt!", "notificationNewMessageFromPeer": "New message from a contact!",
"tooltipHidePassword": "Password verstecken", "tooltipHidePassword": "Hide Password",
"tooltipShowPassword": "Password anzeigen", "tooltipShowPassword": "Show Password",
"serverNotSynced": "Neue Nachrichten abrufen (Dies kann eine Weile dauern...)", "serverNotSynced": "Syncing New Messages (This can take some time)...",
"groupInviteSettingsWarning": "Du wurdest eingeladen einer Gruppe beizutreten! Bitte aktiviere das Gruppenchat Experiment in den Einstellungen um diese Einladung anzusehen.", "groupInviteSettingsWarning": "You have been invited to join a group! Please enable the Group Chat Experiment in Settings to view this Invitation.",
"shutdownCwtchAction": "Cwtch schliessen", "shutdownCwtchAction": "Shutdown Cwtch",
"shutdownCwtchDialog": "Bist du sicher, dass du Cwtch schliessen möchtest? Alle Verbindungen werden geschlossen und die App wird beendet.", "shutdownCwtchDialog": "Are you sure you want to shutdown Cwtch? This will close all connections, and exit the application.",
"shutdownCwtchDialogTitle": "Cwtch schliessen?", "shutdownCwtchDialogTitle": "Shutdown Cwtch?",
"shutdownCwtchTooltip": "Cwtch schliessen", "shutdownCwtchTooltip": "Shutdown Cwtch",
"malformedMessage": "Malformed message", "malformedMessage": "Malformed message",
"profileDeleteSuccess": "Profil erfolgreich gelöscht", "profileDeleteSuccess": "Successfully deleted profile",
"debugLog": "Konsolendebuglogging aktivivieren", "debugLog": "Turn on console debug logging",
"torNetworkStatus": "Tor Netzwerkstatus", "torNetworkStatus": "Tor network status",
"addContactFirst": "Wähle einen Kontakt oder füge ihn hinzu, um einen Chat zu starten.", "addContactFirst": "Add or pick a contact to begin chatting.",
"createProfileToBegin": "Bitte erstelle oder entsperre ein Profil um loszulegen", "createProfileToBegin": "Please create or unlock a profile to begin",
"nickChangeSuccess": "Profilename erfolgreich geändert", "nickChangeSuccess": "Profile nickname changed successfully",
"addServerFirst": "Du musst einen Server hinzufügen, bevor du eine Gruppe erstellen kannst", "addServerFirst": "You need to add a server before you can create a group",
"deleteProfileSuccess": "Erfolgreich Profil gelöscht", "deleteProfileSuccess": "Successfully deleted profile",
"sendInvite": "Versende Kontakt- oder Gruppeneinladung", "sendInvite": "Send a contact or group invite",
"sendMessage": "Nachricht senden", "sendMessage": "Send Message",
"cancel": "Abbrechen", "cancel": "Cancel",
"resetTor": "Zurücksetzen", "resetTor": "Reset",
"torStatus": "Tor Status", "torStatus": "Tor Status",
"torVersion": "Tor Version", "torVersion": "Tor Version",
"sendAnInvitation": "Du hast eine Einladung geschickt für: ", "sendAnInvitation": "You sent an invitation for: ",
"contactSuggestion": "Dieser Kontaktvorschlag ist für:", "contactSuggestion": "This is a contact suggestion for: ",
"rejected": "Abgelehnt!", "rejected": "Rejected!",
"accepted": "Angenommen!", "accepted": "Accepted!",
"chatHistoryDefault": "Diese Unterhaltung wird gelöscht sobald Cwtch geschlossen wird! Der Nachrichtenverlauf für jede Unterhaltung kann im Einstellungsmenü oben rechts geändert werden.", "chatHistoryDefault": "This conversation will be deleted when Cwtch is closed! Message history can be enabled per-conversation via the Settings menu in the upper right.",
"newPassword": "Neues Passwort", "newPassword": "New Password",
"yesLeave": "Ja, diese Unterhaltung beenden", "yesLeave": "Yes, Leave This Conversation",
"reallyLeaveThisGroupPrompt": "Bist du sicher, dass du diese Unterhaltung beenden möchtest? Alle Nachrichten und Attribute werden gelöscht.", "reallyLeaveThisGroupPrompt": "Are you sure you want to leave this conversation? All messages and attributes will be deleted.",
"leaveGroup": "Unterhaltung beenden", "leaveGroup": "Leave This Conversation",
"inviteToGroup": "Du wurdest eingeladen einer Gruppe beizutreten:", "inviteToGroup": "You have been invited to join a group:",
"pasteAddressToAddContact": "Adresse hier hinzufügen, um einen Kontakt aufzunehmen", "pasteAddressToAddContact": "Adresse hier hinzufügen, um einen Kontakt aufzunehmen",
"tooltipAddContact": "Neuen Kontakt oder Unterhaltung hinzufügen", "tooltipAddContact": "Add a new contact or conversation",
"titleManageContacts": "Unterhaltungen", "titleManageContacts": "Conversations",
"titleManageServers": "Server verwalten", "titleManageServers": "Manage Servers",
"dateMonthsAgo": "Months Ago", "dateMonthsAgo": "Months Ago",
"dateNever": "Nie", "dateNever": "Never",
"dateYearsAgo": "X Years Ago (displayed next to a contact row to indicate time of last action)", "dateYearsAgo": "X Years Ago (displayed next to a contact row to indicate time of last action)",
"dateLastYear": "Letzes Jahr", "dateLastYear": "Last Year",
"dateYesterday": "Gestern", "dateYesterday": "Yesterday",
"dateLastMonth": "Letzter Monat", "dateLastMonth": "Last Month",
"dateWeeksAgo": "Weeks Ago", "dateWeeksAgo": "Weeks Ago",
"dateDaysAgo": "Days Ago", "dateDaysAgo": "Days Ago",
"dateHoursAgo": "Hours Ago", "dateHoursAgo": "Hours Ago",
"dateMinutesAgo": "Minutes Ago", "dateMinutesAgo": "Minutes Ago",
"dateRightNow": "Jetzt", "dateRightNow": "Right Now",
"successfullAddedContact": "Erfolgreich hinzugefügt", "successfullAddedContact": "Successfully added ",
"descriptionBlockUnknownConnections": "If turned on, this option will automatically close connections from Cwtch users that have not been added to your contact list.", "descriptionBlockUnknownConnections": "If turned on, this option will automatically close connections from Cwtch users that have not been added to your contact list.",
"descriptionExperimentsGroups": "The group experiment allows Cwtch to connect with untrusted server infrastructure to facilitate communication with more than one contact.", "descriptionExperimentsGroups": "The group experiment allows Cwtch to connect with untrusted server infrastructure to facilitate communication with more than one contact.",
"descriptionExperiments": "Cwtch experiments are optional, opt-in features that add additional functionality to Cwtch that may have different privacy considerations than traditional 1:1 metadata resistant chat e.g. group chat, bot integration etc.", "descriptionExperiments": "Cwtch experiments are optional, opt-in features that add additional functionality to Cwtch that may have different privacy considerations than traditional 1:1 metadata resistant chat e.g. group chat, bot integration etc.",
"titleManageProfiles": "Cwtch Profile verwalten", "titleManageProfiles": "Manage Cwtch Profiles",
"tooltipUnlockProfiles": "Entsperre verschlüsselte Profile durch Eingabe des Passworts.", "tooltipUnlockProfiles": "Unlock encrypted profiles by entering their password.",
"tooltipOpenSettings": "Öfffne das Einstellungsmenü", "tooltipOpenSettings": "Open the settings pane",
"invalidImportString": "Ungültiger Importstring", "invalidImportString": "Invalid import string",
"contactAlreadyExists": "Kontakt existiert bereits", "contactAlreadyExists": "Contact Already Exists",
"conversationSettings": "Unterhaltungseinstellungen", "conversationSettings": "Conversation Settings",
"enterCurrentPasswordForDelete": "Bitte gib das aktuelle Passwort ein, um diese Profil zu löschen.", "enterCurrentPasswordForDelete": "Please enter current password to delete this profile.",
"enableGroups": "Gruppenchat aktivieren", "enableGroups": "Enable Group Chat",
"experimentsEnabled": "Experimente aktiviert", "experimentsEnabled": "Experimente aktiviert",
"localeIt": "Italiana", "localeIt": "Italiana",
"localeEs": "Espanol", "localeEs": "Espanol",
@ -110,12 +110,12 @@
"passwordErrorMatch": "Passwörter stimmen nicht überein", "passwordErrorMatch": "Passwörter stimmen nicht überein",
"saveProfileBtn": "Profil speichern", "saveProfileBtn": "Profil speichern",
"createProfileBtn": "Profil speichern", "createProfileBtn": "Profil speichern",
"passwordErrorEmpty": "Passwort darf nicht leer sein", "passwordErrorEmpty": "Passwort kann nicht leer sein",
"password2Label": "Passwort erneut eingeben", "password2Label": "Passwort erneut eingeben",
"password1Label": "Passwort", "password1Label": "Passwort",
"currentPasswordLabel": "aktuelles Passwort", "currentPasswordLabel": "derzeitiges Passwort",
"yourDisplayName": "Dein Anzeigename", "yourDisplayName": "Ihr Anzeigename",
"profileOnionLabel": "Sende diese Adresse an andere Nutzer, mit denen Sie sich verbinden möchten", "profileOnionLabel": "Senden Sie diese Adresse an Peers, mit denen Sie sich verbinden möchten",
"noPasswordWarning": "Wenn für dieses Konto kein Passwort verwendet wird, bedeutet dies, dass alle lokal gespeicherten Daten nicht verschlüsselt werden.", "noPasswordWarning": "Wenn für dieses Konto kein Passwort verwendet wird, bedeutet dies, dass alle lokal gespeicherten Daten nicht verschlüsselt werden.",
"radioNoPassword": "Unverschlüsselt (kein Passwort)", "radioNoPassword": "Unverschlüsselt (kein Passwort)",
"radioUsePassword": "Passwort", "radioUsePassword": "Passwort",
@ -128,13 +128,13 @@
"editProfileTitle": "Profil bearbeiten", "editProfileTitle": "Profil bearbeiten",
"addProfileTitle": "Neues Profil hinzufügen", "addProfileTitle": "Neues Profil hinzufügen",
"deleteBtn": "löschen", "deleteBtn": "löschen",
"unblockBtn": "Anderen Nutzer entsperren", "unblockBtn": "Peer entblockieren",
"dontSavePeerHistory": "Verlauf mit anderem Nutzer löschen", "dontSavePeerHistory": "Peer-Verlauf löschen",
"savePeerHistoryDescription": "Legt fest, ob ein mit dem anderen Nutzer verknüpfter Verlauf gelöscht werden soll oder nicht.", "savePeerHistoryDescription": "Legt fest, ob ein mit dem Peer verknüpfter Verlauf gelöscht werden soll oder nicht.",
"savePeerHistory": "Peer-Verlauf speichern", "savePeerHistory": "Peer-Verlauf speichern",
"blockBtn": "Anderen Nutzer blockieren", "blockBtn": "Peer blockieren",
"saveBtn": "speichern", "saveBtn": "speichern",
"displayNameLabel": "Angezeigename", "displayNameLabel": "Angezeigter Name",
"addressLabel": "Adresse", "addressLabel": "Adresse",
"puzzleGameBtn": "Puzzlespiel", "puzzleGameBtn": "Puzzlespiel",
"bulletinsBtn": "Meldungen", "bulletinsBtn": "Meldungen",
@ -145,41 +145,41 @@
"acceptGroupInviteLabel": "Möchtest Du die Einladung annehmen", "acceptGroupInviteLabel": "Möchtest Du die Einladung annehmen",
"newGroupBtn": "Neue Gruppe anlegen", "newGroupBtn": "Neue Gruppe anlegen",
"copiedClipboardNotification": "in die Zwischenablage kopiert", "copiedClipboardNotification": "in die Zwischenablage kopiert",
"peerOfflineMessage": "Anderer Nutzer ist offline, Nachrichten können derzeit nicht zugestellt werden", "peerOfflineMessage": "Peer ist offline, Nachrichten können derzeit nicht zugestellt werden",
"peerBlockedMessage": "Anderer Nutzer ist blockiert", "peerBlockedMessage": "Peer ist blockiert",
"pendingLabel": "Bestätigung ausstehend", "pendingLabel": "Bestätigung ausstehend",
"acknowledgedLabel": "bestätigt", "acknowledgedLabel": "bestätigt",
"couldNotSendMsgError": "Nachricht konnte nicht gesendet werden", "couldNotSendMsgError": "Nachricht konnte nicht gesendet werden",
"dmTooltip": "Klicken, um Direktnachricht zu senden", "dmTooltip": "Klicken, um DM zu senden",
"membershipDescription": "Unten steht eine Liste der Benutzer, die Nachrichten an die Gruppe gesendet haben. Möglicherweise enthält diese Benutzerzliste nicht alle, die Zugang zur Gruppe haben.", "membershipDescription": "Unten steht eine Liste der Benutzer, die Nachrichten an die Gruppe gesendet haben. Möglicherweise enthält diese Benutzerzliste nicht alle, die Zugang zur Gruppe haben.",
"addListItemBtn": "Element hinzufügen", "addListItemBtn": "Element hinzufügen",
"peerNotOnline": "Der andere Nutzer ist offline. Die App kann momentan nicht verwendet werden.", "peerNotOnline": "Peer is Offline. Applications cannot be used right now.",
"searchList": "Liste durchsuchen", "searchList": "Search List",
"update": "Update", "update": "Update",
"inviteBtn": "Einladen", "inviteBtn": "Einladen",
"inviteToGroupLabel": "In die Gruppe einladen", "inviteToGroupLabel": "In die Gruppe einladen",
"groupNameLabel": "Gruppenname", "groupNameLabel": "Gruppenname",
"viewServerInfo": "Serverinfo", "viewServerInfo": "Server Info",
"serverSynced": "synchronisiert", "serverSynced": "Synced",
"serverConnectivityDisconnected": "Server getrennt", "serverConnectivityDisconnected": "Server getrennt",
"serverConnectivityConnected": "Server verbunden", "serverConnectivityConnected": "Server verbunden",
"serverInfo": "Server-Informationen", "serverInfo": "Server-Informationen",
"invitationLabel": "Einladung", "invitationLabel": "Einladung",
"serverLabel": "Server", "serverLabel": "Server",
"search": "Suche...", "search": "Suche...",
"cycleColoursDesktop": "Klicken um Farbe zu wechseln.\nRechtsklick zum zurücksetzen.", "cycleColoursDesktop": "Click to cycle colours.\nRight-click to reset.",
"cycleColoursAndroid": "Klicken um Farbe zu wechseln.\nLanger Klick zum zurücksetzen.", "cycleColoursAndroid": "Click to cycle colours.\nLong-press to reset.",
"cycleMorphsDesktop": "Click to cycle morphs.\nRight-click to reset.", "cycleMorphsDesktop": "Click to cycle morphs.\nRight-click to reset.",
"cycleMorphsAndroid": "Click to cycle morphs.\nLong-press to reset.", "cycleMorphsAndroid": "Click to cycle morphs.\nLong-press to reset.",
"cycleCatsDesktop": "Klicken um Kategorie zu wechseln.\nRechtslick zum zurücksetzen.", "cycleCatsDesktop": "Click to cycle category.\nRight-click to reset.",
"cycleCatsAndroid": "Klicken um Kategorie zu wechseln.\nLanger Klick zum zurücksetzen.", "cycleCatsAndroid": "Click to cycle category.\nLong-press to reset.",
"blocked": "Blockiert", "blocked": "Blockiert",
"titlePlaceholder": "Titel...", "titlePlaceholder": "Titel...",
"postNewBulletinLabel": "Neue Meldung veröffentlichen", "postNewBulletinLabel": "Neue Meldung veröffentlichen",
"newBulletinLabel": "Neue Meldung", "newBulletinLabel": "Neue Meldung",
"joinGroup": "Gruppe beitreten", "joinGroup": "Gruppe beitreten",
"createGroup": "Gruppe erstellen", "createGroup": "Gruppe erstellen",
"addPeer": "Anderen Nutzer hinzufügen", "addPeer": "Peer hinzufügen",
"groupAddr": "Adresse", "groupAddr": "Adresse",
"invitation": "Einladung", "invitation": "Einladung",
"server": "Server", "server": "Server",
@ -188,7 +188,7 @@
"peerAddress": "Adresse", "peerAddress": "Adresse",
"joinGroupTab": "Einer Gruppe beitreten", "joinGroupTab": "Einer Gruppe beitreten",
"createGroupTab": "Eine Gruppe erstellen", "createGroupTab": "Eine Gruppe erstellen",
"addPeerTab": "Einen anderen Nutzer hinzufügen", "addPeerTab": "Einen Peer hinzufügen",
"createGroupBtn": "Anlegen", "createGroupBtn": "Anlegen",
"defaultGroupName": "Tolle Gruppe", "defaultGroupName": "Tolle Gruppe",
"createGroupTitle": "Gruppe Anlegen" "createGroupTitle": "Gruppe Anlegen"

View File

@ -163,6 +163,7 @@ class _AddEditProfileViewState extends State<AddEditProfileView> {
), ),
CwtchPasswordField( CwtchPasswordField(
controller: ctrlrOldPass, controller: ctrlrOldPass,
autoFillHints: [AutofillHints.newPassword],
validator: (value) { validator: (value) {
// Password field can be empty when just updating the profile, not on creation // Password field can be empty when just updating the profile, not on creation
if (Provider.of<ProfileInfoState>(context).isEncrypted && Provider.of<ProfileInfoState>(context, listen: false).onion.isEmpty && value.isEmpty && usePassword) { if (Provider.of<ProfileInfoState>(context).isEncrypted && Provider.of<ProfileInfoState>(context, listen: false).onion.isEmpty && value.isEmpty && usePassword) {

View File

@ -4,14 +4,17 @@ import 'package:provider/provider.dart';
import '../settings.dart'; import '../settings.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
const hints = [AutofillHints.password];
// Provides a styled Password Input Field for use in Form Widgets. // Provides a styled Password Input Field for use in Form Widgets.
// Callers must provide a text controller, label helper text and a validator. // Callers must provide a text controller, label helper text and a validator.
class CwtchPasswordField extends StatefulWidget { class CwtchPasswordField extends StatefulWidget {
CwtchPasswordField({required this.controller, required this.validator, this.action, this.autofocus = false}); CwtchPasswordField({required this.controller, required this.validator, this.action, this.autofocus = false, this.autoFillHints = hints});
final TextEditingController controller; final TextEditingController controller;
final FormFieldValidator validator; final FormFieldValidator validator;
final Function(String)? action; final Function(String)? action;
final bool autofocus; final bool autofocus;
final Iterable<String> autoFillHints;
@override @override
_CwtchTextFieldState createState() => _CwtchTextFieldState(); _CwtchTextFieldState createState() => _CwtchTextFieldState();
@ -34,6 +37,7 @@ class _CwtchTextFieldState extends State<CwtchPasswordField> {
controller: widget.controller, controller: widget.controller,
validator: widget.validator, validator: widget.validator,
obscureText: obscureText, obscureText: obscureText,
autofillHints: widget.autoFillHints,
autovalidateMode: AutovalidateMode.always, autovalidateMode: AutovalidateMode.always,
onFieldSubmitted: widget.action, onFieldSubmitted: widget.action,
textInputAction: TextInputAction.unspecified, textInputAction: TextInputAction.unspecified,