From 6673e989320736fb66a0faa5bff7c8795c1996e9 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 9 Dec 2011 10:46:37 +0100 Subject: [PATCH 01/12] Linphone-android 1.2.2 --- AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 8c9384124..4816ceea1 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,7 +1,7 @@ + android:versionCode="1220" android:versionName="1.2.2" android:installLocation="auto"> From cce4aa09954239116f496e0f5d1ce1028f05e738 Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Fri, 9 Dec 2011 14:51:08 +0100 Subject: [PATCH 02/12] Fix preview window on Nexus one. --- src/org/linphone/VideoCallActivity.java | 8 ++++---- submodules/linphone | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/org/linphone/VideoCallActivity.java b/src/org/linphone/VideoCallActivity.java index 0a08a6f7a..6aeb19295 100755 --- a/src/org/linphone/VideoCallActivity.java +++ b/src/org/linphone/VideoCallActivity.java @@ -99,7 +99,9 @@ public class VideoCallActivity extends Activity implements LinphoneOnCallStateCh } public void onVideoPreviewSurfaceDestroyed(AndroidVideoWindowImpl vw) { - + // Remove references kept in jni code and restart camera + // LinphoneManager.getLc().setPreviewWindow(null); + // Commented to remove flicker. } }); @@ -290,9 +292,7 @@ public class VideoCallActivity extends Activity implements LinphoneOnCallStateCh */ LinphoneManager.getLc().setVideoWindow(null); } - - LinphoneManager.getLc().setPreviewWindow(null); - + if (mCallQualityUpdater!=null){ refreshHandler.removeCallbacks(mCallQualityUpdater); mCallQualityUpdater=null; diff --git a/submodules/linphone b/submodules/linphone index ad8a8bbbb..75e7426eb 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit ad8a8bbbb3fe7189111c38eefe1320ae21a64f02 +Subproject commit 75e7426eb68e6fdbaae229e05fe11398172fec7e From cdcd50e258738113a917cd0799bd49c3b108fcf2 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 9 Dec 2011 15:16:54 +0100 Subject: [PATCH 03/12] Fix an exception if hanging up while rotating --- src/org/linphone/VideoCallActivity.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/org/linphone/VideoCallActivity.java b/src/org/linphone/VideoCallActivity.java index 6aeb19295..ce6b307c3 100755 --- a/src/org/linphone/VideoCallActivity.java +++ b/src/org/linphone/VideoCallActivity.java @@ -274,7 +274,9 @@ public class VideoCallActivity extends Activity implements LinphoneOnCallStateCh @Override protected void onDestroy() { - androidVideoWindowImpl.release(); + if (androidVideoWindowImpl != null) { // Prevent linphone from crashing if correspondent hang up while you are rotating + androidVideoWindowImpl.release(); + } super.onDestroy(); } From f6afe8b15e1c5db4f1fd453945f1ff9ace354fea Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Fri, 9 Dec 2011 16:26:19 +0100 Subject: [PATCH 04/12] Terminate conference button in the conf details activity. --- res/layout/conference_details_layout.xml | 9 +++++++-- src/org/linphone/ConferenceDetailsActivity.java | 7 +++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/res/layout/conference_details_layout.xml b/res/layout/conference_details_layout.xml index 7290b364f..044b7cb78 100644 --- a/res/layout/conference_details_layout.xml +++ b/res/layout/conference_details_layout.xml @@ -26,8 +26,13 @@ ui:unchecked="@drawable/incall_micro" ui:bgdrawables="true" /> - - + + Date: Tue, 13 Dec 2011 12:04:47 +0100 Subject: [PATCH 05/12] Fix calls from native dialer. --- AndroidManifest.xml | 27 +++++++++++++------------- src/org/linphone/DialerActivity.java | 10 +++++++--- src/org/linphone/LinphoneActivity.java | 3 ++- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 4816ceea1..5a734ffae 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -16,19 +16,6 @@ - - - - - - - - - @@ -44,6 +31,20 @@ + + + + + + + + + + Date: Tue, 13 Dec 2011 12:16:40 +0100 Subject: [PATCH 06/12] Fix calls on phone rotation due to immutable intent. Appears when application launched with intent data. --- src/org/linphone/DialerActivity.java | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/org/linphone/DialerActivity.java b/src/org/linphone/DialerActivity.java index 1ae76d3da..97df4a686 100644 --- a/src/org/linphone/DialerActivity.java +++ b/src/org/linphone/DialerActivity.java @@ -31,7 +31,6 @@ import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.os.Handler; import android.view.KeyEvent; import android.widget.TextView; import android.widget.Toast; @@ -51,15 +50,16 @@ import android.widget.Toast; public class DialerActivity extends Activity implements LinphoneGuiListener { private TextView mStatus; - private Handler mHandler; private AddressText mAddress; private CallButton mCall; private static DialerActivity instance; + private boolean mPreventDoubleCallOnRotation; private static final String CURRENT_ADDRESS = "org.linphone.current-address"; private static final String CURRENT_DISPLAYNAME = "org.linphone.current-displayname"; + private static final String PREVENT_DOUBLE_CALL = "prevent_call_on_phone_rotation"; /** * @return null if not ready yet @@ -71,8 +71,6 @@ public class DialerActivity extends Activity implements LinphoneGuiListener { public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.dialer); - mHandler = new Handler(); - mAddress = (AddressText) findViewById(R.id.SipUri); ((EraseButton) findViewById(R.id.Erase)).setAddressWidget(mAddress); @@ -89,8 +87,14 @@ public class DialerActivity extends Activity implements LinphoneGuiListener { // call to super must be done after all fields are initialized // because it may call this.enterIncallMode super.onCreate(savedInstanceState); - - checkIfOutgoingCallIntentReceived(); + + mPreventDoubleCallOnRotation=savedInstanceState != null + && savedInstanceState.getBoolean(PREVENT_DOUBLE_CALL, false); + if (mPreventDoubleCallOnRotation) { + Log.i("Prevent launching a new call on rotation"); + } else { + checkIfOutgoingCallIntentReceived(); + } instance = this; super.onCreate(savedInstanceState); @@ -129,6 +133,7 @@ public class DialerActivity extends Activity implements LinphoneGuiListener { savedInstanceState.putCharSequence(CURRENT_ADDRESS, mAddress.getText()); if (mAddress.getDisplayedName() != null) savedInstanceState.putString(CURRENT_DISPLAYNAME,mAddress.getDisplayedName()); + savedInstanceState.putBoolean(PREVENT_DOUBLE_CALL, mPreventDoubleCallOnRotation); } @Override @@ -165,6 +170,11 @@ public class DialerActivity extends Activity implements LinphoneGuiListener { mAddress.clearDisplayedName(); intent.setData(null); + // Setting data to null is no use when the activity is recreated + // as the intent is immutable. + // https://groups.google.com/forum/#!topic/android-developers/vrLdM5mKeoY + mPreventDoubleCallOnRotation=true; + setIntent(intent); LinphoneManager.getInstance().newOutgoingCall(mAddress); } From 420698d3b4db2a97e52fc268526e294b5b8ae4d1 Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Fri, 16 Dec 2011 10:59:32 +0100 Subject: [PATCH 07/12] Optional tunnel plugin. Requires a tunnel implementation with Android.mk in submodules/linphone/tunnel --- README | 1 + jni/Android.mk | 4 + jni/Application.mk | 20 ++--- res/values/custom.xml | 3 + res/values/non_localizable_strings.xml | 16 ++++ res/values/strings.xml | 13 +++ res/xml/preferences.xml | 13 +++ src/org/linphone/LinphoneManager.java | 83 ++++++++++++++++++- .../linphone/LinphonePreferencesActivity.java | 10 +++ src/org/linphone/LinphoneService.java | 2 +- src/org/linphone/NetworkManager.java | 10 ++- .../core/LinphoneCoreFactoryImpl.java | 3 + src/org/linphone/core/LinphoneCoreImpl.java | 35 ++++++++ submodules/externals/exosip | 2 +- submodules/linphone | 2 +- 15 files changed, 199 insertions(+), 18 deletions(-) diff --git a/README b/README index 50cc863fb..9d01b6ad4 100644 --- a/README +++ b/README @@ -19,6 +19,7 @@ BUILD_X264 0 (don't build x264) or 1 (build x264) BUILD_AMR 0 (don't build amr codec), light (try to use amr codec from android), full (build your own amr codec) BUILD_GPLV3_ZRTP 0 (don't support ZRTP), 1 (support ZRTP and make the whole program GPLv3) BUILD_SILK 0 (don't build silk plugin), 1 (build silk) [silk is Skype nonfree patented audio codec] +BUILD_TUNNEL 0 (don't build tunnel), 1 (build tunnel) [requires a tunnel implementation in submodules/linphone/tunnel] In order to use ZRTP you also need to define the media_encryption property to "zrtp" in the sip section of linphonerc file. diff --git a/jni/Android.mk b/jni/Android.mk index d6f8cef16..95fd7fd3f 100755 --- a/jni/Android.mk +++ b/jni/Android.mk @@ -63,6 +63,10 @@ include $(linphone-root-dir)/submodules/linphone/mediastreamer2/build/android/An include $(linphone-root-dir)/submodules/linphone/mediastreamer2/tests/Android.mk +ifeq ($(BUILD_TUNNEL), 1) +include $(linphone-root-dir)/submodules/linphone/tunnel/Android.mk +endif + ifeq ($(BUILD_SILK), 1) $(info Build proprietary SILK plugin for mediastreamer2) include $(linphone-root-dir)/submodules/mssilk/Android.mk diff --git a/jni/Application.mk b/jni/Application.mk index 85985223d..bd23bae2a 100644 --- a/jni/Application.mk +++ b/jni/Application.mk @@ -2,10 +2,6 @@ APP_PROJECT_PATH := $(call my-dir)/../ APP_MODULES :=libspeex libgsm libortp libosip2 libeXosip2 libmediastreamer2 liblinphone APP_STL := stlport_static -ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) -APP_MODULES +=libmsilbc -endif - ifeq ($(LINPHONE_VIDEO),1) APP_MODULES += libavutil libavcore libavcodec libswscale libvpx endif @@ -14,10 +10,6 @@ ifeq ($(BUILD_AMR),1) APP_MODULES += libopencoreamr libmsamr endif -ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) -APP_MODULES += liblincrypto liblinssl -endif - ifeq ($(BUILD_X264),1) APP_MODULES +=libx264 libmsx264 endif @@ -30,7 +22,14 @@ ifeq ($(RING),yes) APP_MODULES += libring endif +ifeq ($(BUILD_TUNNEL), 1) +APP_MODULES += libtunnelclient +endif + ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) +APP_MODULES += liblincrypto liblinssl +APP_MODULES +=libmsilbc + ifeq ($(BUILD_GPLV3_ZRTP), 1) APP_MODULES += libzrtpcpp endif @@ -38,12 +37,13 @@ endif ifeq ($(BUILD_SRTP), 1) APP_MODULES += libsrtp endif -endif +endif #armeabi-v7a + linphone-root-dir:=$(APP_PROJECT_PATH) APP_BUILD_SCRIPT:=$(call my-dir)/Android.mk APP_PLATFORM := android-8 -#APP_ABI := armeabi-v7a +#APP_ABI := armeabi APP_ABI := armeabi-v7a armeabi APP_CFLAGS:=-DDISABLE_NEON diff --git a/res/values/custom.xml b/res/values/custom.xml index ae8368152..8f4ef1b67 100644 --- a/res/values/custom.xml +++ b/res/values/custom.xml @@ -8,5 +8,8 @@ Registered to %s Fails to register to %s Linphone %s SIP (rfc 3261) compatible phone under GNU Public License V2\n http://www.linphone.org\n\nInstructions\nhttp://www.linphone.org/m/help\n\n© 2011 Belledonne Communications + + + @string/tunnel_mode_entry_value_disabled \ No newline at end of file diff --git a/res/values/non_localizable_strings.xml b/res/values/non_localizable_strings.xml index a5ef23b8b..0bf0c07b6 100644 --- a/res/values/non_localizable_strings.xml +++ b/res/values/non_localizable_strings.xml @@ -1,5 +1,21 @@ + + + pref_tunnel_key + pref_tunnel_mode_key + disabled + 3G_only + always + + @string/tunnel_mode_entry_value_disabled + @string/tunnel_mode_entry_value_3G_only + @string/tunnel_mode_entry_value_always + @string/tunnel_mode_entry_value_auto + + pref_tunnel_host_key + pref_tunnel_port_key + auto pref_audio_use_specific_mode_key pref_audio_hacks_use_galaxys_hack_key diff --git a/res/values/strings.xml b/res/values/strings.xml index 3f320de0e..a0f30fdc0 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1,6 +1,19 @@ + Tunnel + Hostname + Port + Mode + + + + disabled + 3G only + always + auto + + Audio call ongoing Paused call ongoing Video capturing call ongoing diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml index 26279ff3f..9f9ec184f 100644 --- a/res/xml/preferences.xml +++ b/res/xml/preferences.xml @@ -21,7 +21,20 @@ + + + + + + + diff --git a/src/org/linphone/LinphoneManager.java b/src/org/linphone/LinphoneManager.java index 123acbcd0..2d7f60f0c 100644 --- a/src/org/linphone/LinphoneManager.java +++ b/src/org/linphone/LinphoneManager.java @@ -403,6 +403,47 @@ public final class LinphoneManager implements LinphoneCoreListener { } } + + private boolean isTunnelNeeded(NetworkInfo info) { + if (info == null) { + Log.i("No connectivity: tunnel should be disabled"); + return false; + } + + String pref = getPrefString(R.string.pref_tunnel_mode_key, R.string.default_tunnel_mode_entry_value); + + if (getString(R.string.tunnel_mode_entry_value_always).equals(pref)) { + return true; + } + + if (info.getType() != ConnectivityManager.TYPE_WIFI + && getString(R.string.tunnel_mode_entry_value_3G_only).equals(pref)) { + Log.i("need tunnel: 'no wifi' connection"); + return true; + } + + return false; + } + + public void manageTunnelServer(NetworkInfo info) { + if (mLc == null) return; + if (!mLc.isTunnelAvailable()) return; + + Log.i("Managing tunnel"); + if (isTunnelNeeded(info)) { + Log.i("Tunnel need to be activated"); + mLc.tunnelEnable(true); + } else { + Log.i("Tunnel should not be used"); + String pref = getPrefString(R.string.pref_tunnel_mode_key, R.string.default_tunnel_mode_entry_value); + mLc.tunnelEnable(false); + if (getString(R.string.tunnel_mode_entry_value_auto).equals(pref)) { + mLc.tunnelAutoDetect(); + } + } + } + + private synchronized void startLibLinphone() { try { copyAssetsFromPackage(); @@ -484,7 +525,7 @@ public final class LinphoneManager implements LinphoneCoreListener { void initMediaEncryption(){ String pref = getPrefString(R.string.pref_media_encryption_key, - getString(R.string.pref_media_encryption_key_none)); + R.string.pref_media_encryption_key_none); MediaEncryption me=MediaEncryption.None; if (pref.equals(getString(R.string.pref_media_encryption_key_srtp))) me=MediaEncryption.SRTP; @@ -494,11 +535,26 @@ public final class LinphoneManager implements LinphoneCoreListener { mLc.setMediaEncryption(me); } + private void initFromConfTunnel(){ + if (!mLc.isTunnelAvailable()) return; + NetworkInfo info = mConnectivityManager.getActiveNetworkInfo(); + mLc.tunnelEnableLogs(getPrefBoolean(R.string.pref_debug_key, false)); + mLc.tunnelCleanServers(); + String host = getString(R.string.tunnel_host); + if (host == null || host.length() == 0) + host = mPref.getString(getString(R.string.pref_tunnel_host_key), ""); + int port = Integer.parseInt(getPrefString(R.string.pref_tunnel_port_key, "443")); + mLc.tunnelAddServerAndMirror(host, port, 12345,500); + manageTunnelServer(info); + } + public void initFromConf() throws LinphoneConfigException { //traces boolean lIsDebug = true;//mPref.getBoolean(getString(R.string.pref_debug_key), false); LinphoneCoreFactory.instance().setDebugMode(lIsDebug); - + + initFromConfTunnel(); + if (initialTransports == null) initialTransports = mLc.getSignalingTransportPorts(); @@ -713,9 +769,32 @@ public final class LinphoneManager implements LinphoneCoreListener { private String getPrefString(int key, String value) { return mPref.getString(mR.getString(key), value); } + private String getPrefString(int key, int value) { + return mPref.getString(mR.getString(key), mR.getString(value)); + } + /* Simple implementation as Android way seems very complicate: + For example: with wifi and mobile actives; when pulling mobile down: + I/Linphone( 8397): WIFI connected: setting network reachable + I/Linphone( 8397): new state [RegistrationProgress] + I/Linphone( 8397): mobile disconnected: setting network unreachable + I/Linphone( 8397): Managing tunnel + I/Linphone( 8397): WIFI connected: setting network reachable + */ + public void connectivityChanged(NetworkInfo eventInfo, ConnectivityManager cm) { + NetworkInfo activeInfo = cm.getActiveNetworkInfo(); + + if (eventInfo.getState() == NetworkInfo.State.DISCONNECTED) { + Log.i(eventInfo.getTypeName()," disconnected: setting network unreachable"); + mLc.setNetworkReachable(false); + } else if (eventInfo.getState() == NetworkInfo.State.CONNECTED){ + manageTunnelServer(activeInfo); + Log.i(eventInfo.getTypeName()," connected: setting network reachable"); + mLc.setNetworkReachable(true); + } + } diff --git a/src/org/linphone/LinphonePreferencesActivity.java b/src/org/linphone/LinphonePreferencesActivity.java index 077fc0aa0..5c9f58555 100644 --- a/src/org/linphone/LinphonePreferencesActivity.java +++ b/src/org/linphone/LinphonePreferencesActivity.java @@ -52,6 +52,7 @@ import android.preference.CheckBoxPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; +import android.preference.PreferenceCategory; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.Preference.OnPreferenceClickListener; @@ -144,6 +145,15 @@ public class LinphonePreferencesActivity extends PreferenceActivity implements E if (Hacks.needSoftvolume()) checkAndDisableCheckbox(R.string.pref_audio_soft_volume_key); + if (!LinphoneManager.getLc().isTunnelAvailable()){ + hidePreferenceCategory(R.string.pref_tunnel_key); + } + } + + private void hidePreferenceCategory(int key) { + PreferenceCategory p = (PreferenceCategory) findPreference(key); + p.removeAll(); + p.setLayoutResource(R.layout.hidden); } private void doOnFirstLaunch() { diff --git a/src/org/linphone/LinphoneService.java b/src/org/linphone/LinphoneService.java index 6e3c037df..c1a479ab2 100644 --- a/src/org/linphone/LinphoneService.java +++ b/src/org/linphone/LinphoneService.java @@ -414,7 +414,7 @@ public final class LinphoneService extends Service implements LinphoneServiceLis sendNotification(IC_LEVEL_ORANGE, R.string.notification_registered); } - if (state == RegistrationState.RegistrationFailed) { + if (state == RegistrationState.RegistrationFailed || state == RegistrationState.RegistrationCleared) { sendNotification(IC_LEVEL_OFFLINE, R.string.notification_register_failure); } diff --git a/src/org/linphone/NetworkManager.java b/src/org/linphone/NetworkManager.java index fd7a93bd3..9714ceaed 100644 --- a/src/org/linphone/NetworkManager.java +++ b/src/org/linphone/NetworkManager.java @@ -51,11 +51,15 @@ public class NetworkManager extends BroadcastReceiver { if (lNoConnectivity | ((lNetworkInfo.getState() == NetworkInfo.State.DISCONNECTED) /*&& !lIsFailOver*/)) { LinphoneManager.getLc().setNetworkReachable(false); - } else if (lNetworkInfo.getState() == NetworkInfo.State.CONNECTED){ + } else if (lNetworkInfo.getState() == NetworkInfo.State.CONNECTED){ LinphoneManager.getLc().setNetworkReachable(true); - } else { + } else { // Other unhandled events - } + } + + NetworkInfo eventInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); + ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + LinphoneManager.getInstance().connectivityChanged(eventInfo, cm); } } diff --git a/src/org/linphone/core/LinphoneCoreFactoryImpl.java b/src/org/linphone/core/LinphoneCoreFactoryImpl.java index 1591a8b4e..39fbeee54 100644 --- a/src/org/linphone/core/LinphoneCoreFactoryImpl.java +++ b/src/org/linphone/core/LinphoneCoreFactoryImpl.java @@ -49,6 +49,9 @@ public class LinphoneCoreFactoryImpl extends LinphoneCoreFactory { loadOptionalLibrary("srtp"); loadOptionalLibrary("zrtpcpp"); // GPLv3+ + // Tunnel + loadOptionalLibrary("tunnelclient"); + //Main library System.loadLibrary("linphone"); diff --git a/src/org/linphone/core/LinphoneCoreImpl.java b/src/org/linphone/core/LinphoneCoreImpl.java index 61ddbd4d6..5d04d745c 100644 --- a/src/org/linphone/core/LinphoneCoreImpl.java +++ b/src/org/linphone/core/LinphoneCoreImpl.java @@ -617,8 +617,43 @@ class LinphoneCoreImpl implements LinphoneCore { } private native void setPlayFile(long nativePtr, String path); + @Override public void setPlayFile(String path) { setPlayFile(nativePtr, path); } + + + private native void tunnelAddServerAndMirror(long nativePtr, String host, int port, int mirror, int ms); + @Override + public void tunnelAddServerAndMirror(String host, int port, int mirror, int ms) { + tunnelAddServerAndMirror(nativePtr, host, port, mirror, ms); + } + + private native void tunnelAutoDetect(long nativePtr); + @Override + public void tunnelAutoDetect() { + tunnelAutoDetect(nativePtr); + } + + private native void tunnelCleanServers(long nativePtr); + @Override + public void tunnelCleanServers() { + tunnelCleanServers(nativePtr); + } + + private native void tunnelEnable(long nativePtr, boolean enable); + @Override + public void tunnelEnable(boolean enable) { + tunnelEnable(nativePtr, enable); + } + + private native void tunnelEnableLogs(long nativePtr, boolean enable); + @Override + public void tunnelEnableLogs(boolean enable) { + tunnelEnableLogs(nativePtr, enable); + } + + @Override + public native boolean isTunnelAvailable(); } diff --git a/submodules/externals/exosip b/submodules/externals/exosip index 4eabd05b1..c3da03035 160000 --- a/submodules/externals/exosip +++ b/submodules/externals/exosip @@ -1 +1 @@ -Subproject commit 4eabd05b149d18629098f3254f15c8d14ff6664c +Subproject commit c3da0303519ad3120355cb85baee9cf6d0e4d1c2 diff --git a/submodules/linphone b/submodules/linphone index 75e7426eb..886d80bb6 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 75e7426eb68e6fdbaae229e05fe11398172fec7e +Subproject commit 886d80bb6d8ac916d6cc0cf635ce25e82ff1f051 From bfb9440f9c1518009fb05c9cb1226e00fc96a2f0 Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Tue, 20 Dec 2011 16:49:06 +0100 Subject: [PATCH 08/12] exosip transport makefile include --- submodules/externals/build/exosip/Android.mk | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/submodules/externals/build/exosip/Android.mk b/submodules/externals/build/exosip/Android.mk index c0698c5cc..979de4b82 100755 --- a/submodules/externals/build/exosip/Android.mk +++ b/submodules/externals/build/exosip/Android.mk @@ -56,7 +56,9 @@ LOCAL_CFLAGS += \ -UHAVE_CONFIG_H \ -include $(LOCAL_PATH)/../build/exosip/libeXosip2_AndroidConfig.h \ -DOSIP_MT \ - -DENABLE_TRACE + -DENABLE_TRACE \ + -include $(LOCAL_PATH)/include/eXosip2/eXosip_transport_hook.h + LOCAL_C_INCLUDES += \ $(LOCAL_PATH)/include \ From 7ce7895e9fe418dd3f7bec63400ead7eff2da799 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 26 Dec 2011 12:01:12 +0100 Subject: [PATCH 09/12] CallQuality indicator in audio and conference views --- res/drawable/stat_sys_signal_0.png | Bin 587 -> 905 bytes res/layout/conf_callee.xml | 1 + src/org/linphone/AbstractCalleesActivity.java | 47 ++++++++++++++++++ .../linphone/ConferenceDetailsActivity.java | 2 + src/org/linphone/IncallActivity.java | 2 + 5 files changed, 52 insertions(+) diff --git a/res/drawable/stat_sys_signal_0.png b/res/drawable/stat_sys_signal_0.png index cb7b7b34bf087a626d8b46c388b69f05816f64f4..0b7a04f44c498a89af7c15399c363fdfec2eb839 100644 GIT binary patch delta 882 zcmV-&1C9L41c?WbB!2;OQb$4nuFf3k00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru+YA~C10Ish_rL%E0|`k)K~zY`y;e<2R8bgy&Y+Vn z92I6j#}Jee9BmfULJY$K4MG!5a0C_99L*0Bk_6r4XBgPZFn{oK(p18U9H9)$l>|!Q zW?ZEkg&h0=x$xe5?%V2~?ld!gpmyL{+~>UaJn!?q=Wq@qfI!4>Rf91yfQW%Hx+(z> zu_yqzotJm_J7bh#vt7#C27}?p&z+qdtwK=%kdTn@{$W`ec6~lPZfd%afGo?H_IPq0 z6c-ZPR$7WhuYWh}oQ6fO7iFcTqHLUVNRo6m zCmM>2ir`yb4&pL0GEh=d0^jm7ii?UM%Q93|6*!j@4fhHQ@p)xMe5a?UqrvUQ^wgB# zPIYpUfQCEy`S`ZB21%08(%OnQqoat8jTQ6y?W}Ryh|-+sw_K!gD>oM#>+5(uG6HZ8 zA`**n&VK;_s;UZSK~9d3k0Zivx5MRf!EU!>V{;QXolZPyZx`j!;`C=mfBuT=n;bA=O=nz@!%cXG#KpxymSybi z@1wu3Pn1E6)0Za2YQ^6Eeh?S-oai$oA`lS{0s&aeX2JdIM9*2wW<2ld35g35Q4~d# z%wn;iwXF>a@$o^N(P$JIhU2=sy3o_xE4Yv?EXy(&WAOX^Xl-jlOLMdM+3)wmX0u^y zYisLN?(6C*+>MQ3j0Kg85fQ9b>o2p}oZ{c!#x4A`-8Pt9q@l|MBkn0|@BIu6W0{u>b%707*qo IM6N<$f*_8d9RL6T delta 562 zcmV-20?qx22g?MIB!3xnMObuGZ)S9NVRB^vL1b@YWgtmyVP|DhWnpA_ami&o0005) zNklsj1L0kyAjAzIpa*1rcM!=OI_(Q~nt3(0{ zZvC5i4b^nU8O-=AXq$dLU9aj@f7Fi0Bi-Ayhmq9l_1F1){(pWr9ICf)s_S|?7K^>L zTCGov4g7>cp{5DO!{IP_z22(`w%aW&m&>ZzH_hRbBnbwCalhY>2x!0GU*tTUPE#tC zqUm%>lgWfut5uxm1PLTFr4sE@OD2RARYiF@oe9vaH7g>{9 zt=7or^D7^QVZ?9o#+y?842Q$U@~07*qoM6N<$f>+1{ A@Bjb+ diff --git a/res/layout/conf_callee.xml b/res/layout/conf_callee.xml index e46979919..f2fa06a33 100644 --- a/res/layout/conf_callee.xml +++ b/res/layout/conf_callee.xml @@ -23,6 +23,7 @@ android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_centerVertical="true"> + diff --git a/src/org/linphone/AbstractCalleesActivity.java b/src/org/linphone/AbstractCalleesActivity.java index 0147ba002..48d5e0b65 100644 --- a/src/org/linphone/AbstractCalleesActivity.java +++ b/src/org/linphone/AbstractCalleesActivity.java @@ -64,6 +64,8 @@ public abstract class AbstractCalleesActivity extends ListActivity implements Li private Set mChronometers = new HashSet(); + private float oldQuality = 0; + private Runnable mCallQualityUpdater; @Override /** * Called by the child classes AFTER their own onCreate. @@ -210,6 +212,26 @@ public abstract class AbstractCalleesActivity extends ListActivity implements Li timer.setBase(SystemClock.elapsedRealtime() - 1000 * callDuration); timer.start(); } + + protected final void registerCallQualityListener(final View v, final LinphoneCall call) { + final Handler callqualityHandler = new Handler(); + callqualityHandler.postDelayed(mCallQualityUpdater = new Runnable(){ + public void run() { + if (call==null){ + mCallQualityUpdater=null; + return; + } + + float newQuality = call.getCurrentQuality(); + if ((int) newQuality != oldQuality){ + updateQualityOfSignalIcon(v, newQuality); + oldQuality = newQuality; + } + + callqualityHandler.postDelayed(this, 1000); + } + },1000); + } } @Override @@ -248,4 +270,29 @@ public abstract class AbstractCalleesActivity extends ListActivity implements Li } }); } + + void updateQualityOfSignalIcon(View v, float quality) + { + ImageView qos = (ImageView) v.findViewById(R.id.QoS); + if (quality >= 4) // Good Quality + { + qos.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_signal_4)); + } + else if (quality >= 3) // Average quality + { + qos.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_signal_3)); + } + else if (quality >= 2) // Low quality + { + qos.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_signal_2)); + } + else if (quality >= 1) // Very low quality + { + qos.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_signal_1)); + } + else // Worst quality + { + qos.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_signal_0)); + } + } } \ No newline at end of file diff --git a/src/org/linphone/ConferenceDetailsActivity.java b/src/org/linphone/ConferenceDetailsActivity.java index 07c2fd64f..08bcea633 100644 --- a/src/org/linphone/ConferenceDetailsActivity.java +++ b/src/org/linphone/ConferenceDetailsActivity.java @@ -101,6 +101,8 @@ public class ConferenceDetailsActivity extends AbstractCalleesActivity { setCalleePicture(pictureView, address); registerCallDurationTimer(v, call); + registerCallQualityListener(v, call); + return v; } diff --git a/src/org/linphone/IncallActivity.java b/src/org/linphone/IncallActivity.java index 6711cd0a3..91cda16cd 100644 --- a/src/org/linphone/IncallActivity.java +++ b/src/org/linphone/IncallActivity.java @@ -456,6 +456,7 @@ public class IncallActivity extends AbstractCalleesActivity implements boolean statusPaused = state== State.Paused || state == State.PausedByRemote; setVisibility(v, R.id.callee_status_paused, statusPaused); + setVisibility(v, R.id.QoS, !statusPaused); final OnLongClickListener showCallActionsLongListener = new OnLongClickListener() { public boolean onLongClick(View v) { @@ -538,6 +539,7 @@ public class IncallActivity extends AbstractCalleesActivity implements } registerCallDurationTimer(v, call); + registerCallQualityListener(v, call); enableView(v, R.id.callee_status_details, showCallActionsSimpleListener, true); From 9905ea33ed5fcf530106dd6c3a29802e2a9f70d8 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 26 Dec 2011 14:47:48 +0100 Subject: [PATCH 10/12] Submodule linphone updated to fix some SRTP issues --- submodules/linphone | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/linphone b/submodules/linphone index 886d80bb6..24d62eeeb 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 886d80bb6d8ac916d6cc0cf635ce25e82ff1f051 +Subproject commit 24d62eeeb9ac3458c0971515afef281eb9720ef6 From 421a23846bd42c9ccf5064c243912577247bb3a9 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 26 Dec 2011 16:48:43 +0100 Subject: [PATCH 11/12] Better call quality indicator --- src/org/linphone/AbstractCalleesActivity.java | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/org/linphone/AbstractCalleesActivity.java b/src/org/linphone/AbstractCalleesActivity.java index 48d5e0b65..3b40cb296 100644 --- a/src/org/linphone/AbstractCalleesActivity.java +++ b/src/org/linphone/AbstractCalleesActivity.java @@ -18,6 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.linphone; +import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -27,9 +28,9 @@ import org.linphone.LinphoneSimpleListener.LinphoneOnAudioChangedListener; import org.linphone.LinphoneSimpleListener.LinphoneOnCallStateChangedListener; import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneCall; +import org.linphone.core.LinphoneCall.State; import org.linphone.core.LinphoneCore; import org.linphone.core.Log; -import org.linphone.core.LinphoneCall.State; import android.app.ListActivity; import android.net.Uri; @@ -64,8 +65,8 @@ public abstract class AbstractCalleesActivity extends ListActivity implements Li private Set mChronometers = new HashSet(); - private float oldQuality = 0; - private Runnable mCallQualityUpdater; + private Handler callqualityHandler; + private List viewsToUpdateCallQuality; @Override /** * Called by the child classes AFTER their own onCreate. @@ -213,25 +214,33 @@ public abstract class AbstractCalleesActivity extends ListActivity implements Li timer.start(); } - protected final void registerCallQualityListener(final View v, final LinphoneCall call) { - final Handler callqualityHandler = new Handler(); - callqualityHandler.postDelayed(mCallQualityUpdater = new Runnable(){ + protected final void initCallQualityListener() { + callqualityHandler = new Handler(); + viewsToUpdateCallQuality = new ArrayList(); + callqualityHandler.postDelayed(new Runnable() { public void run() { - if (call==null){ - mCallQualityUpdater=null; + if (viewsToUpdateCallQuality == null) { return; } - float newQuality = call.getCurrentQuality(); - if ((int) newQuality != oldQuality){ + for (View v : viewsToUpdateCallQuality) { + LinphoneCall call = (LinphoneCall) v.getTag(); + float newQuality = call.getCurrentQuality(); updateQualityOfSignalIcon(v, newQuality); - oldQuality = newQuality; } callqualityHandler.postDelayed(this, 1000); } },1000); } + + protected final void registerCallQualityListener(final View v, final LinphoneCall call) { + if (viewsToUpdateCallQuality == null && callqualityHandler == null) { + initCallQualityListener(); + } + v.setTag(call); + viewsToUpdateCallQuality.add(v); + } } @Override From df138443579d5ef233bf17b66af56526962bbbb3 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 26 Dec 2011 16:54:47 +0100 Subject: [PATCH 12/12] Fix a SIGSEV on Android --- submodules/linphone | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/linphone b/submodules/linphone index 24d62eeeb..5bf95231b 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 24d62eeeb9ac3458c0971515afef281eb9720ef6 +Subproject commit 5bf95231b51641ce095af49a864cf00fa6837750