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" /> + + -