diff --git a/src/net/java/sip/communicator/impl/globaldisplaydetails/GlobalDisplayDetailsActivator.java b/src/net/java/sip/communicator/impl/globaldisplaydetails/GlobalDisplayDetailsActivator.java index 0c5c78d2d..55dc3df84 100644 --- a/src/net/java/sip/communicator/impl/globaldisplaydetails/GlobalDisplayDetailsActivator.java +++ b/src/net/java/sip/communicator/impl/globaldisplaydetails/GlobalDisplayDetailsActivator.java @@ -7,7 +7,9 @@ package net.java.sip.communicator.impl.globaldisplaydetails; import net.java.sip.communicator.service.globaldisplaydetails.*; +import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.protocol.*; +import net.java.sip.communicator.service.protocol.globalstatus.*; import net.java.sip.communicator.util.*; import org.jitsi.service.configuration.*; @@ -37,6 +39,16 @@ public class GlobalDisplayDetailsActivator */ private static ConfigurationService configService; + /** + * The alert UI service. + */ + private static AlertUIService alertUIService; + + /** + * The UI service. + */ + private static UIService uiService; + /** * The display details implementation. */ @@ -61,6 +73,11 @@ public void start(BundleContext bc) GlobalDisplayDetailsService.class.getName(), displayDetailsImpl, null); + + bundleContext.registerService( + GlobalStatusService.class.getName(), + new GlobalStatusServiceImpl(), + null); } /** @@ -111,6 +128,42 @@ public static ConfigurationService getConfigurationService() return configService; } + /** + * Returns the AlertUIService obtained from the bundle + * context. + * @return the AlertUIService obtained from the bundle + * context + */ + public static AlertUIService getAlertUIService() + { + if(alertUIService == null) + { + alertUIService + = ServiceUtils.getService( + bundleContext, + AlertUIService.class); + } + return alertUIService; + } + + /** + * Returns the UIService obtained from the bundle + * context. + * @return the UIService obtained from the bundle + * context + */ + public static UIService getUIService() + { + if(uiService == null) + { + uiService + = ServiceUtils.getService( + bundleContext, + UIService.class); + } + return uiService; + } + /** * Implements the ServiceListener method. Verifies whether the * passed event concerns a ProtocolProviderService and adds or diff --git a/src/net/java/sip/communicator/impl/gui/main/presence/GlobalStatusServiceImpl.java b/src/net/java/sip/communicator/impl/globaldisplaydetails/GlobalStatusServiceImpl.java similarity index 71% rename from src/net/java/sip/communicator/impl/gui/main/presence/GlobalStatusServiceImpl.java rename to src/net/java/sip/communicator/impl/globaldisplaydetails/GlobalStatusServiceImpl.java index eb09a41b7..616c200de 100644 --- a/src/net/java/sip/communicator/impl/gui/main/presence/GlobalStatusServiceImpl.java +++ b/src/net/java/sip/communicator/impl/globaldisplaydetails/GlobalStatusServiceImpl.java @@ -3,10 +3,8 @@ * * Distributable under LGPL license. See terms of license at gnu.org. */ -package net.java.sip.communicator.impl.gui.main.presence; +package net.java.sip.communicator.impl.globaldisplaydetails; -import net.java.sip.communicator.impl.gui.*; -import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.globalstatus.*; import net.java.sip.communicator.util.*; @@ -45,6 +43,8 @@ public PresenceStatus getLastPresenceStatus( { String lastStatus = getLastStatusString(protocolProvider); + PresenceStatus status = null; + if (lastStatus != null) { OperationSetPresence presence @@ -54,16 +54,62 @@ public PresenceStatus getLastPresenceStatus( return null; Iterator i = presence.getSupportedStatusSet(); - PresenceStatus status; + // Check if there's such status in the supported presence status + // set. while (i.hasNext()) { - status = i.next(); - if (status.getStatusName().equals(lastStatus)) - return status; + PresenceStatus nextStatus = i.next(); + + if (nextStatus.getStatusName().equals(lastStatus)) + status = nextStatus; + } + + // If we haven't found the last status in the protocol provider + // supported status set, we'll have a look for a corresponding + // global status and its protocol representation. + if (status == null) + { + if (lastStatus.equals(GlobalStatusEnum.ONLINE_STATUS)) + { + status = getPresenceStatus( + protocolProvider, + PresenceStatus.AVAILABLE_THRESHOLD, + PresenceStatus.EAGER_TO_COMMUNICATE_THRESHOLD); + } + else if (lastStatus.equals(GlobalStatusEnum.AWAY_STATUS)) + { + status = getPresenceStatus( + protocolProvider, + PresenceStatus.AWAY_THRESHOLD, + PresenceStatus.AVAILABLE_THRESHOLD); + } + else if (lastStatus + .equals(GlobalStatusEnum.DO_NOT_DISTURB_STATUS)) + { + status = getPresenceStatus( + protocolProvider, + PresenceStatus.ONLINE_THRESHOLD, + PresenceStatus.AWAY_THRESHOLD); + } + else if (lastStatus + .equals(GlobalStatusEnum.FREE_FOR_CHAT_STATUS)) + { + status = getPresenceStatus( + protocolProvider, + PresenceStatus.AVAILABLE_THRESHOLD, + PresenceStatus.MAX_STATUS_VALUE); + } + else if (lastStatus.equals(GlobalStatusEnum.OFFLINE_STATUS)) + { + status = getPresenceStatus( + protocolProvider, + 0, + GlobalStatusEnum.ONLINE_THRESHOLD); + } } } - return null; + return status; } /** @@ -79,7 +125,7 @@ public String getLastStatusString(ProtocolProviderService protocolProvider) String lastStatus = null; ConfigurationService configService - = GuiActivator.getConfigurationService(); + = GlobalDisplayDetailsActivator.getConfigurationService(); String prefix = "net.java.sip.communicator.impl.gui.accounts"; List accounts = configService.getPropertyNamesByPrefix(prefix, true); @@ -121,7 +167,7 @@ public void publishStatus( = protocolProvider.getOperationSet(OperationSetPresence.class); LoginManager loginManager - = GuiActivator.getUIService().getLoginManager(); + = GlobalDisplayDetailsActivator.getUIService().getLoginManager(); RegistrationState registrationState = protocolProvider.getRegistrationState(); @@ -147,7 +193,7 @@ else if (registrationState != RegistrationState.REGISTERED && registrationState != RegistrationState.AUTHENTICATING && status.isOnline()) { - GuiActivator.getUIService().getLoginManager() + GlobalDisplayDetailsActivator.getUIService().getLoginManager() .login(protocolProvider); } else if (!status.isOnline() @@ -176,12 +222,11 @@ public void publishStatus(GlobalStatusEnum globalStatus) String itemName = globalStatus.getStatusName(); Iterator pProviders - = GuiActivator.getUIService().getMainFrame().getProtocolProviders(); + = AccountUtils.getRegisteredProviders().iterator(); while (pProviders.hasNext()) { - ProtocolProviderService protocolProvider - = pProviders.next(); + ProtocolProviderService protocolProvider = pProviders.next(); if(itemName.equals(GlobalStatusEnum.ONLINE_STATUS)) { @@ -189,8 +234,8 @@ public void publishStatus(GlobalStatusEnum globalStatus) { saveStatusInformation(protocolProvider, itemName); - GuiActivator.getUIService().getLoginManager() - .login(protocolProvider); + GlobalDisplayDetailsActivator.getUIService() + .getLoginManager().login(protocolProvider); } else { @@ -282,27 +327,51 @@ else if (itemName.equals(GlobalStatusEnum.OFFLINE_STATUS)) } else if (itemName.equals(GlobalStatusEnum.FREE_FOR_CHAT_STATUS)) { - // we search for highest available status here - publishStatus( - protocolProvider, - PresenceStatus.AVAILABLE_THRESHOLD, - PresenceStatus.MAX_STATUS_VALUE); + if(!protocolProvider.isRegistered()) + { + saveStatusInformation(protocolProvider, itemName); + + GlobalDisplayDetailsActivator.getUIService() + .getLoginManager().login(protocolProvider); + } + else + // we search for highest available status here + publishStatus( + protocolProvider, + PresenceStatus.AVAILABLE_THRESHOLD, + PresenceStatus.MAX_STATUS_VALUE); } else if (itemName.equals(GlobalStatusEnum.DO_NOT_DISTURB_STATUS)) { - // status between online and away is DND - publishStatus( - protocolProvider, - PresenceStatus.ONLINE_THRESHOLD, - PresenceStatus.AWAY_THRESHOLD); + if(!protocolProvider.isRegistered()) + { + saveStatusInformation(protocolProvider, itemName); + + GlobalDisplayDetailsActivator.getUIService() + .getLoginManager().login(protocolProvider); + } + else + // status between online and away is DND + publishStatus( + protocolProvider, + PresenceStatus.ONLINE_THRESHOLD, + PresenceStatus.AWAY_THRESHOLD); } else if (itemName.equals(GlobalStatusEnum.AWAY_STATUS)) { - // a status in the away interval - publishStatus( - protocolProvider, - PresenceStatus.AWAY_THRESHOLD, - PresenceStatus.AVAILABLE_THRESHOLD); + if(!protocolProvider.isRegistered()) + { + saveStatusInformation(protocolProvider, itemName); + + GlobalDisplayDetailsActivator.getUIService() + .getLoginManager().login(protocolProvider); + } + else + // a status in the away interval + publishStatus( + protocolProvider, + PresenceStatus.AWAY_THRESHOLD, + PresenceStatus.AVAILABLE_THRESHOLD); } } } @@ -323,12 +392,35 @@ private void publishStatus( if (!protocolProvider.isRegistered()) return; + PresenceStatus status = getPresenceStatus( protocolProvider, + floorStatusValue, + ceilStatusValue); + + if (status != null) + { + OperationSetPresence presence + = protocolProvider + .getOperationSet(OperationSetPresence.class); + + new PublishPresenceStatusThread(protocolProvider, presence, status) + .start(); + + this.saveStatusInformation( protocolProvider, + status.getStatusName()); + } + } + + private PresenceStatus getPresenceStatus( + ProtocolProviderService protocolProvider, + int floorStatusValue, + int ceilStatusValue) + { OperationSetPresence presence = protocolProvider .getOperationSet(OperationSetPresence.class); if (presence == null) - return; + return null; Iterator statusSet = presence.getSupportedStatusSet(); @@ -357,14 +449,7 @@ private void publishStatus( } } - if (status != null) - { - new PublishPresenceStatusThread(protocolProvider, presence, status) - .start(); - - this.saveStatusInformation( protocolProvider, - status.getStatusName()); - } + return status; } /** @@ -380,7 +465,7 @@ private void saveStatusInformation( String statusName) { ConfigurationService configService - = GuiActivator.getConfigurationService(); + = GlobalDisplayDetailsActivator.getConfigurationService(); String prefix = "net.java.sip.communicator.impl.gui.accounts"; @@ -473,46 +558,55 @@ public void run() == OperationFailedException.GENERAL_ERROR) { String msgText = - GuiActivator.getResources().getI18NString( + GlobalDisplayDetailsActivator.getResources() + .getI18NString( "service.gui.STATUS_CHANGE_GENERAL_ERROR", new String[]{ protocolProvider.getAccountID().getUserID(), protocolProvider.getAccountID().getService()}); - new ErrorDialog(null, - GuiActivator.getResources().getI18NString( - "service.gui.GENERAL_ERROR"), msgText, e1) - .showDialog(); + GlobalDisplayDetailsActivator.getAlertUIService() + .showAlertDialog( + GlobalDisplayDetailsActivator.getResources() + .getI18NString("service.gui.GENERAL_ERROR"), + msgText, + e1); } else if (e1.getErrorCode() == OperationFailedException.NETWORK_FAILURE) { String msgText = - GuiActivator.getResources().getI18NString( + GlobalDisplayDetailsActivator.getResources() + .getI18NString( "service.gui.STATUS_CHANGE_NETWORK_FAILURE", new String[]{ protocolProvider.getAccountID().getUserID(), protocolProvider.getAccountID().getService()}); - new ErrorDialog(null, msgText, - GuiActivator.getResources().getI18NString( - "service.gui.NETWORK_FAILURE"), e1) - .showDialog(); + GlobalDisplayDetailsActivator.getAlertUIService() + .showAlertDialog( + msgText, + GlobalDisplayDetailsActivator.getResources() + .getI18NString("service.gui.NETWORK_FAILURE"), + e1); } else if (e1.getErrorCode() == OperationFailedException.PROVIDER_NOT_REGISTERED) { String msgText = - GuiActivator.getResources().getI18NString( + GlobalDisplayDetailsActivator.getResources() + .getI18NString( "service.gui.STATUS_CHANGE_NETWORK_FAILURE", new String[]{ protocolProvider.getAccountID().getUserID(), protocolProvider.getAccountID().getService()}); - new ErrorDialog(null, - GuiActivator.getResources().getI18NString( - "service.gui.NETWORK_FAILURE"), msgText, e1) - .showDialog(); + GlobalDisplayDetailsActivator.getAlertUIService() + .showAlertDialog( + GlobalDisplayDetailsActivator.getResources() + .getI18NString("service.gui.NETWORK_FAILURE"), + msgText, + e1); } logger.error("Error - changing status", e1); } diff --git a/src/net/java/sip/communicator/impl/globaldisplaydetails/globaldisplaydetails.manifest.mf b/src/net/java/sip/communicator/impl/globaldisplaydetails/globaldisplaydetails.manifest.mf index 102ea9d26..91c101ec1 100644 --- a/src/net/java/sip/communicator/impl/globaldisplaydetails/globaldisplaydetails.manifest.mf +++ b/src/net/java/sip/communicator/impl/globaldisplaydetails/globaldisplaydetails.manifest.mf @@ -10,7 +10,9 @@ Import-Package: org.jitsi.service.resources, org.osgi.framework, org.jitsi.util, net.java.sip.communicator.service.protocol, + net.java.sip.communicator.service.protocol.globalstatus, net.java.sip.communicator.service.protocol.event, + net.java.sip.communicator.service.gui, net.java.sip.communicator.util.account Export-Package: net.java.sip.communicator.service.globaldisplaydetails, net.java.sip.communicator.service.globaldisplaydetails.event diff --git a/src/net/java/sip/communicator/impl/gui/GuiActivator.java b/src/net/java/sip/communicator/impl/gui/GuiActivator.java index 446d65a78..c8b7fb41d 100644 --- a/src/net/java/sip/communicator/impl/gui/GuiActivator.java +++ b/src/net/java/sip/communicator/impl/gui/GuiActivator.java @@ -10,7 +10,6 @@ import net.java.sip.communicator.impl.gui.main.account.*; import net.java.sip.communicator.impl.gui.main.contactlist.*; -import net.java.sip.communicator.impl.gui.main.presence.*; import net.java.sip.communicator.impl.gui.utils.*; import net.java.sip.communicator.service.browserlauncher.*; import net.java.sip.communicator.service.callhistory.*; @@ -136,13 +135,6 @@ public void start(BundleContext bContext) try { - if (logger.isInfoEnabled()) - logger.info("GlobalStatus Service ...[REGISTERED]"); - - bundleContext.registerService(GlobalStatusService.class.getName(), - new GlobalStatusServiceImpl(), - null); - alertUIService = new AlertUIServiceImpl(); // Registers an implementation of the AlertUIService. bundleContext.registerService( AlertUIService.class.getName(), diff --git a/src/net/java/sip/communicator/service/gui/UIService.java b/src/net/java/sip/communicator/service/gui/UIService.java index 9ad472c51..68ab90734 100644 --- a/src/net/java/sip/communicator/service/gui/UIService.java +++ b/src/net/java/sip/communicator/service/gui/UIService.java @@ -14,6 +14,7 @@ import net.java.sip.communicator.service.contactlist.*; import net.java.sip.communicator.service.gui.event.*; import net.java.sip.communicator.service.protocol.*; +import net.java.sip.communicator.util.account.*; /** * The UIService offers generic access to the graphical user interface @@ -465,4 +466,11 @@ public ContactList createContactListComponent( * @return a collection of all currently in progress calls. */ public Collection getInProgressCalls(); + + /** + * Returns the login manager used by the current UI implementation. + * + * @return the login manager used by the current UI implementation + */ + public LoginManager getLoginManager(); } diff --git a/src/net/java/sip/communicator/service/gui/gui.manifest.mf b/src/net/java/sip/communicator/service/gui/gui.manifest.mf index 7778af2a2..5bbfcbcce 100644 --- a/src/net/java/sip/communicator/service/gui/gui.manifest.mf +++ b/src/net/java/sip/communicator/service/gui/gui.manifest.mf @@ -8,6 +8,7 @@ Import-Package: org.osgi.framework, org.jitsi.service.resources, net.java.sip.communicator.service.resources, net.java.sip.communicator.util, + net.java.sip.communicator.util.account, net.java.sip.communicator.service.contactsource, net.java.sip.communicator.service.contactlist, net.java.sip.communicator.service.protocol diff --git a/src/net/java/sip/communicator/service/protocol/globalstatus/GlobalStatusEnum.java b/src/net/java/sip/communicator/service/protocol/globalstatus/GlobalStatusEnum.java index 95650df10..ac039aeab 100644 --- a/src/net/java/sip/communicator/service/protocol/globalstatus/GlobalStatusEnum.java +++ b/src/net/java/sip/communicator/service/protocol/globalstatus/GlobalStatusEnum.java @@ -34,12 +34,12 @@ public class GlobalStatusEnum /** * Indicates that the user is connected and eager to communicate. */ - public static final String FREE_FOR_CHAT_STATUS = "FreeForChat"; + public static final String FREE_FOR_CHAT_STATUS = "Free For Chat"; /** * Indicates that the user is connected and eager to communicate. */ - public static final String DO_NOT_DISTURB_STATUS = "DoNotDisturb"; + public static final String DO_NOT_DISTURB_STATUS = "Do Not Disturb"; /** * The Online status. Indicate that the user is able and willing to