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");