@ -3,10 +3,8 @@
*
* Distributable under LGPL license . See terms of license at gnu . org .
* /
package net.java.sip.communicator.impl.g ui.main.presence ;
package net.java.sip.communicator.impl.g lobaldisplaydetails ;
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
= G ui Activator. getConfigurationService ( ) ;
= G lobalDisplayDetails Activator. 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
= G ui Activator. getUIService ( ) . getLoginManager ( ) ;
= G lobalDisplayDetails Activator. getUIService ( ) . getLoginManager ( ) ;
RegistrationState registrationState
= protocolProvider . getRegistrationState ( ) ;
@ -147,7 +193,7 @@ else if (registrationState != RegistrationState.REGISTERED
& & registrationState ! = RegistrationState . AUTHENTICATING
& & status . isOnline ( ) )
{
G ui Activator. getUIService ( ) . getLoginManager ( )
G lobalDisplayDetails Activator. 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 ) ;
G ui Activator. getUIService ( ) . getLoginManager ( )
. login( protocolProvider ) ;
G lobalDisplayDetails Activator. 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
= G ui Activator. getConfigurationService ( ) ;
= G lobalDisplayDetails Activator. 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 ) ;
}