Started use of encryption APIs

This commit is contained in:
Sylvain Berfini 2018-10-26 17:10:48 +02:00
parent c975235cb1
commit d3fc819cf6
18 changed files with 183 additions and 58 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

View file

@ -192,11 +192,12 @@
<ImageView <ImageView
android:id="@+id/room_security_level" android:id="@+id/room_security_level"
android:layout_width="33dp" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:src="@drawable/security_alert_button" android:src="@drawable/security_alert_indicator"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:layout_below="@id/top" android:layout_below="@id/top"
android:layout_marginRight="12dp"/> android:layout_marginTop="6dp"
android:layout_marginRight="6dp"/>
</RelativeLayout> </RelativeLayout>

View file

@ -42,6 +42,7 @@ enable_basic_to_client_group_chat_room_migration=0
enable_simple_group_chat_message_state=0 enable_simple_group_chat_message_state=0
aggregate_imdn=1 aggregate_imdn=1
version_check_url_root=https://www.linphone.org/releases version_check_url_root=https://www.linphone.org/releases
xmlrpc_server_url=https://subscribe.linphone.org:444/wizard.php
[app] [app]
activation_code_length=4 activation_code_length=4
@ -60,3 +61,11 @@ username_max_length=64
username_min_length=1 username_min_length=1
username_regex=^[a-z0-9_.\-]*$ username_regex=^[a-z0-9_.\-]*$
xmlrpc_url=https://subscribe.linphone.org:444/wizard.php 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

View file

