diff --git a/app/src/main/java/org/linphone/LinphoneManager.java b/app/src/main/java/org/linphone/LinphoneManager.java
index 03698933e..60510b113 100644
--- a/app/src/main/java/org/linphone/LinphoneManager.java
+++ b/app/src/main/java/org/linphone/LinphoneManager.java
@@ -193,6 +193,7 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
private MediaPlayer mRingerPlayer;
private final Vibrator mVibrator;
private boolean mIsRinging;
+ private boolean mHasLastCallSasBeenRejected;
private LinphoneManager(Context c) {
mUnreadChatsPerRoom = new HashMap();
@@ -220,6 +221,7 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
mSensorManager = (SensorManager) c.getSystemService(Context.SENSOR_SERVICE);
mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
mRessources = c.getResources();
+ mHasLastCallSasBeenRejected = false;
File f = new File(mUserCertsPath);
if (!f.exists()) {
@@ -493,13 +495,42 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
newOutgoingCall(to, address.getDisplayedName());
}
- public void newOutgoingCall(String to, String displayName) {
- // if (mCore.inCall()) {
- // listenerDispatcher.tryingNewOutgoingCallButAlreadyInCall();
- // return;
- // }
+ public void newOutgoingCall(Address to) {
if (to == null) return;
+ ProxyConfig lpc = mCore.getDefaultProxyConfig();
+ if (mRessources.getBoolean(R.bool.forbid_self_call)
+ && lpc != null
+ && to.weakEqual(lpc.getIdentityAddress())) {
+ return;
+ }
+
+ boolean isLowBandwidthConnection =
+ !LinphoneUtils.isHighBandwidthConnection(
+ LinphoneService.instance().getApplicationContext());
+
+ if (mCore.isNetworkReachable()) {
+ if (Version.isVideoCapable()) {
+ boolean prefVideoEnable = mPrefs.isVideoEnabled();
+ boolean prefInitiateWithVideo = mPrefs.shouldInitiateVideoCall();
+ CallManager.getInstance()
+ .inviteAddress(
+ to,
+ prefVideoEnable && prefInitiateWithVideo,
+ isLowBandwidthConnection);
+ } else {
+ CallManager.getInstance().inviteAddress(to, false, isLowBandwidthConnection);
+ }
+ } else if (LinphoneActivity.isInstanciated()) {
+ LinphoneActivity.instance()
+ .displayCustomToast(
+ getString(R.string.error_network_unreachable), Toast.LENGTH_LONG);
+ } else {
+ Log.e("[Manager] Error: " + getString(R.string.error_network_unreachable));
+ }
+ }
+
+ public void newOutgoingCall(String to, String displayName) {
// If to is only a username, try to find the contact to get an alias if existing
if (!to.startsWith("sip:") || !to.contains("@")) {
LinphoneContact contact = ContactsManager.getInstance().findContactFromPhoneNumber(to);
@@ -518,37 +549,9 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
return;
}
- ProxyConfig lpc = mCore.getDefaultProxyConfig();
- if (mRessources.getBoolean(R.bool.forbid_self_call)
- && lpc != null
- && lAddress.weakEqual(lpc.getIdentityAddress())) {
- return;
- }
- lAddress.setDisplayName(displayName);
+ if (displayName != null) lAddress.setDisplayName(displayName);
- boolean isLowBandwidthConnection =
- !LinphoneUtils.isHighBandwidthConnection(
- LinphoneService.instance().getApplicationContext());
-
- if (mCore.isNetworkReachable()) {
- if (Version.isVideoCapable()) {
- boolean prefVideoEnable = mPrefs.isVideoEnabled();
- boolean prefInitiateWithVideo = mPrefs.shouldInitiateVideoCall();
- CallManager.getInstance()
- .inviteAddress(
- lAddress,
- prefVideoEnable && prefInitiateWithVideo,
- isLowBandwidthConnection);
- } else {
- CallManager.getInstance().inviteAddress(lAddress, false, isLowBandwidthConnection);
- }
- } else if (LinphoneActivity.isInstanciated()) {
- LinphoneActivity.instance()
- .displayCustomToast(
- getString(R.string.error_network_unreachable), Toast.LENGTH_LONG);
- } else {
- Log.e("[Manager] Error: " + getString(R.string.error_network_unreachable));
- }
+ newOutgoingCall(lAddress);
}
private void resetCameraFromPreferences() {
@@ -1867,4 +1870,12 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
void setDisplayedName(String s);
}
+
+ public boolean hasLastCallSasBeenRejected() {
+ return mHasLastCallSasBeenRejected;
+ }
+
+ public void lastCallSasRejected(boolean rejected) {
+ mHasLastCallSasBeenRejected = rejected;
+ }
}
diff --git a/app/src/main/java/org/linphone/chat/ChatMessagesFragment.java b/app/src/main/java/org/linphone/chat/ChatMessagesFragment.java
index 0c34c6a93..ea81d0150 100644
--- a/app/src/main/java/org/linphone/chat/ChatMessagesFragment.java
+++ b/app/src/main/java/org/linphone/chat/ChatMessagesFragment.java
@@ -376,6 +376,11 @@ public class ChatMessagesFragment extends Fragment
displayChatRoomHeader();
displayChatRoomHistory();
LinphoneManager.getInstance().setCurrentChatRoomAddress(mRemoteSipAddress);
+
+ if (LinphoneManager.getInstance().hasLastCallSasBeenRejected()) {
+ LinphoneManager.getInstance().lastCallSasRejected(false);
+ LinphoneUtils.showTrustDeniedDialog(getActivity());
+ }
}
public void changeDisplayedChat(String localSipUri, String remoteSipUri) {
diff --git a/app/src/main/java/org/linphone/chat/DevicesFragment.java b/app/src/main/java/org/linphone/chat/DevicesFragment.java
index d48950b2f..6f99c875b 100644
--- a/app/src/main/java/org/linphone/chat/DevicesFragment.java
+++ b/app/src/main/java/org/linphone/chat/DevicesFragment.java
@@ -145,6 +145,11 @@ public class DevicesFragment extends Fragment {
}
initValues();
+
+ if (LinphoneManager.getInstance().hasLastCallSasBeenRejected()) {
+ LinphoneManager.getInstance().lastCallSasRejected(false);
+ LinphoneUtils.showTrustDeniedDialog(getActivity());
+ }
}
private void initChatRoom() {
diff --git a/app/src/main/java/org/linphone/fragments/StatusFragment.java b/app/src/main/java/org/linphone/fragments/StatusFragment.java
index e80ddc749..a22cb413b 100644
--- a/app/src/main/java/org/linphone/fragments/StatusFragment.java
+++ b/app/src/main/java/org/linphone/fragments/StatusFragment.java
@@ -483,6 +483,7 @@ public class StatusFragment extends Fragment {
@Override
public void onClick(View view) {
if (call != null) {
+ LinphoneManager.getInstance().lastCallSasRejected(true);
call.setAuthenticationTokenVerified(false);
if (mEncryption != null) {
mEncryption.setImageResource(R.drawable.security_ko);
diff --git a/app/src/main/java/org/linphone/utils/LinphoneUtils.java b/app/src/main/java/org/linphone/utils/LinphoneUtils.java
index 70d4fe5cd..7fac670e6 100644
--- a/app/src/main/java/org/linphone/utils/LinphoneUtils.java
+++ b/app/src/main/java/org/linphone/utils/LinphoneUtils.java
@@ -21,8 +21,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
import android.app.Activity;
import android.app.AlertDialog;
+import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Handler;
@@ -32,9 +35,14 @@ import android.text.Html;
import android.text.Spanned;
import android.view.KeyEvent;
import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
import android.widget.EditText;
+import android.widget.ImageView;
import android.widget.TextView;
+import androidx.core.content.ContextCompat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
@@ -49,6 +57,7 @@ import org.linphone.core.AccountCreator;
import org.linphone.core.Address;
import org.linphone.core.Call;
import org.linphone.core.Call.State;
+import org.linphone.core.CallLog;
import org.linphone.core.ChatRoom;
import org.linphone.core.ChatRoomCapabilities;
import org.linphone.core.Core;
@@ -502,4 +511,65 @@ public final class LinphoneUtils {
}
return newRooms;
}
+
+ public static void showTrustDeniedDialog(Context context) {
+ final Dialog dialog = new Dialog(context);
+ dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
+ dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
+ dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
+ dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ Drawable d = new ColorDrawable(ContextCompat.getColor(context, R.color.dark_grey_color));
+ d.setAlpha(200);
+ dialog.setContentView(R.layout.dialog);
+ dialog.getWindow()
+ .setLayout(
+ WindowManager.LayoutParams.MATCH_PARENT,
+ WindowManager.LayoutParams.MATCH_PARENT);
+ dialog.getWindow().setBackgroundDrawable(d);
+
+ TextView title = dialog.findViewById(R.id.dialog_title);
+ title.setVisibility(View.GONE);
+
+ TextView message = dialog.findViewById(R.id.dialog_message);
+ message.setVisibility(View.VISIBLE);
+ message.setText(context.getString(R.string.trust_denied));
+
+ ImageView icon = dialog.findViewById(R.id.dialog_icon);
+ icon.setVisibility(View.VISIBLE);
+ icon.setImageResource(R.drawable.security_alert_indicator);
+
+ Button delete = dialog.findViewById(R.id.dialog_delete_button);
+ delete.setVisibility(View.GONE);
+ Button cancel = dialog.findViewById(R.id.dialog_cancel_button);
+ cancel.setVisibility(View.VISIBLE);
+ Button call = dialog.findViewById(R.id.dialog_ok_button);
+ call.setVisibility(View.VISIBLE);
+ call.setText(R.string.call);
+
+ cancel.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ dialog.dismiss();
+ }
+ });
+
+ call.setOnClickListener(
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ CallLog[] logs =
+ LinphoneManager.getLcIfManagerNotDestroyedOrNull().getCallLogs();
+ CallLog lastLog = logs[0];
+ Address addressToCall =
+ lastLog.getDir() == Call.Dir.Incoming
+ ? lastLog.getFromAddress()
+ : lastLog.getToAddress();
+ LinphoneManager.getInstance()
+ .newOutgoingCall(addressToCall.asString(), null);
+ dialog.dismiss();
+ }
+ });
+ dialog.show();
+ }
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 73274c74e..7c725b8c1 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -250,6 +250,7 @@
Unexpected event %i for %s
Download
Select a conversation or create a new one
+ Trust has been denied. Make a call to start the authentication process again.
Connected