/*
* 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.gui.main.call;
import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.service.protocol.event.*;
import net.java.sip.communicator.service.protocol.media.*;
import org.jitsi.service.neomedia.*;
import javax.swing.*;
import javax.swing.plaf.*;
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
/**
* <tt>FullScreenShareIndicator</tt> take care of always on top dialog
* shown when we are sharing our fullscreen. This way when users go to other
* application can still see an indication that their screen is shared, so
* don't show sensitive information.
* We use the java setAlwaysOnTop which is reported to be not working when
* using fullscreen, for example if you enter fullscreen of the call (but
* as you are sharing your screen it doesn't make sense). It also stops working
* if other app goes in always on top, like when using windows you open task
* manager and it is set as always on top, our indicator dialog will stop to
* be always on top.
*
* @author Damian Minkov
*/
public class FullScreenShareIndicator
extends CallChangeAdapter
implements PropertyChangeListener
{
/**
* The call to take care of.
*/
private final Call call;
/**
* The dialog that is shown, otherwise null.
*/
private JDialog dialog = null;
/**
* Constructs the indicator and adds the appropriate listeners.
* @param call
*/
FullScreenShareIndicator(Call call)
{
this.call = call;
if(call instanceof MediaAwareCall)
{
((MediaAwareCall)call).addVideoPropertyChangeListener(this);
}
call.addCallChangeListener(this);
}
/**
* Listens for vide change events of local video straming in mesia case
* desktop, whether we need to start and show the dialog, or if already
* shown to close it.
* @param evt the video event
*/
@Override
public void propertyChange(PropertyChangeEvent evt)
{
if(!evt.getPropertyName()
.equals(OperationSetVideoTelephony.LOCAL_VIDEO_STREAMING)
|| (call instanceof MediaAwareCall
&& ((MediaAwareCall)call).getMediaUseCase()
!= MediaUseCase.DESKTOP))
return;
Object newValue = evt.getNewValue();
Object oldValue = evt.getOldValue();
// and if there is no frame shown for region desktop sharing
if((oldValue == null || oldValue == MediaDirection.RECVONLY)
&& newValue == MediaDirection.SENDRECV
&& DesktopSharingFrame.getFrameForCall(call) == null)
{
showDialog();
}
else if(oldValue == MediaDirection.SENDRECV
&& (newValue == null || newValue == MediaDirection.RECVONLY))
{
closeDialog();
}
}
/**
* Listens whether we need to show or hide the dialog.
* @param ev
*/
@Override
public void callStateChanged(CallChangeEvent ev)
{
if(!CallChangeEvent.CALL_STATE_CHANGE
.equals(ev.getPropertyName()))
return;
Object newValue = ev.getNewValue();
if(CallState.CALL_INITIALIZATION.equals(newValue)
|| CallState.CALL_IN_PROGRESS.equals(newValue))
{
showDialog();
}
else if(CallState.CALL_ENDED.equals(newValue))
{
ev.getSourceCall().removeCallChangeListener(this);
if(call instanceof MediaAwareCall)
{
((MediaAwareCall)call)
.removeVideoPropertyChangeListener(this);
}
closeDialog();
}
}
/**
* Creates and shows the dialog if not already created.
*/
private void showDialog()
{
if(dialog != null)
return;
dialog = new JDialog((Window) null)
{
@Override
public void setVisible(boolean b)
{
setLocationByPlatform(false);
Dimension screenSize =
Toolkit.getDefaultToolkit().getScreenSize();
setLocation(screenSize.width/2 - getWidth()/2,
getLocation().y);
super.setVisible(b);
}
};
dialog.setUndecorated(true);
dialog.getRootPane().setWindowDecorationStyle(JRootPane.NONE);
dialog.setAlwaysOnTop(true);
JLabel label = new JLabel(
GuiActivator.getResources()
.getI18NString("service.gui.DESKTOP_SHARING_DIALOG_INDICATE"));
label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 8));
Color backgroundColor =
new ColorUIResource(GuiActivator.getResources().
getColor("service.gui.DESKTOP_BACKGROUND"));
JPanel panel = new JPanel(new FlowLayout());
panel.setBackground(backgroundColor);
JPanel linePanel = new TransparentPanel(new BorderLayout());
linePanel.add(label, BorderLayout.CENTER);
linePanel.setBorder(
BorderFactory.createMatteBorder(0, 0, 0, 1, Color.lightGray));
panel.add(linePanel);
SIPCommTextButton stopButton = new SIPCommTextButton("Stop");
stopButton.setBackground(backgroundColor);
panel.add(stopButton);
stopButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
if (CallManager.isDesktopSharingEnabled(call))
{
CallManager.enableDesktopSharing(call, false);
}
}
});
panel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10));
dialog.getContentPane().add(panel);
dialog.pack();
dialog.setVisible(true);
}
/**
* Closes and clears the dialog instance.
*/
private void closeDialog()
{
if(dialog != null)
{
dialog.setVisible(false);
dialog = null;
}
}
}