don't use email address as contact unique identifier

This commit is contained in:
adbenitez 2025-03-18 22:56:28 +01:00
parent 8aedbc60a4
commit fbf8637c97
9 changed files with 59 additions and 63 deletions

View file

@ -9,9 +9,8 @@ public class AttachContactActivity extends ContactSelectionActivity {
public static final String CONTACT_ID_EXTRA = "contact_id_extra"; public static final String CONTACT_ID_EXTRA = "contact_id_extra";
@Override @Override
public void onContactSelected(int specialId, String addr) { public void onContactSelected(int contactId) {
Intent intent = new Intent(); Intent intent = new Intent();
int contactId = DcHelper.getContext(this).lookupContactIdByAddr(addr);
intent.putExtra(CONTACT_ID_EXTRA, contactId); intent.putExtra(CONTACT_ID_EXTRA, contactId);
setResult(RESULT_OK, intent); setResult(RESULT_OK, intent);
finish(); finish();

View file

@ -33,6 +33,8 @@ import java.util.List;
*/ */
public class ContactMultiSelectionActivity extends ContactSelectionActivity { public class ContactMultiSelectionActivity extends ContactSelectionActivity {
public static final String CONTACTS_EXTRA = "contacts_extra";
@Override @Override
protected void onCreate(Bundle icicle, boolean ready) { protected void onCreate(Bundle icicle, boolean ready) {
getIntent().putExtra(ContactSelectionListFragment.MULTI_SELECT, true); getIntent().putExtra(ContactSelectionListFragment.MULTI_SELECT, true);
@ -68,12 +70,8 @@ public class ContactMultiSelectionActivity extends ContactSelectionActivity {
private void saveSelection() { private void saveSelection() {
Intent resultIntent = getIntent(); Intent resultIntent = getIntent();
List<String> selectedContacts = contactsFragment.getSelectedContacts(); List<Integer> selectedContacts = contactsFragment.getSelectedContacts();
resultIntent.putIntegerArrayListExtra(CONTACTS_EXTRA, new ArrayList<>(selectedContacts));
if (selectedContacts != null) {
resultIntent.putStringArrayListExtra("contacts", new ArrayList<>(selectedContacts));
}
setResult(RESULT_OK, resultIntent); setResult(RESULT_OK, resultIntent);
} }
} }

View file

@ -89,8 +89,8 @@ public abstract class ContactSelectionActivity extends PassphraseRequiredActionB
} }
@Override @Override
public void onContactSelected(int specialId, String number) {} public void onContactSelected(int contactId) {}
@Override @Override
public void onContactDeselected(int specialId, String number) {} public void onContactDeselected(int contactId) {}
} }

View file

@ -89,7 +89,7 @@ public class ContactSelectionListFragment extends Fragment
private DcContext dcContext; private DcContext dcContext;
private Set<String> selectedContacts; private Set<Integer> selectedContacts;
private OnContactSelectedListener onContactSelectedListener; private OnContactSelectedListener onContactSelectedListener;
private String cursorFilter; private String cursorFilter;
private RecyclerView recyclerView; private RecyclerView recyclerView;
@ -234,8 +234,8 @@ public class ContactSelectionListFragment extends Fragment
Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults); Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
} }
public @NonNull List<String> getSelectedContacts() { public @NonNull List<Integer> getSelectedContacts() {
List<String> selected = new LinkedList<>(); List<Integer> selected = new LinkedList<>();
if (selectedContacts != null) { if (selectedContacts != null) {
selected.addAll(selectedContacts); selected.addAll(selectedContacts);
} }
@ -258,7 +258,7 @@ public class ContactSelectionListFragment extends Fragment
isMulti(), isMulti(),
true); true);
selectedContacts = adapter.getSelectedContacts(); selectedContacts = adapter.getSelectedContacts();
ArrayList<String> preselectedContacts = getActivity().getIntent().getStringArrayListExtra(PRESELECTED_CONTACTS); ArrayList<Integer> preselectedContacts = getActivity().getIntent().getIntegerArrayListExtra(PRESELECTED_CONTACTS);
if(preselectedContacts!=null) { if(preselectedContacts!=null) {
selectedContacts.addAll(preselectedContacts); selectedContacts.addAll(preselectedContacts);
} }
@ -336,10 +336,9 @@ public class ContactSelectionListFragment extends Fragment
} }
return; return;
} }
int specialId = contact.getSpecialId(); int contactId = contact.getSpecialId();
String addr = contact.getNumber(); if (!isMulti() || !selectedContacts.contains(contactId)) {
if (!isMulti() || !selectedContacts.contains(addr)) { if (contactId == DcContact.DC_CONTACT_ID_NEW_CLASSIC_CONTACT) {
if (specialId == DcContact.DC_CONTACT_ID_NEW_CLASSIC_CONTACT) {
Intent intent = new Intent(getContext(), NewContactActivity.class); Intent intent = new Intent(getContext(), NewContactActivity.class);
if (dcContext.mayBeValidAddr(cursorFilter)) { if (dcContext.mayBeValidAddr(cursorFilter)) {
intent.putExtra(NewContactActivity.ADDR_EXTRA, cursorFilter); intent.putExtra(NewContactActivity.ADDR_EXTRA, cursorFilter);
@ -363,16 +362,16 @@ public class ContactSelectionListFragment extends Fragment
return; return;
} }
selectedContacts.add(addr); selectedContacts.add(contactId);
contact.setChecked(true); contact.setChecked(true);
if (onContactSelectedListener != null) { if (onContactSelectedListener != null) {
onContactSelectedListener.onContactSelected(specialId, addr); onContactSelectedListener.onContactSelected(contactId);
} }
} else { } else {
selectedContacts.remove(addr); selectedContacts.remove(contactId);
contact.setChecked(false); contact.setChecked(false);
if (onContactSelectedListener != null) { if (onContactSelectedListener != null) {
onContactSelectedListener.onContactDeselected(specialId, addr); onContactSelectedListener.onContactDeselected(contactId);
} }
} }
} }
@ -398,8 +397,8 @@ public class ContactSelectionListFragment extends Fragment
} }
public interface OnContactSelectedListener { public interface OnContactSelectedListener {
void onContactSelected(int specialId, String number); void onContactSelected(int contactId);
void onContactDeselected(int specialId, String number); void onContactDeselected(int contactId);
} }
@Override @Override
@ -413,7 +412,10 @@ public class ContactSelectionListFragment extends Fragment
public void onActivityResult(int reqCode, int resultCode, final Intent data) { public void onActivityResult(int reqCode, int resultCode, final Intent data) {
super.onActivityResult(reqCode, resultCode, data); super.onActivityResult(reqCode, resultCode, data);
if (resultCode == Activity.RESULT_OK && reqCode == CONTACT_ADDR_RESULT_CODE) { 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); getLoaderManager().restartLoader(0, null, ContactSelectionListFragment.this);
} }
} }

