From fbf8637c97a8f2835fbfaae9fb49525fbb9dd746 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Tue, 18 Mar 2025 22:56:28 +0100 Subject: [PATCH] don't use email address as contact unique identifier --- .../securesms/AttachContactActivity.java | 3 +- .../ContactMultiSelectionActivity.java | 10 ++--- .../securesms/ContactSelectionActivity.java | 4 +- .../ContactSelectionListFragment.java | 32 ++++++++-------- .../securesms/GroupCreateActivity.java | 11 ++---- .../securesms/NewConversationActivity.java | 37 ++++++++++--------- .../securesms/ProfileSettingsFragment.java | 16 ++++---- .../contacts/ContactSelectionListAdapter.java | 6 +-- .../contacts/NewContactActivity.java | 3 +- 9 files changed, 59 insertions(+), 63 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/AttachContactActivity.java b/src/main/java/org/thoughtcrime/securesms/AttachContactActivity.java index fcacec7b5..4747254ea 100644 --- a/src/main/java/org/thoughtcrime/securesms/AttachContactActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/AttachContactActivity.java @@ -9,9 +9,8 @@ public class AttachContactActivity extends ContactSelectionActivity { public static final String CONTACT_ID_EXTRA = "contact_id_extra"; @Override - public void onContactSelected(int specialId, String addr) { + public void onContactSelected(int contactId) { Intent intent = new Intent(); - int contactId = DcHelper.getContext(this).lookupContactIdByAddr(addr); intent.putExtra(CONTACT_ID_EXTRA, contactId); setResult(RESULT_OK, intent); finish(); diff --git a/src/main/java/org/thoughtcrime/securesms/ContactMultiSelectionActivity.java b/src/main/java/org/thoughtcrime/securesms/ContactMultiSelectionActivity.java index f60cc8da5..9654c0249 100644 --- a/src/main/java/org/thoughtcrime/securesms/ContactMultiSelectionActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ContactMultiSelectionActivity.java @@ -33,6 +33,8 @@ import java.util.List; */ public class ContactMultiSelectionActivity extends ContactSelectionActivity { + public static final String CONTACTS_EXTRA = "contacts_extra"; + @Override protected void onCreate(Bundle icicle, boolean ready) { getIntent().putExtra(ContactSelectionListFragment.MULTI_SELECT, true); @@ -68,12 +70,8 @@ public class ContactMultiSelectionActivity extends ContactSelectionActivity { private void saveSelection() { Intent resultIntent = getIntent(); - List selectedContacts = contactsFragment.getSelectedContacts(); - - if (selectedContacts != null) { - resultIntent.putStringArrayListExtra("contacts", new ArrayList<>(selectedContacts)); - } - + List selectedContacts = contactsFragment.getSelectedContacts(); + resultIntent.putIntegerArrayListExtra(CONTACTS_EXTRA, new ArrayList<>(selectedContacts)); setResult(RESULT_OK, resultIntent); } } diff --git a/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java b/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java index cff905c4b..38c3ef79e 100644 --- a/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java @@ -89,8 +89,8 @@ public abstract class ContactSelectionActivity extends PassphraseRequiredActionB } @Override - public void onContactSelected(int specialId, String number) {} + public void onContactSelected(int contactId) {} @Override - public void onContactDeselected(int specialId, String number) {} + public void onContactDeselected(int contactId) {} } diff --git a/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java b/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java index 07a0b6642..82370c2b6 100644 --- a/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java @@ -89,7 +89,7 @@ public class ContactSelectionListFragment extends Fragment private DcContext dcContext; - private Set selectedContacts; + private Set selectedContacts; private OnContactSelectedListener onContactSelectedListener; private String cursorFilter; private RecyclerView recyclerView; @@ -234,8 +234,8 @@ public class ContactSelectionListFragment extends Fragment Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults); } - public @NonNull List getSelectedContacts() { - List selected = new LinkedList<>(); + public @NonNull List getSelectedContacts() { + List selected = new LinkedList<>(); if (selectedContacts != null) { selected.addAll(selectedContacts); } @@ -258,7 +258,7 @@ public class ContactSelectionListFragment extends Fragment isMulti(), true); selectedContacts = adapter.getSelectedContacts(); - ArrayList preselectedContacts = getActivity().getIntent().getStringArrayListExtra(PRESELECTED_CONTACTS); + ArrayList preselectedContacts = getActivity().getIntent().getIntegerArrayListExtra(PRESELECTED_CONTACTS); if(preselectedContacts!=null) { selectedContacts.addAll(preselectedContacts); } @@ -336,10 +336,9 @@ public class ContactSelectionListFragment extends Fragment } return; } - int specialId = contact.getSpecialId(); - String addr = contact.getNumber(); - if (!isMulti() || !selectedContacts.contains(addr)) { - if (specialId == DcContact.DC_CONTACT_ID_NEW_CLASSIC_CONTACT) { + int contactId = contact.getSpecialId(); + if (!isMulti() || !selectedContacts.contains(contactId)) { + if (contactId == DcContact.DC_CONTACT_ID_NEW_CLASSIC_CONTACT) { Intent intent = new Intent(getContext(), NewContactActivity.class); if (dcContext.mayBeValidAddr(cursorFilter)) { intent.putExtra(NewContactActivity.ADDR_EXTRA, cursorFilter); @@ -363,16 +362,16 @@ public class ContactSelectionListFragment extends Fragment return; } - selectedContacts.add(addr); + selectedContacts.add(contactId); contact.setChecked(true); if (onContactSelectedListener != null) { - onContactSelectedListener.onContactSelected(specialId, addr); + onContactSelectedListener.onContactSelected(contactId); } } else { - selectedContacts.remove(addr); + selectedContacts.remove(contactId); contact.setChecked(false); if (onContactSelectedListener != null) { - onContactSelectedListener.onContactDeselected(specialId, addr); + onContactSelectedListener.onContactDeselected(contactId); } } } @@ -398,8 +397,8 @@ public class ContactSelectionListFragment extends Fragment } public interface OnContactSelectedListener { - void onContactSelected(int specialId, String number); - void onContactDeselected(int specialId, String number); + void onContactSelected(int contactId); + void onContactDeselected(int contactId); } @Override @@ -413,7 +412,10 @@ public class ContactSelectionListFragment extends Fragment public void onActivityResult(int reqCode, int resultCode, final Intent data) { super.onActivityResult(reqCode, resultCode, data); if (resultCode == Activity.RESULT_OK && reqCode == CONTACT_ADDR_RESULT_CODE) { - selectedContacts.add(data.getStringExtra(NewContactActivity.ADDR_EXTRA)); + int contactId = data.getIntExtra(NewContactActivity.CONTACT_ID_EXTRA, 0); + if (contactId != 0) { + selectedContacts.add(contactId); + } getLoaderManager().restartLoader(0, null, ContactSelectionListFragment.this); } } diff --git a/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java b/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java index 5892a4292..7d6479947 100644 --- a/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/GroupCreateActivity.java @@ -244,10 +244,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity if (contactId == DcContact.DC_CONTACT_ID_ADD_MEMBER) { Intent intent = new Intent(this, ContactMultiSelectionActivity.class); intent.putExtra(ContactSelectionListFragment.SELECT_VERIFIED_EXTRA, verified); - ArrayList preselectedContacts = new ArrayList<>(); - for (int id : getAdapter().getContacts()) { - preselectedContacts.add(dcContext.getContact(id).getAddr()); - } + ArrayList preselectedContacts = new ArrayList<>(getAdapter().getContacts()); intent.putExtra(ContactSelectionListFragment.PRESELECTED_CONTACTS, preselectedContacts); startActivityForResult(intent, PICK_CONTACT); } @@ -333,9 +330,9 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity case PICK_CONTACT: ArrayList contactIds = new ArrayList<>(); - for (String addr : Objects.requireNonNull(data.getStringArrayListExtra("contacts"))) { - if(addr != null) { - contactIds.add(dcContext.createContact(null, addr)); + for (Integer contactId : Objects.requireNonNull(data.getIntegerArrayListExtra(ContactMultiSelectionActivity.CONTACTS_EXTRA))) { + if(contactId != null) { + contactIds.add(contactId); } } getAdapter().changeData(contactIds); diff --git a/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java b/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java index 4b600c22c..efea8dc4d 100644 --- a/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java @@ -72,7 +72,17 @@ public class NewConversationActivity extends ContactSelectionActivity { if (!textToShare.isEmpty()) { getIntent().putExtra(TEXT_EXTRA, textToShare); } - onContactSelected(DcContact.DC_CONTACT_ID_NEW_CLASSIC_CONTACT, recipientsArray[0]); + final String addr = recipientsArray[0]; + final DcContext dcContext = DcHelper.getContext(this); + int contactId = dcContext.lookupContactIdByAddr(addr); + if (contactId == 0 && dcContext.mayBeValidAddr(addr)) { + contactId = dcContext.createContact(null, recipientsArray[0]); + } + if (contactId == 0) { + Toast.makeText(this, R.string.bad_email_address, Toast.LENGTH_LONG).show(); + } else { + onContactSelected(contactId); + } } else { Intent shareIntent = new Intent(this, ShareActivity.class); shareIntent.putExtra(Intent.EXTRA_TEXT, textToShare); @@ -89,37 +99,28 @@ public class NewConversationActivity extends ContactSelectionActivity { } @Override - public void onContactSelected(int specialId, String addr) { - final DcContext dcContext = DcHelper.getContext(this); - if(specialId == DcContact.DC_CONTACT_ID_NEW_GROUP) { + public void onContactSelected(int contactId) { + if(contactId == DcContact.DC_CONTACT_ID_NEW_GROUP) { startActivity(new Intent(this, GroupCreateActivity.class)); - } else if(specialId == DcContact.DC_CONTACT_ID_NEW_BROADCAST_LIST) { + } else if(contactId == DcContact.DC_CONTACT_ID_NEW_BROADCAST_LIST) { Intent intent = new Intent(this, GroupCreateActivity.class); intent.putExtra(GroupCreateActivity.CREATE_BROADCAST, true); startActivity(intent); - } else if (specialId == DcContact.DC_CONTACT_ID_QR_INVITE) { + } else if (contactId == DcContact.DC_CONTACT_ID_QR_INVITE) { new IntentIntegrator(this).setCaptureActivity(QrActivity.class).initiateScan(); } else { - int contactId = dcContext.lookupContactIdByAddr(addr); - if (contactId!=0 && dcContext.getChatIdByContactId(contactId)!=0) { + final DcContext dcContext = DcHelper.getContext(this); + if (dcContext.getChatIdByContactId(contactId)!=0) { openConversation(dcContext.getChatIdByContactId(contactId)); } else { - String nameNAddr = contactId == 0 ? addr : dcContext.getContact(contactId).getNameNAddr(); + String nameNAddr = dcContext.getContact(contactId).getNameNAddr(); new AlertDialog.Builder(this) .setMessage(getString(R.string.ask_start_chat_with, nameNAddr)) .setCancelable(true) .setNegativeButton(android.R.string.cancel, null) .setPositiveButton(android.R.string.ok, (dialog, which) -> { - int contactId1 = dcContext.lookupContactIdByAddr(addr); - if (contactId1 == 0) { - contactId1 = dcContext.createContact(null, addr); - if (contactId1 == 0) { - Toast.makeText(NewConversationActivity.this, R.string.bad_email_address, Toast.LENGTH_LONG).show(); - return; - } - } - openConversation(dcContext.createChatByContactId(contactId1)); + openConversation(dcContext.createChatByContactId(contactId)); }).show(); } } diff --git a/src/main/java/org/thoughtcrime/securesms/ProfileSettingsFragment.java b/src/main/java/org/thoughtcrime/securesms/ProfileSettingsFragment.java index c701bf5d4..67c58c3ad 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProfileSettingsFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ProfileSettingsFragment.java @@ -207,10 +207,9 @@ public class ProfileSettingsFragment extends Fragment DcChat dcChat = dcContext.getChat(chatId); Intent intent = new Intent(getContext(), ContactMultiSelectionActivity.class); intent.putExtra(ContactSelectionListFragment.SELECT_VERIFIED_EXTRA, dcChat.isProtected()); - ArrayList preselectedContacts = new ArrayList<>(); - int[] memberIds = dcContext.getChatContacts(chatId); - for (int memberId : memberIds) { - preselectedContacts.add(dcContext.getContact(memberId).getAddr()); + ArrayList preselectedContacts = new ArrayList<>(); + for (int memberId : dcContext.getChatContacts(chatId)) { + preselectedContacts.add(memberId); } intent.putExtra(ContactSelectionListFragment.PRESELECTED_CONTACTS, preselectedContacts); startActivityForResult(intent, REQUEST_CODE_PICK_CONTACT); @@ -318,13 +317,12 @@ public class ProfileSettingsFragment extends Fragment public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode==REQUEST_CODE_PICK_CONTACT && resultCode==Activity.RESULT_OK && data!=null) { - List selected = data.getStringArrayListExtra("contacts"); + List selected = data.getIntegerArrayListExtra(ContactMultiSelectionActivity.CONTACTS_EXTRA); if(selected == null) return; Util.runOnAnyBackgroundThread(() -> { - for (String addr : selected) { - if (addr!=null) { - int toAddId = dcContext.createContact(null, addr); - dcContext.addContactToChat(chatId, toAddId); + for (Integer contactId : selected) { + if (contactId!=null) { + dcContext.addContactToChat(chatId, contactId); } } }); diff --git a/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java b/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java index 2dd098c71..093ad27ba 100644 --- a/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java @@ -63,7 +63,7 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter selectedContacts = new HashSet<>(); // TODO: maybe better use contact-id here + private final Set selectedContacts = new HashSet<>(); // TODO: maybe better use contact-id here private final SparseIntArray actionModeSelection = new SparseIntArray(); @Override @@ -292,7 +292,7 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter getSelectedContacts() { + public Set getSelectedContacts() { return selectedContacts; } diff --git a/src/main/java/org/thoughtcrime/securesms/contacts/NewContactActivity.java b/src/main/java/org/thoughtcrime/securesms/contacts/NewContactActivity.java index 421f2d167..ae5a44eb9 100644 --- a/src/main/java/org/thoughtcrime/securesms/contacts/NewContactActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/contacts/NewContactActivity.java @@ -26,6 +26,7 @@ public class NewContactActivity extends PassphraseRequiredActionBarActivity { public static final String ADDR_EXTRA = "contact_addr"; + public static final String CONTACT_ID_EXTRA = "contact_id"; private TextInputEditText nameInput; private TextInputEditText addrInput; @@ -81,7 +82,7 @@ public class NewContactActivity extends PassphraseRequiredActionBarActivity } if (getCallingActivity() != null) { // called for result Intent intent = new Intent(); - intent.putExtra(ADDR_EXTRA, addr); + intent.putExtra(CONTACT_ID_EXTRA, contactId); setResult(RESULT_OK, intent); } else { int chatId = dcContext.createChatByContactId(contactId);