[PATCH] add unattended call transfer

31 views
Skip to first unread message

James Bottomley

unread,
Oct 10, 2009, 11:53:41 AM10/10/09
to Sipdroid Developers
If you run your own PBX, call transfer is one of the features it's
difficult to live without. This patch implements unattended transfer.
It's very difficult to do attended transfer without giving sipdroid the
ability to handle multiple call appearances.

James

---

Index: src/org/sipdroid/sipua/SipdroidEngine.java
===================================================================
--- src/org/sipdroid/sipua/SipdroidEngine.java (revision 331)
+++ src/org/sipdroid/sipua/SipdroidEngine.java (working copy)
@@ -313,6 +313,10 @@
public void togglehold() {
ua.reInvite(null, 0);
}
+
+ public void transfer(String number) {
+ ua.transfer(number);
+ }

public void togglemute() {
if (ua.muteMediaApplication())
Index: src/org/sipdroid/sipua/ui/CallScreen.java
===================================================================
--- src/org/sipdroid/sipua/ui/CallScreen.java (revision 330)
+++ src/org/sipdroid/sipua/ui/CallScreen.java (working copy)
@@ -3,17 +3,22 @@
import org.sipdroid.media.RtpStreamReceiver;
import org.sipdroid.sipua.R;
import org.sipdroid.sipua.UserAgent;
+import org.sipdroid.sipua.ui.InstantAutoCompleteTextView;

import android.app.Activity;
+import android.app.AlertDialog;
import android.app.KeyguardManager;
import android.content.ActivityNotFoundException;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.Intent;
import android.media.AudioManager;
import android.os.SystemClock;
+import android.text.InputType;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
+import android.widget.EditText;

/*
* Copyright (C) 2009 The Sipdroid Open Source Project
@@ -35,14 +40,17 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/

-public class CallScreen extends Activity {
+public class CallScreen extends Activity implements DialogInterface.OnClickListener {
public static final int FIRST_MENU_ID = Menu.FIRST;
public static final int HANG_UP_MENU_ITEM = FIRST_MENU_ID + 1;
public static final int HOLD_MENU_ITEM = FIRST_MENU_ID + 2;
public static final int MUTE_MENU_ITEM = FIRST_MENU_ID + 3;
public static final int VIDEO_MENU_ITEM = FIRST_MENU_ID + 5;
public static final int SPEAKER_MENU_ITEM = FIRST_MENU_ID + 6;
+ public static final int TRANSFER_MENU_ITEM = FIRST_MENU_ID + 7;

+ private static EditText transferText;
+
@Override
public boolean onCreateOptionsMenu(Menu menu) {
boolean result = super.onCreateOptionsMenu(menu);
@@ -57,10 +65,29 @@
m.setIcon(android.R.drawable.stat_sys_speakerphone);
m = menu.add(0, VIDEO_MENU_ITEM, 0, R.string.menu_video);
m.setIcon(android.R.drawable.ic_menu_camera);
+ m = menu.add(0, TRANSFER_MENU_ITEM, 0, R.string.menu_transfer);
+ m.setIcon(android.R.drawable.ic_menu_call);

return result;
}

+ public void onClick(DialogInterface dialog, int which)
+ {
+ Receiver.engine(this).transfer(transferText.getText().toString());
+ }
+
+ private void transfer() {
+ transferText = new InstantAutoCompleteTextView(Receiver.mContext,null);
+ transferText.setInputType(InputType.TYPE_CLASS_TEXT |
+ InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
+
+ new AlertDialog.Builder(this)
+ .setTitle(Receiver.mContext.getString(R.string.transfer_title))
+ .setView(transferText)
+ .setPositiveButton(Receiver.mContext.getString(android.R.string.ok), this)
+ .show();
+ }
+
@Override
public boolean onOptionsItemSelected(MenuItem item) {
boolean result = super.onOptionsItemSelected(item);
@@ -74,6 +101,10 @@
case HOLD_MENU_ITEM:
Receiver.engine(this).togglehold();
break;
+
+ case TRANSFER_MENU_ITEM:
+ transfer();
+ break;

case MUTE_MENU_ITEM:
Receiver.engine(this).togglemute();
Index: src/org/sipdroid/sipua/UserAgent.java
===================================================================
--- src/org/sipdroid/sipua/UserAgent.java (revision 330)
+++ src/org/sipdroid/sipua/UserAgent.java (working copy)
@@ -830,6 +830,10 @@
}
}

+ void transfer(String transfer_to) {
+ call.transfer(transfer_to);
+ }
+
/** Schedules an automatic answer event after <i>delay_time</i> secs. */
void automaticAccept(final int delay_time) {
(new Thread() {
Index: res/values/strings.xml
===================================================================
--- res/values/strings.xml (revision 331)
+++ res/values/strings.xml (working copy)
@@ -148,9 +148,12 @@
<string name="menu_call">Dial</string>
<string name="menu_mute">Mute</string>
<string name="menu_hold">Hold</string>
+<string name="menu_transfer">Transfer</string>
<string name="menu_speaker">Speaker</string>
<string name="menu_endCall">End call</string>

+<string name="transfer_title">Transfer Call to</string>
+
<string name="card_title_dialing">Dialing</string>
<string name="card_title_in_progress">Call in progress</string>
<string name="card_title_incoming_call">Incoming call</string>


Pascal Merle

unread,
Oct 10, 2009, 6:44:22 PM10/10/09
to Sipdroid Developers
You should add a cancel button to the alert. Then after testing you
may check it in.

I have already improved your MWI code. There were still some bugs in
it.

James Bottomley

unread,
Oct 12, 2009, 1:23:08 PM10/12/09
to sipdroid-...@googlegroups.com
On Sat, 2009-10-10 at 15:44 -0700, Pascal Merle wrote:
> You should add a cancel button to the alert. Then after testing you
> may check it in.

Isn't the standard paradigm for modal windows that cancel is the back
button? However, adding one is easy enough, see below.

> I have already improved your MWI code. There were still some bugs in
> it.

Thanks,

James

---

Index: src/org/sipdroid/sipua/SipdroidEngine.java
===================================================================
--- src/org/sipdroid/sipua/SipdroidEngine.java (revision 332)
+++ src/org/sipdroid/sipua/SipdroidEngine.java (working copy)
@@ -312,6 +312,10 @@


public void togglehold() {
ua.reInvite(null, 0);
}
+
+ public void transfer(String number) {
+ ua.transfer(number);
+ }

public void togglemute() {
if (ua.muteMediaApplication())
Index: src/org/sipdroid/sipua/ui/CallScreen.java
===================================================================

--- src/org/sipdroid/sipua/ui/CallScreen.java (revision 332)

@@ -57,10 +65,31 @@


m.setIcon(android.R.drawable.stat_sys_speakerphone);
m = menu.add(0, VIDEO_MENU_ITEM, 0, R.string.menu_video);
m.setIcon(android.R.drawable.ic_menu_camera);
+ m = menu.add(0, TRANSFER_MENU_ITEM, 0, R.string.menu_transfer);
+ m.setIcon(android.R.drawable.ic_menu_call);

return result;
}

+ public void onClick(DialogInterface dialog, int which)
+ {

+ if (which == DialogInterface.BUTTON_POSITIVE)


+ Receiver.engine(this).transfer(transferText.getText().toString());
+ }
+
+ private void transfer() {
+ transferText = new InstantAutoCompleteTextView(Receiver.mContext,null);
+ transferText.setInputType(InputType.TYPE_CLASS_TEXT |
+ InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
+
+ new AlertDialog.Builder(this)
+ .setTitle(Receiver.mContext.getString(R.string.transfer_title))
+ .setView(transferText)

+ .setPositiveButton(android.R.string.ok, this)
+ .setNegativeButton(android.R.string.cancel, this)


+ .show();
+ }
+
@Override
public boolean onOptionsItemSelected(MenuItem item) {
boolean result = super.onOptionsItemSelected(item);

@@ -74,6 +103,10 @@


case HOLD_MENU_ITEM:
Receiver.engine(this).togglehold();
break;
+
+ case TRANSFER_MENU_ITEM:
+ transfer();
+ break;

case MUTE_MENU_ITEM:
Receiver.engine(this).togglemute();
Index: src/org/sipdroid/sipua/UserAgent.java
===================================================================

--- src/org/sipdroid/sipua/UserAgent.java (revision 332)
+++ src/org/sipdroid/sipua/UserAgent.java (working copy)
@@ -827,6 +827,10 @@


}
}

+ void transfer(String transfer_to) {
+ call.transfer(transfer_to);
+ }
+
/** Schedules an automatic answer event after <i>delay_time</i> secs. */
void automaticAccept(final int delay_time) {
(new Thread() {
Index: res/values/strings.xml
===================================================================

--- res/values/strings.xml (revision 332)
+++ res/values/strings.xml (working copy)
@@ -149,9 +149,12 @@

Pascal Merle

unread,
Oct 12, 2009, 3:45:17 PM10/12/09
to Sipdroid Developers
Please check it in. I would like to release 1.1.2 including your patch
today.

James Bottomley

unread,
Oct 12, 2009, 3:58:47 PM10/12/09
to sipdroid-...@googlegroups.com
On Mon, 2009-10-12 at 12:45 -0700, Pascal Merle wrote:
> Please check it in. I would like to release 1.1.2 including your patch
> today.

OK, should be checked in.

James


Reply all
Reply to author
Forward
0 new messages