diff --git a/.classpath b/.classpath
index b65c5418a..aefe1a96e 100644
--- a/.classpath
+++ b/.classpath
@@ -6,6 +6,7 @@
+
diff --git a/res/layout/hello_world.xml b/res/layout/hello_world.xml
new file mode 100644
index 000000000..25d396656
--- /dev/null
+++ b/res/layout/hello_world.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/org/linphone/tutorials/AndroidTutorialNotifier.java b/src/org/linphone/tutorials/AndroidTutorialNotifier.java
new file mode 100644
index 000000000..b1084199b
--- /dev/null
+++ b/src/org/linphone/tutorials/AndroidTutorialNotifier.java
@@ -0,0 +1,52 @@
+/*
+AndroidTutorialNotifier.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.tutorials;
+
+import org.linphone.core.tutorials.TutorialNotifier;
+
+import android.os.Handler;
+import android.widget.TextView;
+
+/**
+ * Write notifications to a TextView widget.
+ * This is an helper class, not a test activity.
+ *
+ * @author Guillaume Beraudo
+ *
+ */
+class AndroidTutorialNotifier extends TutorialNotifier {
+
+ private Handler mHandler;
+ private TextView outputTextView;
+
+ public AndroidTutorialNotifier(Handler mHandler, final TextView outputTextView) {
+ this.mHandler = mHandler;
+ this.outputTextView = outputTextView;
+ }
+
+
+ @Override
+ public void notify(final String s) {
+ mHandler.post(new Runnable() {
+ public void run() {
+ outputTextView.setText(s + "\n" + outputTextView.getText());
+ }
+ });
+ }
+}
diff --git a/src/org/linphone/tutorials/TutorialBuddyStatusActivity.java b/src/org/linphone/tutorials/TutorialBuddyStatusActivity.java
new file mode 100644
index 000000000..94b30b43c
--- /dev/null
+++ b/src/org/linphone/tutorials/TutorialBuddyStatusActivity.java
@@ -0,0 +1,111 @@
+/*
+TutorialBuddyStatusActivity.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.tutorials;
+
+import org.linphone.R;
+import org.linphone.core.LinphoneCoreException;
+import org.linphone.core.tutorials.TutorialBuddyStatus;
+import org.linphone.core.tutorials.TutorialNotifier;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+/**
+ * Activity for displaying and starting the BuddyStatus example on Android phone.
+ *
+ * @author Guillaume Beraudo
+ *
+ */
+public class TutorialBuddyStatusActivity extends Activity {
+
+ private static final String defaultSipAddress = "sip:";
+ private TextView sipAddressWidget;
+ private TextView mySipAddressWidget;
+ private TextView mySipPasswordWidget;
+
+ private TutorialBuddyStatus tutorial;
+ private Handler mHandler = new Handler() ;
+ private Button buttonCall;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.hello_world);
+ sipAddressWidget = (TextView) findViewById(R.id.AddressId);
+ sipAddressWidget.setText(defaultSipAddress);
+
+ mySipAddressWidget = (TextView) findViewById(R.id.MyAddressId);
+ mySipAddressWidget.setVisibility(View.VISIBLE);
+ mySipPasswordWidget = (TextView) findViewById(R.id.Password);
+ mySipPasswordWidget.setVisibility(TextView.VISIBLE);
+
+
+ // Output text to the outputText widget
+ final TextView outputText = (TextView) findViewById(R.id.OutputText);
+ final TutorialNotifier notifier = new AndroidTutorialNotifier(mHandler, outputText);
+
+
+ // Create BuddyStatus object
+ tutorial = new TutorialBuddyStatus(notifier);
+
+
+
+ // Assign call action to call button
+ buttonCall = (Button) findViewById(R.id.CallButton);
+ buttonCall.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ TutorialLaunchingThread thread = new TutorialLaunchingThread();
+ buttonCall.setEnabled(false);
+ thread.start();
+ }
+ });
+
+ // Assign stop action to stop button
+ Button buttonStop = (Button) findViewById(R.id.ButtonStop);
+ buttonStop.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ tutorial.stopMainLoop();
+ }
+ });
+ }
+
+
+ private class TutorialLaunchingThread extends Thread {
+ @Override
+ public void run() {
+ super.run();
+ try {
+ String myIdentity = mySipAddressWidget.getText().length()>0?mySipAddressWidget.getText().toString():null;
+ String myPassword = mySipPasswordWidget.getText().length()>0?mySipPasswordWidget.getText().toString():null;
+ tutorial.launchTutorial(sipAddressWidget.getText().toString(), myIdentity, myPassword);
+ mHandler.post(new Runnable() {
+ public void run() {
+ buttonCall.setEnabled(true);
+ }
+ });
+ } catch (LinphoneCoreException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/src/org/linphone/tutorials/TutorialChatRoomActivity.java b/src/org/linphone/tutorials/TutorialChatRoomActivity.java
new file mode 100644
index 000000000..fe83fec89
--- /dev/null
+++ b/src/org/linphone/tutorials/TutorialChatRoomActivity.java
@@ -0,0 +1,100 @@
+/*
+TutorialChatRoomActivity.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.tutorials;
+
+import org.linphone.R;
+import org.linphone.core.LinphoneCoreException;
+import org.linphone.core.tutorials.TutorialChatRoom;
+import org.linphone.core.tutorials.TutorialNotifier;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+/**
+ * Activity for displaying and starting the chatroom example on Android phone.
+ *
+ * @author Guillaume Beraudo
+ *
+ */
+public class TutorialChatRoomActivity extends Activity {
+
+ private static final String defaultSipAddress = "sip:";
+ private TextView sipAddressWidget;
+ private TutorialChatRoom tutorial;
+ private Handler mHandler = new Handler() ;
+ private Button buttonCall;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.hello_world);
+ sipAddressWidget = (TextView) findViewById(R.id.AddressId);
+ sipAddressWidget.setText(defaultSipAddress);
+
+ // Output text to the outputText widget
+ final TextView outputText = (TextView) findViewById(R.id.OutputText);
+ final TutorialNotifier notifier = new AndroidTutorialNotifier(mHandler, outputText);
+
+
+ // Create HelloWorld object
+ tutorial = new TutorialChatRoom(notifier);
+
+
+
+ // Assign call action to call button
+ buttonCall = (Button) findViewById(R.id.CallButton);
+ buttonCall.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ TutorialLaunchingThread thread = new TutorialLaunchingThread();
+ buttonCall.setEnabled(false);
+ thread.start();
+ }
+ });
+
+ // Assign stop action to stop button
+ Button buttonStop = (Button) findViewById(R.id.ButtonStop);
+ buttonStop.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ tutorial.stopMainLoop();
+ }
+ });
+ }
+
+
+ private class TutorialLaunchingThread extends Thread {
+ @Override
+ public void run() {
+ super.run();
+ try {
+ tutorial.launchTutorial(sipAddressWidget.getText().toString());
+ mHandler.post(new Runnable() {
+ public void run() {
+ buttonCall.setEnabled(true);
+ }
+ });
+ } catch (LinphoneCoreException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/src/org/linphone/tutorials/TutorialHelloWorldActivity.java b/src/org/linphone/tutorials/TutorialHelloWorldActivity.java
new file mode 100644
index 000000000..df326dc3d
--- /dev/null
+++ b/src/org/linphone/tutorials/TutorialHelloWorldActivity.java
@@ -0,0 +1,100 @@
+/*
+TutorialHelloWorldActivity.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.tutorials;
+
+import org.linphone.R;
+import org.linphone.core.LinphoneCoreException;
+import org.linphone.core.tutorials.TutorialHelloWorld;
+import org.linphone.core.tutorials.TutorialNotifier;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+/**
+ * Activity for displaying and starting the HelloWorld example on Android phone.
+ *
+ * @author Guillaume Beraudo
+ *
+ */
+public class TutorialHelloWorldActivity extends Activity {
+
+ private static final String defaultSipAddress = "sip:";
+ private TextView sipAddressWidget;
+ private TutorialHelloWorld tutorial;
+ private Handler mHandler = new Handler() ;
+ private Button buttonCall;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.hello_world);
+ sipAddressWidget = (TextView) findViewById(R.id.AddressId);
+ sipAddressWidget.setText(defaultSipAddress);
+
+ // Output text to the outputText widget
+ final TextView outputText = (TextView) findViewById(R.id.OutputText);
+ final TutorialNotifier notifier = new AndroidTutorialNotifier(mHandler, outputText);
+
+
+ // Create HelloWorld object
+ tutorial = new TutorialHelloWorld(notifier);
+
+
+
+ // Assign call action to call button
+ buttonCall = (Button) findViewById(R.id.CallButton);
+ buttonCall.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ TutorialLaunchingThread thread = new TutorialLaunchingThread();
+ buttonCall.setEnabled(false);
+ thread.start();
+ }
+ });
+
+ // Assign stop action to stop button
+ Button buttonStop = (Button) findViewById(R.id.ButtonStop);
+ buttonStop.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ tutorial.stopMainLoop();
+ }
+ });
+ }
+
+
+ private class TutorialLaunchingThread extends Thread {
+ @Override
+ public void run() {
+ super.run();
+ try {
+ tutorial.launchTutorial(sipAddressWidget.getText().toString());
+ mHandler.post(new Runnable() {
+ public void run() {
+ buttonCall.setEnabled(true);
+ }
+ });
+ } catch (LinphoneCoreException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/src/org/linphone/tutorials/TutorialRegistrationActivity.java b/src/org/linphone/tutorials/TutorialRegistrationActivity.java
new file mode 100644
index 000000000..7fae5f477
--- /dev/null
+++ b/src/org/linphone/tutorials/TutorialRegistrationActivity.java
@@ -0,0 +1,105 @@
+/*
+TutorialRegistrationActivity.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.tutorials;
+
+import org.linphone.R;
+import org.linphone.core.LinphoneCoreException;
+import org.linphone.core.tutorials.TutorialNotifier;
+import org.linphone.core.tutorials.TutorialRegistration;
+
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+/**
+ * Activity for displaying and starting the registration example on Android phone.
+ *
+ * @author Guillaume Beraudo
+ *
+ */
+public class TutorialRegistrationActivity extends TutorialHelloWorldActivity {
+
+ private static final String defaultSipAddress = "sip:";
+ private static final String defaultSipPassword = "";
+ private TextView sipAddressWidget;
+ private TextView sipPasswordWidget;
+ private TutorialRegistration tutorial;
+ private Button buttonCall;
+ private Handler mHandler = new Handler();
+ private TextView outputText;
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.hello_world);
+ sipAddressWidget = (TextView) findViewById(R.id.AddressId);
+ sipAddressWidget.setText(defaultSipAddress);
+ sipPasswordWidget = (TextView) findViewById(R.id.Password);
+ sipPasswordWidget.setVisibility(TextView.VISIBLE);
+ sipPasswordWidget.setText(defaultSipPassword);
+
+ // Output text to the outputText widget
+ outputText = (TextView) findViewById(R.id.OutputText);
+ final TutorialNotifier notifier = new AndroidTutorialNotifier(mHandler, outputText);
+
+
+ // Create Tutorial object
+ tutorial = new TutorialRegistration(notifier);
+
+
+
+ // Assign call action to call button
+ buttonCall = (Button) findViewById(R.id.CallButton);
+ buttonCall.setText("Register");
+ buttonCall.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ TutorialLaunchingThread thread = new TutorialLaunchingThread();
+ buttonCall.setEnabled(false);
+ thread.start();
+ }
+ });
+
+
+ Button buttonStop = (Button) findViewById(R.id.ButtonStop);
+ buttonStop.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ tutorial.stopMainLoop();
+ }
+ });
+ }
+
+
+ private class TutorialLaunchingThread extends Thread {
+ @Override
+ public void run() {
+ super.run();
+ try {
+ tutorial.launchTutorial(
+ sipAddressWidget.getText().toString(),
+ sipPasswordWidget.getText().toString());
+ } catch (LinphoneCoreException e) {
+ e.printStackTrace();
+ outputText.setText(e.getMessage() +"\n"+outputText.getText());
+ }
+ }
+ }
+}
diff --git a/submodules/linphone b/submodules/linphone
index 5087bd396..140dd5556 160000
--- a/submodules/linphone
+++ b/submodules/linphone
@@ -1 +1 @@
-Subproject commit 5087bd396a86226764c611e3ddd804a46eb771c7
+Subproject commit 140dd55563261f45206bfec8690ebefbbd638fcd