diff --git a/app/src/main/java/org/linphone/LinphoneActivity.java b/app/src/main/java/org/linphone/LinphoneActivity.java
index 1dc20b972..6adb55a01 100644
--- a/app/src/main/java/org/linphone/LinphoneActivity.java
+++ b/app/src/main/java/org/linphone/LinphoneActivity.java
@@ -1070,7 +1070,8 @@ public class LinphoneActivity extends LinphoneGenericActivity
if (LinphoneManager.isInstanciated() && LinphoneManager.getLc().getCallsNb() > 0) {
Call call = LinphoneManager.getLc().getCalls()[0];
- if (call.getState() == Call.State.IncomingReceived) {
+ if (call.getState() == Call.State.IncomingReceived
+ || call.getState() == State.IncomingEarlyMedia) {
startActivity(new Intent(LinphoneActivity.this, CallIncomingActivity.class));
} else {
startIncallActivity();
@@ -1399,7 +1400,8 @@ public class LinphoneActivity extends LinphoneGenericActivity
Call call = LinphoneManager.getLc().getCalls()[0];
Call.State onCallStateChanged = call.getState();
- if (onCallStateChanged == State.IncomingReceived) {
+ if (onCallStateChanged == State.IncomingReceived
+ || onCallStateChanged == State.IncomingEarlyMedia) {
startActivity(new Intent(this, CallIncomingActivity.class));
} else if (onCallStateChanged == State.OutgoingInit
|| onCallStateChanged == State.OutgoingProgress
diff --git a/app/src/main/java/org/linphone/LinphoneManager.java b/app/src/main/java/org/linphone/LinphoneManager.java
index 57927a8f9..e7f2a697b 100644
--- a/app/src/main/java/org/linphone/LinphoneManager.java
+++ b/app/src/main/java/org/linphone/LinphoneManager.java
@@ -1161,7 +1161,8 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou
}
}
- if (state == State.IncomingReceived && getCallGsmON()) {
+ if ((state == State.IncomingReceived || state == State.IncomingEarlyMedia)
+ && getCallGsmON()) {
if (mCore != null) {
mCore.declineCall(call, Reason.Busy);
}
diff --git a/app/src/main/java/org/linphone/LinphoneService.java b/app/src/main/java/org/linphone/LinphoneService.java
index 562c613d3..da8411dc7 100644
--- a/app/src/main/java/org/linphone/LinphoneService.java
+++ b/app/src/main/java/org/linphone/LinphoneService.java
@@ -203,7 +203,8 @@ public final class LinphoneService extends Service {
mNotificationManager.displayCallNotification(call);
}
- if (state == Call.State.IncomingReceived) {
+ if (state == Call.State.IncomingReceived
+ || state == State.IncomingEarlyMedia) {
if (!LinphoneManager.getInstance().getCallGsmON())
onIncomingReceived();
}
diff --git a/app/src/main/java/org/linphone/call/CallActivity.java b/app/src/main/java/org/linphone/call/CallActivity.java
index 51acf3046..5f15fb03e 100644
--- a/app/src/main/java/org/linphone/call/CallActivity.java
+++ b/app/src/main/java/org/linphone/call/CallActivity.java
@@ -209,7 +209,7 @@ public class CallActivity extends LinphoneGenericActivity
return;
}
- if (state == State.IncomingReceived) {
+ if (state == State.IncomingReceived || state == State.IncomingEarlyMedia) {
// This scenario will be handled by the Service listener
return;
} else if (state == State.Paused
diff --git a/app/src/main/java/org/linphone/call/CallIncomingActivity.java b/app/src/main/java/org/linphone/call/CallIncomingActivity.java
index 1d01b614e..526995f40 100644
--- a/app/src/main/java/org/linphone/call/CallIncomingActivity.java
+++ b/app/src/main/java/org/linphone/call/CallIncomingActivity.java
@@ -27,6 +27,7 @@ import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.KeyEvent;
+import android.view.TextureView;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
@@ -63,6 +64,7 @@ public class CallIncomingActivity extends LinphoneGenericActivity {
private CoreListenerStub mListener;
private boolean mAlreadyAcceptedOrDeniedCall;
private KeyguardManager mKeyguardManager;
+ private TextureView mVideoDisplay;
public static CallIncomingActivity instance() {
return sInstance;
@@ -88,6 +90,7 @@ public class CallIncomingActivity extends LinphoneGenericActivity {
mName = findViewById(R.id.contact_name);
mNumber = findViewById(R.id.contact_number);
+ mVideoDisplay = findViewById(R.id.videoSurface);
mAccept = findViewById(R.id.answer_button);
mDecline = findViewById(R.id.decline_button);
@@ -189,6 +192,10 @@ public class CallIncomingActivity extends LinphoneGenericActivity {
mName.setText(displayName);
}
mNumber.setText(address.asStringUriOnly());
+
+ if (LinphonePreferences.instance().acceptIncomingEarlyMedia()) {
+ mCall.getCore().setNativeVideoWindowId(mVideoDisplay);
+ }
}
@Override
@@ -225,7 +232,8 @@ public class CallIncomingActivity extends LinphoneGenericActivity {
private void lookupCurrentCall() {
if (LinphoneManager.getLcIfManagerNotDestroyedOrNull() != null) {
for (Call call : LinphoneManager.getLc().getCalls()) {
- if (State.IncomingReceived == call.getState()) {
+ if (State.IncomingReceived == call.getState()
+ || State.IncomingEarlyMedia == call.getState()) {
mCall = call;
break;
}
diff --git a/app/src/main/java/org/linphone/settings/LinphonePreferences.java b/app/src/main/java/org/linphone/settings/LinphonePreferences.java
index 51c832131..de470698a 100644
--- a/app/src/main/java/org/linphone/settings/LinphonePreferences.java
+++ b/app/src/main/java/org/linphone/settings/LinphonePreferences.java
@@ -748,6 +748,14 @@ public class LinphonePreferences {
// End of video settings
// Call settings
+ public boolean acceptIncomingEarlyMedia() {
+ return getConfig().getBool("sip", "incoming_calls_early_media", false);
+ }
+
+ public void setAcceptIncomingEarlyMedia(boolean accept) {
+ getConfig().setBool("sip", "incoming_calls_early_media", accept);
+ }
+
public boolean useRfc2833Dtmfs() {
if (getLc() == null) return false;
return getLc().getUseRfc2833ForDtmf();
diff --git a/app/src/main/java/org/linphone/settings/SettingsFragment.java b/app/src/main/java/org/linphone/settings/SettingsFragment.java
index ecbb40b38..693c5b433 100644
--- a/app/src/main/java/org/linphone/settings/SettingsFragment.java
+++ b/app/src/main/java/org/linphone/settings/SettingsFragment.java
@@ -1123,6 +1123,9 @@ public class SettingsFragment extends PreferenceFragment {
EditTextPreference incTimeout =
(EditTextPreference)
findPreference(getString(R.string.pref_incoming_call_timeout_key));
+ CheckBoxPreference earlyMedia =
+ (CheckBoxPreference)
+ findPreference(getString(R.string.pref_accept_early_media_key));
rfc2833.setChecked(mPrefs.useRfc2833Dtmfs());
sipInfo.setChecked(mPrefs.useSipInfoDtmfs());
@@ -1133,6 +1136,7 @@ public class SettingsFragment extends PreferenceFragment {
autoAnswer.setChecked(mPrefs.isAutoAnswerEnabled());
autoAnswerTime.setText(String.valueOf(mPrefs.getAutoAnswerTime()));
autoAnswerTime.setSummary(String.valueOf(mPrefs.getAutoAnswerTime()));
+ earlyMedia.setChecked(mPrefs.acceptIncomingEarlyMedia());
if (mPrefs.isAutoAnswerEnabled()) {
autoAnswerTime.setEnabled(true);
@@ -1317,6 +1321,18 @@ public class SettingsFragment extends PreferenceFragment {
return true;
}
});
+
+ findPreference(getString(R.string.pref_accept_early_media_key))
+ .setOnPreferenceChangeListener(
+ new OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(
+ Preference preference, Object newValue) {
+ boolean accept = (Boolean) newValue;
+ mPrefs.setAcceptIncomingEarlyMedia(accept);
+ return true;
+ }
+ });
}
private void initChatSettings() {
diff --git a/app/src/main/res/layout/call_incoming.xml b/app/src/main/res/layout/call_incoming.xml
index a4844dc59..2a367b4f2 100644
--- a/app/src/main/res/layout/call_incoming.xml
+++ b/app/src/main/res/layout/call_incoming.xml
@@ -29,49 +29,60 @@
-
-
-
-
-
+ android:layout_height="match_parent">
-
+
+
+
+
+
+
+
+
+
-
+
+
+
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values/non_localizable_custom.xml b/app/src/main/res/values/non_localizable_custom.xml
index 257e97fca..db5eb0f31 100644
--- a/app/src/main/res/values/non_localizable_custom.xml
+++ b/app/src/main/res/values/non_localizable_custom.xml
@@ -73,7 +73,7 @@
false
- true
+ false
true
false
diff --git a/app/src/main/res/values/non_localizable_strings.xml b/app/src/main/res/values/non_localizable_strings.xml
index 3ae74fce6..bbb4b125e 100644
--- a/app/src/main/res/values/non_localizable_strings.xml
+++ b/app/src/main/res/values/non_localizable_strings.xml
@@ -131,6 +131,7 @@
- @string/pref_auto_download_policy_always_key
- @string/pref_auto_download_policy_size_key
+ pref_accept_early_media_key
push_reg_id_key
push_sender_id_key
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 1d498460e..21904fdd8 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -433,6 +433,7 @@
Call timeout (in seconds)
Voice mail URI
Use Linphone as default phone app
+ Accept early-media
Chat
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index 5e7224f3e..8f2bcc7be 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -231,6 +231,12 @@
android:persistent="false"
android:title="@string/pref_incoming_call_timeout_title" />
+
+
-