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