Updates sending sms messages to reuse contacts that have numbers.

cusax-fix 4949
Damian Minkov 12 years ago
parent 476eb40d0b
commit 51f7e377ca

@ -132,6 +132,7 @@ service.gui.CHAT_ROOMS=Chat rooms
service.gui.CHAT_ROOM=Chat room service.gui.CHAT_ROOM=Chat room
service.gui.CHAT_ROOM_SUBJECT_CHANGED={0} has changed the subject to {1} service.gui.CHAT_ROOM_SUBJECT_CHANGED={0} has changed the subject to {1}
service.gui.CHOOSE_CONTACT=Choose contact service.gui.CHOOSE_CONTACT=Choose contact
service.gui.CHOOSE_NUMBER=Choose number
service.gui.CHOOSE_ACCOUNT=Please select one of the listed accounts. service.gui.CHOOSE_ACCOUNT=Please select one of the listed accounts.
service.gui.CITY=City service.gui.CITY=City
service.gui.COUNTRY=Country service.gui.COUNTRY=Country

@ -44,7 +44,7 @@ public class ChooseCallAccountPopupMenu
/** /**
* The invoker component. * The invoker component.
*/ */
private final JComponent invoker; protected final JComponent invoker;
/** /**
* The call interface listener, which would be notified once the call * The call interface listener, which would be notified once the call
@ -110,7 +110,7 @@ public ChooseCallAccountPopupMenu(
{ {
this.invoker = invoker; this.invoker = invoker;
this.init(GuiActivator.getResources() this.init(GuiActivator.getResources()
.getI18NString("service.gui.CALL_VIA")); .getI18NString(getI18NKeyCallVia()));
for (ProtocolProviderService provider : telephonyProviders) for (ProtocolProviderService provider : telephonyProviders)
{ {
@ -148,7 +148,7 @@ public ChooseCallAccountPopupMenu(JComponent invoker,
{ {
this.invoker = invoker; this.invoker = invoker;
this.init(GuiActivator.getResources() this.init(GuiActivator.getResources()
.getI18NString("service.gui.CHOOSE_CONTACT")); .getI18NString(getI18NKeyChooseContact()));
for (Object o : telephonyObjects) for (Object o : telephonyObjects)
{ {
@ -161,6 +161,26 @@ else if (o instanceof ChatTransport)
} }
} }
/**
* Returns the key to use for choose contact string. Can be overridden
* by extenders.
* @return the key to use for choose contact string.
*/
protected String getI18NKeyChooseContact()
{
return "service.gui.CHOOSE_CONTACT";
}
/**
* Returns the key to use for choose contact string. Can be overridden
* by extenders.
* @return the key to use for choose contact string.
*/
protected String getI18NKeyCallVia()
{
return "service.gui.CALL_VIA";
}
/** /**
* Initializes and add some common components. * Initializes and add some common components.
* *
@ -258,13 +278,8 @@ public void actionPerformed(ActionEvent e)
} }
else if (providers.size() > 1) else if (providers.size() > 1)
{ {
ChooseCallAccountDialog callAccountDialog itemSelected(
= new ChooseCallAccountDialog( opSetClass, providers, telephonyContact.getAddress());
telephonyContact.getAddress(), opSetClass, providers);
if (uiContact != null)
callAccountDialog.setUIContact(uiContact);
callAccountDialog.setVisible(true);
} }
else // providersCount == 1 else // providersCount == 1
{ {
@ -470,6 +485,25 @@ protected void itemSelected(Class<? extends OperationSet> opSetClass,
contact); contact);
} }
/**
* Item was selected, give a chance for extenders to override.
*
* @param opSetClass the operation set to use.
* @param providers list of available protocol providers
* @param contact the contact address selected
*/
protected void itemSelected(Class<? extends OperationSet> opSetClass,
List<ProtocolProviderService> providers,
String contact)
{
ChooseCallAccountDialog callAccountDialog
= new ChooseCallAccountDialog(contact, opSetClass, providers);
if (uiContact != null)
callAccountDialog.setUIContact(uiContact);
callAccountDialog.setVisible(true);
}
/** /**
* A custom menu item corresponding to a specific * A custom menu item corresponding to a specific
* <tt>ProtocolProviderService</tt>. * <tt>ProtocolProviderService</tt>.

@ -20,11 +20,13 @@
import javax.swing.text.*; import javax.swing.text.*;
import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.impl.gui.main.call.*;
import net.java.sip.communicator.impl.gui.main.chat.conference.*; import net.java.sip.communicator.impl.gui.main.chat.conference.*;
import net.java.sip.communicator.impl.gui.main.chat.filetransfer.*; import net.java.sip.communicator.impl.gui.main.chat.filetransfer.*;
import net.java.sip.communicator.impl.gui.utils.*; import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.plugin.desktoputil.SwingWorker; import net.java.sip.communicator.plugin.desktoputil.SwingWorker;
import net.java.sip.communicator.service.contactlist.*;
import net.java.sip.communicator.service.filehistory.*; import net.java.sip.communicator.service.filehistory.*;
import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.gui.*;
import net.java.sip.communicator.service.gui.event.*; import net.java.sip.communicator.service.gui.event.*;
@ -1664,6 +1666,26 @@ public void sendSmsMessage()
if(smsChatTransport.askForSMSNumber()) if(smsChatTransport.askForSMSNumber())
{ {
Object desc =
smsChatTransport.getParentChatSession().getDescriptor();
// descriptor will be metacontact
if(desc instanceof MetaContact)
{
UIPhoneUtil contactPhoneUtil =
UIPhoneUtil.getPhoneUtil((MetaContact) desc);
List<UIContactDetail> uiContactDetailList =
contactPhoneUtil.getAdditionalNumbers();
if(uiContactDetailList.size() != 0)
{
SMSManager.sendSMS(
this, uiContactDetailList, messageText, this);
return;
}
}
smsDialog.setPreferredSize(new Dimension(400, 200)); smsDialog.setPreferredSize(new Dimension(400, 200));
smsDialog.setVisible(true); smsDialog.setVisible(true);
} }

@ -11,6 +11,7 @@
import javax.swing.*; import javax.swing.*;
import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.protocol.event.*; import net.java.sip.communicator.service.protocol.event.*;
@ -452,14 +453,10 @@ public void sendSmsMessage(String phoneNumber, String messageText)
if (!allowsSmsMessage()) if (!allowsSmsMessage())
return; return;
OperationSetSmsMessaging smsOpSet SMSManager.sendSMS(
= contact contact.getProtocolProvider(),
.getProtocolProvider() phoneNumber,
.getOperationSet(OperationSetSmsMessaging.class); messageText);
Message smsMessage = smsOpSet.createMessage(messageText);
smsOpSet.sendSmsMessage(phoneNumber, smsMessage);
} }
/** /**
@ -496,13 +493,7 @@ public void sendSmsMessage(String message)
if (!allowsSmsMessage()) if (!allowsSmsMessage())
return; return;
OperationSetSmsMessaging smsOpSet SMSManager.sendSMS(contact, message);
= contact.getProtocolProvider()
.getOperationSet(OperationSetSmsMessaging.class);
Message smsMessage = smsOpSet.createMessage(message);
smsOpSet.sendSmsMessage(contact, smsMessage);
} }
/** /**

@ -8,13 +8,12 @@
import java.awt.*; import java.awt.*;
import java.awt.event.*; import java.awt.event.*;
import java.util.*;
import javax.swing.*; import javax.swing.*;
import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.service.gui.*;
import net.java.sip.communicator.util.*; import net.java.sip.communicator.util.*;
/** /**
@ -124,48 +123,7 @@ public void sendSmsMessage(String phoneNumber, String message)
chatTransport.getParentChatSession() chatTransport.getParentChatSession()
.setDefaultSmsNumber(phoneNumber); .setDefaultSmsNumber(phoneNumber);
try SMSManager.sendSMS(phoneNumber, message, chatTransport, chatPanel);
{
if(phoneNumber != null)
chatTransport.sendSmsMessage(phoneNumber, message);
else
chatTransport.sendSmsMessage(message);
}
catch (IllegalStateException ex)
{
logger.error("Failed to send SMS.", ex);
chatPanel.addMessage(
phoneNumber,
new Date(),
Chat.OUTGOING_MESSAGE,
message,
"text/plain");
chatPanel.addErrorMessage(
phoneNumber,
GuiActivator.getResources()
.getI18NString("service.gui.SMS_SEND_CONNECTION_PROBLEM"));
}
catch (Exception ex)
{
logger.error("Failed to send SMS.", ex);
chatPanel.addMessage(
phoneNumber,
new Date(),
Chat.OUTGOING_MESSAGE,
message,
"text/plain");
chatPanel.addErrorMessage(
phoneNumber,
GuiActivator.getResources()
.getI18NString("service.gui.MSG_DELIVERY_ERROR",
new String[]{ex.getMessage()}));
}
chatPanel.refreshWriteArea();
this.dispose(); this.dispose();
} }

@ -8,8 +8,10 @@
import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.impl.gui.main.call.*; import net.java.sip.communicator.impl.gui.main.call.*;
import net.java.sip.communicator.impl.gui.main.chat.*;
import net.java.sip.communicator.impl.gui.main.contactlist.*; import net.java.sip.communicator.impl.gui.main.contactlist.*;
import net.java.sip.communicator.service.contactlist.*; import net.java.sip.communicator.service.contactlist.*;
import net.java.sip.communicator.service.gui.*;
import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.*; import net.java.sip.communicator.util.*;
import net.java.sip.communicator.util.account.*; import net.java.sip.communicator.util.account.*;
@ -36,7 +38,20 @@ public class SMSManager
* to show popup for choosing provider. * to show popup for choosing provider.
* @param to the destination number * @param to the destination number
*/ */
public static void sendSMS(JComponent invoker, final String to) public static void sendSMS(
JComponent invoker, String to)
{
sendSMSInternal(invoker, to, null, null);
}
/**
* Sends sms, chooses provider and sends the sms.
* @param invoker the component invoker, used to get correct location
* to show popup for choosing provider.
* @param to the destination number
*/
private static void sendSMSInternal(
JComponent invoker, String to, String messageText, ChatPanel chatPanel)
{ {
List<ProtocolProviderService> providers = List<ProtocolProviderService> providers =
AccountUtils AccountUtils
@ -45,47 +60,78 @@ public static void sendSMS(JComponent invoker, final String to)
if(providers.size() == 1) if(providers.size() == 1)
{ {
//send //send
sendSms(providers.get(0), to); if(messageText != null)
{
sendSMSInternal(
to,
messageText,
providers.get(0),
null,
chatPanel);
}
else
sendSMSInternal(providers.get(0), to);
} }
else if(providers.size() > 1) else if(providers.size() > 1)
{ {
ChooseCallAccountPopupMenu chooseAccountDialog ChooseSMSAccountPopupMenu chooseAccountDialog
= new ChooseCallAccountPopupMenu( = new ChooseSMSAccountPopupMenu(
invoker, invoker,
to, to,
providers) providers,
{ messageText,
@Override chatPanel);
protected void itemSelected(
Class<? extends OperationSet> opSetClass,
ProtocolProviderService protocolProviderService,
String contact,
UIContactImpl uiContact)
{
sendSms(protocolProviderService, to);
}
@Override
protected void itemSelected(
Class<? extends OperationSet> opSetClass,
ProtocolProviderService protocolProviderService,
String contact)
{
sendSms(protocolProviderService, to);
}
};
chooseAccountDialog.setLocation(invoker.getLocation()); chooseAccountDialog.setLocation(invoker.getLocation());
chooseAccountDialog.showPopupMenu(); chooseAccountDialog.showPopupMenu();
} }
} }
/**
* Sends sms message.
* @param protocolProviderService
* @param to the receive number
* @param messageText the text
*/
public static void sendSMS(
ProtocolProviderService protocolProviderService,
String to,
String messageText)
throws Exception
{
OperationSetSmsMessaging smsOpSet
= protocolProviderService
.getOperationSet(OperationSetSmsMessaging.class);
Message smsMessage = smsOpSet.createMessage(messageText);
smsOpSet.sendSmsMessage(to, smsMessage);
}
/**
* Sends sms message.
* @param contact the contact to send sms to
* @param messageText the text.
*/
public static void sendSMS(
Contact contact,
String messageText)
throws Exception
{
OperationSetSmsMessaging smsOpSet = contact.getProtocolProvider()
.getOperationSet(OperationSetSmsMessaging.class);
Message smsMessage = smsOpSet.createMessage(messageText);
smsOpSet.sendSmsMessage(contact, smsMessage);
}
/** /**
* Sends sms. * Sends sms.
* @param protocolProviderService * @param protocolProviderService
* @param to * @param to
*/ */
private static void sendSms( private static void sendSMSInternal(
ProtocolProviderService protocolProviderService, ProtocolProviderService protocolProviderService,
String to) String to)
{ {
@ -106,4 +152,250 @@ private static void sendSms(
GuiActivator.getUIService().getChatWindowManager() GuiActivator.getUIService().getChatWindowManager()
.startChat(metaContact, contact, true); .startChat(metaContact, contact, true);
} }
/**
* Sends sms, chooses phone and chooses provider and sends the sms.
* @param invoker the component invoker, used to get correct location
* to show popup for choosing provider.
* @param additionalNumbers the destination numbers to choose from
*/
public static void sendSMS(final JComponent invoker,
List<UIContactDetail> additionalNumbers,
String messageText,
ChatPanel chatPanel)
{
if(additionalNumbers.size() == 1)
{
sendSMSInternal(invoker, additionalNumbers.get(0).getAddress(),
messageText, chatPanel);
}
else
{
ChooseSMSAccountPopupMenu chooseAccountDialog
= new ChooseSMSAccountPopupMenu(
invoker,
additionalNumbers,
OperationSetSmsMessaging.class,
messageText,
chatPanel);
chooseAccountDialog.setLocation(invoker.getLocation());
chooseAccountDialog.showPopupMenu();
}
}
/**
* Sends sms message using chatTransport otherwise.
* @param phoneNumber
* @param message
* @param chatTransport the transport to use if protocol provider missing
* @param chatPanel the panel where the message is sent, will be used for
* success or fail messages
*/
public static void sendSMS(
String phoneNumber,
String message,
ChatTransport chatTransport,
ChatPanel chatPanel)
{
sendSMSInternal(phoneNumber, message, null, chatTransport, chatPanel);
}
/**
* Sends sms message using protocolProviderService if it is not null,
* or using chatTransport otherwise.
* @param phoneNumber
* @param message
* @param protocolProviderService the protocol provider service to use,
* if not null.
* @param chatTransport the transport to use if protocol provider missing
* @param chatPanel the panel where the message is sent, will be used for
* success or fail messages
*/
private static void sendSMSInternal(
String phoneNumber,
String message,
ProtocolProviderService protocolProviderService,
ChatTransport chatTransport,
ChatPanel chatPanel)
{
try
{
if(protocolProviderService != null)
{
sendSMS(protocolProviderService, phoneNumber, message);
}
else
{
if(phoneNumber != null)
chatTransport.sendSmsMessage(phoneNumber, message);
else
chatTransport.sendSmsMessage(message);
}
}
catch (IllegalStateException ex)
{
logger.error("Failed to send SMS.", ex);
chatPanel.addMessage(
phoneNumber,
new Date(),
Chat.OUTGOING_MESSAGE,
message,
"text/plain");
chatPanel.addErrorMessage(
phoneNumber,
GuiActivator.getResources()
.getI18NString("service.gui.SMS_SEND_CONNECTION_PROBLEM"));
}
catch (Exception ex)
{
logger.error("Failed to send SMS.", ex);
chatPanel.addMessage(
phoneNumber,
new Date(),
Chat.OUTGOING_MESSAGE,
message,
"text/plain");
chatPanel.addErrorMessage(
phoneNumber,
GuiActivator.getResources()
.getI18NString("service.gui.MSG_DELIVERY_ERROR",
new String[]{ex.getMessage()}));
}
chatPanel.refreshWriteArea();
}
/**
* Extends ChooseCallAccountPopupMenu to use it for sms functionality.
*/
private static class ChooseSMSAccountPopupMenu
extends ChooseCallAccountPopupMenu
{
private String messageText = null;
private ChatPanel chatPanel = null;
/**
* Creates popup menu.
* @param invoker
* @param contactToCall
* @param telephonyProviders
*/
public ChooseSMSAccountPopupMenu(
JComponent invoker,
final String contactToCall,
List<ProtocolProviderService> telephonyProviders,
String messageText,
ChatPanel chatPanel)
{
super(invoker, contactToCall, telephonyProviders,
OperationSetBasicTelephony.class);
this.messageText = messageText;
this.chatPanel = chatPanel;
}
/**
* Creates popup menu.
* @param invoker
* @param telephonyObjects
* @param opSetClass
*/
public ChooseSMSAccountPopupMenu(
JComponent invoker,
List<?> telephonyObjects,
Class<? extends OperationSet> opSetClass,
String messageText,
ChatPanel chatPanel)
{
super(invoker, telephonyObjects, opSetClass);
this.messageText = messageText;
this.chatPanel = chatPanel;
}
/**
* Sends sms when number is selected and several providers are
* available.
* @param opSetClass the operation set to use.
* @param providers list of available protocol providers
* @param contact the contact address selected
*/
@Override
protected void itemSelected(
Class<? extends OperationSet> opSetClass,
List<ProtocolProviderService> providers,
String contact)
{
SMSManager.sendSMSInternal(invoker, contact, messageText, chatPanel);
}
/**
* Sends sms when we have a number and provider.
* @param opSetClass the operation set to use.
* @param protocolProviderService the protocol provider
* @param contact the contact address
* @param uiContact the <tt>MetaContact</tt> selected
*/
@Override
protected void itemSelected(
Class<? extends OperationSet> opSetClass,
ProtocolProviderService protocolProviderService,
String contact,
UIContactImpl uiContact)
{
if(messageText != null)
{
sendSMSInternal(
contact,
messageText,
protocolProviderService,
null,
chatPanel);
}
else
sendSMSInternal(protocolProviderService, contact);
}
/**
* Sends sms when we have a number and provider.
* @param opSetClass the operation set to use.
* @param protocolProviderService the protocol provider
* @param contact the contact address selected
*/
@Override
protected void itemSelected(
Class<? extends OperationSet> opSetClass,
ProtocolProviderService protocolProviderService,
String contact)
{
if(messageText != null)
{
sendSMSInternal(
contact,
messageText,
protocolProviderService,
null,
chatPanel);
}
else
sendSMSInternal(protocolProviderService, contact);
}
@Override
protected String getI18NKeyChooseContact()
{
return "service.gui.CHOOSE_NUMBER";
}
@Override
protected String getI18NKeyCallVia()
{
return "service.gui.SEND_VIA";
}
}
} }

Loading…
Cancel
Save