/*
* 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.impl.neomedia;
import java.beans.*;
import java.util.*;
import net.java.sip.communicator.service.gui.*;
import net.java.sip.communicator.service.notification.*;
import net.java.sip.communicator.service.systray.event.*;
import net.java.sip.communicator.util.*;
/**
* An abstract listener to the click on the popup message concerning
* device configuration changes.
*
* @author Vincent Lucas
*/
public abstract class AbstractDeviceConfigurationListener
implements PropertyChangeListener,
SystrayPopupMessageListener
{
/**
* The audio or video configuration form.
*/
private final ConfigurationForm configurationForm;
/**
* A boolean used to verify that this listener registers only once to
* the popup message notification handler.
*/
private boolean isRegisteredToPopupMessageListener = false;
/**
* Creates an abstract listener to the click on the popup message concerning
* device configuration changes.
*
* @param configurationForm The audio or video configuration form.
*/
public AbstractDeviceConfigurationListener(
ConfigurationForm configurationForm)
{
this.configurationForm = configurationForm;
}
/**
* Adds/removes this instance as a PopupMessageListener to/from the
* NotificationService in order to be able to detect when the user
* clicks on a pop-up notification displayed by this instance.
*
* @param add true to add this instance as a
* PopupMessageListener to the NotificationService or
* false to remove it
*/
private void addOrRemovePopupMessageListener(boolean add)
{
Iterator notificationHandlers
= NeomediaActivator.getNotificationService()
.getActionHandlers(NotificationAction.ACTION_POPUP_MESSAGE)
.iterator();
while(notificationHandlers.hasNext())
{
NotificationHandler notificationHandler
= notificationHandlers.next();
if(notificationHandler instanceof PopupMessageNotificationHandler)
{
PopupMessageNotificationHandler popupMessageNotificationHandler
= (PopupMessageNotificationHandler) notificationHandler;
if(add)
{
popupMessageNotificationHandler.addPopupMessageListener(
this);
}
else
{
popupMessageNotificationHandler.removePopupMessageListener(
this);
}
}
}
}
/**
* Releases the resources acquired by this instance throughout its lifetime,
* uninstalls the listeners it has installed and, generally, prepares it for
* garbage collection.
*/
public void dispose()
{
addOrRemovePopupMessageListener(false);
}
/**
* Indicates that user has clicked on the systray popup message.
*
* @param ev the event triggered when user clicks on the systray popup
* message
*/
public void popupMessageClicked(SystrayPopupMessageEvent ev)
{
// Checks if this event is fired from one click on one of our popup
// message.
if(ev.getTag() == this)
{
// Get the UI service
UIService uiService
= ServiceUtils.getService(
NeomediaActivator.getBundleContext(),
UIService.class);
if(uiService != null)
{
// Shows the audio configuration window.
ConfigurationContainer configurationContainer
= uiService.getConfigurationContainer();
configurationContainer.setSelected(configurationForm);
configurationContainer.setVisible(true);
}
}
}
/**
* Function called when an audio device is plugged or unplugged.
*
* @param ev The property change event which may concern the audio device
*/
public abstract void propertyChange(PropertyChangeEvent ev);
/**
* Shows a pop-up notification corresponding to a device configuration
* change.
*
* @param title The title of the pop-up notification.
* @param body A body text describing the device modifications.
* @param popUpEvent The event for a device which has fired this
* notification: connected, disconnected or selected.
*/
public void showPopUpNotification(
String title,
String body,
String popUpEvent)
{
// Shows the pop-up notification.
if(title != null && body != null && popUpEvent != null)
{
NotificationService notificationService
= NeomediaActivator.getNotificationService();
if(notificationService != null)
{
// Registers only once to the popup message notification
// handler.
if(!isRegisteredToPopupMessageListener)
{
isRegisteredToPopupMessageListener = true;
addOrRemovePopupMessageListener(true);
}
// Fires the popup notification.
Map extras = new HashMap();
extras.put(
NotificationData.POPUP_MESSAGE_HANDLER_TAG_EXTRA,
this);
notificationService.fireNotification(
popUpEvent,
title,
body
+ "\r\n\r\n"
+ NeomediaActivator.getResources().getI18NString(
"impl.media.configform"
+ ".AUDIO_DEVICE_CONFIG_MANAGMENT_CLICK"),
null,
extras);
}
}
}
}