diff --git a/res/values/non_localizable_strings.xml b/res/values/non_localizable_strings.xml
index c114a813e..dcbc04bec 100644
--- a/res/values/non_localizable_strings.xml
+++ b/res/values/non_localizable_strings.xml
@@ -206,4 +206,6 @@
pref_device_ringtone_key
pref_auto_answer_key
pref_android_app_settings_key
+ pref_turn_username_key
+ pref_turn_passwd_key
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 0e1399a20..1088d136d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -331,9 +331,11 @@
Network
Use WiFi only
- Stun server
+ STUN server
Enable ICE
Enable TURN
+ STUN / TURN username (optional)
+ STUN / TURN password (optional)
Enable UPNP
Use random ports
SIP port to use
diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml
index 7c008a604..f4ca919ac 100644
--- a/res/xml/preferences.xml
+++ b/res/xml/preferences.xml
@@ -263,6 +263,18 @@
android:title="@string/pref_turn_enable"
android:key="@string/pref_turn_enable_key"
android:persistent="false"/>
+
+
+
+
0) {
LinphoneCall call = LinphoneManager.getLc().getCalls()[0];
- if (call.getCurrentParamsCopy().getVideoEnabled()) {
- startVideoActivity(call);
- } else {
- startIncallActivity(call);
- }
+ startIncallActivity(call);
}
} else {
DialerFragment dialerFragment = DialerFragment.instance();
diff --git a/src/org/linphone/LinphoneManager.java b/src/org/linphone/LinphoneManager.java
index d63a66d2b..277c5e03f 100644
--- a/src/org/linphone/LinphoneManager.java
+++ b/src/org/linphone/LinphoneManager.java
@@ -66,6 +66,7 @@ import org.linphone.core.PublishState;
import org.linphone.core.SubscriptionState;
import org.linphone.core.TunnelConfig;
import org.linphone.mediastream.Log;
+import org.linphone.mediastream.MediastreamerAndroidContext;
import org.linphone.mediastream.Version;
import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration;
import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration.AndroidCamera;
@@ -139,6 +140,7 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
private static List mPendingChatFileMessage;
private static LinphoneChatMessage mUploadPendingFileMessage;
+
public String wizardLoginViewDomain = null;
private static List simpleListeners = new ArrayList();
@@ -1069,6 +1071,7 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
else if (state == State.IncomingReceived || (state == State.CallIncomingEarlyMedia && mR.getBoolean(R.bool.allow_ringing_while_early_media))) {
// Brighten screen for at least 10 seconds
if (mLc.getCallsNb() == 1) {
+ requestAudioFocus(STREAM_RING);
BluetoothManager.getInstance().disableBluetoothSCO(); // Just in case
ringingCall = call;
@@ -1082,8 +1085,8 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
if (state == State.Connected) {
if (mLc.getCallsNb() == 1) {
- requestAudioFocus();
- setAudioManagerInCallMode();
+ mAudioManager.abandonAudioFocus(null);
+ requestAudioFocus(STREAM_VOICE_CALL);
}
if (Hacks.needSoftvolume()) {
@@ -1096,15 +1099,14 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
setAudioManagerInCallMode();
}
- if (state == State.CallReleased || state == State.Error) {
+ if (state == State.CallEnd || state == State.Error) {
if (mLc.getCallsNb() == 0) {
+ Context activity = getContext();
if (mAudioFocused){
int res = mAudioManager.abandonAudioFocus(null);
Log.d("Audio focus released a bit later: " + (res == AudioManager.AUDIOFOCUS_REQUEST_GRANTED ? "Granted" : "Denied"));
mAudioFocused = false;
}
-
- Context activity = getContext();
if (activity != null) {
TelephonyManager tm = (TelephonyManager) activity.getSystemService(Context.TELEPHONY_SERVICE);
if (tm.getCallState() == TelephonyManager.CALL_STATE_IDLE) {
@@ -1116,17 +1118,6 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
}
}
}
-
- if (state == State.CallEnd) {
- if (mLc.getCallsNb() == 0) {
- if (mIncallWakeLock != null && mIncallWakeLock.isHeld()) {
- mIncallWakeLock.release();
- Log.i("Last call ended: releasing incall (CPU only) wake lock");
- } else {
- Log.i("Last call ended: no incall (CPU only) wake lock were held");
- }
- }
- }
if (state == State.CallUpdatedByRemote) {
// If the correspondent proposes video while audio call
boolean remoteVideo = call.getRemoteParams().getVideoEnabled();
@@ -1140,6 +1131,10 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
}
}
}
+ if (state == State.OutgoingInit) {
+ setAudioManagerInCallMode();
+ requestAudioFocus(STREAM_VOICE_CALL);
+ }
if (state == State.StreamsRunning) {
if (BluetoothManager.getInstance().isBluetoothHeadsetAvailable()) {
@@ -1175,6 +1170,7 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
routeAudioToSpeaker();
setAudioManagerInCallMode();
Log.i("Set audio mode on 'Voice Communication'");
+ requestAudioFocus(STREAM_VOICE_CALL);
int oldVolume = mAudioManager.getStreamVolume(STREAM_VOICE_CALL);
int maxVolume = mAudioManager.getStreamMaxVolume(STREAM_VOICE_CALL);
mAudioManager.setStreamVolume(STREAM_VOICE_CALL, maxVolume, 0);
@@ -1186,6 +1182,7 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
routeAudioToSpeaker();
setAudioManagerInCallMode();
Log.i("Set audio mode on 'Voice Communication'");
+ requestAudioFocus(STREAM_VOICE_CALL);
int oldVolume = mAudioManager.getStreamVolume(STREAM_VOICE_CALL);
int maxVolume = mAudioManager.getStreamMaxVolume(STREAM_VOICE_CALL);
int sampleRate = 44100;
@@ -1222,9 +1219,9 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
private boolean isRinging;
- private void requestAudioFocus(){
+ private void requestAudioFocus(int stream){
if (!mAudioFocused){
- int res = mAudioManager.requestAudioFocus(null, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT );
+ int res = mAudioManager.requestAudioFocus(null, stream, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT );
Log.d("Audio focus requested: " + (res == AudioManager.AUDIOFOCUS_REQUEST_GRANTED ? "Granted" : "Denied"));
if (res == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) mAudioFocused=true;
}
@@ -1259,7 +1256,7 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
mVibrator.vibrate(patern, 1);
}
if (mRingerPlayer == null) {
- requestAudioFocus();
+ requestAudioFocus(STREAM_RING);
mRingerPlayer = new MediaPlayer();
mRingerPlayer.setAudioStreamType(STREAM_RING);
@@ -1528,6 +1525,7 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
public void ecCalibrationStatus(LinphoneCore lc, EcCalibratorStatus status,
int delay_ms, Object data) {
((AudioManager)getContext().getSystemService(Context.AUDIO_SERVICE)).setMode(AudioManager.MODE_NORMAL);
+ mAudioManager.abandonAudioFocus(null);
Log.i("Set audio mode on 'Normal'");
}
diff --git a/src/org/linphone/LinphonePreferences.java b/src/org/linphone/LinphonePreferences.java
index 6e129309f..99ff6cd56 100644
--- a/src/org/linphone/LinphonePreferences.java
+++ b/src/org/linphone/LinphonePreferences.java
@@ -935,46 +935,6 @@ public class LinphonePreferences {
public boolean isWifiOnlyEnabled() {
return getConfig().getBool("app", "wifi_only", false);
}
-
- private LinphoneNatPolicy getOrCreateNatPolicy() {
- LinphoneNatPolicy nat = getLc().getNatPolicy();
- if (nat == null) {
- nat = getLc().createNatPolicy();
- }
- return nat;
- }
-
- public String getStunServer() {
- LinphoneNatPolicy nat = getOrCreateNatPolicy();
- return nat.getStunServer();
- }
-
- public void setStunServer(String stun) {
- LinphoneNatPolicy nat = getOrCreateNatPolicy();
- nat.setStunServer(stun);
- if (stun != null && !stun.isEmpty()) {
- nat.enableStun(true);
- }
- getLc().setNatPolicy(nat);
- }
-
- public void setIceEnabled(boolean enabled) {
- LinphoneNatPolicy nat = getOrCreateNatPolicy();
- nat.enableIce(enabled);
- getLc().setNatPolicy(nat);
- }
-
- public void setTurnEnabled(boolean enabled) {
- LinphoneNatPolicy nat = getOrCreateNatPolicy();
- nat.enableTurn(enabled);
- getLc().setNatPolicy(nat);
- }
-
- public void setUpnpEnabled(boolean enabled) {
- LinphoneNatPolicy nat = getOrCreateNatPolicy();
- nat.enableUpnp(enabled);
- getLc().setNatPolicy(nat);
- }
public void useRandomPort(boolean enabled) {
useRandomPort(enabled, true);
@@ -1012,6 +972,47 @@ public class LinphonePreferences {
transports.tls = LINPHONE_CORE_RANDOM_PORT;
getLc().setSignalingTransportPorts(transports);
}
+
+ private LinphoneNatPolicy getOrCreateNatPolicy() {
+ LinphoneNatPolicy nat = getLc().getNatPolicy();
+ if (nat == null) {
+ nat = getLc().createNatPolicy();
+ }
+ return nat;
+ }
+
+ public String getStunServer() {
+ LinphoneNatPolicy nat = getOrCreateNatPolicy();
+ return nat.getStunServer();
+ }
+
+ public void setStunServer(String stun) {
+ LinphoneNatPolicy nat = getOrCreateNatPolicy();
+ nat.setStunServer(stun);
+
+ if (stun != null && !stun.isEmpty()) {
+ nat.enableStun(true);
+ }
+ getLc().setNatPolicy(nat);
+ }
+
+ public void setIceEnabled(boolean enabled) {
+ LinphoneNatPolicy nat = getOrCreateNatPolicy();
+ nat.enableIce(enabled);
+ getLc().setNatPolicy(nat);
+ }
+
+ public void setTurnEnabled(boolean enabled) {
+ LinphoneNatPolicy nat = getOrCreateNatPolicy();
+ nat.enableTurn(enabled);
+ getLc().setNatPolicy(nat);
+ }
+
+ public void setUpnpEnabled(boolean enabled) {
+ LinphoneNatPolicy nat = getOrCreateNatPolicy();
+ nat.enableUpnp(enabled);
+ getLc().setNatPolicy(nat);
+ }
public boolean isUpnpEnabled() {
LinphoneNatPolicy nat = getOrCreateNatPolicy();
@@ -1027,6 +1028,44 @@ public class LinphonePreferences {
LinphoneNatPolicy nat = getOrCreateNatPolicy();
return nat.turnEnabled();
}
+
+ public String getTurnUsername() {
+ LinphoneNatPolicy nat = getOrCreateNatPolicy();
+ return nat.getStunServerUsername();
+ }
+
+ public void setTurnUsername(String username) {
+ LinphoneNatPolicy nat = getOrCreateNatPolicy();
+ LinphoneAuthInfo authInfo = getLc().findAuthInfo(nat.getStunServerUsername(), null, null);
+
+ if (authInfo != null) {
+ LinphoneAuthInfo cloneAuthInfo = authInfo.clone();
+ getLc().removeAuthInfo(authInfo);
+ cloneAuthInfo.setUsername(username);
+ cloneAuthInfo.setUserId(username);
+ getLc().addAuthInfo(cloneAuthInfo);
+ } else {
+ authInfo = LinphoneCoreFactory.instance().createAuthInfo(username, username, null, null, null, null);
+ getLc().addAuthInfo(authInfo);
+ }
+ nat.setStunServerUsername(username);
+ getLc().setNatPolicy(nat);
+ }
+
+ public void setTurnPassword(String password) {
+ LinphoneNatPolicy nat = getOrCreateNatPolicy();
+ LinphoneAuthInfo authInfo = getLc().findAuthInfo(nat.getStunServerUsername(), null, null);
+
+ if (authInfo != null) {
+ LinphoneAuthInfo cloneAuthInfo = authInfo.clone();
+ getLc().removeAuthInfo(authInfo);
+ cloneAuthInfo.setPassword(password);
+ getLc().addAuthInfo(cloneAuthInfo);
+ } else {
+ authInfo = LinphoneCoreFactory.instance().createAuthInfo(nat.getStunServerUsername(), nat.getStunServerUsername(), password, null, null, null);
+ getLc().addAuthInfo(authInfo);
+ }
+ }
public MediaEncryption getMediaEncryption() {
return getLc().getMediaEncryption();
diff --git a/src/org/linphone/SettingsFragment.java b/src/org/linphone/SettingsFragment.java
index 80d5241c6..01f8626fe 100644
--- a/src/org/linphone/SettingsFragment.java
+++ b/src/org/linphone/SettingsFragment.java
@@ -1014,7 +1014,15 @@ public class SettingsFragment extends PreferencesListFragment {
CheckBoxPreference ice = (CheckBoxPreference) findPreference(getString(R.string.pref_ice_enable_key));
CheckBoxPreference turn = (CheckBoxPreference) findPreference(getString(R.string.pref_turn_enable_key));
ice.setChecked(mPrefs.isIceEnabled());
+ turn.setEnabled(mPrefs.getStunServer() != null);
turn.setChecked(mPrefs.isTurnEnabled());
+
+ EditTextPreference turnUsername = (EditTextPreference) findPreference(getString(R.string.pref_turn_username_key));
+ EditTextPreference turnPassword = (EditTextPreference) findPreference(getString(R.string.pref_turn_passwd_key));
+ turnUsername.setEnabled(mPrefs.isTurnEnabled());
+ turnUsername.setSummary(mPrefs.getTurnUsername());
+ turnUsername.setText(mPrefs.getTurnUsername());
+ turnPassword.setEnabled(mPrefs.isTurnEnabled());
CheckBoxPreference randomPort = (CheckBoxPreference) findPreference(getString(R.string.pref_transport_use_random_ports_key));
randomPort.setChecked(mPrefs.isUsingRandomPort());
@@ -1047,6 +1055,9 @@ public class SettingsFragment extends PreferencesListFragment {
public boolean onPreferenceChange(Preference preference, Object newValue) {
mPrefs.setStunServer(newValue.toString());
preference.setSummary(newValue.toString());
+
+ CheckBoxPreference turn = (CheckBoxPreference) findPreference(getString(R.string.pref_turn_enable_key));
+ turn.setEnabled(mPrefs.getStunServer() != null);
return true;
}
});
@@ -1063,6 +1074,27 @@ public class SettingsFragment extends PreferencesListFragment {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
mPrefs.setTurnEnabled((Boolean) newValue);
+ EditTextPreference turnUsername = (EditTextPreference) findPreference(getString(R.string.pref_turn_username_key));
+ EditTextPreference turnPassword = (EditTextPreference) findPreference(getString(R.string.pref_turn_passwd_key));
+ turnUsername.setEnabled(mPrefs.isTurnEnabled());
+ turnPassword.setEnabled(mPrefs.isTurnEnabled());
+ return true;
+ }
+ });
+
+ findPreference(getString(R.string.pref_turn_username_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ mPrefs.setTurnUsername((String) newValue);
+ preference.setSummary(mPrefs.getTurnUsername());
+ return true;
+ }
+ });
+
+ findPreference(getString(R.string.pref_turn_passwd_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ mPrefs.setTurnPassword((String) newValue);
return true;
}
});
diff --git a/submodules/cmake-builder b/submodules/cmake-builder
index f4eac4803..a6d9ea7b2 160000
--- a/submodules/cmake-builder
+++ b/submodules/cmake-builder
@@ -1 +1 @@
-Subproject commit f4eac4803eee43de3efa96ecca9450ba4f2bc7dc
+Subproject commit a6d9ea7b211c53b1d4800497644a56f4674e5924
diff --git a/submodules/linphone b/submodules/linphone
index a44713b45..56b08128b 160000
--- a/submodules/linphone
+++ b/submodules/linphone
@@ -1 +1 @@
-Subproject commit a44713b458d1d9ccaa84d5acb464d76ad77ca403
+Subproject commit 56b08128b41a64ae95b708ce61f1a9328016d3a4
diff --git a/submodules/msopenh264 b/submodules/msopenh264
index 7744dc572..3fe5d85ee 160000
--- a/submodules/msopenh264
+++ b/submodules/msopenh264
@@ -1 +1 @@
-Subproject commit 7744dc572470de6caf11b7e4ce7e79ba0c5efd55
+Subproject commit 3fe5d85ee4dbed91920f3a43f129d28b3dece138