/* * 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 javax.media.*; import net.java.sip.communicator.service.gui.*; import org.jitsi.impl.neomedia.device.*; import org.jitsi.service.resources.*; /** * A listener to the click on the popup message concerning audio * device configuration changes. * * @author Vincent Lucas */ public class AudioDeviceConfigurationListener extends AbstractDeviceConfigurationListener { /** * The last PropertyChangeEvent about an audio capture device which * has been received. */ private PropertyChangeEvent capturePropertyChangeEvent; /** * The last PropertyChangeEvent about an audio notification device * which has been received. */ private PropertyChangeEvent notifyPropertyChangeEvent; /** * The last PropertyChangeEvent about an audio playback device * which has been received. */ private PropertyChangeEvent playbackPropertyChangeEvent; /** * Creates a listener to the click on the popup message concerning audio * device configuration changes. * * @param configurationForm The audio or video configuration form. */ public AudioDeviceConfigurationListener( ConfigurationForm configurationForm) { super(configurationForm); } /** * Notifies this instance that a property related to the configuration of * devices has had its value changed and thus signals that an audio device * may have been plugged or unplugged. * * @param ev a PropertyChangeEvent which describes the name of the * property whose value has changed and the old and new values of that * property */ @Override public void propertyChange(PropertyChangeEvent ev) { String propertyName = ev.getPropertyName(); /* * The list of available capture, notification and/or playback devices * has changes. */ if (DeviceConfiguration.PROP_AUDIO_SYSTEM_DEVICES.equals(propertyName)) { @SuppressWarnings("unchecked") List oldDevices = (List) ev.getOldValue(); @SuppressWarnings("unchecked") List newDevices = (List) ev.getNewValue(); if (oldDevices.isEmpty()) oldDevices = null; if (newDevices.isEmpty()) newDevices = null; String title; ResourceManagementService r = NeomediaActivator.getResources(); List devices; boolean removal; // At least one new device has been connected. if(newDevices != null) { title = r.getI18NString( "impl.media.configform.AUDIO_DEVICE_CONNECTED"); devices = newDevices; removal = false; } /* * At least one old device has been disconnected and no new device * has been connected. */ else if(oldDevices != null) { title = r.getI18NString( "impl.media.configform.AUDIO_DEVICE_DISCONNECTED"); devices = oldDevices; removal = true; } else { /* * Neither a new device has been connected nor an old device has * been disconnected. Why are we even here in the first place * anyway? */ capturePropertyChangeEvent = null; notifyPropertyChangeEvent = null; playbackPropertyChangeEvent = null; return; } StringBuilder body = new StringBuilder(); for (CaptureDeviceInfo device : devices) body.append(device.getName()).append("\r\n"); DeviceConfiguration devConf = (DeviceConfiguration) ev.getSource(); AudioSystem audioSystem = devConf.getAudioSystem(); boolean selectedHasChanged = false; if (audioSystem != null) { if(capturePropertyChangeEvent != null) { CaptureDeviceInfo cdi = audioSystem.getSelectedDevice( AudioSystem.DataFlow.CAPTURE); if ((cdi != null) && !cdi.equals( capturePropertyChangeEvent.getOldValue())) { body.append("\r\n") .append(r.getI18NString( "impl.media.configform.AUDIO_DEVICE_SELECTED_AUDIO_IN")) .append("\r\n\t") .append(cdi.getName()); selectedHasChanged = true; } } if(playbackPropertyChangeEvent != null) { CaptureDeviceInfo cdi = audioSystem.getSelectedDevice( AudioSystem.DataFlow.PLAYBACK); if ((cdi != null) && !cdi.equals( playbackPropertyChangeEvent.getOldValue())) { body.append("\r\n") .append(r.getI18NString( "impl.media.configform.AUDIO_DEVICE_SELECTED_AUDIO_OUT")) .append("\r\n\t") .append(cdi.getName()); selectedHasChanged = true; } } if(notifyPropertyChangeEvent != null) { CaptureDeviceInfo cdi = audioSystem.getSelectedDevice( AudioSystem.DataFlow.NOTIFY); if ((cdi != null) && !cdi.equals( notifyPropertyChangeEvent.getOldValue())) { body.append("\r\n") .append(r.getI18NString( "impl.media.configform.AUDIO_DEVICE_SELECTED_AUDIO_NOTIFICATIONS")) .append("\r\n\t") .append(cdi.getName()); selectedHasChanged = true; } } } capturePropertyChangeEvent = null; notifyPropertyChangeEvent = null; playbackPropertyChangeEvent = null; /* * If an old device has been disconnected and no new device has been * connected, show a notification only if any selected device has * changed. */ if (!removal || selectedHasChanged) { showPopUpNotification( title, body.toString(), NeomediaActivator.DEVICE_CONFIGURATION_HAS_CHANGED); } } /* * A new capture, notification or playback devices has been selected. * We will not show a notification, we will remember to report the * change after the batch of changes completes. */ else if(CaptureDevices.PROP_DEVICE.equals(propertyName)) { capturePropertyChangeEvent = ev; } else if(NotifyDevices.PROP_DEVICE.equals(propertyName)) { notifyPropertyChangeEvent = ev; } else if(PlaybackDevices.PROP_DEVICE.equals(propertyName)) { playbackPropertyChangeEvent = ev; } } }