/*
* 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 java.util.*;
import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.*;
import org.jitsi.service.neomedia.*;
import org.jitsi.service.neomedia.device.*;
/**
* Implements a button which starts/stops the streaming of the local video in a
* <tt>Call</tt> to the remote peer(s).
*
* @author Lyubomir Marinov
*/
public class LocalVideoButton
extends AbstractCallToggleButton
{
private static final long serialVersionUID = 0L;
/**
* The telephony conference to be depicted by this instance.
*/
private final CallConference callConference;
/**
* Initializes a new <tt>LocalVideoButton</tt> instance which is to
* start/stop the streaming of the local video to the remote peers
* participating in a specific telephony conference.
*
* @param call the <tt>Call</tt> which participates in the telephony
* conference to start/stop the streaming of the local video to the remote
* peers in
*/
public LocalVideoButton(Call call)
{
this(call, false);
}
/**
* Initializes a new <tt>LocalVideoButton</tt> instance which is to
* start/stop the streaming of the local video to the remote peers
* participating in a specific telephony conference.
*
* @param call the <tt>Call</tt> which participates in the telephony
* conference to start/stop the streaming of the local video to the remote
* peers in
* @param selected <tt>true</tt> if the new instance is to be initially
* selected; otherwise, <tt>false</tt>
*/
public LocalVideoButton(Call call, boolean selected)
{
super(
null,
true,
selected,
ImageLoader.LOCAL_VIDEO_BUTTON,
ImageLoader.LOCAL_VIDEO_BUTTON_PRESSED,
"service.gui.LOCAL_VIDEO_BUTTON_TOOL_TIP");
this.callConference = call.getConference();
}
/**
* Enables or disables local video when the button is toggled/untoggled.
*/
@Override
public void buttonPressed()
{
/*
* CallManager actually enables/disables the local video for the
* telephony conference associated with the Call so pick up a Call
* participating in callConference and it should do.
*/
List<Call> calls = callConference.getCalls();
if (!calls.isEmpty())
{
Call call = calls.get(0);
CallManager.enableLocalVideo(
call,
!CallManager.isLocalVideoEnabled(call));
}
}
/**
* Enables/disables the button. If <tt>this.videoAvailable</tt> is false,
* keeps the button as it is (i.e. disabled).
*
* @param enabled <tt>true</tt> to enable the button, <tt>false</tt> to
* disable it.
*/
@Override
public void setEnabled(boolean enabled)
{
/*
* Regardless of what CallPanel tells us about the enabled state of
* this LocalVideoButton, we have to analyze the state ourselves because
* we have to update the tool tip and take into account the global state
* of the application.
*/
MediaDevice videoDevice
= GuiActivator.getMediaService().getDefaultDevice(
MediaType.VIDEO,
MediaUseCase.CALL);
String toolTipTextKey;
boolean videoAvailable;
/* Check whether we can send video and set the appropriate tool tip. */
if((videoDevice == null)
|| !videoDevice.getDirection().allowsSending())
{
toolTipTextKey = "service.gui.NO_CAMERA_AVAILABLE";
videoAvailable = false;
}
else
{
boolean hasVideoTelephony = false;
boolean hasEnabledVideoFormat = false;
for (Call conferenceCall : callConference.getCalls())
{
ProtocolProviderService protocolProvider
= conferenceCall.getProtocolProvider();
if (!hasVideoTelephony)
{
OperationSetVideoTelephony videoTelephony
= protocolProvider.getOperationSet(
OperationSetVideoTelephony.class);
if (videoTelephony != null)
hasVideoTelephony = true;
}
if (!hasEnabledVideoFormat
&& ConfigurationUtils.hasEnabledVideoFormat(
protocolProvider))
{
hasEnabledVideoFormat = true;
}
if (hasVideoTelephony && hasEnabledVideoFormat)
break;
}
if (!hasVideoTelephony)
{
toolTipTextKey = "service.gui.NO_VIDEO_FOR_PROTOCOL";
videoAvailable = false;
}
else if(!hasEnabledVideoFormat)
{
toolTipTextKey = "service.gui.NO_VIDEO_ENCODINGS";
videoAvailable = false;
}
else
{
toolTipTextKey = "service.gui.LOCAL_VIDEO_BUTTON_TOOL_TIP";
videoAvailable = true;
}
}
setToolTipText(
GuiActivator.getResources().getI18NString(toolTipTextKey));
super.setEnabled(videoAvailable && enabled);
}
}