/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.java.sip.communicator.impl.gui.utils; 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.*; import net.java.sip.communicator.impl.gui.main.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.util.*; import net.java.sip.communicator.util.account.*; import javax.swing.*; import java.util.*; /** * Handles any sms common actions. * @author Damian Minkov */ public class SMSManager { /** * The <tt>Logger</tt> used by the <tt>ChatWindowManager</tt> class and its * instances for logging output. */ private static final Logger logger = Logger.getLogger(SMSManager.class); /** * 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 */ 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 = AccountUtils .getRegisteredProviders(OperationSetSmsMessaging.class); if(providers.size() == 1) { //send if(messageText != null) { sendSMSInternal( to, messageText, providers.get(0), null, chatPanel); } else sendSMSInternal(providers.get(0), to); } else if(providers.size() > 1) { ChooseSMSAccountPopupMenu chooseAccountDialog = new ChooseSMSAccountPopupMenu( invoker, to, providers, messageText, chatPanel); chooseAccountDialog.setLocation(invoker.getLocation()); 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. * @param protocolProviderService * @param to */ private static void sendSMSInternal( ProtocolProviderService protocolProviderService, String to) { OperationSetSmsMessaging smsMessaging = protocolProviderService.getOperationSet( OperationSetSmsMessaging.class); Contact contact = smsMessaging.getContact(to); MetaContact metaContact = GuiActivator.getContactListService() .findMetaContactByContact(contact); if(metaContact == null) { logger.error("MetaContact not found for: " + contact); return; } GuiActivator.getUIService().getChatWindowManager() .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 == null ? chatTransport.getName() : phoneNumber, new Date(), Chat.OUTGOING_MESSAGE, message, "text/plain"); chatPanel.addErrorMessage( phoneNumber == null ? chatTransport.getName() : phoneNumber, 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"; } } }