From d3fc819cf69f99617ec666f7c635bd799138874a Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 26 Oct 2018 17:10:48 +0200 Subject: [PATCH] Started use of encryption APIs --- res/drawable-xhdpi/security_alert_button.png | Bin 2544 -> 0 bytes res/layout/chat.xml | 7 +- res/raw/linphonerc_factory | 9 +++ .../linphone/activities/LinphoneActivity.java | 8 +- .../assistant/CreateAccountFragment.java | 3 +- .../linphone/chat/ChatCreationFragment.java | 31 ++++++-- .../org/linphone/chat/ChatListFragment.java | 4 +- .../org/linphone/chat/ChatRoomViewHolder.java | 19 ++++- .../org/linphone/chat/DeviceAdapter.java | 36 ++++++++- .../org/linphone/chat/DevicesFragment.java | 1 - .../org/linphone/chat/GroupChatFragment.java | 29 +++++++- .../org/linphone/chat/GroupInfoAdapter.java | 1 + .../org/linphone/chat/GroupInfoFragment.java | 16 +++- .../contacts/SearchContactsListAdapter.java | 1 + .../org/linphone/ui/ContactAvatar.java | 70 ++++++++++++------ submodules/bzrtp | 2 +- submodules/linphone | 2 +- submodules/mediastreamer2 | 2 +- 18 files changed, 183 insertions(+), 58 deletions(-) delete mode 100644 res/drawable-xhdpi/security_alert_button.png diff --git a/res/drawable-xhdpi/security_alert_button.png b/res/drawable-xhdpi/security_alert_button.png deleted file mode 100644 index a751236923d4ba7849741cd72a9e02b6d77f5e66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2544 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 + android:layout_marginTop="6dp" + android:layout_marginRight="6dp"/> diff --git a/res/raw/linphonerc_factory b/res/raw/linphonerc_factory index edb966667..60069b9b0 100644 --- a/res/raw/linphonerc_factory +++ b/res/raw/linphonerc_factory @@ -42,6 +42,7 @@ enable_basic_to_client_group_chat_room_migration=0 enable_simple_group_chat_message_state=0 aggregate_imdn=1 version_check_url_root=https://www.linphone.org/releases +xmlrpc_server_url=https://subscribe.linphone.org:444/wizard.php [app] activation_code_length=4 @@ -60,3 +61,11 @@ username_max_length=64 username_min_length=1 username_regex=^[a-z0-9_.\-]*$ xmlrpc_url=https://subscribe.linphone.org:444/wizard.php + +[lime] +lime_v2=1 +x3dh_server_url=http://54.37.202.229:80/flexisip-account-manager/x3dh-25519.php +lime_update_threshold=86400 +max_nb_device_per_participant=255 +allow_message_in_unsafe_chatroom=0 +unsafe_if_sas_refused=1 diff --git a/src/android/org/linphone/activities/LinphoneActivity.java b/src/android/org/linphone/activities/LinphoneActivity.java index 34546f5ad..89baf5af4 100644 --- a/src/android/org/linphone/activities/LinphoneActivity.java +++ b/src/android/org/linphone/activities/LinphoneActivity.java @@ -682,7 +682,8 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick } } - public void goToChatCreator(String address, ArrayList selectedContacts, String subject, boolean isGoBack, Bundle shareInfos, boolean createGroupChat) { + public void goToChatCreator(String address, ArrayList selectedContacts, String subject, boolean isGoBack, Bundle shareInfos, + boolean createGroupChat, boolean isChatRoomEncrypted) { if (currentFragment == FragmentsAvailable.INFO_GROUP_CHAT && isGoBack) { getFragmentManager().popBackStackImmediate(); getFragmentManager().popBackStackImmediate(); @@ -692,6 +693,7 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick extras.putString("subject", subject); extras.putString("groupChatRoomAddress", address); extras.putBoolean("createGroupChatRoom", createGroupChat); + extras.putBoolean("encrypted", isChatRoomEncrypted); if (shareInfos != null) { if (shareInfos.getString("fileSharedUri") != null) @@ -731,7 +733,8 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick displayMissedChats(LinphoneManager.getInstance().getUnreadMessageCount()); } - public void goToChatGroupInfos(String address, ArrayList contacts, String subject, boolean isEditionEnabled, boolean isGoBack, Bundle shareInfos) { + public void goToChatGroupInfos(String address, ArrayList contacts, String subject, + boolean isEditionEnabled, boolean isGoBack, Bundle shareInfos, boolean enableEncryption) { if (currentFragment == FragmentsAvailable.CREATE_CHAT && isGoBack) { getFragmentManager().popBackStackImmediate(); getFragmentManager().popBackStackImmediate(); @@ -741,6 +744,7 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick extras.putBoolean("isEditionEnabled", isEditionEnabled); extras.putSerializable("ContactAddress", contacts); extras.putString("subject", subject); + extras.putBoolean("encryptionEnabled", enableEncryption); if (shareInfos != null) { if (shareInfos.getString("fileSharedUri") != null) diff --git a/src/android/org/linphone/assistant/CreateAccountFragment.java b/src/android/org/linphone/assistant/CreateAccountFragment.java index 80ce6dd08..12508bc87 100644 --- a/src/android/org/linphone/assistant/CreateAccountFragment.java +++ b/src/android/org/linphone/assistant/CreateAccountFragment.java @@ -54,8 +54,7 @@ import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; -public class CreateAccountFragment extends Fragment implements CompoundButton.OnCheckedChangeListener - , OnClickListener, AccountCreatorListener { +public class CreateAccountFragment extends Fragment implements CompoundButton.OnCheckedChangeListener, OnClickListener, AccountCreatorListener { private EditText phoneNumberEdit, usernameEdit, passwordEdit, passwordConfirmEdit, emailEdit, dialCode; private TextView phoneNumberError, passwordError, passwordConfirmError, emailError, assisstantTitle, sipUri, skip, instruction; private ImageView phoneNumberInfo; diff --git a/src/android/org/linphone/chat/ChatCreationFragment.java b/src/android/org/linphone/chat/ChatCreationFragment.java index 5d7eb43fb..245e822b6 100644 --- a/src/android/org/linphone/chat/ChatCreationFragment.java +++ b/src/android/org/linphone/chat/ChatCreationFragment.java @@ -79,6 +79,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen private ImageView mSecurityToggleOff, mSecurityToggleOn; private Switch mSecurityToggle; private boolean mCreateGroupChatRoom; + private boolean mChatRoomEncrypted; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -97,6 +98,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen mChatRoomSubject = getArguments().getString("subject"); mChatRoomAddress = getArguments().getString("groupChatRoomAddress"); mCreateGroupChatRoom = getArguments().getBoolean("createGroupChatRoom", false); + mChatRoomEncrypted = getArguments().getBoolean("encrypted", false); } mWaitLayout = view.findViewById(R.id.waitScreen); @@ -170,6 +172,13 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen } }); + mSecurityToggle.setChecked(mChatRoomEncrypted); + if (mChatRoomSubject != null && mChatRoomAddress != null) { + mSecurityToggle.setEnabled(false); + mSecurityToggleOn.setOnClickListener(null); + mSecurityToggleOff.setOnClickListener(null); + } + LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity().getApplicationContext()); mContactsList.setAdapter(mSearchAdapter); @@ -389,7 +398,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen } - private void removeContactFromSelection(ContactAddress ca) { + private void addOrRemoveContactFromSelection(ContactAddress ca) { updateContactsClick(ca, mSearchAdapter.getContactsSelectedList()); mSearchAdapter.notifyDataSetChanged(); updateListSelected(); @@ -447,7 +456,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen if (chatRoom == null) { ProxyConfig lpc = lc.getDefaultProxyConfig(); if (lpc != null && lpc.getConferenceFactoryUri() != null && !LinphonePreferences.instance().useBasicChatRoomFor1To1()) { - mChatRoom = lc.createClientGroupChatRoom(getString(R.string.dummy_group_chat_subject), true); + mChatRoom = lc.createClientGroupChatRoom(getString(R.string.dummy_group_chat_subject), true, mSecurityToggle.isChecked()); mChatRoom.addListener(mChatRoomCreationListener); mChatRoom.addParticipant(participant); } else { @@ -459,17 +468,17 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen } } else { mContactsSelectedLayout.removeAllViews(); - LinphoneActivity.instance().goToChatGroupInfos(null, mContactsSelected, null, true, false, mShareInfos); + LinphoneActivity.instance().goToChatGroupInfos(null, mContactsSelected, null, true, false, mShareInfos, mSecurityToggle.isChecked()); } } else { - LinphoneActivity.instance().goToChatGroupInfos(mChatRoomAddress, mContactsSelected, mChatRoomSubject, true, true, mShareInfos); + LinphoneActivity.instance().goToChatGroupInfos(mChatRoomAddress, mContactsSelected, mChatRoomSubject, true, true, mShareInfos, mSecurityToggle.isChecked()); } } else if (id == R.id.clearSearchField) { mSearchField.setText(""); mSearchAdapter.searchContacts("", mContactsList); } else if (id == R.id.contactChatDelete) { ContactAddress ca = (ContactAddress) view.getTag(); - removeContactFromSelection(ca); + addOrRemoveContactFromSelection(ca); } } @@ -479,10 +488,16 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen Core lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); ProxyConfig lpc = lc.getDefaultProxyConfig(); if (lpc == null || lpc.getConferenceFactoryUri() == null || mCreateGroupChatRoom == false) { - ChatRoom chatRoom = lc.getChatRoom(ca.getAddress()); - LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly(), mShareInfos, chatRoom.getLocalAddress().asString()); + if (mSecurityToggle.isChecked() && lpc != null && lpc.getConferenceFactoryUri() != null) { + mChatRoom = lc.createClientGroupChatRoom(getString(R.string.dummy_group_chat_subject), true, mSecurityToggle.isChecked()); + mChatRoom.addListener(mChatRoomCreationListener); + mChatRoom.addParticipant(ca.getAddress()); + } else { + ChatRoom chatRoom = lc.getChatRoom(ca.getAddress()); + LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly(), mShareInfos, chatRoom.getLocalAddress().asString()); + } } else { - removeContactFromSelection(ca); + addOrRemoveContactFromSelection(ca); } } diff --git a/src/android/org/linphone/chat/ChatListFragment.java b/src/android/org/linphone/chat/ChatListFragment.java index 0cb6075cb..bdc2e8861 100644 --- a/src/android/org/linphone/chat/ChatListFragment.java +++ b/src/android/org/linphone/chat/ChatListFragment.java @@ -101,14 +101,14 @@ public class ChatListFragment extends Fragment implements ContactsUpdatedListene mNewDiscussionButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - LinphoneActivity.instance().goToChatCreator(null, null, null, false, null, false); + LinphoneActivity.instance().goToChatCreator(null, null, null, false, null, false, false); } }); mNewGroupDiscussionButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - LinphoneActivity.instance().goToChatCreator(null, null, null, false, null, true); + LinphoneActivity.instance().goToChatCreator(null, null, null, false, null, true, false); } }); diff --git a/src/android/org/linphone/chat/ChatRoomViewHolder.java b/src/android/org/linphone/chat/ChatRoomViewHolder.java index 08116fc45..1e0ce6e23 100644 --- a/src/android/org/linphone/chat/ChatRoomViewHolder.java +++ b/src/android/org/linphone/chat/ChatRoomViewHolder.java @@ -154,17 +154,28 @@ public class ChatRoomViewHolder extends RecyclerView.ViewHolder implements View. if (mRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())) { LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(mRoom.getPeerAddress()); if (contact != null) { - ContactAvatar.displayAvatar(contact, avatarLayout); + if (mRoom.hasCapability(ChatRoomCapabilities.Encrypted.toInt())) { + ContactAvatar.displayAvatar(contact, mRoom.getSecurityLevel(), avatarLayout); + } else { + ContactAvatar.displayAvatar(contact, avatarLayout); + } } else { String username = mRoom.getPeerAddress().getDisplayName(); if (username == null) { username = mRoom.getPeerAddress().getUsername(); } - ContactAvatar.displayAvatar(username, avatarLayout); + if (mRoom.hasCapability(ChatRoomCapabilities.Encrypted.toInt())) { + ContactAvatar.displayAvatar(username, mRoom.getSecurityLevel(), avatarLayout); + } else { + ContactAvatar.displayAvatar(username, avatarLayout); + } } } else { - ((ImageView)avatarLayout.findViewById(R.id.contact_picture)).setImageBitmap(mDefaultGroupBitmap); - avatarLayout.findViewById(R.id.generated_avatar).setVisibility(View.GONE); + if (mRoom.hasCapability(ChatRoomCapabilities.Encrypted.toInt())) { + ContactAvatar.displayGroupChatAvatar(mRoom.getSecurityLevel(), avatarLayout); + } else { + ContactAvatar.displayGroupChatAvatar(avatarLayout); + } } } diff --git a/src/android/org/linphone/chat/DeviceAdapter.java b/src/android/org/linphone/chat/DeviceAdapter.java index a3775275f..5bcffd9c6 100644 --- a/src/android/org/linphone/chat/DeviceAdapter.java +++ b/src/android/org/linphone/chat/DeviceAdapter.java @@ -30,6 +30,7 @@ import org.linphone.R; import org.linphone.contacts.ContactsManager; import org.linphone.contacts.LinphoneContact; import org.linphone.core.Address; +import org.linphone.core.ChatRoomSecurityLevel; import org.linphone.core.Participant; import org.linphone.core.ParticipantDevice; import org.linphone.ui.ContactAvatar; @@ -76,6 +77,21 @@ public class DeviceAdapter extends BaseExpandableListAdapter { Address deviceAddress = device.getAddress(); holder.deviceName.setText(deviceAddress.getUriParam("gr")); //TODO + + ChatRoomSecurityLevel level = device.getSecurityLevel(); + switch (level) { + case Safe: + holder.securityLevel.setImageResource(R.drawable.security_2_indicator); + break; + case Encrypted: + holder.securityLevel.setImageResource(R.drawable.security_1_indicator); + break; + case ClearText: + case Unsafe: + default: + holder.securityLevel.setImageResource(R.drawable.security_alert_indicator); + break; + } } else { Participant participant = (Participant) getGroup(groupPosition); @@ -97,11 +113,11 @@ public class DeviceAdapter extends BaseExpandableListAdapter { Address participantAddress = participant.getAddress(); LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(participantAddress); if (contact != null) { - ContactAvatar.displayAvatar(contact, holder.avatarLayout); + ContactAvatar.displayAvatar(contact, participant.getSecurityLevel(), holder.avatarLayout); holder.participantName.setText(contact.getFullName()); } else { String displayName = LinphoneUtils.getAddressDisplayName(participantAddress); - ContactAvatar.displayAvatar(displayName, holder.avatarLayout); + ContactAvatar.displayAvatar(displayName, participant.getSecurityLevel(), holder.avatarLayout); holder.participantName.setText(displayName); } @@ -132,7 +148,21 @@ public class DeviceAdapter extends BaseExpandableListAdapter { Address deviceAddress = device.getAddress(); holder.deviceName.setText(deviceAddress.getUriParam("gr")); //TODO - //holder.securityLevel.setImageResource(); + + ChatRoomSecurityLevel level = device.getSecurityLevel(); + switch (level) { + case Safe: + holder.securityLevel.setImageResource(R.drawable.security_2_indicator); + break; + case Encrypted: + holder.securityLevel.setImageResource(R.drawable.security_1_indicator); + break; + case ClearText: + case Unsafe: + default: + holder.securityLevel.setImageResource(R.drawable.security_alert_indicator); + break; + } return view; } diff --git a/src/android/org/linphone/chat/DevicesFragment.java b/src/android/org/linphone/chat/DevicesFragment.java index 507e34b22..3e6d636c4 100644 --- a/src/android/org/linphone/chat/DevicesFragment.java +++ b/src/android/org/linphone/chat/DevicesFragment.java @@ -146,7 +146,6 @@ public class DevicesFragment extends Fragment { boolean onlyDisplayChilds = mRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt()); - //TODO get list of participants and devices if (mRoom != null && mRoom.getNbParticipants() > 0) { mAdapter.updateListItems(Arrays.asList(mRoom.getParticipants()), onlyDisplayChilds); } diff --git a/src/android/org/linphone/chat/GroupChatFragment.java b/src/android/org/linphone/chat/GroupChatFragment.java index 623926066..10ae3f423 100644 --- a/src/android/org/linphone/chat/GroupChatFragment.java +++ b/src/android/org/linphone/chat/GroupChatFragment.java @@ -69,6 +69,7 @@ import org.linphone.core.ChatMessage; import org.linphone.core.ChatRoom; import org.linphone.core.ChatRoomCapabilities; import org.linphone.core.ChatRoomListener; +import org.linphone.core.ChatRoomSecurityLevel; import org.linphone.core.Content; import org.linphone.core.Core; import org.linphone.core.EventLog; @@ -186,7 +187,9 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con ContactAddress ca = new ContactAddress(c, a.asString(), "", c.isFriend(), p.isAdmin()); participants.add(ca); } - LinphoneActivity.instance().goToChatGroupInfos(mRemoteSipAddress.asString(), participants, mChatRoom.getSubject(), mChatRoom.getMe() != null ? mChatRoom.getMe().isAdmin() : false, false, null); + LinphoneActivity.instance().goToChatGroupInfos(mRemoteSipAddress.asString(), participants, mChatRoom.getSubject(), + mChatRoom.getMe() != null ? mChatRoom.getMe().isAdmin() : false, false, null, + mChatRoom.hasCapability(ChatRoomCapabilities.Encrypted.toInt())); } }); @@ -634,11 +637,23 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con setReadOnly(); } - if (mChatRoom.hasCapability(ChatRoomCapabilities.Basic.toInt())) { + if (!mChatRoom.hasCapability(ChatRoomCapabilities.Encrypted.toInt())) { mChatRoomSecurityLevel.setVisibility(View.GONE); } else { - //TODO - //mChatRoomSecurityLevel.setImageResource(); + ChatRoomSecurityLevel level = mChatRoom.getSecurityLevel(); + switch (level) { + case Safe: + mChatRoomSecurityLevel.setImageResource(R.drawable.security_2_indicator); + break; + case Encrypted: + mChatRoomSecurityLevel.setImageResource(R.drawable.security_1_indicator); + break; + case ClearText: + case Unsafe: + mChatRoomSecurityLevel.setImageResource(R.drawable.security_alert_indicator); + break; + + } } } @@ -1032,6 +1047,12 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con } + @Override + public void onSecurityEvent(ChatRoom cr, EventLog eventLog) { + mEventsAdapter.addToHistory(eventLog); + scrollToBottom(); + } + @Override public void onStateChanged(ChatRoom cr, ChatRoom.State newState) { if (mChatRoom.hasBeenLeft()) { diff --git a/src/android/org/linphone/chat/GroupInfoAdapter.java b/src/android/org/linphone/chat/GroupInfoAdapter.java index 3c7f582e5..f658d9fbd 100644 --- a/src/android/org/linphone/chat/GroupInfoAdapter.java +++ b/src/android/org/linphone/chat/GroupInfoAdapter.java @@ -35,6 +35,7 @@ import org.linphone.activities.LinphoneActivity; import org.linphone.contacts.ContactAddress; import org.linphone.contacts.LinphoneContact; import org.linphone.core.ChatRoom; +import org.linphone.core.ChatRoomCapabilities; import org.linphone.core.Participant; import org.linphone.ui.ContactAvatar; diff --git a/src/android/org/linphone/chat/GroupInfoFragment.java b/src/android/org/linphone/chat/GroupInfoFragment.java index a628ed94f..525b850be 100644 --- a/src/android/org/linphone/chat/GroupInfoFragment.java +++ b/src/android/org/linphone/chat/GroupInfoFragment.java @@ -80,6 +80,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener { private Bundle mShareInfos; private Context mContext; private LinearLayoutManager layoutManager; + private boolean mIsEncryptionEnabled; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -113,6 +114,8 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener { mIsEditionEnabled = false; } + mIsEncryptionEnabled = getArguments().getBoolean("encryptionEnabled", false); + mParticipantsList = view.findViewById(R.id.chat_room_participants); mAdapter = new GroupInfoAdapter(mParticipants, !mIsEditionEnabled, !mIsAlreadyCreatedGroup); mAdapter.setOnDeleteClickListener(new View.OnClickListener() { @@ -160,7 +163,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener { getFragmentManager().popBackStack(); } } else { - LinphoneActivity.instance().goToChatCreator(null, mParticipants, null, true, mShareInfos, true); + LinphoneActivity.instance().goToChatCreator(null, mParticipants, null, true, mShareInfos, true, mIsEncryptionEnabled); } } }); @@ -205,7 +208,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener { @Override public void onClick(View view) { if (mIsEditionEnabled) { - LinphoneActivity.instance().goToChatCreator(mGroupChatRoomAddress != null ? mGroupChatRoomAddress.asString() : null, mParticipants, mSubject, !mIsAlreadyCreatedGroup, null, true); + LinphoneActivity.instance().goToChatCreator(mGroupChatRoomAddress != null ? mGroupChatRoomAddress.asString() : null, mParticipants, mSubject, !mIsAlreadyCreatedGroup, null, true, mIsEncryptionEnabled); } } }); @@ -213,7 +216,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener { mAddParticipantsButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - LinphoneActivity.instance().goToChatCreator(mGroupChatRoomAddress != null ? mGroupChatRoomAddress.asString() : null, mParticipants, mSubject, !mIsAlreadyCreatedGroup, null, true); + LinphoneActivity.instance().goToChatCreator(mGroupChatRoomAddress != null ? mGroupChatRoomAddress.asString() : null, mParticipants, mSubject, !mIsAlreadyCreatedGroup, null, true, mIsEncryptionEnabled); } }); @@ -258,7 +261,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener { public void onClick(View view) { if (!mIsAlreadyCreatedGroup) { mWaitLayout.setVisibility(View.VISIBLE); - mTempChatRoom = LinphoneManager.getLc().createClientGroupChatRoom(mSubjectField.getText().toString(), mParticipants.size() == 1); + mTempChatRoom = LinphoneManager.getLc().createClientGroupChatRoom(mSubjectField.getText().toString(), mParticipants.size() == 1, mIsEncryptionEnabled); mTempChatRoom.addListener(mChatRoomCreationListener); Address addresses[] = new Address[mParticipants.size()]; @@ -492,6 +495,11 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener { } + @Override + public void onSecurityEvent(ChatRoom cr, EventLog eventLog) { + refreshParticipantsList(); + } + @Override public void onUndecryptableMessageReceived(ChatRoom cr, ChatMessage msg) { diff --git a/src/android/org/linphone/contacts/SearchContactsListAdapter.java b/src/android/org/linphone/contacts/SearchContactsListAdapter.java index ef176513d..d63b9db87 100644 --- a/src/android/org/linphone/contacts/SearchContactsListAdapter.java +++ b/src/android/org/linphone/contacts/SearchContactsListAdapter.java @@ -146,6 +146,7 @@ public class SearchContactsListAdapter extends RecyclerView.Adapter