diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/ChatItemImportInserter.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/ChatItemImportInserter.kt index 734827220d..d6c9f28907 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/ChatItemImportInserter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/database/ChatItemImportInserter.kt @@ -65,7 +65,6 @@ import org.thoughtcrime.securesms.payments.Direction import org.thoughtcrime.securesms.payments.FailureReason import org.thoughtcrime.securesms.payments.State import org.thoughtcrime.securesms.payments.proto.PaymentMetaData -import org.thoughtcrime.securesms.profiles.ProfileName import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.stickers.StickerLocator @@ -1021,8 +1020,7 @@ class ChatItemImportInserter( } private fun ContactAttachment.Name?.toLocal(): Contact.Name { - val displayName = ProfileName.fromParts(this?.givenName, this?.familyName).toString() - return Contact.Name(displayName, this?.givenName, this?.familyName, this?.prefix, this?.suffix, this?.middleName) + return Contact.Name(this?.givenName, this?.familyName, this?.prefix, this?.suffix, this?.middleName, null) } private fun ContactAttachment.Phone.Type?.toLocal(): Contact.Phone.Type { diff --git a/app/src/main/java/org/thoughtcrime/securesms/contactshare/Contact.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/Contact.java index 487fab8105..97cfffb225 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contactshare/Contact.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contactshare/Contact.java @@ -142,9 +142,6 @@ public class Contact implements Parcelable { public static class Name implements Parcelable { - @JsonProperty - private final String displayName; - @JsonProperty private final String givenName; @@ -160,30 +157,29 @@ public class Contact implements Parcelable { @JsonProperty private final String middleName; + @JsonProperty + private final String nickname; + public Name( - @JsonProperty("displayName") @Nullable String displayName, @JsonProperty("givenName") @Nullable String givenName, @JsonProperty("familyName") @Nullable String familyName, @JsonProperty("prefix") @Nullable String prefix, @JsonProperty("suffix") @Nullable String suffix, - @JsonProperty("middleName") @Nullable String middleName) + @JsonProperty("middleName") @Nullable String middleName, + @JsonProperty("nickname") @Nullable String nickname) { - this.displayName = displayName; this.givenName = givenName; this.familyName = familyName; this.prefix = prefix; this.suffix = suffix; this.middleName = middleName; + this.nickname = nickname; } private Name(Parcel in) { this(in.readString(), in.readString(), in.readString(), in.readString(), in.readString(), in.readString()); } - public @Nullable String getDisplayName() { - return displayName; - } - public @Nullable String getGivenName() { return givenName; } @@ -204,8 +200,12 @@ public class Contact implements Parcelable { return middleName; } + public @Nullable String getNickname() { + return nickname; + } + public boolean isEmpty() { - return TextUtils.isEmpty(displayName) && + return TextUtils.isEmpty(nickname) && TextUtils.isEmpty(givenName) && TextUtils.isEmpty(familyName) && TextUtils.isEmpty(prefix) && @@ -220,12 +220,12 @@ public class Contact implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { - dest.writeString(displayName); dest.writeString(givenName); dest.writeString(familyName); dest.writeString(prefix); dest.writeString(suffix); dest.writeString(middleName); + dest.writeString(nickname); } public static final Creator CREATOR = new Creator() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactModelMapper.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactModelMapper.java index 8c89829a09..8ca512b920 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactModelMapper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactModelMapper.java @@ -59,7 +59,7 @@ public class ContactModelMapper { .build()); } - SharedContact.Name name = new SharedContact.Name.Builder().setDisplay(contact.getName().getDisplayName()) + SharedContact.Name name = new SharedContact.Name.Builder().setNickname(contact.getName().getNickname()) .setGiven(contact.getName().getGivenName()) .setFamily(contact.getName().getFamilyName()) .setPrefix(contact.getName().getPrefix()) @@ -74,66 +74,14 @@ public class ContactModelMapper { .withAddresses(postalAddresses); } - public static Contact remoteToLocal(@NonNull SharedContact sharedContact) { - Name name = new Name(sharedContact.getName().getDisplay().orElse(null), - sharedContact.getName().getGiven().orElse(null), - sharedContact.getName().getFamily().orElse(null), - sharedContact.getName().getPrefix().orElse(null), - sharedContact.getName().getSuffix().orElse(null), - sharedContact.getName().getMiddle().orElse(null)); - - List phoneNumbers = new LinkedList<>(); - if (sharedContact.getPhone().isPresent()) { - for (SharedContact.Phone phone : sharedContact.getPhone().get()) { - phoneNumbers.add(new Phone(phone.getValue(), - remoteToLocalType(phone.getType()), - phone.getLabel().orElse(null))); - } - } - - List emails = new LinkedList<>(); - if (sharedContact.getEmail().isPresent()) { - for (SharedContact.Email email : sharedContact.getEmail().get()) { - emails.add(new Email(email.getValue(), - remoteToLocalType(email.getType()), - email.getLabel().orElse(null))); - } - } - - List postalAddresses = new LinkedList<>(); - if (sharedContact.getAddress().isPresent()) { - for (SharedContact.PostalAddress postalAddress : sharedContact.getAddress().get()) { - postalAddresses.add(new PostalAddress(remoteToLocalType(postalAddress.getType()), - postalAddress.getLabel().orElse(null), - postalAddress.getStreet().orElse(null), - postalAddress.getPobox().orElse(null), - postalAddress.getNeighborhood().orElse(null), - postalAddress.getCity().orElse(null), - postalAddress.getRegion().orElse(null), - postalAddress.getPostcode().orElse(null), - postalAddress.getCountry().orElse(null))); - } - } - - Avatar avatar = null; - if (sharedContact.getAvatar().isPresent()) { - Attachment attachment = PointerAttachment.forPointer(Optional.of(sharedContact.getAvatar().get().getAttachment().asPointer())).get(); - boolean isProfile = sharedContact.getAvatar().get().isProfile(); - - avatar = new Avatar(null, attachment, isProfile); - } - - return new Contact(name, sharedContact.getOrganization().orElse(null), phoneNumbers, emails, postalAddresses, avatar); - } - public static Contact remoteToLocal(@NonNull DataMessage.Contact contact) { DataMessage.Contact.Name contactName = contact.name != null ? contact.name : new DataMessage.Contact.Name(); - Name name = new Name(contactName.displayName, - contactName.givenName, + Name name = new Name(contactName.givenName, contactName.familyName, contactName.prefix, contactName.suffix, - contactName.middleName); + contactName.middleName, + contactName.nickname); List phoneNumbers = new ArrayList<>(contact.number.size()); for (DataMessage.Contact.Phone phone : contact.number) { @@ -182,17 +130,6 @@ public class ContactModelMapper { return new Contact(name, contact.organization, phoneNumbers, emails, postalAddresses, avatar); } - private static Phone.Type remoteToLocalType(@Nullable SharedContact.Phone.Type type) { - if (type == null) return Phone.Type.CUSTOM; - - switch (type) { - case HOME: return Phone.Type.HOME; - case MOBILE: return Phone.Type.MOBILE; - case WORK: return Phone.Type.WORK; - default: return Phone.Type.CUSTOM; - } - } - private static Phone.Type remoteToLocalType(@Nullable DataMessage.Contact.Phone.Type type) { if (type == null) return Phone.Type.CUSTOM; @@ -204,17 +141,6 @@ public class ContactModelMapper { } } - private static Email.Type remoteToLocalType(@Nullable SharedContact.Email.Type type) { - if (type == null) return Email.Type.CUSTOM; - - switch (type) { - case HOME: return Email.Type.HOME; - case MOBILE: return Email.Type.MOBILE; - case WORK: return Email.Type.WORK; - default: return Email.Type.CUSTOM; - } - } - private static Email.Type remoteToLocalType(@Nullable DataMessage.Contact.Email.Type type) { if (type == null) return Email.Type.CUSTOM; diff --git a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactNameEditViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactNameEditViewModel.java index b1433dc36f..4690495d95 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactNameEditViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactNameEditViewModel.java @@ -36,7 +36,7 @@ public class ContactNameEditViewModel extends ViewModel { } Name getName() { - return new Name(displayName.getValue(), givenName, familyName, prefix, suffix, middleName); + return new Name(givenName, familyName, prefix, suffix, middleName, null); } void updateGivenName(@NonNull String givenName) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactUtil.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactUtil.java index 3a464785f2..9c65f87337 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactUtil.java @@ -28,6 +28,7 @@ import org.thoughtcrime.securesms.contactshare.Contact.PostalAddress; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.mms.PartAuthority; import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter; +import org.thoughtcrime.securesms.profiles.ProfileName; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.SpanUtil; @@ -65,8 +66,12 @@ public final class ContactUtil { return ""; } - if (!TextUtils.isEmpty(contact.getName().getDisplayName())) { - return contact.getName().getDisplayName(); + if (!TextUtils.isEmpty(contact.getName().getNickname())) { + return contact.getName().getNickname(); + } + + if (!TextUtils.isEmpty(contact.getName().getGivenName())) { + return ProfileName.fromParts(contact.getName().getGivenName(), contact.getName().getFamilyName()).toString(); } if (!TextUtils.isEmpty(contact.getOrganization())) { @@ -152,8 +157,11 @@ public final class ContactUtil { Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT); intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE); - if (!TextUtils.isEmpty(contact.getName().getDisplayName())) { - intent.putExtra(ContactsContract.Intents.Insert.NAME, contact.getName().getDisplayName()); + if (!TextUtils.isEmpty(contact.getName().getNickname())) { + intent.putExtra(ContactsContract.Intents.Insert.NAME, contact.getName().getNickname()); + } else if (!TextUtils.isEmpty(contact.getName().getGivenName())) { + String displayName = ProfileName.fromParts(contact.getName().getGivenName(), contact.getName().getFamilyName()).toString(); + intent.putExtra(ContactsContract.Intents.Insert.NAME, displayName); } if (!TextUtils.isEmpty(contact.getOrganization())) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/contactshare/SharedContactRepository.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/SharedContactRepository.java index 9c0a78f8df..264e23e3e7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contactshare/SharedContactRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contactshare/SharedContactRepository.java @@ -108,7 +108,7 @@ public class SharedContactRepository { NameDetails nameDetails = SystemContactsRepository.getNameDetails(context, contactId); if (nameDetails != null) { - Name name = new Name(nameDetails.getDisplayName(), nameDetails.getGivenName(), nameDetails.getFamilyName(), nameDetails.getPrefix(), nameDetails.getSuffix(), nameDetails.getMiddleName()); + Name name = new Name(nameDetails.getGivenName(), nameDetails.getFamilyName(), nameDetails.getPrefix(), nameDetails.getSuffix(), nameDetails.getMiddleName(), null); if (!name.isEmpty()) { return name; } @@ -116,7 +116,7 @@ public class SharedContactRepository { String org = SystemContactsRepository.getOrganizationName(context, contactId); if (!TextUtils.isEmpty(org)) { - return new Name(org, org, null, null, null, null); + return new Name(org, null, null, null, null, null); } return null; diff --git a/app/src/main/java/org/thoughtcrime/securesms/contactshare/VCardUtil.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/VCardUtil.java index 4a3970f762..ca4a1a06d9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contactshare/VCardUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contactshare/VCardUtil.java @@ -52,11 +52,12 @@ public final class VCardUtil { return null; } - Contact.Name name = new Contact.Name(displayName, + Contact.Name name = new Contact.Name( vName != null ? vName.getGiven() : null, vName != null ? vName.getFamily() : null, vName != null && !vName.getPrefixes().isEmpty() ? vName.getPrefixes().get(0) : null, vName != null && !vName.getSuffixes().isEmpty() ? vName.getSuffixes().get(0) : null, + null, null); diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java index d45b8f61e7..1a9525067e 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java @@ -1754,12 +1754,12 @@ public class SignalServiceMessageSender { for (SharedContact contact : contacts) { DataMessage.Contact.Name.Builder nameBuilder = new DataMessage.Contact.Name.Builder(); - if (contact.getName().getFamily().isPresent()) nameBuilder.familyName(contact.getName().getFamily().get()); - if (contact.getName().getGiven().isPresent()) nameBuilder.givenName(contact.getName().getGiven().get()); - if (contact.getName().getMiddle().isPresent()) nameBuilder.middleName(contact.getName().getMiddle().get()); - if (contact.getName().getPrefix().isPresent()) nameBuilder.prefix(contact.getName().getPrefix().get()); - if (contact.getName().getSuffix().isPresent()) nameBuilder.suffix(contact.getName().getSuffix().get()); - if (contact.getName().getDisplay().isPresent()) nameBuilder.displayName(contact.getName().getDisplay().get()); + if (contact.getName().getFamily().isPresent()) nameBuilder.familyName(contact.getName().getFamily().get()); + if (contact.getName().getGiven().isPresent()) nameBuilder.givenName(contact.getName().getGiven().get()); + if (contact.getName().getMiddle().isPresent()) nameBuilder.middleName(contact.getName().getMiddle().get()); + if (contact.getName().getPrefix().isPresent()) nameBuilder.prefix(contact.getName().getPrefix().get()); + if (contact.getName().getSuffix().isPresent()) nameBuilder.suffix(contact.getName().getSuffix().get()); + if (contact.getName().getNickname().isPresent()) nameBuilder.nickname(contact.getName().getNickname().get()); DataMessage.Contact.Builder contactBuilder = new DataMessage.Contact.Builder().name(nameBuilder.build()); diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/shared/SharedContact.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/shared/SharedContact.java index 4bf284c38c..a7ad777348 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/shared/SharedContact.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/messages/shared/SharedContact.java @@ -11,9 +11,9 @@ import java.util.Optional; public class SharedContact { private final Name name; - private final Optional avatar; - private final Optional> phone; - private final Optional> email; + private final Optional avatar; + private final Optional> phone; + private final Optional> email; private final Optional> address; private final Optional organization; @@ -103,28 +103,28 @@ public class SharedContact { public static class Name { - private final Optional display; private final Optional given; private final Optional family; private final Optional prefix; private final Optional suffix; private final Optional middle; + private final Optional nickname; - public Name(Optional display, Optional given, Optional family, Optional prefix, Optional suffix, Optional middle) { - this.display = display; - this.given = given; - this.family = family; - this.prefix = prefix; - this.suffix = suffix; - this.middle = middle; + public Name(Optional given, Optional family, Optional prefix, Optional suffix, Optional middle, Optional nickname) { + this.given = given; + this.family = family; + this.prefix = prefix; + this.suffix = suffix; + this.middle = middle; + this.nickname = nickname; } public static Builder newBuilder() { return new Builder(); } - public Optional getDisplay() { - return display; + public Optional getNickname() { + return nickname; } public Optional getGiven() { @@ -148,15 +148,15 @@ public class SharedContact { } public static class Builder { - private String display; + private String nickname; private String given; private String family; private String prefix; private String suffix; private String middle; - public Builder setDisplay(String display) { - this.display = display; + public Builder setNickname(String nickname) { + this.nickname = nickname; return this; } @@ -186,12 +186,12 @@ public class SharedContact { } public Name build() { - return new Name(Optional.ofNullable(display), - Optional.ofNullable(given), + return new Name(Optional.ofNullable(given), Optional.ofNullable(family), Optional.ofNullable(prefix), Optional.ofNullable(suffix), - Optional.ofNullable(middle)); + Optional.ofNullable(middle), + Optional.ofNullable(nickname)); } } } diff --git a/libsignal-service/src/main/protowire/SignalService.proto b/libsignal-service/src/main/protowire/SignalService.proto index c16f9b24a0..343092d1d9 100644 --- a/libsignal-service/src/main/protowire/SignalService.proto +++ b/libsignal-service/src/main/protowire/SignalService.proto @@ -177,7 +177,8 @@ message DataMessage { optional string prefix = 3; optional string suffix = 4; optional string middleName = 5; - optional string displayName = 6; + reserved /*displayName*/ 6; + optional string nickname = 7; } message Phone {