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";
@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();

View file

@ -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<String> selectedContacts = contactsFragment.getSelectedContacts();
if (selectedContacts != null) {
resultIntent.putStringArrayListExtra("contacts", new ArrayList<>(selectedContacts));
}
List<Integer> selectedContacts = contactsFragment.getSelectedContacts();
resultIntent.putIntegerArrayListExtra(CONTACTS_EXTRA, new ArrayList<>(selectedContacts));
setResult(RESULT_OK, resultIntent);
}
}

View file

@ -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) {}
}

View file

@ -89,7 +89,7 @@ public class ContactSelectionListFragment extends Fragment
private DcContext dcContext;
private Set<String> selectedContacts;
private Set<Integer> 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<String> getSelectedContacts() {
List<String> selected = new LinkedList<>();
public @NonNull List<Integer> getSelectedContacts() {
List<Integer> selected = new LinkedList<>();
if (selectedContacts != null) {
selected.addAll(selectedContacts);
}
@ -258,7 +258,7 @@ public class ContactSelectionListFragment extends Fragment
isMulti(),
true);
selectedContacts = adapter.getSelectedContacts();
ArrayList<String> preselectedContacts = getActivity().getIntent().getStringArrayListExtra(PRESELECTED_CONTACTS);
ArrayList<Integer> 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);
}
}

View file

@ -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<String> preselectedContacts = new ArrayList<>();
for (int id : getAdapter().getContacts()) {
preselectedContacts.add(dcContext.getContact(id).getAddr());
}
ArrayList<Integer> 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<Integer> 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);

View file

@ -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();
}
}

View file

@ -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<String> preselectedContacts = new ArrayList<>();
int[] memberIds = dcContext.getChatContacts(chatId);
for (int memberId : memberIds) {
preselectedContacts.add(dcContext.getContact(memberId).getAddr());
ArrayList<Integer> 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<String> selected = data.getStringArrayListExtra("contacts");
List<Integer> 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);
}
}
});

View file

@ -63,7 +63,7 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter<ContactSel
private final LayoutInflater li;
private final ItemClickListener clickListener;
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();
@Override
@ -292,7 +292,7 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter<ContactSel
enabled = !(dcContact.getId() == DcContact.DC_CONTACT_ID_SELF && itemMultiSelect);
}
viewHolder.bind(glideRequests, id, dcContact, name, addr, null, itemMultiSelect, enabled);
viewHolder.setChecked(selectedContacts.contains(addr));
viewHolder.setChecked(selectedContacts.contains(id));
}
@Override
@ -300,7 +300,7 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter<ContactSel
return VIEW_TYPE_CONTACT;
}
public Set<String> getSelectedContacts() {
public Set<Integer> getSelectedContacts() {
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 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);