View file

@ -244,10 +244,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
if (contactId == DcContact.DC_CONTACT_ID_ADD_MEMBER) { if (contactId == DcContact.DC_CONTACT_ID_ADD_MEMBER) {
Intent intent = new Intent(this, ContactMultiSelectionActivity.class); Intent intent = new Intent(this, ContactMultiSelectionActivity.class);
intent.putExtra(ContactSelectionListFragment.SELECT_VERIFIED_EXTRA, verified); intent.putExtra(ContactSelectionListFragment.SELECT_VERIFIED_EXTRA, verified);
ArrayList<String> preselectedContacts = new ArrayList<>(); ArrayList<Integer> preselectedContacts = new ArrayList<>(getAdapter().getContacts());
for (int id : getAdapter().getContacts()) {
preselectedContacts.add(dcContext.getContact(id).getAddr());
}
intent.putExtra(ContactSelectionListFragment.PRESELECTED_CONTACTS, preselectedContacts); intent.putExtra(ContactSelectionListFragment.PRESELECTED_CONTACTS, preselectedContacts);
startActivityForResult(intent, PICK_CONTACT); startActivityForResult(intent, PICK_CONTACT);
} }
@ -333,9 +330,9 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
case PICK_CONTACT: case PICK_CONTACT:
ArrayList<Integer> contactIds = new ArrayList<>(); ArrayList<Integer> contactIds = new ArrayList<>();
for (String addr : Objects.requireNonNull(data.getStringArrayListExtra("contacts"))) { for (Integer contactId : Objects.requireNonNull(data.getIntegerArrayListExtra(ContactMultiSelectionActivity.CONTACTS_EXTRA))) {
if(addr != null) { if(contactId != null) {
contactIds.add(dcContext.createContact(null, addr)); contactIds.add(contactId);
} }
} }
getAdapter().changeData(contactIds); getAdapter().changeData(contactIds);

