Merge branch 'master' into dev_phonenumber

Conflicts:
	submodules/linphone
This commit is contained in:
Margaux Clerc 2016-09-01 18:00:07 +02:00
commit 3d845d8ee2
13 changed files with 153 additions and 96 deletions

View file

@ -206,4 +206,6 @@
<string name="pref_device_ringtone_key">pref_device_ringtone_key</string>
<string name="pref_auto_answer_key">pref_auto_answer_key</string>
<string name="pref_android_app_settings_key">pref_android_app_settings_key</string>
<string name="pref_turn_username_key">pref_turn_username_key</string>
<string name="pref_turn_passwd_key">pref_turn_passwd_key</string>
</resources>

View file

@ -331,9 +331,11 @@
<!-- Network settings -->
<string name="pref_network_title">Network</string>
<string name="pref_wifi_only">Use WiFi only</string>
<string name="pref_stun_server">Stun server</string>
<string name="pref_stun_server">STUN server</string>
<string name="pref_ice_enable">Enable ICE</string>
<string name="pref_turn_enable">Enable TURN</string>
<string name="pref_turn_username_title">STUN / TURN username (optional)</string>
<string name="pref_turn_passwd_title">STUN / TURN password (optional)</string>
<string name="pref_upnp_enable">Enable UPNP</string>
<string name="pref_transport_use_random_ports">Use random ports</string>
<string name="pref_sip_port_title">SIP port to use</string>

View file

@ -263,6 +263,18 @@
android:title="@string/pref_turn_enable"
android:key="@string/pref_turn_enable_key"
android:persistent="false"/>
<EditTextPreference
android:key="@string/pref_turn_username_key"
android:title="@string/pref_turn_username_title"
android:inputType="text|textNoSuggestions"
android:persistent="false"/>
<EditTextPreference
android:key="@string/pref_turn_passwd_key"
android:title="@string/pref_turn_passwd_title"
android:inputType="textPassword"
android:persistent="false"/>
<CheckBoxPreference
android:title="@string/pref_upnp_enable"

View file

@ -300,7 +300,6 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
callFragment.setArguments(getIntent().getExtras());
getFragmentManager().beginTransaction().add(R.id.fragmentContainer, callFragment).commitAllowingStateLoss();
}
}

View file

@ -305,12 +305,8 @@ public class CallIncomingActivity extends Activity implements LinphoneSliderTrig
if (!LinphoneActivity.isInstanciated()) {
return;
}
final LinphoneCallParams remoteParams = mCall.getRemoteParams();
if (remoteParams != null && remoteParams.getVideoEnabled() && LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests()) {
LinphoneActivity.instance().startVideoActivity(mCall);
} else {
LinphoneActivity.instance().startIncallActivity(mCall);
}
LinphoneManager.getInstance().routeAudioToReceiver();
LinphoneActivity.instance().startIncallActivity(mCall);
}
}

View file

@ -101,12 +101,7 @@ public class CallOutgoingActivity extends Activity implements OnClickListener{
if (!LinphoneActivity.isInstanciated()) {
return;
}
final LinphoneCallParams remoteParams = mCall.getRemoteParams();
if (remoteParams != null && remoteParams.getVideoEnabled() && LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests()) {
LinphoneActivity.instance().startVideoActivity(mCall);
} else {
LinphoneActivity.instance().startIncallActivity(mCall);
}
LinphoneActivity.instance().startIncallActivity(mCall);
finish();
return;
} else if (state == State.Error) {

View file

@ -960,16 +960,8 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
LinphoneManager.getInstance().newOutgoingCall(address);
}
public void startVideoActivity(LinphoneCall currentCall) {
Intent intent = new Intent(this, CallActivity.class);
intent.putExtra("VideoEnabled", true);
startOrientationSensor();
startActivityForResult(intent, CALL_ACTIVITY);
}
public void startIncallActivity(LinphoneCall currentCall) {
Intent intent = new Intent(this, CallActivity.class);
intent.putExtra("VideoEnabled", false);
startOrientationSensor();
startActivityForResult(intent, CALL_ACTIVITY);
}
@ -1041,8 +1033,6 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
LinphoneCall call = LinphoneManager.getLc().getCalls()[0];
if (call.getState() == LinphoneCall.State.IncomingReceived) {
startActivity(new Intent(LinphoneActivity.this, CallIncomingActivity.class));
} else if (call.getCurrentParamsCopy().getVideoEnabled()) {
startVideoActivity(call);
} else {
startIncallActivity(call);
}
@ -1365,11 +1355,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
} else if (callState == State.OutgoingInit || callState == State.OutgoingProgress || callState == State.OutgoingRinging) {
startActivity(new Intent(this, CallOutgoingActivity.class));
} else {
if (call.getCurrentParamsCopy().getVideoEnabled()) {
startVideoActivity(call);
} else {
startIncallActivity(call);
}
startIncallActivity(call);
}
}
}
@ -1419,11 +1405,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
} else if (extras != null && extras.getBoolean("Notification", false)) {
if (LinphoneManager.getLc().getCallsNb() > 0) {
LinphoneCall call = LinphoneManager.getLc().getCalls()[0];
if (call.getCurrentParamsCopy().getVideoEnabled()) {
startVideoActivity(call);
} else {
startIncallActivity(call);
}
startIncallActivity(call);
}
} else {
DialerFragment dialerFragment = DialerFragment.instance();

View file

@ -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<LinphoneChatMessage> mPendingChatFileMessage;
private static LinphoneChatMessage mUploadPendingFileMessage;
public String wizardLoginViewDomain = null;
private static List<LinphoneChatMessage.LinphoneChatMessageListener> simpleListeners = new ArrayList<LinphoneChatMessage.LinphoneChatMessageListener>();
@ -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'");
}

View file

@ -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();

View file

@ -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;
}
});

@ -1 +1 @@
Subproject commit f4eac4803eee43de3efa96ecca9450ba4f2bc7dc
Subproject commit a6d9ea7b211c53b1d4800497644a56f4674e5924

@ -1 +1 @@
Subproject commit a44713b458d1d9ccaa84d5acb464d76ad77ca403
Subproject commit 56b08128b41a64ae95b708ce61f1a9328016d3a4

@ -1 +1 @@
Subproject commit 7744dc572470de6caf11b7e4ce7e79ba0c5efd55
Subproject commit 3fe5d85ee4dbed91920f3a43f129d28b3dece138