@ -682,7 +682,8 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
} }
} }
public void goToChatCreator(String address, ArrayList<ContactAddress> selectedContacts, String subject, boolean isGoBack, Bundle shareInfos, boolean createGroupChat) { public void goToChatCreator(String address, ArrayList<ContactAddress> selectedContacts, String subject, boolean isGoBack, Bundle shareInfos,
boolean createGroupChat, boolean isChatRoomEncrypted) {
if (currentFragment == FragmentsAvailable.INFO_GROUP_CHAT && isGoBack) { if (currentFragment == FragmentsAvailable.INFO_GROUP_CHAT && isGoBack) {
getFragmentManager().popBackStackImmediate(); getFragmentManager().popBackStackImmediate();
getFragmentManager().popBackStackImmediate(); getFragmentManager().popBackStackImmediate();
@ -692,6 +693,7 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
extras.putString("subject", subject); extras.putString("subject", subject);
extras.putString("groupChatRoomAddress", address); extras.putString("groupChatRoomAddress", address);
extras.putBoolean("createGroupChatRoom", createGroupChat); extras.putBoolean("createGroupChatRoom", createGroupChat);
extras.putBoolean("encrypted", isChatRoomEncrypted);
if (shareInfos != null) { if (shareInfos != null) {
if (shareInfos.getString("fileSharedUri") != null) if (shareInfos.getString("fileSharedUri") != null)
@ -731,7 +733,8 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
displayMissedChats(LinphoneManager.getInstance().getUnreadMessageCount()); displayMissedChats(LinphoneManager.getInstance().getUnreadMessageCount());
} }
public void goToChatGroupInfos(String address, ArrayList<ContactAddress> contacts, String subject, boolean isEditionEnabled, boolean isGoBack, Bundle shareInfos) { public void goToChatGroupInfos(String address, ArrayList<ContactAddress> contacts, String subject,
boolean isEditionEnabled, boolean isGoBack, Bundle shareInfos, boolean enableEncryption) {
if (currentFragment == FragmentsAvailable.CREATE_CHAT && isGoBack) { if (currentFragment == FragmentsAvailable.CREATE_CHAT && isGoBack) {
getFragmentManager().popBackStackImmediate(); getFragmentManager().popBackStackImmediate();
getFragmentManager().popBackStackImmediate(); getFragmentManager().popBackStackImmediate();
@ -741,6 +744,7 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
extras.putBoolean("isEditionEnabled", isEditionEnabled); extras.putBoolean("isEditionEnabled", isEditionEnabled);
extras.putSerializable("ContactAddress", contacts); extras.putSerializable("ContactAddress", contacts);
extras.putString("subject", subject); extras.putString("subject", subject);
extras.putBoolean("encryptionEnabled", enableEncryption);
if (shareInfos != null) { if (shareInfos != null) {
if (shareInfos.getString("fileSharedUri") != null) if (shareInfos.getString("fileSharedUri") != null)

View file

@ -54,8 +54,7 @@ import java.util.Locale;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class CreateAccountFragment extends Fragment implements CompoundButton.OnCheckedChangeListener public class CreateAccountFragment extends Fragment implements CompoundButton.OnCheckedChangeListener, OnClickListener, AccountCreatorListener {
, OnClickListener, AccountCreatorListener {
private EditText phoneNumberEdit, usernameEdit, passwordEdit, passwordConfirmEdit, emailEdit, dialCode; private EditText phoneNumberEdit, usernameEdit, passwordEdit, passwordConfirmEdit, emailEdit, dialCode;
private TextView phoneNumberError, passwordError, passwordConfirmError, emailError, assisstantTitle, sipUri, skip, instruction; private TextView phoneNumberError, passwordError, passwordConfirmError, emailError, assisstantTitle, sipUri, skip, instruction;
private ImageView phoneNumberInfo; private ImageView phoneNumberInfo;

View file

@ -79,6 +79,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
private ImageView mSecurityToggleOff, mSecurityToggleOn; private ImageView mSecurityToggleOff, mSecurityToggleOn;
private Switch mSecurityToggle; private Switch mSecurityToggle;
private boolean mCreateGroupChatRoom; private boolean mCreateGroupChatRoom;
private boolean mChatRoomEncrypted;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 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"); mChatRoomSubject = getArguments().getString("subject");
mChatRoomAddress = getArguments().getString("groupChatRoomAddress"); mChatRoomAddress = getArguments().getString("groupChatRoomAddress");
mCreateGroupChatRoom = getArguments().getBoolean("createGroupChatRoom", false); mCreateGroupChatRoom = getArguments().getBoolean("createGroupChatRoom", false);
mChatRoomEncrypted = getArguments().getBoolean("encrypted", false);
} }
mWaitLayout = view.findViewById(R.id.waitScreen); 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()); LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
mContactsList.setAdapter(mSearchAdapter); 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()); updateContactsClick(ca, mSearchAdapter.getContactsSelectedList());
mSearchAdapter.notifyDataSetChanged(); mSearchAdapter.notifyDataSetChanged();
updateListSelected(); updateListSelected();
@ -447,7 +456,7 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
if (chatRoom == null) { if (chatRoom == null) {
ProxyConfig lpc = lc.getDefaultProxyConfig(); ProxyConfig lpc = lc.getDefaultProxyConfig();
if (lpc != null && lpc.getConferenceFactoryUri() != null && !LinphonePreferences.instance().useBasicChatRoomFor1To1()) { 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.addListener(mChatRoomCreationListener);
mChatRoom.addParticipant(participant); mChatRoom.addParticipant(participant);
} else { } else {
@ -459,17 +468,17 @@ public class ChatCreationFragment extends Fragment implements View.OnClickListen
} }
} else { } else {
mContactsSelectedLayout.removeAllViews(); mContactsSelectedLayout.removeAllViews();
LinphoneActivity.instance().goToChatGroupInfos(null, mContactsSelected, null, true, false, mShareInfos); LinphoneActivity.instance().goToChatGroupInfos(null, mContactsSelected, null, true, false, mShareInfos, mSecurityToggle.isChecked());
} }
} else { } 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) { } else if (id == R.id.clearSearchField) {
mSearchField.setText(""); mSearchField.setText("");
mSearchAdapter.searchContacts("", mContactsList); mSearchAdapter.searchContacts("", mContactsList);
} else if (id == R.id.contactChatDelete) { } else if (id == R.id.contactChatDelete) {
ContactAddress ca = (ContactAddress) view.getTag(); 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(); Core lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
ProxyConfig lpc = lc.getDefaultProxyConfig(); ProxyConfig lpc = lc.getDefaultProxyConfig();
if (lpc == null || lpc.getConferenceFactoryUri() == null || mCreateGroupChatRoom == false) { if (lpc == null || lpc.getConferenceFactoryUri() == null || mCreateGroupChatRoom == false) {
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()); ChatRoom chatRoom = lc.getChatRoom(ca.getAddress());
LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly(), mShareInfos, chatRoom.getLocalAddress().asString()); LinphoneActivity.instance().goToChat(chatRoom.getPeerAddress().asStringUriOnly(), mShareInfos, chatRoom.getLocalAddress().asString());
}
} else { } else {
removeContactFromSelection(ca); addOrRemoveContactFromSelection(ca);
} }
} }

View file

@ -101,14 +101,14 @@ public class ChatListFragment extends Fragment implements ContactsUpdatedListene
mNewDiscussionButton.setOnClickListener(new View.OnClickListener() { mNewDiscussionButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { 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() { mNewGroupDiscussionButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
LinphoneActivity.instance().goToChatCreator(null, null, null, false, null, true); LinphoneActivity.instance().goToChatCreator(null, null, null, false, null, true, false);
} }
}); });

View file

@ -154,17 +154,28 @@ public class ChatRoomViewHolder extends RecyclerView.ViewHolder implements View.
if (mRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())) { if (mRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())) {
LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(mRoom.getPeerAddress()); LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(mRoom.getPeerAddress());
if (contact != null) { if (contact != null) {
if (mRoom.hasCapability(ChatRoomCapabilities.Encrypted.toInt())) {
ContactAvatar.displayAvatar(contact, mRoom.getSecurityLevel(), avatarLayout);
} else {
ContactAvatar.displayAvatar(contact, avatarLayout); ContactAvatar.displayAvatar(contact, avatarLayout);
}
} else { } else {
String username = mRoom.getPeerAddress().getDisplayName(); String username = mRoom.getPeerAddress().getDisplayName();
if (username == null) { if (username == null) {
username = mRoom.getPeerAddress().getUsername(); username = mRoom.getPeerAddress().getUsername();
} }
if (mRoom.hasCapability(ChatRoomCapabilities.Encrypted.toInt())) {
ContactAvatar.displayAvatar(username, mRoom.getSecurityLevel(), avatarLayout);
} else {
ContactAvatar.displayAvatar(username, avatarLayout); ContactAvatar.displayAvatar(username, avatarLayout);
} }
}
} else { } else {
((ImageView)avatarLayout.findViewById(R.id.contact_picture)).setImageBitmap(mDefaultGroupBitmap); if (mRoom.hasCapability(ChatRoomCapabilities.Encrypted.toInt())) {
avatarLayout.findViewById(R.id.generated_avatar).setVisibility(View.GONE); ContactAvatar.displayGroupChatAvatar(mRoom.getSecurityLevel(), avatarLayout);
} else {
ContactAvatar.displayGroupChatAvatar(avatarLayout);
}
} }
} }

View file

@ -30,6 +30,7 @@ import org.linphone.R;
import org.linphone.contacts.ContactsManager; import org.linphone.contacts.ContactsManager;
import org.linphone.contacts.LinphoneContact; import org.linphone.contacts.LinphoneContact;
import org.linphone.core.Address; import org.linphone.core.Address;
import org.linphone.core.ChatRoomSecurityLevel;
import org.linphone.core.Participant; import org.linphone.core.Participant;
import org.linphone.core.ParticipantDevice; import org.linphone.core.ParticipantDevice;
import org.linphone.ui.ContactAvatar; import org.linphone.ui.ContactAvatar;
@ -76,6 +77,21 @@ public class DeviceAdapter extends BaseExpandableListAdapter {
Address deviceAddress = device.getAddress(); Address deviceAddress = device.getAddress();
holder.deviceName.setText(deviceAddress.getUriParam("gr")); //TODO 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 { } else {
Participant participant = (Participant) getGroup(groupPosition); Participant participant = (Participant) getGroup(groupPosition);
@ -97,11 +113,11 @@ public class DeviceAdapter extends BaseExpandableListAdapter {
Address participantAddress = participant.getAddress(); Address participantAddress = participant.getAddress();
LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(participantAddress); LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(participantAddress);
if (contact != null) { if (contact != null) {
ContactAvatar.displayAvatar(contact, holder.avatarLayout); ContactAvatar.displayAvatar(contact, participant.getSecurityLevel(), holder.avatarLayout);
holder.participantName.setText(contact.getFullName()); holder.participantName.setText(contact.getFullName());
} else { } else {
String displayName = LinphoneUtils.getAddressDisplayName(participantAddress); String displayName = LinphoneUtils.getAddressDisplayName(participantAddress);
ContactAvatar.displayAvatar(displayName, holder.avatarLayout); ContactAvatar.displayAvatar(displayName, participant.getSecurityLevel(), holder.avatarLayout);
holder.participantName.setText(displayName); holder.participantName.setText(displayName);
} }
@ -132,7 +148,21 @@ public class DeviceAdapter extends BaseExpandableListAdapter {
Address deviceAddress = device.getAddress(); Address deviceAddress = device.getAddress();
holder.deviceName.setText(deviceAddress.getUriParam("gr")); //TODO 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; return view;
} }

View file

@ -146,7 +146,6 @@ public class DevicesFragment extends Fragment {
boolean onlyDisplayChilds = mRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt()); boolean onlyDisplayChilds = mRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt());
//TODO get list of participants and devices
if (mRoom != null && mRoom.getNbParticipants() > 0) { if (mRoom != null && mRoom.getNbParticipants() > 0) {
mAdapter.updateListItems(Arrays.asList(mRoom.getParticipants()), onlyDisplayChilds); mAdapter.updateListItems(Arrays.asList(mRoom.getParticipants()), onlyDisplayChilds);
} }

View file

