net.java.sip.communicator.impl.growlnotification.GrowlNotificationServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for net.java.sip.communicator.impl.growlnotification.GrowlNotificationServiceImpl.java

Source

/*
 * 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.growlnotification;

import net.java.sip.communicator.service.systray.*;
import net.java.sip.communicator.service.systray.event.*;
import net.java.sip.communicator.util.*;

import org.apache.commons.lang3.*;
import org.growl4j.*;
import org.jitsi.service.resources.*;
import org.osgi.framework.*;

/**
 * The Growl Notification Service displays on-screen information such as
 * messages or call received, etc.
 *
 * @author Romain Kuntz
 * @author Egidijus Jankauskas
 * @author Lyubomir Marinov
 */
public class GrowlNotificationServiceImpl extends AbstractPopupMessageHandler implements GrowlCallbacksListener {
    /**
     * The <tt>Logger</tt> used by the <tt>GrowlNotificationServiceImpl</tt>
     * class and its instance for logging output.
     */
    private static final Logger logger = Logger.getLogger(GrowlNotificationServiceImpl.class);

    /**
     * The notification type (in Growl terms) to be specified to
     * {@link Growl#notifyGrowlOf(String, String, String, byte[], Object)}
     * when called by {@link #showPopupMessage(PopupMessage)}.
     */
    private static final String SHOW_POPUP_MESSAGE_TYPE = "Default";

    /**
     * The <tt>Growl</tt> object.
     */
    private Growl growl;

    /**
     * Starts the service. Creates a Growl notifier, and check the current
     * registered protocol providers which supports BasicIM and adds message
     * listener to them.
     *
     * @param bc a currently valid bundle context
     */
    public void start(BundleContext bc) {
        if (logger.isDebugEnabled())
            logger.debug("Starting the Growl Notification implementation.");

        ResourceManagementService resources = GrowlNotificationActivator.getResources();
        byte[] sipIcon = resources.getImageInBytes("service.gui.SIP_COMMUNICATOR_LOGO_45x45");
        String[] dict = { SHOW_POPUP_MESSAGE_TYPE };

        growl = new Growl(resources.getSettingsString("service.gui.APPLICATION_NAME"), "net.sip-communicator",
                sipIcon, dict, dict);
        growl.addClickedNotificationsListener(this);
    }

    /**
     * Stops the service.
     *
     * @param bc BundleContext
     */
    public void stop(BundleContext bc) {
        if (growl != null) {
            growl.doFinalCleanUp();
            growl = null;
        }
    }

    /**
     * Implements <tt>PopupMessageHandler#showPopupMessage()</tt>
     *
     * @param popupMessage the message we will show
     */
    public void showPopupMessage(PopupMessage popupMessage) {
        String messageBody = popupMessage.getMessage();
        String messageTitle = popupMessage.getMessageTitle();

        // remove eventual HTML code before showing the pop-up message
        messageBody = messageBody.replaceAll("</?\\w++[^>]*+>", "");
        messageTitle = messageTitle.replaceAll("</?\\w++[^>]*+>", "");

        // unescape any chars that can be escaped inside the text
        messageBody = StringEscapeUtils.unescapeHtml4(messageBody);
        messageTitle = StringEscapeUtils.unescapeHtml4(messageTitle);

        growl.notifyGrowlOf(messageTitle, messageBody, SHOW_POPUP_MESSAGE_TYPE, popupMessage.getIcon(),
                popupMessage.getTag());
    }

    /**
     * This method is called by Growl when the Growl notification is not clicked
     *
     * @param context an object identifying the notification
     */
    public void growlNotificationTimedOut(Object context) {
        if (logger.isTraceEnabled())
            logger.trace("Growl notification timed out: " + context);
    }

    /**
     * This method is called by Growl when the Growl notification is clicked
     *
     * @param context an object identifying the notification
     */
    public void growlNotificationWasClicked(final Object context) {
        // release the native thread
        new Thread(new Runnable() {
            public void run() {
                firePopupMessageClicked(new SystrayPopupMessageEvent(this, context));
                if (logger.isTraceEnabled())
                    logger.trace("Growl notification clicked: " + context);
            }
        }).start();
    }

    /**
     * Implements <tt>toString</tt> from <tt>PopupMessageHandler</tt>.
     *
     * @return a description of this handler
     */
    @Override
    public String toString() {
        return GrowlNotificationActivator.getResources()
                .getI18NString("impl.growlnotification.POPUP_MESSAGE_HANDLER");
    }

    /**
     * Implements <tt>getPreferenceIndex</tt> from <tt>PopupMessageHandler</tt>.
     * This handler is able to show images, detect clicks, match a click to a
     * message, and use a native popup mechanism, thus the index is 4.
     *
     * @return a preference index
     */
    public int getPreferenceIndex() {
        return 4;
    }
}