mirror of
https://github.com/deltachat/deltachat-android.git
synced 2025-10-03 17:59:39 +02:00
don't use email address as contact unique identifier
This commit is contained in:
parent
8aedbc60a4
commit
fbf8637c97
9 changed files with 59 additions and 63 deletions
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue