diff --git a/res/values/strings.xml b/res/values/strings.xml
index 36caa90d7..02dfd6a49 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -225,6 +225,7 @@
%s\'s devices
Conversation\'s devices
Add to contacts
+ Instant messages are end-to-end encrypted in secured conversations. It is possible to upgrade the security level of a conversation by authenticating participants. To do so, call the contact and follow the authentification process.
Registered
diff --git a/src/android/org/linphone/LinphonePreferences.java b/src/android/org/linphone/LinphonePreferences.java
index 038bb0926..c3e0097eb 100644
--- a/src/android/org/linphone/LinphonePreferences.java
+++ b/src/android/org/linphone/LinphonePreferences.java
@@ -1540,6 +1540,14 @@ public class LinphonePreferences {
getConfig().setBool("app", "link_popup_enabled", enable);
}
+ public boolean isLimeSecurityPopupEnabled() {
+ return getConfig().getBool("app", "lime_security_popup_enabled", true);
+ }
+
+ public void enableLimeSecurityPopup(boolean enable) {
+ getConfig().setBool("app", "lime_security_popup_enabled", enable);
+ }
+
public String getDebugPopupAddress() {
return getConfig().getString("app", "debug_popup_magic", null);
}
diff --git a/src/android/org/linphone/chat/GroupChatFragment.java b/src/android/org/linphone/chat/GroupChatFragment.java
index b48f53b54..116a7c989 100644
--- a/src/android/org/linphone/chat/GroupChatFragment.java
+++ b/src/android/org/linphone/chat/GroupChatFragment.java
@@ -49,16 +49,19 @@ import android.view.ViewTreeObserver;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
+import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import org.linphone.LinphoneManager;
+import org.linphone.LinphonePreferences;
import org.linphone.LinphoneService;
import org.linphone.LinphoneUtils;
import org.linphone.R;
import org.linphone.activities.LinphoneActivity;
+import org.linphone.assistant.AssistantActivity;
import org.linphone.compatibility.Compatibility;
import org.linphone.contacts.ContactAddress;
import org.linphone.contacts.ContactsManager;
@@ -76,6 +79,7 @@ import org.linphone.core.EventLog;
import org.linphone.core.Factory;
import org.linphone.core.LimeState;
import org.linphone.core.Participant;
+import org.linphone.core.ParticipantDevice;
import org.linphone.core.Reason;
import org.linphone.mediastream.Log;
import org.linphone.ui.SelectableHelper;
@@ -106,7 +110,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
private Uri mImageToUploadUri;
private ChatEventsAdapter mEventsAdapter;
private String mRemoteSipUri;
- private Address mRemoteSipAddress, mRemoteParticipantAddress, mLocalIdentityAddress;
+ private Address mRemoteSipAddress, mRemoteParticipantAddress;
private ChatRoom mChatRoom;
private ArrayList mParticipants;
private LinearLayoutManager layoutManager;
@@ -126,10 +130,6 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
mRemoteSipUri = getArguments().getString("SipUri");
mRemoteSipAddress = LinphoneManager.getLc().createAddress(mRemoteSipUri);
}
- if (getArguments().getString("LocalIdentity") != null) {
- String localIdentity = getArguments().getString("LocalIdentity");
- mLocalIdentityAddress = LinphoneManager.getLc().createAddress(localIdentity);
- }
}
mContext = getActivity().getApplicationContext();
@@ -142,7 +142,24 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
mChatRoomSecurityLevel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- LinphoneActivity.instance().goToContactDevicesInfos(getRemoteSipUri());
+ boolean oneParticipantOneDevice = false;
+ if (mChatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt())) {
+ ParticipantDevice[] devices = mChatRoom.getParticipants()[0].getDevices();
+ if (devices.length == 1) {
+ oneParticipantOneDevice = true;
+ }
+ }
+
+ if (LinphonePreferences.instance().isLimeSecurityPopupEnabled()) {
+ showSecurityDialog(oneParticipantOneDevice);
+ } else {
+ if (oneParticipantOneDevice) {
+ ParticipantDevice device = mChatRoom.getParticipants()[0].getDevices()[0];
+ LinphoneManager.getLc().inviteAddress(device.getAddress());
+ } else {
+ LinphoneActivity.instance().goToContactDevicesInfos(getRemoteSipUri());
+ }
+ }
}
});
@@ -435,7 +452,6 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
@Override
public boolean onContextItemSelected(MenuItem item) {
-
EventLog event = (EventLog) mEventsAdapter.getItem(mContextMenuMessagePosition);
if (event.getType() != EventLog.Type.ConferenceChatMessage) {
@@ -662,6 +678,57 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
scrollToBottom();
}
+ private void showSecurityDialog(boolean oneParticipantOneDevice) {
+ final Dialog dialog = LinphoneActivity.instance().displayDialog(getString(R.string.lime_security_popup));
+ Button delete = dialog.findViewById(R.id.delete_button);
+ delete.setVisibility(View.GONE);
+ Button ok = dialog.findViewById(R.id.ok_button);
+ ok.setText(oneParticipantOneDevice ? getString(R.string.call) : getString(R.string.ok));
+ ok.setVisibility(View.VISIBLE);
+ Button cancel = dialog.findViewById(R.id.cancel);
+ cancel.setText(getString(R.string.cancel));
+
+ dialog.findViewById(R.id.doNotAskAgainLayout).setVisibility(View.VISIBLE);
+ final CheckBox doNotAskAgain = dialog.findViewById(R.id.doNotAskAgain);
+ dialog.findViewById(R.id.doNotAskAgainLabel).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ doNotAskAgain.setChecked(!doNotAskAgain.isChecked());
+ }
+ });
+
+ ok.setTag(oneParticipantOneDevice);
+ ok.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ boolean oneParticipantOneDevice = (boolean) view.getTag();
+ if (doNotAskAgain.isChecked()) {
+ LinphonePreferences.instance().enableLimeSecurityPopup(false);
+ }
+
+ if (oneParticipantOneDevice) {
+ ParticipantDevice device = mChatRoom.getParticipants()[0].getDevices()[0];
+ LinphoneManager.getLc().inviteAddress(device.getAddress());
+ } else {
+ LinphoneActivity.instance().goToContactDevicesInfos(getRemoteSipUri());
+ }
+
+ dialog.dismiss();
+ }
+ });
+
+ cancel.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ if (doNotAskAgain.isChecked()) {
+ LinphonePreferences.instance().enableLimeSecurityPopup(false);
+ }
+ dialog.dismiss();
+ }
+ });
+ dialog.show();
+ }
+
public void scrollToBottom() {
mChatEventsList.getLayoutManager().scrollToPosition(0);
}