/* * 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.plugin.busylampfield; import net.java.sip.communicator.service.contactsource.*; import net.java.sip.communicator.service.customcontactactions.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.event.*; import net.java.sip.communicator.util.*; import org.jitsi.service.configuration.*; import org.osgi.framework.*; import java.util.*; /** * OSGi Activator for the Busy Lamp Field Plugin. * * @author Damian Minkov */ public class BLFActivator implements BundleActivator, ServiceListener, BLFStatusListener { /** * The bundle context. */ static BundleContext bundleContext; /** * Property to enable/disable this plugin. */ private static final String BLF_PLUGIN_ENABLED = "net.java.sip.communicator.plugin.busylampfield.ENABLED"; /** * The name of default group name if none is present. */ private static final String BLF_DEFAULT_GROUP_NAME = "Monitored Lines"; /** * List of currently registered contact source services for the * corresponding group. */ private Map<String, ServiceRegistration<ContactSourceService>> currentBLFGroups = new LinkedHashMap <String, ServiceRegistration<ContactSourceService>>(); /** * Starts implementation. * * @param bundleContext * @throws Exception */ @Override public void start(BundleContext bundleContext) throws Exception { ConfigurationService config = ServiceUtils.getService( bundleContext, ConfigurationService.class); if(!config.getBoolean(BLF_PLUGIN_ENABLED, false)) return; BLFActivator.bundleContext = bundleContext; bundleContext.addServiceListener(this); initProviders(); bundleContext.registerService( CustomContactActionsService.class.getName(), new CustomActionsBLFSourceContact(), null ); } /** * Stops. * @param bundleContext * @throws Exception */ @Override public void stop(BundleContext bundleContext) throws Exception {} /** * Listens for registered providers. * @param serviceEvent */ @Override public void serviceChanged(ServiceEvent serviceEvent) { ServiceReference<?> serviceRef = serviceEvent.getServiceReference(); // if the event is caused by a bundle being stopped, we don't want to // know if(serviceRef.getBundle().getState() == Bundle.STOPPING) return; Object service = bundleContext.getService(serviceRef); // we don't care if the source service is not a protocol provider if(!(service instanceof ProtocolProviderService)) return; switch(serviceEvent.getType()) { case ServiceEvent.REGISTERED: handleProviderAdded((ProtocolProviderService) service); break; case ServiceEvent.UNREGISTERING: handleProviderRemoved((ProtocolProviderService) service); break; } } /** * Initializes all currently registered protocol providers that contain * the desired operation set. */ private void initProviders() { for(ServiceReference<ProtocolProviderService> serRef : ServiceUtils.getServiceReferences( bundleContext, ProtocolProviderService.class)) { handleProviderAdded(bundleContext.getService(serRef)); } } /** * Adds a protocol provider, when such provider is registered. * * @param protocolProvider the <tt>ProtocolProviderService</tt> to add */ private void handleProviderAdded(ProtocolProviderService protocolProvider) { OperationSetTelephonyBLF opset = protocolProvider.getOperationSet(OperationSetTelephonyBLF.class); if(opset == null) return; opset.addStatusListener(this); for(OperationSetTelephonyBLF.Line line : opset.getCurrentlyMonitoredLines()) { String groupName = line.getGroup(); if(groupName == null) groupName = BLF_DEFAULT_GROUP_NAME; ServiceRegistration<ContactSourceService> serviceReg = currentBLFGroups.get(groupName); if(serviceReg != null) { BLFContactSourceService css = (BLFContactSourceService)bundleContext.getService( serviceReg.getReference()); css.addLine(line); continue; } else { BLFContactSourceService css = new BLFContactSourceService( groupName, currentBLFGroups.size() + 1); serviceReg = bundleContext.registerService( ContactSourceService.class, css, null); currentBLFGroups.put(groupName, serviceReg); css.addLine(line); } } } /** * Removes a protocol provider from the list when unregistered. * @param protocolProvider the <tt>ProtocolProviderService</tt> to remove */ private void handleProviderRemoved(ProtocolProviderService protocolProvider) { OperationSetTelephonyBLF opset = protocolProvider.getOperationSet(OperationSetTelephonyBLF.class); if(opset == null) return; opset.removeStatusListener(this); for(OperationSetTelephonyBLF.Line line : opset.getCurrentlyMonitoredLines()) { String groupName = line.getGroup(); if(groupName == null) groupName = BLF_DEFAULT_GROUP_NAME; ServiceRegistration<ContactSourceService> serviceReg = currentBLFGroups.remove(groupName); if(serviceReg == null) continue; serviceReg.unregister(); } } /** * Called whenever a change occurs in the BLFStatus of one of the * monitored lines that we have subscribed for. * @param event the BLFStatusEvent describing the status change. */ @Override public void blfStatusChanged(BLFStatusEvent event) { if(!(event.getSource() instanceof OperationSetTelephonyBLF.Line)) return; OperationSetTelephonyBLF.Line line = (OperationSetTelephonyBLF.Line)event.getSource(); String gr = line.getGroup(); if(gr == null) gr = BLF_DEFAULT_GROUP_NAME; ServiceRegistration<ContactSourceService> serviceReg = currentBLFGroups.get(gr); if(serviceReg == null) return; BLFContactSourceService css = (BLFContactSourceService)bundleContext.getService( serviceReg.getReference()); css.updateLineStatus(line, event.getType()); } }