@ -69,6 +69,7 @@ import org.linphone.core.ChatMessage;
import org.linphone.core.ChatRoom; import org.linphone.core.ChatRoom;
import org.linphone.core.ChatRoomCapabilities; import org.linphone.core.ChatRoomCapabilities;
import org.linphone.core.ChatRoomListener; import org.linphone.core.ChatRoomListener;
import org.linphone.core.ChatRoomSecurityLevel;
import org.linphone.core.Content; import org.linphone.core.Content;
import org.linphone.core.Core; import org.linphone.core.Core;
import org.linphone.core.EventLog; 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()); ContactAddress ca = new ContactAddress(c, a.asString(), "", c.isFriend(), p.isAdmin());
participants.add(ca); 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(); setReadOnly();
} }
if (mChatRoom.hasCapability(ChatRoomCapabilities.Basic.toInt())) { if (!mChatRoom.hasCapability(ChatRoomCapabilities.Encrypted.toInt())) {
mChatRoomSecurityLevel.setVisibility(View.GONE); mChatRoomSecurityLevel.setVisibility(View.GONE);
} else { } else {
//TODO ChatRoomSecurityLevel level = mChatRoom.getSecurityLevel();
//mChatRoomSecurityLevel.setImageResource(); 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 @Override
public void onStateChanged(ChatRoom cr, ChatRoom.State newState) { public void onStateChanged(ChatRoom cr, ChatRoom.State newState) {
if (mChatRoom.hasBeenLeft()) { if (mChatRoom.hasBeenLeft()) {

View file

@ -35,6 +35,7 @@ import org.linphone.activities.LinphoneActivity;
import org.linphone.contacts.ContactAddress; import org.linphone.contacts.ContactAddress;
import org.linphone.contacts.LinphoneContact; import org.linphone.contacts.LinphoneContact;
import org.linphone.core.ChatRoom; import org.linphone.core.ChatRoom;
import org.linphone.core.ChatRoomCapabilities;
import org.linphone.core.Participant; import org.linphone.core.Participant;
import org.linphone.ui.ContactAvatar; import org.linphone.ui.ContactAvatar;

View file

@ -80,6 +80,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
private Bundle mShareInfos; private Bundle mShareInfos;
private Context mContext; private Context mContext;
private LinearLayoutManager layoutManager; private LinearLayoutManager layoutManager;
private boolean mIsEncryptionEnabled;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@ -113,6 +114,8 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
mIsEditionEnabled = false; mIsEditionEnabled = false;
} }
mIsEncryptionEnabled = getArguments().getBoolean("encryptionEnabled", false);
mParticipantsList = view.findViewById(R.id.chat_room_participants); mParticipantsList = view.findViewById(R.id.chat_room_participants);
mAdapter = new GroupInfoAdapter(mParticipants, !mIsEditionEnabled, !mIsAlreadyCreatedGroup); mAdapter = new GroupInfoAdapter(mParticipants, !mIsEditionEnabled, !mIsAlreadyCreatedGroup);
mAdapter.setOnDeleteClickListener(new View.OnClickListener() { mAdapter.setOnDeleteClickListener(new View.OnClickListener() {
@ -160,7 +163,7 @@ public class GroupInfoFragment extends Fragment implements ChatRoomListener {
getFragmentManager().popBackStack(); getFragmentManager().popBackStack();
} }
} else { } 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 @Override
public void onClick(View view) { public void onClick(View view) {
if (mIsEditionEnabled) { 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() { mAddParticipantsButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { 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) { public void onClick(View view) {
if (!mIsAlreadyCreatedGroup) { if (!mIsAlreadyCreatedGroup) {
mWaitLayout.setVisibility(View.VISIBLE); 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); mTempChatRoom.addListener(mChatRoomCreationListener);
Address addresses[] = new Address[mParticipants.size()]; 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 @Override
public void onUndecryptableMessageReceived(ChatRoom cr, ChatMessage msg) { public void onUndecryptableMessageReceived(ChatRoom cr, ChatMessage msg) {

View file

@ -146,6 +146,7 @@ public class SearchContactsListAdapter extends RecyclerView.Adapter<SearchContac
if (c != null) { if (c != null) {
ContactAvatar.displayAvatar(c, holder.avatarLayout); ContactAvatar.displayAvatar(c, holder.avatarLayout);
//TODO get if contact has security capabilities
} else { } else {
ContactAvatar.displayAvatar(holder.name.getText().toString(), holder.avatarLayout); ContactAvatar.displayAvatar(holder.name.getText().toString(), holder.avatarLayout);
} }

View file

@ -29,6 +29,7 @@ import org.linphone.LinphoneService;
import org.linphone.LinphoneUtils; import org.linphone.LinphoneUtils;
import org.linphone.R; import org.linphone.R;
import org.linphone.contacts.LinphoneContact; import org.linphone.contacts.LinphoneContact;
import org.linphone.core.ChatRoomSecurityLevel;
import org.linphone.mediastream.Log; import org.linphone.mediastream.Log;
import java.io.IOException; import java.io.IOException;
@ -63,6 +64,28 @@ public class ContactAvatar {
return generatedAvatarText.toUpperCase(); return generatedAvatarText.toUpperCase();
} }
private static void setSecurityLevel(ChatRoomSecurityLevel level, View v) {
ContactAvatarHolder holder = new ContactAvatarHolder(v);
if (holder.securityLevel != null) {
holder.securityLevel.setVisibility(View.VISIBLE);
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 {
holder.securityLevel.setVisibility(View.GONE);
}
}
public static void setAvatarMask(View v, int resourceId) { public static void setAvatarMask(View v, int resourceId) {
ContactAvatarHolder holder = new ContactAvatarHolder(v); ContactAvatarHolder holder = new ContactAvatarHolder(v);
holder.avatarMask.setImageResource(resourceId); holder.avatarMask.setImageResource(resourceId);
@ -77,12 +100,17 @@ public class ContactAvatar {
if (displayName.startsWith("+")) { if (displayName.startsWith("+")) {
// If display name is a phone number, use default avatar because generated one will be +... // If display name is a phone number, use default avatar because generated one will be +...
holder.generatedAvatar.setVisibility(View.GONE); holder.generatedAvatar.setVisibility(View.GONE);
return; } else {
}
holder.generatedAvatar.setText(generateAvatar(displayName)); holder.generatedAvatar.setText(generateAvatar(displayName));
holder.generatedAvatar.setVisibility(View.VISIBLE); holder.generatedAvatar.setVisibility(View.VISIBLE);
} }
holder.securityLevel.setVisibility(View.GONE);
}
public static void displayAvatar(String displayName, ChatRoomSecurityLevel securityLevel, View v) {
displayAvatar(displayName, v);
setSecurityLevel(securityLevel, v);
}
public static void displayAvatar(LinphoneContact contact, View v) { public static void displayAvatar(LinphoneContact contact, View v) {
if (contact == null || v == null) return; if (contact == null || v == null) return;
@ -112,25 +140,23 @@ public class ContactAvatar {
contact.getFirstName() + " " + contact.getLastName() : contact.getFullName())); contact.getFirstName() + " " + contact.getLastName() : contact.getFullName()));
holder.generatedAvatar.setVisibility(View.VISIBLE); holder.generatedAvatar.setVisibility(View.VISIBLE);
} }
if (holder.securityLevel != null) {
//TODO when security level will be available
/*if (contact.hasSecurity()) {
holder.securityLevel.setVisibility(View.VISIBLE);
switch(contact.getSecurityLevel()) {
case 0:
holder.securityLevel.setImageResource(R.drawable.security_alert_indicator);
break;
case 1:
holder.securityLevel.setImageResource(R.drawable.security_1_indicator.png);
break;
case 2:
holder.securityLevel.setImageResource(R.drawable.security_2_indicator);
break;
}
} else {
holder.securityLevel.setVisibility(View.GONE); holder.securityLevel.setVisibility(View.GONE);
}*/
} }
public static void displayAvatar(LinphoneContact contact, ChatRoomSecurityLevel securityLevel, View v) {
displayAvatar(contact, v);
setSecurityLevel(securityLevel, v);
}
public static void displayGroupChatAvatar(View v) {
ContactAvatarHolder holder = new ContactAvatarHolder(v);
holder.contactPicture.setImageResource(R.drawable.chat_group_avatar);
holder.generatedAvatar.setVisibility(View.GONE);
holder.securityLevel.setVisibility(View.GONE);
}
public static void displayGroupChatAvatar(ChatRoomSecurityLevel level, View v) {
displayGroupChatAvatar(v);
setSecurityLevel(level, v);
} }
} }

@ -1 +1 @@
Subproject commit 7515af934e5fa96c7e59f94f49c8bd25dd3ce071 Subproject commit 2dea113f7f1596af94d024008f401899b102b2ab

@ -1 +1 @@
Subproject commit 876682e9a6a07290bf867e3fc363c476c68a3da2 Subproject commit 9b9dcbbc5ec45c637dbbade15fdd64cf56bbd758

@ -1 +1 @@
Subproject commit 5de9bb4086b036bfe84e088c87211cdf48f37cd6 Subproject commit c08cd438a0583ea80ae3bc0449ed5817509cf681