From c4411985bdb5b4a1310f43e1ae8816ac93ac7997 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 5 Feb 2010 17:49:43 +0100 Subject: [PATCH] -phone view -settings --- AndroidManifest.xml | 10 +- res/drawable/green.png | Bin 0 -> 3951 bytes res/drawable/linphone.png | Bin 0 -> 11971 bytes res/drawable/linphone2.png | Bin 0 -> 5485 bytes res/drawable/red.png | Bin 0 -> 4062 bytes res/layout/main.xml | 38 ++- res/menu/linphone_activity_menu.xml | 5 + res/values/non_localizable_strings.xml | 7 + res/values/strings.xml | 9 + res/xml/preferences.xml | 9 + src/org/linphone/Linphone.java | 226 ++++++++++++++---- src/org/linphone/LinphoneException.java | 43 ++++ .../linphone/LinphonePreferencesActivity.java | 45 ++++ src/org/linphone/core/LinphoneCore.java | 16 +- src/org/linphone/core/LinphoneCoreImpl.java | 23 +- .../linphone/core/LinphoneProxyConfig.java | 26 +- .../core/LinphoneProxyConfigImpl.java | 46 +++- 17 files changed, 417 insertions(+), 86 deletions(-) create mode 100644 res/drawable/green.png create mode 100644 res/drawable/linphone.png create mode 100644 res/drawable/linphone2.png create mode 100644 res/drawable/red.png create mode 100644 res/menu/linphone_activity_menu.xml create mode 100644 res/values/non_localizable_strings.xml create mode 100644 res/xml/preferences.xml create mode 100644 src/org/linphone/LinphoneException.java create mode 100644 src/org/linphone/LinphonePreferencesActivity.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index c241a7282..6d4730203 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -3,15 +3,19 @@ package="org.linphone" android:versionCode="1" android:versionName="1.0"> - + - - + + + + + + diff --git a/res/drawable/green.png b/res/drawable/green.png new file mode 100644 index 0000000000000000000000000000000000000000..0005537cad9fc63ddb48d750a91938443f6ae137 GIT binary patch literal 3951 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 V7sWprRrO3P?wqO6LN1et%fjmaN&|?tY)=KKHrr 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 literal 0 HcmV?d00001 diff --git a/res/drawable/red.png b/res/drawable/red.png new file mode 100644 index 0000000000000000000000000000000000000000..e6136b3ff0793499aab41e34d5776112b9da42e6 GIT binary patch literal 4062 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 Qy#N3J07*qoM6N<$f^dDCCIA2c literal 0 HcmV?d00001 diff --git a/res/layout/main.xml b/res/layout/main.xml index 6c4a48182..08dfa960c 100644 --- a/res/layout/main.xml +++ b/res/layout/main.xml @@ -5,20 +5,34 @@ android:layout_height="fill_parent" > - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + diff --git a/res/menu/linphone_activity_menu.xml b/res/menu/linphone_activity_menu.xml new file mode 100644 index 000000000..eba6385cd --- /dev/null +++ b/res/menu/linphone_activity_menu.xml @@ -0,0 +1,5 @@ + + + + diff --git a/res/values/non_localizable_strings.xml b/res/values/non_localizable_strings.xml new file mode 100644 index 000000000..04591bc94 --- /dev/null +++ b/res/values/non_localizable_strings.xml @@ -0,0 +1,7 @@ + + + pref_proxy_key + pref_domain_key + pref_passwd_key + pref_username_key + diff --git a/res/values/strings.xml b/res/values/strings.xml index 1b02d5367..250dc8b7e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1,5 +1,14 @@ + Settings + Proxy + Domain* + Password* + Username* Hello World, Linphone! Linphone + SIP Account + Enter a user name +Enter a password +Enter a domain diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml new file mode 100644 index 000000000..2912fbaa9 --- /dev/null +++ b/res/xml/preferences.xml @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/src/org/linphone/Linphone.java b/src/org/linphone/Linphone.java index 22281a218..2d306b7bf 100644 --- a/src/org/linphone/Linphone.java +++ b/src/org/linphone/Linphone.java @@ -1,83 +1,118 @@ +/* +Linphone.java +Copyright (C) 2010 Belledonne Communications, Grenoble, France + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ package org.linphone; import java.io.File; -import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.net.URI; import java.util.Timer; import java.util.TimerTask; import org.linphone.core.LinphoneAuthInfo; import org.linphone.core.LinphoneCore; +import org.linphone.core.LinphoneCoreException; import org.linphone.core.LinphoneCoreFactory; import org.linphone.core.LinphoneCoreListener; import org.linphone.core.LinphoneProxyConfig; -import org.linphone.core.LinphoneCore.GeneralState; import android.app.Activity; +import android.content.Intent; +import android.content.SharedPreferences; import android.os.Bundle; +import android.preference.PreferenceManager; import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.widget.Toast; public class Linphone extends Activity implements LinphoneCoreListener { - static final String TAG="Linphone"; - /** Called when the activity is first created. */ + static final public String TAG="Linphone"; + /** Called when the activity is first created. */ private static String LINPHONE_FACTORY_RC = "/data/data/org.linphone/files/linphonerc"; private static String LINPHONE_RC = "/data/data/org.linphone/files/.linphonerc"; private static String RING_SND = "/data/data/org.linphone/files/oldphone_mono.wav"; private static String RINGBACK_SND = "/data/data/org.linphone/files/ringback.wav"; + private static Linphone theLinphone; private LinphoneCore mLinphoneCore; - private LinphoneProxyConfig mProxyConfig; - private LinphoneAuthInfo mAuthInfo; + private SharedPreferences mPref; Timer mTimer = new Timer("Linphone scheduler"); - + + static Linphone getLinphone() { + if (theLinphone == null) { + throw new RuntimeException("LinphoneActivity not instanciated yet"); + } else { + return theLinphone; + } + } @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.main); - try { + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + theLinphone = this; + mPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + try { copyAssetsFromPackage(); - - mLinphoneCore = LinphoneCoreFactory.instance().createLinphoneCore( this - , new File(LINPHONE_RC) - , new File(LINPHONE_FACTORY_RC) - , null); - mAuthInfo = LinphoneCoreFactory.instance().createAuthInfo("jehan", "223299"); - mLinphoneCore.addAuthInfo(mAuthInfo); - mProxyConfig = mLinphoneCore.createProxyConfig("sip:jehan@sip.antisip.com", "sip:sip.antisip.com",null); - mProxyConfig.enableRegister(true); - mLinphoneCore.addtProxyConfig(mProxyConfig); - mLinphoneCore.setDefaultProxyConfig(mProxyConfig); - - TimerTask lTask = new TimerTask() { + mLinphoneCore = LinphoneCoreFactory.instance().createLinphoneCore( this + , new File(LINPHONE_RC) + , new File(LINPHONE_FACTORY_RC) + , null); - @Override - public void run() { - mLinphoneCore.iterate(); - - } + initFromConf(); - }; - mTimer.scheduleAtFixedRate(lTask, 0, 100); - - - + TimerTask lTask = new TimerTask() { + + @Override + public void run() { + mLinphoneCore.iterate(); + + } + + }; + mTimer.scheduleAtFixedRate(lTask, 0, 100); + } catch (Exception e) { Log.e(TAG,"Cannot start linphone",e); } - - } - public void copyAssetsFromPackage() throws IOException { - copyIfNotExist(R.raw.oldphone_mono,RING_SND); - copyIfNotExist(R.raw.ringback,RINGBACK_SND); - copyIfNotExist(R.raw.linphonerc,LINPHONE_FACTORY_RC); - } - private void copyIfNotExist(int ressourceId,String target) throws IOException { - File lFileToCopy = new File(target); + + } + + + @Override + protected void onStop() { + // TODO Auto-generated method stub + super.onStop(); + //finish(); + } + + + private void copyAssetsFromPackage() throws IOException { + copyIfNotExist(R.raw.oldphone_mono,RING_SND); + copyIfNotExist(R.raw.ringback,RINGBACK_SND); + copyIfNotExist(R.raw.linphonerc,LINPHONE_FACTORY_RC); + } + private void copyIfNotExist(int ressourceId,String target) throws IOException { + File lFileToCopy = new File(target); if (!lFileToCopy.exists()) { FileOutputStream lOutputStream = openFileOutput (lFileToCopy.getName(), 0); InputStream lInputStream = getResources().openRawResource(ressourceId); @@ -90,44 +125,129 @@ public class Linphone extends Activity implements LinphoneCoreListener { lOutputStream.close(); lInputStream.close(); } - - } + + } public void authInfoRequested(LinphoneCore lc, String realm, String username) { // TODO Auto-generated method stub - + } public void byeReceived(LinphoneCore lc, String from) { // TODO Auto-generated method stub - + } public void displayMessage(LinphoneCore lc, String message) { // TODO Auto-generated method stub - + } public void displayStatus(LinphoneCore lc, String message) { Log.i(TAG, message); - + } public void displayWarning(LinphoneCore lc, String message) { // TODO Auto-generated method stub - + } public void generalState(LinphoneCore lc, LinphoneCore.GeneralState state) { Log.i(TAG, "new state ["+state+"]"); switch(state) { case GSTATE_REG_OK: { - mLinphoneCore.invite("simon.morlat"); + //mLinphoneCore.invite("simon.morlat"); } } } public void inviteReceived(LinphoneCore lc, String from) { // TODO Auto-generated method stub - + } public void show(LinphoneCore lc) { // TODO Auto-generated method stub + + } + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the currently selected menu XML resource. + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.linphone_activity_menu, menu); + + + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_settings: + startprefActivity(); + return true; + default: + Log.e(TAG, "Unknown menu item ["+item+"]"); + break; + } + + return false; + } + + public void initFromConf() throws LinphoneCoreException { + //1 read proxy config from preferences + String lUserName = mPref.getString(getString(R.string.pref_username_key), null); + if (lUserName == null) { + Toast toast = Toast.makeText(this, this.getString(R.string.enter_username), Toast.LENGTH_LONG); + toast.show(); + startprefActivity(); + return; + } + + String lPasswd = mPref.getString(getString(R.string.pref_passwd_key), null); + if (lPasswd == null) { + Toast toast = Toast.makeText(this, this.getString(R.string.enter_passwd), Toast.LENGTH_LONG); + toast.show(); + startprefActivity(); + return; + } + + String lDomain = mPref.getString(getString(R.string.pref_domain_key), null); + if (lDomain == null) { + Toast toast = Toast.makeText(this, this.getString(R.string.enter_domain), Toast.LENGTH_LONG); + toast.show(); + startprefActivity(); + return; + } + + + //auth + mLinphoneCore.clearAuthInfos(); + LinphoneAuthInfo lAuthInfo = LinphoneCoreFactory.instance().createAuthInfo(lUserName, lPasswd); + mLinphoneCore.addAuthInfo(lAuthInfo); + + + //proxy + String lProxy = mPref.getString(getString(R.string.pref_proxy_key), "sip:"+lDomain); + + //get Default proxy if any + LinphoneProxyConfig lDefaultProxyConfig = mLinphoneCore.getDefaultProxyConfig(); + String lIdentity = "sip:"+lUserName+"@"+lDomain; + if (lDefaultProxyConfig == null) { + lDefaultProxyConfig = mLinphoneCore.createProxyConfig(lIdentity, lProxy, null,true); + mLinphoneCore.addtProxyConfig(lDefaultProxyConfig); + mLinphoneCore.setDefaultProxyConfig(lDefaultProxyConfig); + + } else { + lDefaultProxyConfig.edit(); + lDefaultProxyConfig.setIdentity(lIdentity); + lDefaultProxyConfig.setProxy(lProxy); + lDefaultProxyConfig.enableRegister(true); + lDefaultProxyConfig.done(); + } + } + + private void startprefActivity() { + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.setClass(Linphone.this, LinphonePreferencesActivity.class); + startActivity(intent); + } + } \ No newline at end of file diff --git a/src/org/linphone/LinphoneException.java b/src/org/linphone/LinphoneException.java new file mode 100644 index 000000000..e24708d5e --- /dev/null +++ b/src/org/linphone/LinphoneException.java @@ -0,0 +1,43 @@ +/* +LinphoneCoreException.java +Copyright (C) 2010 Belledonne Communications, Grenoble, France + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ +package org.linphone; + +@SuppressWarnings("serial") +public class LinphoneException extends Exception { + + public LinphoneException() { + // TODO Auto-generated constructor stub + } + + public LinphoneException(String detailMessage) { + super(detailMessage); + // TODO Auto-generated constructor stub + } + + public LinphoneException(Throwable throwable) { + super(throwable); + // TODO Auto-generated constructor stub + } + + public LinphoneException(String detailMessage, Throwable throwable) { + super(detailMessage, throwable); + // TODO Auto-generated constructor stub + } + +} diff --git a/src/org/linphone/LinphonePreferencesActivity.java b/src/org/linphone/LinphonePreferencesActivity.java new file mode 100644 index 000000000..31c70191b --- /dev/null +++ b/src/org/linphone/LinphonePreferencesActivity.java @@ -0,0 +1,45 @@ +/* +LinphonePreferencesActivity.java +Copyright (C) 2010 Belledonne Communications, Grenoble, France + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +package org.linphone; +import org.linphone.core.LinphoneCoreException; + +import android.os.Bundle; +import android.preference.PreferenceActivity; +import android.util.Log; + +public class LinphonePreferencesActivity extends PreferenceActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // Load the preferences from an XML resource + addPreferencesFromResource(R.xml.preferences); + } + + @Override + protected void onStop() { + super.onStop(); + try { + Linphone.getLinphone().initFromConf(); + } catch (LinphoneCoreException e) { + Log.e(Linphone.TAG, "cannot update config",e); + } + } + +} diff --git a/src/org/linphone/core/LinphoneCore.java b/src/org/linphone/core/LinphoneCore.java index 8df865468..4e608452c 100644 --- a/src/org/linphone/core/LinphoneCore.java +++ b/src/org/linphone/core/LinphoneCore.java @@ -61,18 +61,28 @@ public interface LinphoneCore { * @param identity sip uri sip:jehan@linphone.org * @param proxy sip uri (sip:linphone.org) * @param route optionnal sip usi (sip:linphone.org) + * @param register should be initiated * @return */ - public LinphoneProxyConfig createProxyConfig(String identity,String proxy,String route) throws LinphoneCoreException; + public LinphoneProxyConfig createProxyConfig(String identity,String proxy,String route,boolean enableRegister) throws LinphoneCoreException; + /** + * clear all added proxy config + */ + public void clearProxyConfigs(); public void addtProxyConfig(LinphoneProxyConfig proxyCfg) throws LinphoneCoreException; public void setDefaultProxyConfig(LinphoneProxyConfig proxyCfg); /** - * @return null if no default proxyconfig + * @return null if no default proxy config */ - public LinphoneProxyConfig getDefaultProxyConfig(); + public LinphoneProxyConfig getDefaultProxyConfig() ; + + /** + * clear all the added auth info + */ + void clearAuthInfos(); void addAuthInfo(LinphoneAuthInfo info); diff --git a/src/org/linphone/core/LinphoneCoreImpl.java b/src/org/linphone/core/LinphoneCoreImpl.java index 444091ac8..2cc292911 100644 --- a/src/org/linphone/core/LinphoneCoreImpl.java +++ b/src/org/linphone/core/LinphoneCoreImpl.java @@ -28,8 +28,13 @@ class LinphoneCoreImpl implements LinphoneCore { private final long nativePtr; private native long newLinphoneCore(LinphoneCoreListener listener,String userConfig,String factoryConfig,Object userdata); private native void iterate(long nativePtr); + private native long getDefaultProxyConfig(long nativePtr); + private native void setDefaultProxyConfig(long nativePtr,long proxyCfgNativePtr); private native int addProxyConfig(long nativePtr,long proxyCfgNativePtr); + private native void clearAuthInfos(long nativePtr); + + private native void clearProxyConfigs(long nativePtr); private native void addAuthInfo(long nativePtr,long authInfoNativePtr); private native void invite(long nativePtr,String uri); LinphoneCoreImpl(LinphoneCoreListener listener, File userConfig,File factoryConfig,Object userdata) throws IOException { @@ -41,12 +46,17 @@ class LinphoneCoreImpl implements LinphoneCore { addAuthInfo(nativePtr,((LinphoneAuthInfoImpl)info).nativePtr); } - public LinphoneProxyConfig createProxyConfig(String identity, String proxy,String route) throws LinphoneCoreException { - return new LinphoneProxyConfigImpl(identity, proxy, route); + public LinphoneProxyConfig createProxyConfig(String identity, String proxy,String route,boolean enableRegister) throws LinphoneCoreException { + return new LinphoneProxyConfigImpl(identity, proxy, route,enableRegister); } public LinphoneProxyConfig getDefaultProxyConfig() { - throw new RuntimeException("not implemenetd yet"); + long lNativePtr = getDefaultProxyConfig(nativePtr); + if (lNativePtr!=0) { + return new LinphoneProxyConfigImpl(lNativePtr); + } else { + return null; + } } public void invite(String uri) { @@ -65,6 +75,13 @@ class LinphoneCoreImpl implements LinphoneCore { throw new LinphoneCoreException("bad proxy config"); } } + public void clearAuthInfos() { + clearAuthInfos(nativePtr); + + } + public void clearProxyConfigs() { + clearProxyConfigs(nativePtr); + } } diff --git a/src/org/linphone/core/LinphoneProxyConfig.java b/src/org/linphone/core/LinphoneProxyConfig.java index b4b5fd8b8..17085de82 100644 --- a/src/org/linphone/core/LinphoneProxyConfig.java +++ b/src/org/linphone/core/LinphoneProxyConfig.java @@ -20,7 +20,31 @@ package org.linphone.core; public interface LinphoneProxyConfig { - void enableRegister(boolean value); + /** + * Unregister proxy config a enable edition + */ + public void edit(); + /** + * Validate proxy config changes. Start registration in case + */ + public void done(); + /** + * sip user made by sip:username@domain + */ + public void setIdentity(String identity) throws LinphoneCoreException; + /** + * Set proxy uri, like sip:linphone.org:5060 + * @param proxyUri + * @throws LinphoneCoreException + */ + public void setProxy(String proxyUri) throws LinphoneCoreException; + /** + * Enable register for this proxy config. + * Register message is issued after call to {@link #done()} + * @param value + * @throws LinphoneCoreException + */ + public void enableRegister(boolean value) throws LinphoneCoreException; } diff --git a/src/org/linphone/core/LinphoneProxyConfigImpl.java b/src/org/linphone/core/LinphoneProxyConfigImpl.java index 0fa1a85b7..f1de9707b 100644 --- a/src/org/linphone/core/LinphoneProxyConfigImpl.java +++ b/src/org/linphone/core/LinphoneProxyConfigImpl.java @@ -18,28 +18,37 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.linphone.core; +import org.linphone.Linphone; + +import android.util.Log; + class LinphoneProxyConfigImpl implements LinphoneProxyConfig { protected final long nativePtr; - protected LinphoneProxyConfigImpl(String identity,String proxy,String route) throws LinphoneCoreException { + boolean ownPtr = false; + protected LinphoneProxyConfigImpl(String identity,String proxy,String route, boolean enableRegister) throws LinphoneCoreException { nativePtr = newLinphoneProxyConfig(); - setIdentity(nativePtr,identity); - if (setProxy(nativePtr,proxy)!=0) { - throw new LinphoneCoreException("Bad proxy address ["+proxy+"]"); - } + setIdentity(identity); + setProxy(proxy); + enableRegister(enableRegister); + ownPtr=true; + Log.w(Linphone.TAG, "route ["+route+"] not used yet"); + } + protected LinphoneProxyConfigImpl(long aNativePtr) { + nativePtr = aNativePtr; + ownPtr=false; } - protected void finalize() throws Throwable { - delete(nativePtr); + if (ownPtr) delete(nativePtr); } private native long newLinphoneProxyConfig(); private native void delete(long ptr); - //private native void edit(long ptr); - //private native void done(long ptr); + private native void edit(long ptr); + private native void done(long ptr); private native void setIdentity(long ptr,String identity); private native int setProxy(long ptr,String proxy); @@ -47,9 +56,24 @@ class LinphoneProxyConfigImpl implements LinphoneProxyConfig { private native void enableRegister(long ptr,boolean value); public void enableRegister(boolean value) { - //edit(nativePtr); enableRegister(nativePtr,value); - //done(nativePtr); } + public void done() { + done(nativePtr); + } + + public void edit() { + edit(nativePtr); + } + + public void setIdentity(String identity) throws LinphoneCoreException { + setIdentity(nativePtr,identity); + } + + public void setProxy(String proxyUri) throws LinphoneCoreException { + if (setProxy(nativePtr,proxyUri)!=0) { + throw new LinphoneCoreException("Bad proxy address ["+proxyUri+"]"); + } + } }