diff --git a/res/values/non_localizable_strings.xml b/res/values/non_localizable_strings.xml
index 7b0463d28..f4e25d109 100644
--- a/res/values/non_localizable_strings.xml
+++ b/res/values/non_localizable_strings.xml
@@ -107,6 +107,7 @@
pref_background_mode_key
pref_codec_bitrate_limit_key
pref_adaptive_rate_control_key
+ pref_echo_tester_key
push_reg_id_key
push_sender_id_key
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7d6534af1..a7edab164 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -245,6 +245,7 @@
Echo cancellation
Removes the echo heard by other end
Echo canceler calibration
+ Test echo
Calibrating…
Calibrated in %s ms
No echo
diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml
index ceadfee7f..fe2e82710 100644
--- a/res/xml/preferences.xml
+++ b/res/xml/preferences.xml
@@ -69,6 +69,11 @@
android:title="@string/pref_echo_canceller_calibration"
android:key="@string/pref_echo_canceller_calibration_key"
android:persistent="false"/>
+
+
box && ohcodec.getUserData(box) != null)
- ((CheckBoxPreference)ohcodec.getUserData(box)).setSummary(mCodecDownloader.getLicenseMessage());
+ if (ohcodec.getUserDataSize() > box && ohcodec.getUserData(box) != null) {
+ ((CheckBoxPreference) ohcodec.getUserData(box)).setSummary(mCodecDownloader.getLicenseMessage());
+ ((CheckBoxPreference) ohcodec.getUserData(box)).setTitle("OpenH264");
+ }
}
}
});
@@ -1154,6 +1159,42 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
mAudioManager.setStreamVolume(STREAM_VOICE_CALL, oldVolume, 0);
}
+ public int startEchoTester() throws LinphoneCoreException {
+ routeAudioToSpeaker();
+ Compatibility.setAudioManagerInCallMode((AudioManager)getContext().getSystemService(Context.AUDIO_SERVICE));
+ Log.i("Set audio mode on 'Voice Communication'");
+ int oldVolume = mAudioManager.getStreamVolume(STREAM_VOICE_CALL);
+ int maxVolume = mAudioManager.getStreamMaxVolume(STREAM_VOICE_CALL);
+ int sampleRate = 0;
+ mAudioManager.setStreamVolume(STREAM_VOICE_CALL, maxVolume, 0);
+ String sampleRateProperty = mAudioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
+ sampleRate = Integer.parseInt(sampleRateProperty);
+ int status = mLc.startEchoTester(sampleRate);
+ if (status > 0)
+ echoTesterIsRunning = true;
+ else {
+ echoTesterIsRunning = false;
+ routeAudioToReceiver();
+ mAudioManager.setStreamVolume(STREAM_VOICE_CALL, oldVolume, 0);
+ ((AudioManager)getContext().getSystemService(Context.AUDIO_SERVICE)).setMode(AudioManager.MODE_NORMAL);
+ Log.i("Set audio mode on 'Normal'");
+ }
+ return status;
+ }
+
+ public int stopEchoTester() throws LinphoneCoreException {
+ echoTesterIsRunning = false;
+ int status = mLc.stopEchoTester();
+ routeAudioToReceiver();
+ ((AudioManager)getContext().getSystemService(Context.AUDIO_SERVICE)).setMode(AudioManager.MODE_NORMAL);
+ Log.i("Set audio mode on 'Normal'");
+ return status;
+ }
+
+ public boolean getEchoTesterStatus() {
+ return echoTesterIsRunning;
+ }
+
private boolean isRinging;
private void requestAudioFocus(){
diff --git a/src/org/linphone/SettingsFragment.java b/src/org/linphone/SettingsFragment.java
index 1230155f8..b9683e1d4 100644
--- a/src/org/linphone/SettingsFragment.java
+++ b/src/org/linphone/SettingsFragment.java
@@ -41,6 +41,7 @@ import org.linphone.ui.LedPreference;
import org.linphone.ui.PreferencesListFragment;
import android.app.AlertDialog;
+import android.app.FragmentManager;
import android.content.DialogInterface;
import android.Manifest;
import android.content.Context;
@@ -611,6 +612,46 @@ public class SettingsFragment extends PreferencesListFragment {
return true;
}
});
+
+ findPreference(getString(R.string.pref_echo_tester_key)).setOnPreferenceClickListener(new OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ synchronized (SettingsFragment.this) {
+ int recordAudio = getActivity().getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getActivity().getPackageName());
+ if (recordAudio == PackageManager.PERMISSION_GRANTED) {
+ if (LinphoneManager.getInstance().getEchoTesterStatus())
+ stopEchoTester();
+ else
+ startEchoTester();
+ } else {
+ LinphoneActivity.instance().checkAndRequestRecordAudioPermissionsForEchoTester();
+ }
+ }
+ return true;
+ }
+ });
+ }
+
+ public void startEchoTester() {
+ Preference preference = findPreference(getString(R.string.pref_echo_tester_key));
+ try {
+ if (LinphoneManager.getInstance().startEchoTester() > 0) {
+ preference.setSummary("Is running");
+ }
+ } catch (LinphoneCoreException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void stopEchoTester() {
+ Preference preference = findPreference(getString(R.string.pref_echo_tester_key));
+ try {
+ if (LinphoneManager.getInstance().stopEchoTester() > 0) {
+ preference.setSummary("Is stopped");
+ }
+ } catch (LinphoneCoreException e) {
+ e.printStackTrace();
+ }
}
public void startEchoCancellerCalibration() {
@@ -642,7 +683,9 @@ public class SettingsFragment extends PreferencesListFragment {
codecs.removeAll();
LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
+
final OpenH264DownloadHelper mCodecDownloader = LinphoneManager.getInstance().getOpenH264DownloadHelper();
+
for (final PayloadType pt : lc.getVideoCodecs()) {
final CheckBoxPreference codec = new CheckBoxPreference(getActivity());
codec.setTitle(pt.getMime());
@@ -659,8 +702,10 @@ public class SettingsFragment extends PreferencesListFragment {
}
}
}
- if (pt.getMime().equals("H264") && mCodecDownloader.isCodecFound())
+ if (pt.getMime().equals("H264") && mCodecDownloader.isCodecFound()) {
codec.setSummary(mCodecDownloader.getLicenseMessage());
+ codec.setTitle("OpenH264");
+ }
codec.setChecked(lc.isPayloadTypeEnabled(pt));
codec.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@@ -670,9 +715,9 @@ public class SettingsFragment extends PreferencesListFragment {
try {
if (enable && Version.getCpuAbis().contains("armeabi-v7a") && !Version.getCpuAbis().contains("x86")
&& pt.getMime().equals("H264") && !mCodecDownloader.isCodecFound()) {
- LinphoneManager.getInstance().getOpenH264DownloadHelper().setOpenH264HelperListener(LinphoneManager.getInstance().getOpenH264HelperListener());
- LinphoneManager.getInstance().getOpenH264DownloadHelper().setUserData(0,LinphoneManager.getInstance().getContext());
- LinphoneManager.getInstance().getOpenH264DownloadHelper().setUserData(1,codec);
+ mCodecDownloader.setOpenH264HelperListener(LinphoneManager.getInstance().getOpenH264HelperListener());
+ mCodecDownloader.setUserData(0,LinphoneManager.getInstance().getContext());
+ mCodecDownloader.setUserData(1,codec);
AlertDialog.Builder builder = new AlertDialog.Builder(LinphoneManager.getInstance().getContext());
builder.setCancelable(false);
@@ -703,7 +748,6 @@ public class SettingsFragment extends PreferencesListFragment {
codecs.addPreference(codec);
}
-
((CheckBoxPreference) findPreference(getString(R.string.pref_video_enable_key))).setChecked(mPrefs.isVideoEnabled());
((CheckBoxPreference) findPreference(getString(R.string.pref_video_use_front_camera_key))).setChecked(mPrefs.useFrontCam());
((CheckBoxPreference) findPreference(getString(R.string.pref_video_initiate_call_with_video_key))).setChecked(mPrefs.shouldInitiateVideoCall());
@@ -1189,9 +1233,11 @@ public class SettingsFragment extends PreferencesListFragment {
}
}
-
+
@Override
public void onPause() {
+ if (LinphoneManager.getInstance().getEchoTesterStatus())
+ stopEchoTester();
LinphoneActivity.instance().hideTopBar();
super.onPause();
}
diff --git a/src/org/linphone/StatusFragment.java b/src/org/linphone/StatusFragment.java
index 64a842dc5..cfc8ffa0a 100644
--- a/src/org/linphone/StatusFragment.java
+++ b/src/org/linphone/StatusFragment.java
@@ -478,7 +478,10 @@ public class StatusFragment extends Fragment {
PayloadType payloadAudio = params.getUsedAudioCodec();
PayloadType payloadVideo = params.getUsedVideoCodec();
if (payloadVideo != null && payloadAudio != null) {
- codec.setText(payloadVideo.getMime() + " / " + payloadAudio.getMime() + (payloadAudio.getRate() / 1000));
+ String videoMime = payloadVideo.getMime();
+ if (payloadVideo.getMime().equals("H264") && LinphoneManager.getInstance().getOpenH264DownloadHelper().isCodecFound())
+ videoMime = "OpenH264";
+ codec.setText(videoMime + " / " + payloadAudio.getMime() + (payloadAudio.getRate() / 1000));
}
dl.setText(String.valueOf((int) videoStats.getDownloadBandwidth()) + " / " + (int) audioStats.getDownloadBandwidth() + " kbits/s");
ul.setText(String.valueOf((int) videoStats.getUploadBandwidth()) + " / " + (int) audioStats.getUploadBandwidth() + " kbits/s");