/*
* 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.splashscreen;
import org.osgi.framework.*;
import java.awt.*;
/**
* Activates if splash screen is available to draw progress and
* currently loading bundle name.
*
* @author Damian Minkov
*/
public class SplashScreenActivator
implements BundleActivator,
ServiceListener
{
/**
* A reference to the bundle context that is currently in use.
*/
private BundleContext bundleContext = null;
/**
* The splash screen if any.
*/
private SplashScreen splash;
/**
* The splash screen graphics.
*/
private Graphics2D g;
/**
* Progress so far.
*/
private int progress = 0;
/**
* The colors.
*/
private Color TEXT_BACKGROUND = new Color(203, 202, 202);
private Color TEXT_FOREGROUND = new Color(82, 82, 82);
private Color PROGRESS_FOREGROUND = new Color(177, 174, 173);
/**
* Starts if the splash screen is available.
*
* @throws Exception if starting the arg delegation bundle and registering
* the delegationPeer with the util package URI manager fails
*/
public void start(BundleContext bundleContext)
{
this.bundleContext = bundleContext;
splash = SplashScreen.getSplashScreen();
if(splash == null)
return;
g = splash.createGraphics();
if(g == null)
return;
bundleContext.addServiceListener(this);
}
/**
* Unsets the listener that we set when we start this bundle.
*
* @param bc an instance of the currently valid bundle context.
*/
public void stop(BundleContext bc)
{
bc.removeServiceListener(this);
this.g = null;
this.splash = null;
TEXT_BACKGROUND = null; TEXT_FOREGROUND = null;
PROGRESS_FOREGROUND = null;
}
@Override
public void serviceChanged(ServiceEvent serviceEvent)
{
if(splash == null)
return;
synchronized(splash)
{
try
{
if(!splash.isVisible())
{
stop(bundleContext);
return;
}
Bundle bundle =
serviceEvent.getServiceReference().getBundle();
if(bundle == null)
return;
Object bundleName =
bundle.getHeaders().get(Constants.BUNDLE_NAME);
if(bundleName == null)
return;
// If the main frame was set visible, the splash screen was/will
// be closed by Java automatically. Otherwise we need to do that
// manually.
Object service =
bundleContext
.getService(serviceEvent.getServiceReference());
if (service.getClass().getSimpleName().equals("UIServiceImpl"))
{
splash.close();
stop(bundleContext);
return;
}
bundleContext.ungetService(serviceEvent.getServiceReference());
progress++;
int progressWidth = 233;
int progressHeight = 14;
int progressX = 168;
int progressY = 97;
int textHeight = 20;
int textBaseX = 150;
int textBaseY = 145 + (50 - textHeight)/2 + textHeight;
int currentProgressWidth = Math.min(2*progress, progressWidth);
g.setComposite(AlphaComposite.Clear);
g.setPaintMode();
// first clear the space for text
g.setColor(TEXT_BACKGROUND);
g.clearRect(
textBaseX - 1,// -1 to clear a pix left from some txt
textBaseY - textHeight,
(int) this.splash.getBounds().getWidth() - textBaseX,
textHeight + 5);
g.fillRect(
textBaseX - 1,// -1 to clear a pix left from some txt
textBaseY - textHeight,
(int) this.splash.getBounds().getWidth() - textBaseX,
textHeight + 5);
// then fill the progress
g.setColor(PROGRESS_FOREGROUND);
g.fillRect(progressX, progressY,
currentProgressWidth, progressHeight);
g.drawRect(progressX, progressY,
currentProgressWidth, progressHeight);
g.setRenderingHint(
RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g.setColor(TEXT_FOREGROUND);
g.drawString(bundleName.toString(), textBaseX, textBaseY);
splash.update();
}
catch(Throwable e)
{
stop(bundleContext);
return;
}
}
}
}