diff --git a/src/net/java/sip/communicator/impl/gui/GuiActivator.java b/src/net/java/sip/communicator/impl/gui/GuiActivator.java
index 6ca04b0ba..b80e8ac2d 100644
--- a/src/net/java/sip/communicator/impl/gui/GuiActivator.java
+++ b/src/net/java/sip/communicator/impl/gui/GuiActivator.java
@@ -8,10 +8,6 @@
import java.util.*;
-import javax.swing.*;
-
-import net.java.sip.communicator.impl.gui.main.*;
-import net.java.sip.communicator.impl.gui.main.login.*;
import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.service.audionotifier.*;
import net.java.sip.communicator.service.browserlauncher.*;
@@ -20,6 +16,7 @@
import net.java.sip.communicator.service.contactlist.*;
import net.java.sip.communicator.service.gui.*;
import net.java.sip.communicator.service.msghistory.*;
+import net.java.sip.communicator.service.notification.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.*;
@@ -30,9 +27,10 @@
*
* @author Yana Stamcheva
*/
-public class GuiActivator implements BundleActivator {
-
- private static Logger logger = Logger.getLogger(GuiActivator.class.getName());
+public class GuiActivator implements BundleActivator
+{
+ private static Logger logger
+ = Logger.getLogger(GuiActivator.class.getName());
private static UIServiceImpl uiService = null;
@@ -49,7 +47,9 @@ public class GuiActivator implements BundleActivator {
private static AudioNotifierService audioNotifierService;
private static BrowserLauncherService browserLauncherService;
-
+
+ private static NotificationService notificationService;
+
private static Map providerFactoriesMap = new Hashtable();
/**
@@ -61,6 +61,9 @@ public void start(BundleContext bundleContext) throws Exception {
GuiActivator.bundleContext = bundleContext;
+ NotificationManager.registerGuiNotifications();
+ bundleContext.addServiceListener(new NotificationServiceListener());
+
ConfigurationManager.loadGuiConfigurations();
try {
@@ -271,4 +274,63 @@ public static BrowserLauncherService getBrowserLauncher() {
public static UIServiceImpl getUIService() {
return uiService;
}
+
+ /**
+ * Returns the NotificationService obtained from the bundle context.
+ *
+ * @return the NotificationService obtained from the bundle context
+ */
+ public static NotificationService getNotificationService()
+ {
+ if (notificationService == null)
+ {
+ ServiceReference serviceReference = bundleContext
+ .getServiceReference(NotificationService.class.getName());
+
+ notificationService = (NotificationService) bundleContext
+ .getService(serviceReference);
+ }
+
+ return notificationService;
+ }
+
+ /**
+ * Implements the ServiceListener. Verifies whether the
+ * passed event concerns a NotificationService and if so
+ * intiates the gui NotificationManager.
+ */
+ private class NotificationServiceListener implements ServiceListener
+ {
+ /**
+ * Implements the ServiceListener method. Verifies whether the
+ * passed event concerns a NotificationService and if so
+ * initiates the NotificationManager.
+ *
+ * @param event The ServiceEvent object.
+ */
+ public void serviceChanged(ServiceEvent event)
+ {
+ // if the event is caused by a bundle being stopped, we don't want
+ // to know
+ if (event.getServiceReference().getBundle().getState()
+ == Bundle.STOPPING)
+ {
+ return;
+ }
+
+ Object service = GuiActivator.bundleContext.getService(event
+ .getServiceReference());
+
+ // we don't care if the source service is not a notification service
+ if (!(service instanceof NotificationService))
+ {
+ return;
+ }
+
+ if (event.getType() == ServiceEvent.REGISTERED)
+ {
+ NotificationManager.registerGuiNotifications();
+ }
+ }
+ }
}
diff --git a/src/net/java/sip/communicator/impl/gui/main/call/CallManager.java b/src/net/java/sip/communicator/impl/gui/main/call/CallManager.java
index 6a72e558d..966f5e86b 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/CallManager.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/CallManager.java
@@ -174,10 +174,8 @@ public void actionPerformed(ActionEvent evt)
.getCallState() == CallState.CALL_INITIALIZATION)
{
- GuiActivator.getAudioNotifier().createAudio(Sounds.BUSY).stop();
-
- GuiActivator.getAudioNotifier().createAudio(
- Sounds.INCOMING_CALL).stop();
+ NotificationManager.stopSound(NotificationManager.BUSY_CALL);
+ NotificationManager.stopSound(NotificationManager.INCOMING_CALL);
CallPanel callPanel = (CallPanel) selectedPanel;
@@ -283,11 +281,9 @@ else if (buttonName.equalsIgnoreCase("hangup"))
if (selectedPanel != null && selectedPanel instanceof CallPanel)
{
- GuiActivator.getAudioNotifier().createAudio(Sounds.BUSY).stop();
- GuiActivator.getAudioNotifier().createAudio(
- Sounds.INCOMING_CALL).stop();
- GuiActivator.getAudioNotifier().createAudio(
- Sounds.OUTGOING_CALL).stop();
+ NotificationManager.stopSound(NotificationManager.BUSY_CALL);
+ NotificationManager.stopSound(NotificationManager.INCOMING_CALL);
+ NotificationManager.stopSound(NotificationManager.OUTGOING_CALL);
CallPanel callPanel = (CallPanel) selectedPanel;
@@ -507,8 +503,11 @@ public void incomingCallReceived(CallEvent event)
this.callButton.setEnabled(true);
this.hangupButton.setEnabled(true);
- GuiActivator.getAudioNotifier().createAudio(Sounds.INCOMING_CALL)
- .playInLoop(2000);
+ NotificationManager.fireNotification(
+ Sounds.INCOMING_CALL,
+ null,
+ "Incoming call recived from: "
+ + sourceCall.getCallParticipants().next());
activeCalls.put(sourceCall, callPanel);
@@ -524,11 +523,9 @@ public void callEnded(CallEvent event)
{
Call sourceCall = event.getSourceCall();
- GuiActivator.getAudioNotifier().createAudio(Sounds.BUSY).stop();
- GuiActivator.getAudioNotifier().createAudio(Sounds.INCOMING_CALL)
- .stop();
- GuiActivator.getAudioNotifier().createAudio(Sounds.OUTGOING_CALL)
- .stop();
+ NotificationManager.stopSound(NotificationManager.BUSY_CALL);
+ NotificationManager.stopSound(NotificationManager.INCOMING_CALL);
+ NotificationManager.stopSound(NotificationManager.OUTGOING_CALL);
if (activeCalls.get(sourceCall) != null)
{
diff --git a/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java b/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java
index 4b967bfd2..e4ae2fb37 100644
--- a/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/call/CallPanel.java
@@ -297,24 +297,20 @@ public void participantStateChanged(CallParticipantChangeEvent evt)
if(evt.getNewValue() == CallParticipantState.ALERTING_REMOTE_SIDE)
{
- GuiActivator.getAudioNotifier()
- .createAudio(Sounds.OUTGOING_CALL).playInLoop(3000);
+ NotificationManager
+ .fireNotification(NotificationManager.OUTGOING_CALL);
}
else if(evt.getNewValue() == CallParticipantState.BUSY)
{
- GuiActivator.getAudioNotifier()
- .createAudio(Sounds.OUTGOING_CALL).stop();
+ NotificationManager.stopSound(NotificationManager.OUTGOING_CALL);
- GuiActivator.getAudioNotifier()
- .createAudio(Sounds.BUSY).playInLoop(0);
+ NotificationManager.fireNotification(NotificationManager.BUSY_CALL);
}
else if(evt.getNewValue() == CallParticipantState.CONNECTED) {
//start the timer that takes care of refreshing the time label
- GuiActivator.getAudioNotifier()
- .createAudio(Sounds.OUTGOING_CALL).stop();
- GuiActivator.getAudioNotifier()
- .createAudio(Sounds.INCOMING_CALL).stop();
+ NotificationManager.stopSound(NotificationManager.OUTGOING_CALL);
+ NotificationManager.stopSound(NotificationManager.INCOMING_CALL);
participantPanel.startCallTimer();
}
diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatInviteDialog.java b/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatInviteDialog.java
index 9e7bc1cba..7b744af28 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatInviteDialog.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/conference/ChatInviteDialog.java
@@ -119,7 +119,7 @@ public ChatInviteDialog (ChatPanel chatPanel)
}
/**
- * Handles the ActionEvent triggered when one user clicks
+ * Handles the ActionEvent triggered when user clicks
* on one of the buttons.
*/
public void actionPerformed(ActionEvent e)
diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/conference/MultiUserChatManager.java b/src/net/java/sip/communicator/impl/gui/main/chat/conference/MultiUserChatManager.java
index d105dd5b5..bc4f4239d 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chat/conference/MultiUserChatManager.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/conference/MultiUserChatManager.java
@@ -16,6 +16,7 @@
import net.java.sip.communicator.impl.gui.main.chatroomslist.*;
import net.java.sip.communicator.impl.gui.main.chatroomslist.joinforms.*;
import net.java.sip.communicator.impl.gui.utils.*;
+import net.java.sip.communicator.impl.systray.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.protocol.event.*;
import net.java.sip.communicator.util.*;
@@ -127,8 +128,14 @@ public void messageReceived(ChatRoomMessageReceivedEvent evt)
chatWindowManager.openChat(chatPanel, false);
- GuiActivator.getAudioNotifier()
- .createAudio(Sounds.INCOMING_MESSAGE).play();
+ // Fire notification
+ String title = Resources.getString("messageReceived") + " "
+ + sourceMember.getName();
+
+ NotificationManager.fireNotification(
+ NotificationManager.INCOMING_MESSAGE,
+ title,
+ message.getContent());
}
/**
diff --git a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPanel.java b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPanel.java
index 13e13cb53..0d7fd4679 100755
--- a/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPanel.java
+++ b/src/net/java/sip/communicator/impl/gui/main/contactlist/ContactListPanel.java
@@ -14,7 +14,6 @@
import javax.swing.*;
import javax.swing.Timer;
-import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.impl.gui.i18n.*;
import net.java.sip.communicator.impl.gui.main.*;
import net.java.sip.communicator.impl.gui.main.chat.*;
@@ -214,17 +213,20 @@ public void messageReceived(MessageReceivedEvent evt)
.findMetaContactByContact(protocolContact);
if(metaContact != null)
- {
- ContactListModel clistModel = (ContactListModel) contactList.getModel();
+ {
+ // Show an envelope on the sender contact in the contact list.
+ ContactListModel clistModel
+ = (ContactListModel) contactList.getModel();
+
clistModel.addActiveContact(metaContact);
contactList.refreshContact(metaContact);
+ // Obtain the corresponding chat panel.
ChatPanel chatPanel = chatWindowManager.getContactChat(
metaContact, protocolContact, message.getMessageUID());
// Distinguish the message type, depending on the type of event that
// we have received.
-
String messageType = null;
if(eventType == MessageReceivedEvent.CONVERSATION_MESSAGE_RECEIVED)
@@ -240,11 +242,18 @@ else if(eventType == MessageReceivedEvent.SYSTEM_MESSAGE_RECEIVED)
messageType, message.getContent(),
message.getContentType());
+ // Opens the chat panel with the new message.
chatWindowManager.openChat(chatPanel, false);
+
+ // Fire notification
+ String title = Messages.getI18NString("messageReceived").getText()
+ + " " + evt.getSourceContact().getDisplayName();
+
+ NotificationManager.fireNotification(
+ NotificationManager.INCOMING_MESSAGE,
+ title,
+ message.getContent());
- GuiActivator.getAudioNotifier()
- .createAudio(Sounds.INCOMING_MESSAGE).play();
-
chatPanel.treatReceivedMessage(protocolContact);
}
else
@@ -427,6 +436,15 @@ public void setChatNotificationMsg(MetaContact metaContact,
.setStatusMessage(notificationMsg);
}
+ /**
+ * Returns the right button menu of the contact list.
+ * @return the right button menu of the contact list
+ */
+ public CommonRightButtonMenu getCommonRightButtonMenu()
+ {
+ return commonRightButtonMenu;
+ }
+
/**
* The TypingTimer is started after a PAUSED typing notification is
* received. It waits 5 seconds and if no other typing event occurs removes
@@ -456,10 +474,5 @@ private void setMetaContact(MetaContact metaContact)
{
this.metaContact = metaContact;
}
- }
-
- public CommonRightButtonMenu getCommonRightButtonMenu()
- {
- return commonRightButtonMenu;
- }
+ }
}
diff --git a/src/net/java/sip/communicator/impl/gui/swing.ui.manifest.mf b/src/net/java/sip/communicator/impl/gui/swing.ui.manifest.mf
index e7293513a..166566266 100644
--- a/src/net/java/sip/communicator/impl/gui/swing.ui.manifest.mf
+++ b/src/net/java/sip/communicator/impl/gui/swing.ui.manifest.mf
@@ -21,6 +21,7 @@ Import-Package: org.osgi.framework,
net.java.sip.communicator.service.callhistory,
net.java.sip.communicator.service.callhistory.event,
net.java.sip.communicator.service.browserlauncher,
+ net.java.sip.communicator.service.notification,
javax.swing,
javax.swing.event,
javax.swing.table,
diff --git a/src/net/java/sip/communicator/impl/gui/utils/NotificationManager.java b/src/net/java/sip/communicator/impl/gui/utils/NotificationManager.java
new file mode 100644
index 000000000..d9ece4b87
--- /dev/null
+++ b/src/net/java/sip/communicator/impl/gui/utils/NotificationManager.java
@@ -0,0 +1,130 @@
+/*
+ * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package net.java.sip.communicator.impl.gui.utils;
+
+import java.util.*;
+
+import net.java.sip.communicator.impl.gui.*;
+import net.java.sip.communicator.service.notification.*;
+
+public class NotificationManager
+{
+ public static final String INCOMING_MESSAGE = "IncomingMessage";
+
+ public static final String INCOMING_CALL = "IncomingCall";
+
+ public static final String OUTGOING_CALL = "OutgoingCall";
+
+ public static final String BUSY_CALL = "BusyCall";
+
+ private static Hashtable soundHandlers = new Hashtable();
+
+ public static void registerGuiNotifications()
+ {
+ NotificationService notificationService
+ = GuiActivator.getNotificationService();
+
+ if(notificationService == null)
+ return;
+
+ // Register incoming message notifications.
+ notificationService.registerNotificationForEvent(
+ INCOMING_MESSAGE,
+ NotificationService.ACTION_POPUP_MESSAGE,
+ null,
+ null);
+
+ notificationService.registerNotificationForEvent(
+ INCOMING_MESSAGE,
+ NotificationService.ACTION_SOUND,
+ Sounds.INCOMING_MESSAGE,
+ null);
+
+ // Register incoming call notifications.
+ notificationService.registerNotificationForEvent(
+ INCOMING_CALL,
+ NotificationService.ACTION_POPUP_MESSAGE,
+ null,
+ null);
+
+ SoundNotificationHandler inCallSoundHandler
+ = (SoundNotificationHandler) notificationService
+ .createSoundNotificationHandler(Sounds.INCOMING_CALL, 2000);
+
+ notificationService.registerNotificationForEvent(
+ INCOMING_CALL,
+ NotificationService.ACTION_SOUND,
+ inCallSoundHandler);
+
+ soundHandlers.put(INCOMING_CALL, inCallSoundHandler);
+
+ // Register outgoing call notifications.
+ SoundNotificationHandler outCallSoundHandler
+ = (SoundNotificationHandler) notificationService
+ .createSoundNotificationHandler(Sounds.OUTGOING_CALL, 3000);
+
+ notificationService.registerNotificationForEvent(
+ OUTGOING_CALL,
+ NotificationService.ACTION_SOUND,
+ outCallSoundHandler);
+
+ soundHandlers.put(OUTGOING_CALL, outCallSoundHandler);
+
+ // Register busy call notifications.
+ SoundNotificationHandler busyCallSoundHandler
+ = (SoundNotificationHandler) notificationService
+ .createSoundNotificationHandler(Sounds.BUSY, 0);
+
+ notificationService.registerNotificationForEvent(
+ BUSY_CALL,
+ NotificationService.ACTION_SOUND,
+ busyCallSoundHandler);
+
+ soundHandlers.put(OUTGOING_CALL, outCallSoundHandler);
+
+ }
+
+ public static void fireNotification(String eventType,
+ String messageTitle,
+ String message)
+ {
+ NotificationService notificationService
+ = GuiActivator.getNotificationService();
+
+ if(notificationService == null)
+ return;
+
+ notificationService.fireNotification(eventType, messageTitle, message);
+ }
+
+ public static void fireNotification(String eventType)
+ {
+ NotificationService notificationService
+ = GuiActivator.getNotificationService();
+
+ if(notificationService == null)
+ return;
+
+ notificationService.fireNotification(eventType);
+ }
+
+ public static void stopSound(String eventType)
+ {
+ NotificationService notificationService
+ = GuiActivator.getNotificationService();
+
+ if(notificationService == null)
+ return;
+
+ SoundNotificationHandler soundHandler
+ = (SoundNotificationHandler) notificationService
+ .getEventNotificationActionHandler(
+ eventType, NotificationService.ACTION_SOUND);
+
+ soundHandler.stop();
+ }
+}
diff --git a/src/net/java/sip/communicator/impl/gui/utils/sounds.properties b/src/net/java/sip/communicator/impl/gui/utils/sounds.properties
index 8e851db11..8683a2483 100644
--- a/src/net/java/sip/communicator/impl/gui/utils/sounds.properties
+++ b/src/net/java/sip/communicator/impl/gui/utils/sounds.properties
@@ -1,19 +1,19 @@
-INCOMING_MESSAGE=net/java/sip/communicator/impl/gui/resources/sounds/ship-sink.wav
-INCOMING_CALL=net/java/sip/communicator/impl/gui/resources/sounds/incomingCall.wav
-OUTGOING_CALL=net/java/sip/communicator/impl/gui/resources/sounds/ring.wav
+INCOMING_MESSAGE=resources/sounds/ship-sink.wav
+INCOMING_CALL=resources/sounds/incomingCall.wav
+OUTGOING_CALL=resources/sounds/ring.wav
-DIAL_ZERO=net/java/sip/communicator/impl/gui/resources/sounds/one_1.wav
-DIAL_ONE=net/java/sip/communicator/impl/gui/resources/sounds/one_1.wav
-DIAL_TWO=net/java/sip/communicator/impl/gui/resources/sounds/two_2.wav
-DIAL_THREE=net/java/sip/communicator/impl/gui/resources/sounds/three_3.wav
-DIAL_FOUR=net/java/sip/communicator/impl/gui/resources/sounds/four_4.wav
-DIAL_FIVE=net/java/sip/communicator/impl/gui/resources/sounds/five_5.wav
-DIAL_SIX=net/java/sip/communicator/impl/gui/resources/sounds/six_6.wav
-DIAL_SEVEN=net/java/sip/communicator/impl/gui/resources/sounds/seven_7.wav
-DIAL_EIGHT=net/java/sip/communicator/impl/gui/resources/sounds/eight_8.wav
-DIAL_NINE=net/java/sip/communicator/impl/gui/resources/sounds/nine_9.wav
-DIAL_DIEZ=net/java/sip/communicator/impl/gui/resources/sounds/one_1.wav
-DIAL_STAR=net/java/sip/communicator/impl/gui/resources/sounds/one_1.wav
+DIAL_ZERO=resources/sounds/one_1.wav
+DIAL_ONE=resources/sounds/one_1.wav
+DIAL_TWO=resources/sounds/two_2.wav
+DIAL_THREE=resources/sounds/three_3.wav
+DIAL_FOUR=resources/sounds/four_4.wav
+DIAL_FIVE=resources/sounds/five_5.wav
+DIAL_SIX=resources/sounds/six_6.wav
+DIAL_SEVEN=resources/sounds/seven_7.wav
+DIAL_EIGHT=resources/sounds/eight_8.wav
+DIAL_NINE=resources/sounds/nine_9.wav
+DIAL_DIEZ=resources/sounds/one_1.wav
+DIAL_STAR=resources/sounds/one_1.wav
-DIALING=net/java/sip/communicator/impl/gui/resources/sounds/dialing.wav
-BUSY=net/java/sip/communicator/impl/gui/resources/sounds/busy.wav
\ No newline at end of file
+DIALING=resources/sounds/dialing.wav
+BUSY=resources/sounds/busy.wav
\ No newline at end of file