From 652c2e53f0e83d66faebf2b63aa3fc689fffe088 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 15 Feb 2010 18:01:06 +0100 Subject: [PATCH] many bug fixes + audio routing + incoming call --- AndroidManifest.xml | 3 +- res/menu/linphone_activity_menu.xml | 4 +- res/values/strings.xml | 2 + src/org/linphone/DialerActivity.java | 58 ++++++++++++++++--- src/org/linphone/Linphone.java | 24 +++++--- src/org/linphone/core/LinphoneCore.java | 22 ++++++- src/org/linphone/core/LinphoneCoreImpl.java | 37 +++++++----- .../linphone/core/LinphoneProxyConfig.java | 6 ++ .../core/LinphoneProxyConfigImpl.java | 8 ++- 9 files changed, 131 insertions(+), 33 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 881c0dfd7..08131987c 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -3,7 +3,7 @@ package="org.linphone" android:versionCode="1" android:versionName="1.0"> - + @@ -32,5 +32,6 @@ + \ No newline at end of file diff --git a/res/menu/linphone_activity_menu.xml b/res/menu/linphone_activity_menu.xml index eba6385cd..375d66d13 100644 --- a/res/menu/linphone_activity_menu.xml +++ b/res/menu/linphone_activity_menu.xml @@ -1,5 +1,7 @@ - + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 37c960682..a5a776896 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1,5 +1,6 @@ + Exit Prefix Advanced Settings @@ -19,4 +20,5 @@ Yes No %s, do you want to return to the settings page ? +Cannot initiate a new call because a call is already engaged diff --git a/src/org/linphone/DialerActivity.java b/src/org/linphone/DialerActivity.java index 240b2a1bc..9acbed01b 100644 --- a/src/org/linphone/DialerActivity.java +++ b/src/org/linphone/DialerActivity.java @@ -8,6 +8,8 @@ import org.linphone.core.LinphoneProxyConfig; import org.linphone.core.LinphoneCore.GeneralState; import android.app.Activity; +import android.content.Context; +import android.media.AudioManager; import android.os.Bundle; import android.util.Log; import android.view.View; @@ -38,6 +40,8 @@ public class DialerActivity extends Activity implements LinphoneCoreListener { private static DialerActivity theDialer; private String mDisplayName; + private AudioManager mAudioManager; + /** * * @return nul if not ready yet @@ -56,6 +60,7 @@ public class DialerActivity extends Activity implements LinphoneCoreListener { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.dialer); + mAudioManager = ((AudioManager)getSystemService(Context.AUDIO_SERVICE)); try { theDialer = this; mLinphoneCore = Linphone.getLinphone().getLinphoneCore(); @@ -64,6 +69,15 @@ public class DialerActivity extends Activity implements LinphoneCoreListener { mCall = (ImageButton) findViewById(R.id.Call); mCall.setOnClickListener(new OnClickListener() { public void onClick(View v) { + if (mLinphoneCore.isInComingInvitePending()) { + mLinphoneCore.acceptCall(); + return; + } + if (mLinphoneCore.isIncall()) { + Toast toast = Toast.makeText(DialerActivity.this, getString(R.string.warning_already_incall), Toast.LENGTH_LONG); + toast.show(); + return; + } String lRawAddress = mAddress.getText().toString(); String lCallingUri=null; if (lRawAddress.startsWith("sip:")) { @@ -71,7 +85,7 @@ public class DialerActivity extends Activity implements LinphoneCoreListener { } else { LinphoneProxyConfig lProxy = mLinphoneCore.getDefaultProxyConfig(); String lDomain=null; - String lNormalizedNumber=null; + String lNormalizedNumber=lRawAddress; if (lProxy!=null) { lNormalizedNumber = lProxy.normalizePhoneNumber(lNormalizedNumber); lDomain = lProxy.getDomain(); @@ -79,13 +93,14 @@ public class DialerActivity extends Activity implements LinphoneCoreListener { LinphoneAddress lAddress = LinphoneCoreFactory.instance().createLinphoneAddress(lNormalizedNumber , lDomain , mDisplayName); - lCallingUri = lAddress.toUri(); + lCallingUri = lAddress.toUri(); } mLinphoneCore.invite(lCallingUri); } }); - mHangup = (ImageButton) findViewById(R.id.HangUp); + mHangup = (ImageButton) findViewById(R.id.HangUp); + mHangup.setEnabled(false); mHangup.setOnClickListener(new OnClickListener() { public void onClick(View v) { mLinphoneCore.terminateCall(); @@ -160,13 +175,42 @@ public class DialerActivity extends Activity implements LinphoneCoreListener { public void generalState(LinphoneCore lc, GeneralState state) { switch(state) { case GSTATE_CALL_ERROR: { - + Toast toast = Toast.makeText(this - ,String.format(getString(R.string.call_error),lc.getRemoteAddress()) - , Toast.LENGTH_LONG); + ,String.format(getString(R.string.call_error),lc.getRemoteAddress()) + , Toast.LENGTH_LONG); toast.show(); + break; + } + case GSTATE_REG_OK: { + break; + } + case GSTATE_CALL_OUT_INVITE: { + //de-activate green button + mCall.setEnabled(false); + } + case GSTATE_CALL_IN_INVITE: { + // activate red button + mHangup.setEnabled(true); + mAudioManager.setSpeakerphoneOn(true); + mAudioManager.setMode(AudioManager.MODE_NORMAL); + mAudioManager.setRouting(AudioManager.MODE_NORMAL, + AudioManager.ROUTE_SPEAKER, AudioManager.ROUTE_ALL); + break; + } + case GSTATE_CALL_IN_CONNECTED: + case GSTATE_CALL_OUT_CONNECTED: { + mAudioManager.setSpeakerphoneOn(false); + mAudioManager.setMode(AudioManager.MODE_IN_CALL); + mAudioManager.setRouting(AudioManager.MODE_NORMAL, + AudioManager.ROUTE_EARPIECE, AudioManager.ROUTE_ALL); + break; + } + case GSTATE_CALL_END: { + mCall.setEnabled(true); + mHangup.setEnabled(false); + break; } - case GSTATE_REG_OK: } } public void inviteReceived(LinphoneCore lc, String from) { diff --git a/src/org/linphone/Linphone.java b/src/org/linphone/Linphone.java index 7409d815d..680ddc36f 100644 --- a/src/org/linphone/Linphone.java +++ b/src/org/linphone/Linphone.java @@ -142,10 +142,9 @@ public class Linphone extends TabActivity implements LinphoneCoreListener { @Override - protected void onStop() { - // TODO Auto-generated method stub - super.onStop(); - //finish(); + protected void onDestroy() { + super.onDestroy(); + if (isFinishing()) System.exit(0); // FIXME to destroy liblinphone } @@ -157,7 +156,7 @@ public class Linphone extends TabActivity implements LinphoneCoreListener { private void copyIfNotExist(int ressourceId,String target) throws IOException { File lFileToCopy = new File(target); if (!lFileToCopy.exists()) { - copyFromPackage(ressourceId,lFileToCopy.getName()); + copyFromPackage(ressourceId,lFileToCopy.getName()); } } @@ -221,6 +220,9 @@ public class Linphone extends TabActivity implements LinphoneCoreListener { case R.id.menu_settings: startprefActivity(); return true; + case R.id.menu_exit: + finish(); + break; default: Log.e(TAG, "Unknown menu item ["+item+"]"); break; @@ -278,10 +280,14 @@ public class Linphone extends TabActivity implements LinphoneCoreListener { } lDefaultProxyConfig = mLinphoneCore.getDefaultProxyConfig(); - //prefix - String lPrefix = mPref.getString(getString(R.string.pref_prefix_key), null); - if (lPrefix != null && lDefaultProxyConfig !=null) { - lDefaultProxyConfig.setDialPrefix(lPrefix); + if (lDefaultProxyConfig !=null) { + //prefix + String lPrefix = mPref.getString(getString(R.string.pref_prefix_key), null); + if (lPrefix != null ) { + lDefaultProxyConfig.setDialPrefix(lPrefix); + } + //escape + + lDefaultProxyConfig.setDialEscapePlus(true); } } diff --git a/src/org/linphone/core/LinphoneCore.java b/src/org/linphone/core/LinphoneCore.java index 0a327f481..59747220c 100644 --- a/src/org/linphone/core/LinphoneCore.java +++ b/src/org/linphone/core/LinphoneCore.java @@ -94,6 +94,26 @@ public interface LinphoneCore { * @return null if no call engaged yet */ public LinphoneAddress getRemoteAddress(); - + /** + * + * @return TRUE if there is a call running or pending. + */ + public boolean isIncall(); + /** + * + * @return Returns true if in incoming call is pending, ie waiting for being answered or declined. + */ + public boolean isInComingInvitePending(); public void iterate(); + /** + * Accept an incoming call. + * + * Basically the application is notified of incoming calls within the + * {@link LinphoneCoreListener#inviteReceived(LinphoneCore, String)} listener. + * The application can later respond positively to the call using + * this method. + */ + public void acceptCall(); + + } diff --git a/src/org/linphone/core/LinphoneCoreImpl.java b/src/org/linphone/core/LinphoneCoreImpl.java index 2ef2895f6..2997033e5 100644 --- a/src/org/linphone/core/LinphoneCoreImpl.java +++ b/src/org/linphone/core/LinphoneCoreImpl.java @@ -39,21 +39,24 @@ class LinphoneCoreImpl implements LinphoneCore { private native void invite(long nativePtr,String uri); private native void terminateCall(long nativePtr); private native long getRemoteAddress(long nativePtr); + private native boolean isInCall(long nativePtr); + private native boolean isInComingInvitePending(long nativePtr); + private native void acceptCall(long nativePtr); LinphoneCoreImpl(LinphoneCoreListener listener, File userConfig,File factoryConfig,Object userdata) throws IOException { mListener=listener; nativePtr = newLinphoneCore(listener,userConfig.getCanonicalPath(),factoryConfig.getCanonicalPath(),userdata); } - public void addAuthInfo(LinphoneAuthInfo info) { + public synchronized void addAuthInfo(LinphoneAuthInfo info) { addAuthInfo(nativePtr,((LinphoneAuthInfoImpl)info).nativePtr); } - public LinphoneProxyConfig createProxyConfig(String identity, String proxy,String route,boolean enableRegister) throws LinphoneCoreException { + public synchronized LinphoneProxyConfig createProxyConfig(String identity, String proxy,String route,boolean enableRegister) throws LinphoneCoreException { return new LinphoneProxyConfigImpl(identity, proxy, route,enableRegister); } - public LinphoneProxyConfig getDefaultProxyConfig() { + public synchronized LinphoneProxyConfig getDefaultProxyConfig() { long lNativePtr = getDefaultProxyConfig(nativePtr); if (lNativePtr!=0) { return new LinphoneProxyConfigImpl(lNativePtr); @@ -62,33 +65,33 @@ class LinphoneCoreImpl implements LinphoneCore { } } - public void invite(String uri) { + public synchronized void invite(String uri) { invite(nativePtr,uri); } - public void iterate() { + public synchronized void iterate() { iterate(nativePtr); } - public void setDefaultProxyConfig(LinphoneProxyConfig proxyCfg) { + public synchronized void setDefaultProxyConfig(LinphoneProxyConfig proxyCfg) { setDefaultProxyConfig(nativePtr,((LinphoneProxyConfigImpl)proxyCfg).nativePtr); } - public void addtProxyConfig(LinphoneProxyConfig proxyCfg) throws LinphoneCoreException{ + public synchronized void addtProxyConfig(LinphoneProxyConfig proxyCfg) throws LinphoneCoreException{ if (addProxyConfig(nativePtr,((LinphoneProxyConfigImpl)proxyCfg).nativePtr) !=0) { throw new LinphoneCoreException("bad proxy config"); } } - public void clearAuthInfos() { + public synchronized void clearAuthInfos() { clearAuthInfos(nativePtr); } - public void clearProxyConfigs() { + public synchronized void clearProxyConfigs() { clearProxyConfigs(nativePtr); } - public void terminateCall() { + public synchronized void terminateCall() { terminateCall(nativePtr); } - public LinphoneAddress getRemoteAddress() { + public synchronized LinphoneAddress getRemoteAddress() { long ptr = getRemoteAddress(nativePtr); if (ptr==0) { return null; @@ -96,6 +99,14 @@ class LinphoneCoreImpl implements LinphoneCore { return new LinphoneAddressImpl(ptr); } } - - + public synchronized boolean isIncall() { + return isInCall(nativePtr); + } + public synchronized boolean isInComingInvitePending() { + return isInComingInvitePending(nativePtr); + } + public synchronized void acceptCall() { + acceptCall(nativePtr); + + } } diff --git a/src/org/linphone/core/LinphoneProxyConfig.java b/src/org/linphone/core/LinphoneProxyConfig.java index 97c7d21a6..a7fe6b850 100644 --- a/src/org/linphone/core/LinphoneProxyConfig.java +++ b/src/org/linphone/core/LinphoneProxyConfig.java @@ -56,6 +56,12 @@ public interface LinphoneProxyConfig { * @param prefix */ public void setDialPrefix(String prefix); + /** + * * Sets whether liblinphone should replace "+" by "00" in dialed numbers (passed to + * {@link LinphoneCore#invite(String)}). + * @param value default value is false + */ + public void setDialEscapePlus(boolean value); /** * rget domain host name or ip diff --git a/src/org/linphone/core/LinphoneProxyConfigImpl.java b/src/org/linphone/core/LinphoneProxyConfigImpl.java index a82418cdb..af2722dd2 100644 --- a/src/org/linphone/core/LinphoneProxyConfigImpl.java +++ b/src/org/linphone/core/LinphoneProxyConfigImpl.java @@ -42,7 +42,8 @@ class LinphoneProxyConfigImpl implements LinphoneProxyConfig { ownPtr=false; } protected void finalize() throws Throwable { - if (ownPtr) delete(nativePtr); + Log.e(Linphone.TAG,"fixme, should release underlying proxy config"); + // FIXME if (ownPtr) delete(nativePtr); } private native long newLinphoneProxyConfig(); private native void delete(long ptr); @@ -61,6 +62,8 @@ class LinphoneProxyConfigImpl implements LinphoneProxyConfig { private native String getDomain(long ptr); + private native void setDialEscapePlus(long ptr, boolean value); + public void enableRegister(boolean value) { enableRegister(nativePtr,value); } @@ -91,4 +94,7 @@ class LinphoneProxyConfigImpl implements LinphoneProxyConfig { public String getDomain() { return getDomain(nativePtr); } + public void setDialEscapePlus(boolean value) { + setDialEscapePlus(nativePtr,value); + } }