From ffb14ec0882d381492e76382c4f0c07ba118690e Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Mon, 17 Sep 2018 00:57:03 +0200 Subject: [PATCH] adapt group creation display selected group members correctly add items to create groups/verified-groups/contacts directly to the contact list adapt main menu, create chat, help forward from chat to group creation --- res/layout/group_create_activity.xml | 21 -------- res/menu/text_secure_normal.xml | 4 +- res/values/strings.xml | 6 +++ src/com/b44t/messenger/DcContact.java | 10 ++-- .../securesms/ContactSelectionActivity.java | 4 +- .../ContactSelectionListFragment.java | 8 +-- .../securesms/ConversationListActivity.java | 10 ++-- .../securesms/GroupCreateActivity.java | 19 +------ .../securesms/NewConversationActivity.java | 50 +++++++++++-------- .../thoughtcrime/securesms/ShareActivity.java | 4 +- .../securesms/components/AvatarImageView.java | 2 +- .../securesms/connect/DcContactsLoader.java | 19 +++++-- .../contacts/ContactSelectionListAdapter.java | 24 ++++++--- .../contacts/ContactSelectionListItem.java | 41 ++++++++------- .../securesms/database/Address.java | 7 +++ .../securesms/recipients/Recipient.java | 12 +++++ .../util/SelectedRecipientsAdapter.java | 11 +++- 17 files changed, 141 insertions(+), 111 deletions(-) diff --git a/res/layout/group_create_activity.xml b/res/layout/group_create_activity.xml index ea4ec9664..f58dc92e4 100644 --- a/res/layout/group_create_activity.xml +++ b/res/layout/group_create_activity.xml @@ -66,27 +66,6 @@ android:textAppearance="?android:attr/textAppearanceMedium" /> - - - - - - + diff --git a/res/values/strings.xml b/res/values/strings.xml index dcc282d61..6f0d06fac 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1421,5 +1421,11 @@ Loading … One moment … Chat with %1$s? + New group + New verified group + New contact + Type email address above + New chat + https://delta.chat/en/help diff --git a/src/com/b44t/messenger/DcContact.java b/src/com/b44t/messenger/DcContact.java index 5f6969ca2..89391faba 100644 --- a/src/com/b44t/messenger/DcContact.java +++ b/src/com/b44t/messenger/DcContact.java @@ -25,10 +25,12 @@ package com.b44t.messenger; public class DcContact { - public final static int DC_CONTACT_ID_SELF = 1; - public final static int DC_CONTACT_ID_DEVICE = 2; - public final static int DC_CONTACT_ID_LAST_SPECIAL = 9; - public final static int DC_CONTACT_ID_NEW_CONTACT = -1; // used by the UI, not valid to the core + public final static int DC_CONTACT_ID_SELF = 1; + public final static int DC_CONTACT_ID_DEVICE = 2; + public final static int DC_CONTACT_ID_LAST_SPECIAL = 9; + public final static int DC_CONTACT_ID_NEW_CONTACT = -1; // used by the UI, not valid to the core + public final static int DC_CONTACT_ID_NEW_GROUP = -2; // - " - + public final static int DC_CONTACT_ID_NEW_VERIFIED_GROUP = -3; // - " - public DcContact(long contactCPtr) { this.contactCPtr = contactCPtr; diff --git a/src/org/thoughtcrime/securesms/ContactSelectionActivity.java b/src/org/thoughtcrime/securesms/ContactSelectionActivity.java index d61832e59..f5fed5eb8 100644 --- a/src/org/thoughtcrime/securesms/ContactSelectionActivity.java +++ b/src/org/thoughtcrime/securesms/ContactSelectionActivity.java @@ -112,10 +112,10 @@ public abstract class ContactSelectionActivity extends PassphraseRequiredActionB } @Override - public void onContactSelected(String number) {} + public void onContactSelected(int specialId, String number) {} @Override - public void onContactDeselected(String number) {} + public void onContactDeselected(int specialId, String number) {} private static class RefreshDirectoryTask extends AsyncTask { diff --git a/src/org/thoughtcrime/securesms/ContactSelectionListFragment.java b/src/org/thoughtcrime/securesms/ContactSelectionListFragment.java index 312effbdc..bdeaa18fe 100644 --- a/src/org/thoughtcrime/securesms/ContactSelectionListFragment.java +++ b/src/org/thoughtcrime/securesms/ContactSelectionListFragment.java @@ -280,11 +280,11 @@ public class ContactSelectionListFragment extends Fragment if (!isMulti() || !selectedContacts.contains(contact.getNumber())) { selectedContacts.add(contact.getNumber()); contact.setChecked(true); - if (onContactSelectedListener != null) onContactSelectedListener.onContactSelected(contact.getNumber()); + if (onContactSelectedListener != null) onContactSelectedListener.onContactSelected(contact.getSpecialId(), contact.getNumber()); } else { selectedContacts.remove(contact.getNumber()); contact.setChecked(false); - if (onContactSelectedListener != null) onContactSelectedListener.onContactDeselected(contact.getNumber()); + if (onContactSelectedListener != null) onContactSelectedListener.onContactDeselected(contact.getSpecialId(), contact.getNumber()); } } } @@ -298,8 +298,8 @@ public class ContactSelectionListFragment extends Fragment } public interface OnContactSelectedListener { - void onContactSelected(String number); - void onContactDeselected(String number); + void onContactSelected(int specialId, String number); + void onContactDeselected(int specialId, String number); } } diff --git a/src/org/thoughtcrime/securesms/ConversationListActivity.java b/src/org/thoughtcrime/securesms/ConversationListActivity.java index 481e6122e..17a6c0d85 100644 --- a/src/org/thoughtcrime/securesms/ConversationListActivity.java +++ b/src/org/thoughtcrime/securesms/ConversationListActivity.java @@ -114,7 +114,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit inflater.inflate(R.menu.text_secure_normal, menu); - menu.findItem(R.id.menu_clear_passphrase).setVisible(!TextSecurePreferences.isPasswordDisabled(this)); + menu.findItem(R.id.menu_clear_passphrase).setVisible(false/*!TextSecurePreferences.isPasswordDisabled(this)*/); super.onPrepareOptionsMenu(menu); return true; @@ -169,7 +169,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit super.onOptionsItemSelected(item); switch (item.getItemId()) { - case R.id.menu_new_group: createGroup(); return true; + case R.id.menu_new_chat: createChat(); return true; case R.id.menu_settings: handleDisplaySettings(); return true; case R.id.menu_clear_passphrase: handleClearPassphrase(); return true; case R.id.menu_mark_all_read: handleMarkAllRead(); return true; @@ -212,8 +212,8 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit else super.onBackPressed(); } - private void createGroup() { - Intent intent = new Intent(this, GroupCreateActivity.class); + private void createChat() { + Intent intent = new Intent(this, NewConversationActivity.class); startActivity(intent); } @@ -246,7 +246,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit private void handleHelp() { try { - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://support.whispersystems.org"))); + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.help_url)))); } catch (ActivityNotFoundException e) { Toast.makeText(this, R.string.ConversationListActivity_there_is_no_browser_installed_on_your_device, Toast.LENGTH_LONG).show(); } diff --git a/src/org/thoughtcrime/securesms/GroupCreateActivity.java b/src/org/thoughtcrime/securesms/GroupCreateActivity.java index e5c7f45c8..9b06a2d08 100644 --- a/src/org/thoughtcrime/securesms/GroupCreateActivity.java +++ b/src/org/thoughtcrime/securesms/GroupCreateActivity.java @@ -52,7 +52,6 @@ import org.thoughtcrime.securesms.database.Address; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.GroupDatabase; import org.thoughtcrime.securesms.database.GroupDatabase.GroupRecord; -import org.thoughtcrime.securesms.database.RecipientDatabase; import org.thoughtcrime.securesms.database.ThreadDatabase; import org.thoughtcrime.securesms.groups.GroupManager; import org.thoughtcrime.securesms.groups.GroupManager.GroupActionResult; @@ -63,7 +62,6 @@ import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.DynamicTheme; import org.thoughtcrime.securesms.util.SelectedRecipientsAdapter; import org.thoughtcrime.securesms.util.SelectedRecipientsAdapter.OnRecipientDeletedListener; -import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.task.ProgressDialogAsyncTask; import org.whispersystems.libsignal.util.guava.Optional; @@ -128,23 +126,10 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity updateViewState(); } - private void disableSignalGroupViews(int reasonResId) { - View pushDisabled = findViewById(R.id.push_disabled); - pushDisabled.setVisibility(View.VISIBLE); - ((TextView) findViewById(R.id.push_disabled_reason)).setText(reasonResId); - avatar.setEnabled(false); - groupName.setEnabled(false); - } - - private void enableSignalGroupViews() { - findViewById(R.id.push_disabled).setVisibility(View.GONE); - avatar.setEnabled(true); - groupName.setEnabled(true); - } - @SuppressWarnings("ConstantConditions") private void updateViewState() { - enableSignalGroupViews(); + avatar.setEnabled(true); + groupName.setEnabled(true); getSupportActionBar().setTitle(groupToUpdate.isPresent() ? R.string.GroupCreateActivity_actionbar_edit_title : R.string.GroupCreateActivity_actionbar_title); diff --git a/src/org/thoughtcrime/securesms/NewConversationActivity.java b/src/org/thoughtcrime/securesms/NewConversationActivity.java index da2331523..bcdd134a9 100644 --- a/src/org/thoughtcrime/securesms/NewConversationActivity.java +++ b/src/org/thoughtcrime/securesms/NewConversationActivity.java @@ -55,30 +55,36 @@ public class NewConversationActivity extends ContactSelectionActivity { } @Override - public void onContactSelected(String addr) { + public void onContactSelected(int specialId, String addr) { final DcContext dcContext = DcHelper.getContext(this); - final int contactId = dcContext.createContact(null, addr); - if (contactId == 0) { - Toast.makeText(this, R.string.bad_email_address, Toast.LENGTH_LONG).show(); - return; - } - DcContact dcContact = dcContext.getContact(contactId); - - int chatId = dcContext.getChatIdByContactId(contactId); - if (chatId == 0) { - new AlertDialog.Builder(this) - .setMessage(getString(R.string.new_conversation_activity__ask_start_chat_with, dcContact.getNameNAddr())) - .setCancelable(true) - .setNegativeButton(android.R.string.cancel, null) - .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - openConversation(dcContext.createChatByContactId(contactId)); - } - }).show(); + if(specialId==DcContact.DC_CONTACT_ID_NEW_GROUP || specialId==DcContact.DC_CONTACT_ID_NEW_VERIFIED_GROUP) { + Intent intent = new Intent(this, GroupCreateActivity.class); + startActivity(intent); + finish(); } else { - openConversation(chatId); + final int contactId = dcContext.createContact(null, addr); + if (contactId == 0) { + Toast.makeText(this, R.string.bad_email_address, Toast.LENGTH_LONG).show(); + return; + } + DcContact dcContact = dcContext.getContact(contactId); + + int chatId = dcContext.getChatIdByContactId(contactId); + if (chatId == 0) { + new AlertDialog.Builder(this) + .setMessage(getString(R.string.new_conversation_activity__ask_start_chat_with, dcContact.getNameNAddr())) + .setCancelable(true) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + openConversation(dcContext.createChatByContactId(contactId)); + } + }).show(); + } else { + openConversation(chatId); + } } } @@ -128,9 +134,11 @@ public class NewConversationActivity extends ContactSelectionActivity { @Override protected boolean onPrepareOptionsPanel(View view, Menu menu) { + /* currently not needed MenuInflater inflater = this.getMenuInflater(); menu.clear(); inflater.inflate(R.menu.new_conversation_activity, menu); + */ super.onPrepareOptionsMenu(menu); return true; } diff --git a/src/org/thoughtcrime/securesms/ShareActivity.java b/src/org/thoughtcrime/securesms/ShareActivity.java index 60ace0ebe..183e3bcbb 100644 --- a/src/org/thoughtcrime/securesms/ShareActivity.java +++ b/src/org/thoughtcrime/securesms/ShareActivity.java @@ -272,14 +272,14 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity } @Override - public void onContactSelected(String number) { + public void onContactSelected(int specialId, String number) { Recipient recipient = Recipient.from(this, Address.fromExternal(this, number), true); long existingThread = DatabaseFactory.getThreadDatabase(this).getThreadIdIfExistsFor(recipient); createConversation(existingThread, recipient.getAddress(), ThreadDatabase.DistributionTypes.DEFAULT); } @Override - public void onContactDeselected(String number) { + public void onContactDeselected(int specialId, String number) { } diff --git a/src/org/thoughtcrime/securesms/components/AvatarImageView.java b/src/org/thoughtcrime/securesms/components/AvatarImageView.java index f16e44d50..1a2ae7cca 100644 --- a/src/org/thoughtcrime/securesms/components/AvatarImageView.java +++ b/src/org/thoughtcrime/securesms/components/AvatarImageView.java @@ -57,7 +57,7 @@ public class AvatarImageView extends AppCompatImageView { .into(this); setAvatarClickHandler(recipient, quickContactEnabled); } else { - setImageDrawable(new GeneratedContactPhoto("#").asDrawable(getContext(), ContactColors.UNKNOWN_COLOR.toConversationColor(getContext()), inverted)); + setImageDrawable(new GeneratedContactPhoto("+").asDrawable(getContext(), ContactColors.UNKNOWN_COLOR.toConversationColor(getContext()), inverted)); super.setOnClickListener(listener); } } diff --git a/src/org/thoughtcrime/securesms/connect/DcContactsLoader.java b/src/org/thoughtcrime/securesms/connect/DcContactsLoader.java index 32c36e9a3..3b005274d 100644 --- a/src/org/thoughtcrime/securesms/connect/DcContactsLoader.java +++ b/src/org/thoughtcrime/securesms/connect/DcContactsLoader.java @@ -28,14 +28,25 @@ public class DcContactsLoader extends AsyncLoader { public @NonNull DcContactsLoader.Ret loadInBackground() { DcContext dcContext = DcHelper.getContext(getContext()); - int[] ids = dcContext.getContacts(listflags, query); + int[] contact_ids = dcContext.getContacts(listflags, query); if(query!=null) { - // show the "new" link also for partly typed e-mail addresses, so that the user knows he can continue + // show the "new contact" link also for partly typed e-mail addresses, so that the user knows he can continue if( dcContext.lookupContactIdByAddr(query)==0) { - ids = ArrayUtils.appendInt(ids, DcContact.DC_CONTACT_ID_NEW_CONTACT); + contact_ids = ArrayUtils.appendInt(contact_ids, DcContact.DC_CONTACT_ID_NEW_CONTACT); } + return new DcContactsLoader.Ret(contact_ids, query); + } + else { + // add "new group" and "new verified group" links + final int additional_items = 2; // if someone knows an easier way to prepend sth. to int[] please pr :) + int all_ids[] = new int[contact_ids.length+additional_items]; + all_ids[0] = DcContact.DC_CONTACT_ID_NEW_GROUP; + all_ids[1] = DcContact.DC_CONTACT_ID_NEW_VERIFIED_GROUP; + for(int i=0; i { public boolean isDcChat() { return address.startsWith("dc:"); }; + public boolean isDcContact() { return address.startsWith("dcc:"); }; + public @NonNull String toGroupString() { if (!isGroup()) throw new AssertionError("Not group: " + address); return address; @@ -156,6 +158,11 @@ public class Address implements Parcelable, Comparable
{ return Integer.valueOf(address.substring("dc:".length())); } + public int getDcContactId() { + if(!isDcContact()) throw new AssertionError("Not dc contact: " + address); + return Integer.valueOf(address.substring("dcc:".length())); + } + @Override public String toString() { return address; diff --git a/src/org/thoughtcrime/securesms/recipients/Recipient.java b/src/org/thoughtcrime/securesms/recipients/Recipient.java index bd7da6597..74a97d56c 100644 --- a/src/org/thoughtcrime/securesms/recipients/Recipient.java +++ b/src/org/thoughtcrime/securesms/recipients/Recipient.java @@ -29,6 +29,8 @@ import com.annimon.stream.function.Consumer; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.color.MaterialColor; +import org.thoughtcrime.securesms.connect.ApplicationDcContext; +import org.thoughtcrime.securesms.connect.DcHelper; import org.thoughtcrime.securesms.contacts.avatars.ContactColors; import org.thoughtcrime.securesms.contacts.avatars.ContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.FallbackContactPhoto; @@ -96,6 +98,16 @@ public class Recipient implements RecipientModifiedListener { @SuppressWarnings("ConstantConditions") public static @NonNull Recipient from(@NonNull Context context, @NonNull Address address, boolean asynchronous) { if (address == null) throw new AssertionError(address); + ApplicationDcContext dcContext = DcHelper.getContext(context); + if(address.isDcContact()) { + return dcContext.getRecipient(dcContext.getContact(address.getDcContactId())); + } + else if(address.isEmail()) { + int contactId = dcContext.lookupContactIdByAddr(address.toEmailString()); + if(contactId!=0) { + return dcContext.getRecipient(dcContext.getContact(contactId)); + } + } return provider.getRecipient(context, address, Optional.absent(), Optional.absent(), asynchronous); } diff --git a/src/org/thoughtcrime/securesms/util/SelectedRecipientsAdapter.java b/src/org/thoughtcrime/securesms/util/SelectedRecipientsAdapter.java index 9a9ea6f5f..6ddded9bf 100644 --- a/src/org/thoughtcrime/securesms/util/SelectedRecipientsAdapter.java +++ b/src/org/thoughtcrime/securesms/util/SelectedRecipientsAdapter.java @@ -10,7 +10,11 @@ import android.widget.BaseAdapter; import android.widget.ImageButton; import android.widget.TextView; +import com.b44t.messenger.DcContact; + import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.connect.ApplicationDcContext; +import org.thoughtcrime.securesms.connect.DcHelper; import org.thoughtcrime.securesms.recipients.Recipient; import org.whispersystems.libsignal.util.guava.Optional; @@ -25,6 +29,7 @@ public class SelectedRecipientsAdapter extends BaseAdapter { @NonNull private Context context; @Nullable private OnRecipientDeletedListener onRecipientDeletedListener; @NonNull private List recipients; + @NonNull private final ApplicationDcContext dcContext; public SelectedRecipientsAdapter(@NonNull Context context) { this(context, Collections.emptyList()); @@ -34,6 +39,7 @@ public class SelectedRecipientsAdapter extends BaseAdapter { @NonNull Collection existingRecipients) { this.context = context; + this.dcContext = DcHelper.getContext(context); this.recipients = wrapExistingMembers(existingRecipients); } @@ -93,13 +99,14 @@ public class SelectedRecipientsAdapter extends BaseAdapter { final RecipientWrapper rw = (RecipientWrapper)getItem(position); final Recipient p = rw.getRecipient(); final boolean modifiable = rw.isModifiable(); + final DcContact dcContact = dcContext.getContact(p.getAddress().getDcContactId()); TextView name = (TextView) v.findViewById(R.id.name); TextView phone = (TextView) v.findViewById(R.id.phone); ImageButton delete = (ImageButton) v.findViewById(R.id.delete); - name.setText(p.getName()); - phone.setText(p.getAddress().serialize()); + name.setText(dcContact.getDisplayName()); + phone.setText(dcContact.getAddr()); delete.setVisibility(modifiable ? View.VISIBLE : View.GONE); delete.setOnClickListener(new View.OnClickListener() { @Override