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); }