View file

@ -72,7 +72,17 @@ public class NewConversationActivity extends ContactSelectionActivity {
if (!textToShare.isEmpty()) { if (!textToShare.isEmpty()) {
getIntent().putExtra(TEXT_EXTRA, textToShare); 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 { } else {
Intent shareIntent = new Intent(this, ShareActivity.class); Intent shareIntent = new Intent(this, ShareActivity.class);
shareIntent.putExtra(Intent.EXTRA_TEXT, textToShare); shareIntent.putExtra(Intent.EXTRA_TEXT, textToShare);
@ -89,37 +99,28 @@ public class NewConversationActivity extends ContactSelectionActivity {
} }
@Override @Override
public void onContactSelected(int specialId, String addr) { public void onContactSelected(int contactId) {
final DcContext dcContext = DcHelper.getContext(this); if(contactId == DcContact.DC_CONTACT_ID_NEW_GROUP) {
if(specialId == DcContact.DC_CONTACT_ID_NEW_GROUP) {
startActivity(new Intent(this, GroupCreateActivity.class)); 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 intent = new Intent(this, GroupCreateActivity.class);
intent.putExtra(GroupCreateActivity.CREATE_BROADCAST, true); intent.putExtra(GroupCreateActivity.CREATE_BROADCAST, true);
startActivity(intent); 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(); new IntentIntegrator(this).setCaptureActivity(QrActivity.class).initiateScan();
} }
else { else {
int contactId = dcContext.lookupContactIdByAddr(addr); final DcContext dcContext = DcHelper.getContext(this);
if (contactId!=0 && dcContext.getChatIdByContactId(contactId)!=0) { if (dcContext.getChatIdByContactId(contactId)!=0) {
openConversation(dcContext.getChatIdByContactId(contactId)); openConversation(dcContext.getChatIdByContactId(contactId));
} else { } else {
String nameNAddr = contactId == 0 ? addr : dcContext.getContact(contactId).getNameNAddr(); String nameNAddr = dcContext.getContact(contactId).getNameNAddr();
new AlertDialog.Builder(this) new AlertDialog.Builder(this)
.setMessage(getString(R.string.ask_start_chat_with, nameNAddr)) .setMessage(getString(R.string.ask_start_chat_with, nameNAddr))
.setCancelable(true) .setCancelable(true)
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.setPositiveButton(android.R.string.ok, (dialog, which) -> { .setPositiveButton(android.R.string.ok, (dialog, which) -> {
int contactId1 = dcContext.lookupContactIdByAddr(addr); openConversation(dcContext.createChatByContactId(contactId));
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));
}).show(); }).show();
} }
} }

View file

@ -207,10 +207,9 @@ public class ProfileSettingsFragment extends Fragment
DcChat dcChat = dcContext.getChat(chatId); DcChat dcChat = dcContext.getChat(chatId);
Intent intent = new Intent(getContext(), ContactMultiSelectionActivity.class); Intent intent = new Intent(getContext(), ContactMultiSelectionActivity.class);
intent.putExtra(ContactSelectionListFragment.SELECT_VERIFIED_EXTRA, dcChat.isProtected()); intent.putExtra(ContactSelectionListFragment.SELECT_VERIFIED_EXTRA, dcChat.isProtected());
ArrayList<String> preselectedContacts = new ArrayList<>(); ArrayList<Integer> preselectedContacts = new ArrayList<>();
int[] memberIds = dcContext.getChatContacts(chatId); for (int memberId : dcContext.getChatContacts(chatId)) {
for (int memberId : memberIds) { preselectedContacts.add(memberId);
preselectedContacts.add(dcContext.getContact(memberId).getAddr());
} }
intent.putExtra(ContactSelectionListFragment.PRESELECTED_CONTACTS, preselectedContacts); intent.putExtra(ContactSelectionListFragment.PRESELECTED_CONTACTS, preselectedContacts);
startActivityForResult(intent, REQUEST_CODE_PICK_CONTACT); startActivityForResult(intent, REQUEST_CODE_PICK_CONTACT);
@ -318,13 +317,12 @@ public class ProfileSettingsFragment extends Fragment
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
if (requestCode==REQUEST_CODE_PICK_CONTACT && resultCode==Activity.RESULT_OK && data!=null) { if (requestCode==REQUEST_CODE_PICK_CONTACT && resultCode==Activity.RESULT_OK && data!=null) {
List<String> selected = data.getStringArrayListExtra("contacts"); List<Integer> selected = data.getIntegerArrayListExtra(ContactMultiSelectionActivity.CONTACTS_EXTRA);
if(selected == null) return; if(selected == null) return;
Util.runOnAnyBackgroundThread(() -> { Util.runOnAnyBackgroundThread(() -> {
for (String addr : selected) { for (Integer contactId : selected) {
if (addr!=null) { if (contactId!=null) {
int toAddId = dcContext.createContact(null, addr); dcContext.addContactToChat(chatId, contactId);
dcContext.addContactToChat(chatId, toAddId);
} }
} }
}); });

View file

@ -63,7 +63,7 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter<ContactSel
private final LayoutInflater li; private final LayoutInflater li;
private final ItemClickListener clickListener; private final ItemClickListener clickListener;
private final GlideRequests glideRequests; private final GlideRequests glideRequests;
private final Set<String> selectedContacts = new HashSet<>(); // TODO: maybe better use contact-id here private final Set<Integer> selectedContacts = new HashSet<>(); // TODO: maybe better use contact-id here
private final SparseIntArray actionModeSelection = new SparseIntArray(); private final SparseIntArray actionModeSelection = new SparseIntArray();
@Override @Override
@ -292,7 +292,7 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter<ContactSel
enabled = !(dcContact.getId() == DcContact.DC_CONTACT_ID_SELF && itemMultiSelect); enabled = !(dcContact.getId() == DcContact.DC_CONTACT_ID_SELF && itemMultiSelect);
} }
viewHolder.bind(glideRequests, id, dcContact, name, addr, null, itemMultiSelect, enabled); viewHolder.bind(glideRequests, id, dcContact, name, addr, null, itemMultiSelect, enabled);
viewHolder.setChecked(selectedContacts.contains(addr)); viewHolder.setChecked(selectedContacts.contains(id));
} }
@Override @Override
@ -300,7 +300,7 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter<ContactSel
return VIEW_TYPE_CONTACT; return VIEW_TYPE_CONTACT;
} }
public Set<String> getSelectedContacts() { public Set<Integer> getSelectedContacts() {
return selectedContacts; return selectedContacts;
} }

View file

@ -26,6 +26,7 @@ public class NewContactActivity extends PassphraseRequiredActionBarActivity
{ {
public static final String ADDR_EXTRA = "contact_addr"; public static final String ADDR_EXTRA = "contact_addr";
public static final String CONTACT_ID_EXTRA = "contact_id";
private TextInputEditText nameInput; private TextInputEditText nameInput;
private TextInputEditText addrInput; private TextInputEditText addrInput;
@ -81,7 +82,7 @@ public class NewContactActivity extends PassphraseRequiredActionBarActivity
} }
if (getCallingActivity() != null) { // called for result if (getCallingActivity() != null) { // called for result
Intent intent = new Intent(); Intent intent = new Intent();
intent.putExtra(ADDR_EXTRA, addr); intent.putExtra(CONTACT_ID_EXTRA, contactId);
setResult(RESULT_OK, intent); setResult(RESULT_OK, intent);
} else { } else {
int chatId = dcContext.createChatByContactId(contactId); int chatId = dcContext.createChatByContactId(contactId);