/* * 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.plugin.desktoputil.presence; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.event.*; import net.java.sip.communicator.util.Logger; import java.beans.*; /** * The <tt>StatusMessageMenu<tt> is added to every status selector box in order * to enable the user to choose a status message. * * @author Yana Stamcheva */ public class StatusMessageMenu extends AbstractStatusMessageMenu implements ProviderPresenceStatusListener { /** * Our logger. */ private final static Logger logger = Logger.getLogger(StatusMessageMenu.class); private ProtocolProviderService protocolProvider; /** * Creates an instance of <tt>StatusMessageMenu</tt>, by specifying the * <tt>ProtocolProviderService</tt> to which this menu belongs. * * @param protocolProvider the protocol provider service to which this * menu belongs * @param swing should we use swing or awt */ public StatusMessageMenu(ProtocolProviderService protocolProvider, boolean swing) { super(swing); this.protocolProvider = protocolProvider; OperationSetPresence presenceOpSet = protocolProvider.getOperationSet(OperationSetPresence.class); if(presenceOpSet != null) { presenceOpSet.addProviderPresenceStatusListener(this); } } /** * Returns the descriptor common for this status message menu instance. * @return the descriptor common for this status message menu instance. */ public Object getDescriptor() { return protocolProvider; } /** * Returns the currently set status message. * @return the currently set status message. */ public String getCurrentStatusMessage() { OperationSetPresence presenceOpSet = protocolProvider.getOperationSet(OperationSetPresence.class); return presenceOpSet.getCurrentStatusMessage(); } /** * Publishes the new message in separate thread. If successfully ended * the message item is created and added to te list of current status * messages and if needed the message is saved. * @param message the message to save * @param menuItem the item which was clicked to set this status * @param saveIfNewMessage whether to save the status on the custom * statuses list. */ public void publishStatusMessage(String message, Object menuItem, boolean saveIfNewMessage) { new PublishStatusMessageThread(message, menuItem, saveIfNewMessage) .start(); } /** * Not used. * @param evt ProviderStatusChangeEvent the event describing the status */ @Override public void providerStatusChanged(ProviderPresenceStatusChangeEvent evt) {} /** * Detects a provider status changed. * @param evt a PropertyChangeEvent with a STATUS_MESSAGE property name, */ @Override public void providerStatusMessageChanged(PropertyChangeEvent evt) { fireStatusMessageUpdated( (String)evt.getOldValue(), (String)evt.getNewValue()); } /** * Clears resources. */ @Override public void dispose() { super.dispose(); OperationSetPresence presenceOpSet = protocolProvider.getOperationSet(OperationSetPresence.class); if(presenceOpSet != null) { presenceOpSet.removeProviderPresenceStatusListener(this); } } /** * This class allow to use a thread to change the presence status message. */ private class PublishStatusMessageThread extends Thread { private String message; private PresenceStatus currentStatus; private OperationSetPresence presenceOpSet; private Object menuItem; private boolean saveIfNewMessage; public PublishStatusMessageThread( String message, Object menuItem, boolean saveIfNewMessage) { this.message = message; presenceOpSet = protocolProvider.getOperationSet(OperationSetPresence.class); this.currentStatus = presenceOpSet.getPresenceStatus(); this.menuItem = menuItem; this.saveIfNewMessage = saveIfNewMessage; } @Override public void run() { try { presenceOpSet.publishPresenceStatus(currentStatus, message); } catch (IllegalArgumentException e1) { logger.error("Error - changing status", e1); } catch (IllegalStateException e1) { logger.error("Error - changing status", e1); } catch (OperationFailedException e1) { if (e1.getErrorCode() == OperationFailedException.GENERAL_ERROR) { logger.error( "General error occured while " + "publishing presence status.", e1); } else if (e1.getErrorCode() == OperationFailedException .NETWORK_FAILURE) { logger.error( "Network failure occured while " + "publishing presence status.", e1); } else if (e1.getErrorCode() == OperationFailedException .PROVIDER_NOT_REGISTERED) { logger.error( "Protocol provider must be" + "registered in order to change status.", e1); } } } } }