Fixes away and dnd status selection behavior when offline, in a way that

the accounts get connected. Fixes setting DND global status for SIP
accounts. Moves the GlobalStatusServiceImpl to the globaldetails bundle
in order to be easily used from jitsi-android.
cusax-fix
yanas 13 years ago
parent ae0e19fcb3
commit b91c31bc33

@ -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 <tt>AlertUIService</tt> obtained from the bundle
* context.
* @return the <tt>AlertUIService</tt> obtained from the bundle
* context
*/
public static AlertUIService getAlertUIService()
{
if(alertUIService == null)
{
alertUIService
= ServiceUtils.getService(
bundleContext,
AlertUIService.class);
}
return alertUIService;
}
/**
* Returns the <tt>UIService</tt> obtained from the bundle
* context.
* @return the <tt>UIService</tt> obtained from the bundle
* context
*/
public static UIService getUIService()
{
if(uiService == null)
{
uiService
= ServiceUtils.getService(
bundleContext,
UIService.class);
}
return uiService;
}
/**
* Implements the <tt>ServiceListener</tt> method. Verifies whether the
* passed event concerns a <tt>ProtocolProviderService</tt> and adds or

@ -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<PresenceStatus> 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<String> 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<ProtocolProviderService> 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<PresenceStatus> 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);
}

@ -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

@ -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(),

@ -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 <tt>UIService</tt> 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<Call> getInProgressCalls();
/**
* Returns the login manager used by the current UI implementation.
*
* @return the login manager used by the current UI implementation
*/
public LoginManager getLoginManager();
}

@ -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

@ -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

Loading…
Cancel
Save