Merge pull request #1011 from PepperDash/hotfix/zoomroom-default-layout

Hotfix/zoomroom default layout
This commit is contained in:
Andrew Welker
2022-10-06 11:06:30 -06:00
committed by GitHub
8 changed files with 251 additions and 125 deletions

View File

@@ -1,61 +1,56 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Crestron.SimplSharp; using Crestron.SimplSharp;
namespace PepperDash.Essentials.Core namespace PepperDash.Essentials.Core
{ {
/// <summary> /// <summary>
/// Describes the functionality required to prompt a user to enter a password /// Describes the functionality required to prompt a user to enter a password
/// </summary> /// </summary>
public interface IPasswordPrompt public interface IPasswordPrompt
{ {
/// <summary> /// <summary>
/// Notifies when a password is required or is entered incorrectly /// Notifies when a password is required or is entered incorrectly
/// </summary> /// </summary>
event EventHandler<PasswordPromptEventArgs> PasswordRequired; event EventHandler<PasswordPromptEventArgs> PasswordRequired;
/// <summary>
/// Submits the password
/// </summary>
/// <param name="password"></param>
void SubmitPassword(string password);
/// <summary> /// <summary>
/// Cancels the password submission /// Submits the password
/// </summary> /// </summary>
void CancelPasswordPrompt(); /// <param name="password"></param>
} void SubmitPassword(string password);
}
public class PasswordPromptEventArgs : EventArgs
{ public class PasswordPromptEventArgs : EventArgs
/// <summary> {
/// Indicates if the last submitted password was incorrect /// <summary>
/// </summary> /// Indicates if the last submitted password was incorrect
public bool LastAttemptWasIncorrect { get; private set; } /// </summary>
public bool LastAttemptWasIncorrect { get; private set; }
/// <summary>
/// Indicates that the login attempt has failed /// <summary>
/// </summary> /// Indicates that the login attempt has failed
public bool LoginAttemptFailed { get; private set; } /// </summary>
public bool LoginAttemptFailed { get; private set; }
/// <summary>
/// Indicates that the process was cancelled and the prompt should be dismissed /// <summary>
/// </summary> /// Indicates that the process was cancelled and the prompt should be dismissed
public bool LoginAttemptCancelled { get; private set; } /// </summary>
public bool LoginAttemptCancelled { get; private set; }
/// <summary>
/// A message to be displayed to the user /// <summary>
/// </summary> /// A message to be displayed to the user
public string Message { get; private set; } /// </summary>
public string Message { get; private set; }
public PasswordPromptEventArgs(bool lastAttemptIncorrect, bool loginFailed, bool loginCancelled, string message)
{ public PasswordPromptEventArgs(bool lastAttemptIncorrect, bool loginFailed, bool loginCancelled, string message)
LastAttemptWasIncorrect = lastAttemptIncorrect; {
LoginAttemptFailed = loginFailed; LastAttemptWasIncorrect = lastAttemptIncorrect;
LoginAttemptCancelled = loginCancelled; LoginAttemptFailed = loginFailed;
Message = message; LoginAttemptCancelled = loginCancelled;
} Message = message;
} }
}
} }

View File

@@ -283,9 +283,10 @@ namespace PepperDash.Essentials.Core
foreach (var join in joins) foreach (var join in joins)
{ {
Debug.Console(0, Debug.Console(0,
@"Join Number: {0} | JoinSpan: '{1}' | Description: '{2}' | Type: '{3}' | Capabilities: '{4}'", @"Join Number: {0} | JoinSpan: '{1}' | JoinName: {2} | Description: '{3}' | Type: '{4}' | Capabilities: '{5}'",
join.Value.JoinNumber, join.Value.JoinNumber,
join.Value.JoinSpan, join.Value.JoinSpan,
join.Key,
String.IsNullOrEmpty(join.Value.AttributeName) ? join.Value.Metadata.Label : join.Value.AttributeName, String.IsNullOrEmpty(join.Value.AttributeName) ? join.Value.Metadata.Label : join.Value.AttributeName,
join.Value.Metadata.JoinType.ToString(), join.Value.Metadata.JoinType.ToString(),
join.Value.Metadata.JoinCapabilities.ToString()); join.Value.Metadata.JoinCapabilities.ToString());

View File

@@ -43,10 +43,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
[JsonProperty("isLocked", NullValueHandling = NullValueHandling.Ignore)] [JsonProperty("isLocked", NullValueHandling = NullValueHandling.Ignore)]
public Boolean IsLocked { get; private set; } public Boolean IsLocked { get; private set; }
[JsonProperty("isRecording", NullValueHandling = NullValueHandling.Ignore)] [JsonProperty("isRecording", NullValueHandling = NullValueHandling.Ignore)]
public Boolean IsRecording { get; private set; } public Boolean IsRecording { get; private set; }
[JsonProperty("canRecord", NullValueHandling = NullValueHandling.Ignore)]
public Boolean CanRecord { get; private set; }
public MeetingInfo(string id, string name, string host, string password, string shareStatus, bool isHost, bool isSharingMeeting, bool waitingForHost, bool isLocked, bool isRecording) public MeetingInfo(string id, string name, string host, string password, string shareStatus, bool isHost, bool isSharingMeeting, bool waitingForHost, bool isLocked, bool isRecording, bool canRecord)
{ {
Id = id; Id = id;
Name = name; Name = name;
@@ -57,7 +59,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
IsSharingMeeting = isSharingMeeting; IsSharingMeeting = isSharingMeeting;
WaitingForHost = waitingForHost; WaitingForHost = waitingForHost;
IsLocked = isLocked; IsLocked = isLocked;
IsRecording = isRecording; IsRecording = isRecording;
CanRecord = CanRecord;
} }
} }

View File

@@ -3,9 +3,9 @@
public interface IHasPresentationOnlyMeeting public interface IHasPresentationOnlyMeeting
{ {
void StartSharingOnlyMeeting(); void StartSharingOnlyMeeting();
void StartSharingOnlyMeeting(eSharingMeetingMode mode); void StartSharingOnlyMeeting(eSharingMeetingMode displayMode);
void StartSharingOnlyMeeting(eSharingMeetingMode mode, ushort duration); void StartSharingOnlyMeeting(eSharingMeetingMode displayMode, uint duration);
void StartSharingOnlyMeeting(eSharingMeetingMode mode, ushort duration, string password); void StartSharingOnlyMeeting(eSharingMeetingMode displayMode, uint duration, string password);
void StartNormalMeetingFromSharingOnlyMeeting(); void StartNormalMeetingFromSharingOnlyMeeting();
} }

View File

@@ -448,6 +448,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
private bool _isAirHostClientConnected; private bool _isAirHostClientConnected;
private bool _isSharingBlackMagic; private bool _isSharingBlackMagic;
private bool _isDirectPresentationConnected; private bool _isDirectPresentationConnected;
private bool _isBlackMagicConnected;
public string directPresentationPairingCode { get; set; } public string directPresentationPairingCode { get; set; }
@@ -484,7 +485,18 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
} }
} }
public bool isBlackMagicConnected { get; set; } public bool isBlackMagicConnected
{
get { return _isBlackMagicConnected; }
set
{
if (value != _isBlackMagicConnected)
{
_isBlackMagicConnected = value;
NotifyPropertyChanged("isBlackMagicConnected");
}
}
}
public bool isBlackMagicDataAvailable { get; set; } public bool isBlackMagicDataAvailable { get; set; }
public bool isDirectPresentationConnected public bool isDirectPresentationConnected
@@ -627,6 +639,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
// backer variables // backer variables
private bool _can_Switch_Speaker_View; private bool _can_Switch_Speaker_View;
private bool _can_Switch_Wall_View; private bool _can_Switch_Wall_View;
private bool _can_Switch_Strip_View;
private bool _can_Switch_Share_On_All_Screens; private bool _can_Switch_Share_On_All_Screens;
private bool _can_Switch_Floating_Share_Content; private bool _can_Switch_Floating_Share_Content;
private bool _is_In_First_Page; private bool _is_In_First_Page;
@@ -714,6 +727,23 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
} }
} }
[JsonProperty("can_Switch_Strip_View")]
public bool can_Switch_Strip_View
{
get
{
return _can_Switch_Strip_View;
}
set
{
if (value != _can_Switch_Strip_View)
{
_can_Switch_Strip_View = value;
NotifyPropertyChanged("can_Switch_Strip_View");
}
}
}
[JsonProperty("is_In_First_Page")] [JsonProperty("is_In_First_Page")]
public bool is_In_First_Page public bool is_In_First_Page
{ {
@@ -775,11 +805,43 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
public class CallRecordInfo : NotifiableObject public class CallRecordInfo : NotifiableObject
{ {
private bool _meetingIsBeingRecorded; private bool _meetingIsBeingRecorded;
private bool _canRecord;
private bool _emailRequired;
public bool canRecord { get; set; }
public bool emailRequired { get; set; }
public bool amIRecording { get; set; } public bool amIRecording { get; set; }
public bool canRecord
{
get
{
return _canRecord;
}
set
{
if (value != _canRecord)
{
_canRecord = value;
NotifyPropertyChanged("canRecord");
}
}
}
public bool emailRequired
{
get
{
return _emailRequired;
}
set
{
if (value != _emailRequired)
{
_emailRequired = value;
NotifyPropertyChanged("emailRequired");
}
}
}
public bool meetingIsBeingRecorded public bool meetingIsBeingRecorded
{ {
get get
@@ -798,6 +860,17 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
} }
} }
/// <summary>
/// Indicates if recording is allowed (when meeting capable and and email is not required to be entered by the user)
/// </summary>
public bool AllowRecord
{
get
{
return canRecord && !emailRequired;
}
}
public CallRecordInfo() public CallRecordInfo()
{ {
Debug.Console(2, Debug.ErrorLogLevel.Notice, "********************************************* CallRecordInfo() ******************************************"); Debug.Console(2, Debug.ErrorLogLevel.Notice, "********************************************* CallRecordInfo() ******************************************");

View File

@@ -252,7 +252,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
protected override Func<bool> SharingContentIsOnFeedbackFunc protected override Func<bool> SharingContentIsOnFeedbackFunc
{ {
get { return () => Status.Call.Sharing.IsSharing; } get { return () => Status.Sharing.isAirHostClientConnected || Status.Sharing.isDirectPresentationConnected || Status.Sharing.isSharingBlackMagic; }
} }
protected Func<bool> FarEndIsSharingContentFeedbackFunc protected Func<bool> FarEndIsSharingContentFeedbackFunc
@@ -529,6 +529,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
/// </summary> /// </summary>
private void SetUpCallFeedbackActions() private void SetUpCallFeedbackActions()
{ {
Status.Sharing.PropertyChanged -= HandleSharingStateUpdate;
Status.Sharing.PropertyChanged += HandleSharingStateUpdate;
Status.Call.Sharing.PropertyChanged -= HandleSharingStateUpdate; Status.Call.Sharing.PropertyChanged -= HandleSharingStateUpdate;
Status.Call.Sharing.PropertyChanged += HandleSharingStateUpdate; Status.Call.Sharing.PropertyChanged += HandleSharingStateUpdate;
@@ -541,7 +544,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
private void HandleCallRecordInfoStateUpdate(object sender, PropertyChangedEventArgs a) private void HandleCallRecordInfoStateUpdate(object sender, PropertyChangedEventArgs a)
{ {
if (a.PropertyName == "meetingIsBeingRecorded") if (a.PropertyName == "meetingIsBeingRecorded" || a.PropertyName == "emailRequired" || a.PropertyName == "canRecord")
{ {
MeetingIsRecordingFeedback.FireUpdate(); MeetingIsRecordingFeedback.FireUpdate();
@@ -554,7 +557,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
MeetingInfo.IsSharingMeeting, MeetingInfo.IsSharingMeeting,
MeetingInfo.WaitingForHost, MeetingInfo.WaitingForHost,
MeetingIsLockedFeedback.BoolValue, MeetingIsLockedFeedback.BoolValue,
MeetingIsRecordingFeedback.BoolValue); MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord);
MeetingInfo = meetingInfo; MeetingInfo = meetingInfo;
} }
} }
@@ -580,10 +583,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
private void HandleSharingStateUpdate(object sender, PropertyChangedEventArgs a) private void HandleSharingStateUpdate(object sender, PropertyChangedEventArgs a)
{ {
if (a.PropertyName != "State") //if (a.PropertyName != "State")
{ //{
return; // return;
} //}
SharingContentIsOnFeedback.FireUpdate(); SharingContentIsOnFeedback.FireUpdate();
ReceivingContent.FireUpdate(); ReceivingContent.FireUpdate();
@@ -593,21 +596,19 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
// Update the share status of the meeting info // Update the share status of the meeting info
if (MeetingInfo == null) if (MeetingInfo == null)
{ {
var sharingStatus = GetSharingStatus(); MeetingInfo = new MeetingInfo("", "", "", "", GetSharingStatus(), GetIsHostMyself(), true, false, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord);
MeetingInfo = new MeetingInfo("", "", "", "", sharingStatus, GetIsHostMyself(), true, false, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue);
return; return;
} }
var meetingInfo = new MeetingInfo(MeetingInfo.Id, MeetingInfo.Name, Participants.Host != null ? Participants.Host.Name : "None", var meetingInfo = new MeetingInfo(MeetingInfo.Id, MeetingInfo.Name, Participants.Host != null ? Participants.Host.Name : "None",
MeetingInfo.Password, GetSharingStatus(), GetIsHostMyself(), MeetingInfo.IsSharingMeeting, MeetingInfo.WaitingForHost, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue); MeetingInfo.Password, GetSharingStatus(), GetIsHostMyself(), MeetingInfo.IsSharingMeeting, MeetingInfo.WaitingForHost, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord);
MeetingInfo = meetingInfo; MeetingInfo = meetingInfo;
} }
catch (Exception e) catch (Exception e)
{ {
Debug.Console(1, this, "Error processing state property update. {0}", e.Message); Debug.Console(1, this, "Error processing state property update. {0}", e.Message);
Debug.Console(2, this, e.StackTrace); Debug.Console(2, this, e.StackTrace);
MeetingInfo = new MeetingInfo("", "", "", "", "None", false, false, false, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue); MeetingInfo = new MeetingInfo("", "", "", "", "None", false, false, false, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue, false);
} }
} }
@@ -714,7 +715,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
MeetingInfo.IsSharingMeeting, MeetingInfo.IsSharingMeeting,
MeetingInfo.WaitingForHost, MeetingInfo.WaitingForHost,
MeetingIsLockedFeedback.BoolValue, MeetingIsLockedFeedback.BoolValue,
MeetingIsRecordingFeedback.BoolValue MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord
); );
} }
}; };
@@ -776,7 +777,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
MeetingInfo.IsSharingMeeting, MeetingInfo.IsSharingMeeting,
MeetingInfo.WaitingForHost, MeetingInfo.WaitingForHost,
MeetingIsLockedFeedback.BoolValue, MeetingIsLockedFeedback.BoolValue,
MeetingIsRecordingFeedback.BoolValue); MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord);
MeetingInfo = meetingInfo; MeetingInfo = meetingInfo;
break; break;
} }
@@ -810,8 +811,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
Debug.Console(1, this, "Status.Layout.PropertyChanged a.PropertyName: {0}", a.PropertyName); Debug.Console(1, this, "Status.Layout.PropertyChanged a.PropertyName: {0}", a.PropertyName);
switch (a.PropertyName.ToLower()) switch (a.PropertyName.ToLower())
{ {
case "can_switch_speaker_view": case "can_Switch_speaker_view":
case "can_switch_wall_view": case "can_switch_wall_view":
case "can_switch_strip_view":
case "video_type":
case "can_switch_share_on_all_screens": case "can_switch_share_on_all_screens":
{ {
ComputeAvailableLayouts(); ComputeAvailableLayouts();
@@ -827,7 +830,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
LayoutViewIsOnLastPageFeedback.FireUpdate(); LayoutViewIsOnLastPageFeedback.FireUpdate();
break; break;
} }
case "can_Switch_Floating_Share_Content": case "can_switch_floating_share_content":
{ {
CanSwapContentWithThumbnailFeedback.FireUpdate(); CanSwapContentWithThumbnailFeedback.FireUpdate();
break; break;
@@ -1468,13 +1471,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
MeetingInfo.Id, MeetingInfo.Id,
MeetingInfo.Name, MeetingInfo.Name,
Participants.Host.Name, Participants.Host.Name,
MeetingInfo.Password, MeetingInfo.Password,
MeetingInfo.ShareStatus, GetSharingStatus(),
GetIsHostMyself(), GetIsHostMyself(),
MeetingInfo.IsSharingMeeting, MeetingInfo.IsSharingMeeting,
MeetingInfo.WaitingForHost, MeetingInfo.WaitingForHost,
MeetingIsLockedFeedback.BoolValue, MeetingIsLockedFeedback.BoolValue,
MeetingIsRecordingFeedback.BoolValue); MeetingIsRecordingFeedback.BoolValue,
Status.Call.CallRecordInfo.AllowRecord
);
MeetingInfo = meetingInfo; MeetingInfo = meetingInfo;
PrintCurrentCallParticipants(); PrintCurrentCallParticipants();
@@ -1559,7 +1564,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
{ {
JsonConvert.PopulateObject(responseObj.ToString(), Status.Call.Sharing); JsonConvert.PopulateObject(responseObj.ToString(), Status.Call.Sharing);
SetLayout(); SetDefaultLayout();
break; break;
} }
@@ -1689,14 +1694,14 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
if (MeetingInfo == null) if (MeetingInfo == null)
{ {
MeetingInfo = new MeetingInfo("Waiting For Host", "Waiting For Host", "Waiting For Host", "", MeetingInfo = new MeetingInfo("Waiting For Host", "Waiting For Host", "Waiting For Host", "",
GetSharingStatus(), false, false, true, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue); GetSharingStatus(), false, false, true, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord);
UpdateCallStatus(); UpdateCallStatus();
break; break;
} }
MeetingInfo = new MeetingInfo("Waiting For Host", "Waiting For Host", "Waiting For Host", "", MeetingInfo = new MeetingInfo("Waiting For Host", "Waiting For Host", "Waiting For Host", "",
GetSharingStatus(), false, false, true, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue); GetSharingStatus(), false, false, true, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord);
UpdateCallStatus(); UpdateCallStatus();
@@ -1706,12 +1711,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
if (MeetingInfo == null) if (MeetingInfo == null)
{ {
MeetingInfo = new MeetingInfo("Waiting For Host", "Waiting For Host", "Waiting For Host", "", MeetingInfo = new MeetingInfo("Waiting For Host", "Waiting For Host", "Waiting For Host", "",
GetSharingStatus(), false, false, false, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue); GetSharingStatus(), false, false, false, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord);
break; break;
} }
MeetingInfo = new MeetingInfo(MeetingInfo.Id, MeetingInfo.Name, MeetingInfo.Host, MeetingInfo.Password, MeetingInfo = new MeetingInfo(MeetingInfo.Id, MeetingInfo.Name, MeetingInfo.Host, MeetingInfo.Password,
GetSharingStatus(), GetIsHostMyself(), false, false, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue); GetSharingStatus(), GetIsHostMyself(), false, false, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord);
break; break;
} }
@@ -1801,7 +1806,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
if (result.Success) if (result.Success)
{ {
MeetingInfo = new MeetingInfo("", "", "", "", "", true, true, MeetingInfo.WaitingForHost, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue); MeetingInfo = new MeetingInfo("", "", "", "", GetSharingStatus(), true, true, MeetingInfo.WaitingForHost, MeetingIsLockedFeedback.BoolValue, MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord);
break; break;
} }
@@ -1935,7 +1940,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
} }
} }
private void SetLayout() private void SetDefaultLayout()
{ {
if (!_props.AutoDefaultLayouts) return; if (!_props.AutoDefaultLayouts) return;
@@ -1948,8 +1953,13 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
} }
else else
{ {
SendText(String.Format("zconfiguration call layout style: {0}", if (_props.DefaultCallLayout == (_props.DefaultCallLayout & AvailableLayouts))
_props.DefaultCallLayout)); {
SendText(String.Format("zconfiguration call layout style: {0}",
_props.DefaultCallLayout));
}
else
Debug.Console(0, this, "Unable to set default Layout. {0} not currently an available layout based on meeting state", _props.DefaultCallLayout);
} }
} }
@@ -2147,10 +2157,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
!String.Equals(Status.Call.Info.meeting_type,"NORMAL"), !String.Equals(Status.Call.Info.meeting_type,"NORMAL"),
false, false,
MeetingIsLockedFeedback.BoolValue, MeetingIsLockedFeedback.BoolValue,
MeetingIsRecordingFeedback.BoolValue MeetingIsRecordingFeedback.BoolValue, Status.Call.CallRecordInfo.AllowRecord
); );
SetDefaultLayout();
} }
// TODO [ ] Issue #868
else if (item.Status == eCodecCallStatus.Disconnected) else if (item.Status == eCodecCallStatus.Disconnected)
{ {
MeetingInfo = new MeetingInfo( MeetingInfo = new MeetingInfo(
@@ -2163,7 +2175,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
false, false,
false, false,
false, false,
false false, Status.Call.CallRecordInfo.AllowRecord
); );
} }
@@ -2171,11 +2183,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
Debug.Console(1, this, "[OnCallStatusChange] Current Call Status: {0}", Debug.Console(1, this, "[OnCallStatusChange] Current Call Status: {0}",
Status.Call != null ? Status.Call.Status.ToString() : "no call"); Status.Call != null ? Status.Call.Status.ToString() : "no call");
if (_props.AutoDefaultLayouts)
{
SetLayout();
}
} }
private string GetSharingStatus() private string GetSharingStatus()
@@ -2243,6 +2250,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
} }
} }
/// <summary>
/// Starts sharing HDMI source
/// </summary>
public override void StartSharing() public override void StartSharing()
{ {
SendText("zCommand Call Sharing HDMI Start"); SendText("zCommand Call Sharing HDMI Start");
@@ -2388,6 +2398,20 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
/// <param name="joinMap"></param> /// <param name="joinMap"></param>
public void LinkZoomRoomToApi(BasicTriList trilist, ZoomRoomJoinMap joinMap) public void LinkZoomRoomToApi(BasicTriList trilist, ZoomRoomJoinMap joinMap)
{ {
var meetingInfoCodec = this as IHasMeetingInfo;
if (meetingInfoCodec != null)
{
if (meetingInfoCodec.MeetingInfo != null)
{
trilist.SetBool(joinMap.MeetingCanRecord.JoinNumber, meetingInfoCodec.MeetingInfo.CanRecord);
}
meetingInfoCodec.MeetingInfoChanged += (o, a) =>
{
trilist.SetBool(joinMap.MeetingCanRecord.JoinNumber, a.Info.CanRecord);
};
}
var recordingCodec = this as IHasMeetingRecordingWithPrompt; var recordingCodec = this as IHasMeetingRecordingWithPrompt;
if (recordingCodec != null) if (recordingCodec != null)
{ {
@@ -2502,13 +2526,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
//trilist.SetString(joinMap.CurrentSource.JoinNumber, args.Info.ShareStatus); //trilist.SetString(joinMap.CurrentSource.JoinNumber, args.Info.ShareStatus);
}; };
trilist.SetSigTrueAction(joinMap.StartMeetingNow.JoinNumber, () => StartMeeting(0)); trilist.SetSigFalseAction(joinMap.StartMeetingNow.JoinNumber, () => StartMeeting(0));
trilist.SetSigTrueAction(joinMap.ShareOnlyMeeting.JoinNumber, StartSharingOnlyMeeting); trilist.SetSigFalseAction(joinMap.ShareOnlyMeeting.JoinNumber, StartSharingOnlyMeeting);
trilist.SetSigTrueAction(joinMap.StartNormalMeetingFromSharingOnlyMeeting.JoinNumber, StartNormalMeetingFromSharingOnlyMeeting); trilist.SetSigFalseAction(joinMap.StartNormalMeetingFromSharingOnlyMeeting.JoinNumber, StartNormalMeetingFromSharingOnlyMeeting);
trilist.SetStringSigAction(joinMap.SubmitPassword.JoinNumber, SubmitPassword); trilist.SetStringSigAction(joinMap.SubmitPassword.JoinNumber, SubmitPassword);
//trilist.SetSigFalseAction(joinMap.CancelPasswordPrompt.JoinNumber, () =>
// OnPasswordRequired(false, false, true, ""));
// Subscribe to call status to clear ShowPasswordPrompt when in meeting // Subscribe to call status to clear ShowPasswordPrompt when in meeting
this.CallStatusChange += (o, a) => this.CallStatusChange += (o, a) =>
@@ -2567,7 +2589,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
var wirelessInfoCodec = this as IZoomWirelessShareInstructions; var wirelessInfoCodec = this as IZoomWirelessShareInstructions;
if (wirelessInfoCodec != null) if (wirelessInfoCodec != null)
{ {
SetSharingStateJoins(Status.Sharing, trilist, joinMap); if (Status != null && Status.Sharing != null)
{
SetSharingStateJoins(Status.Sharing, trilist, joinMap);
}
wirelessInfoCodec.ShareInfoChanged += (o, a) => wirelessInfoCodec.ShareInfoChanged += (o, a) =>
{ {
@@ -3264,7 +3289,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
// There is no property that directly reports if strip mode is valid, but API stipulates // There is no property that directly reports if strip mode is valid, but API stipulates
// that strip mode is available if the number of screens is 1 // that strip mode is available if the number of screens is 1
if (Status.NumberOfScreens.NumOfScreens == 1) if (Status.NumberOfScreens.NumOfScreens == 1 || Status.Layout.can_Switch_Strip_View || Status.Layout.video_type.ToLower() == "strip")
{ {
availableLayouts |= zConfiguration.eLayoutStyle.Strip; availableLayouts |= zConfiguration.eLayoutStyle.Strip;
} }
@@ -3279,10 +3304,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
var handler = LayoutInfoChanged; var handler = LayoutInfoChanged;
if (handler != null) if (handler != null)
{ {
var currentLayout = zConfiguration.eLayoutStyle.None;
currentLayout = (zConfiguration.eLayoutStyle)Enum.Parse(typeof(zConfiguration.eLayoutStyle), string.IsNullOrEmpty(LocalLayoutFeedback.StringValue) ? "None" : LocalLayoutFeedback.StringValue, true);
handler(this, new LayoutInfoChangedEventArgs() handler(this, new LayoutInfoChangedEventArgs()
{ {
AvailableLayouts = AvailableLayouts, AvailableLayouts = AvailableLayouts,
CurrentSelectedLayout = (zConfiguration.eLayoutStyle)Enum.Parse(typeof(zConfiguration.eLayoutStyle),string.IsNullOrEmpty(LocalLayoutFeedback.StringValue) ? "None" : LocalLayoutFeedback.StringValue , true), CurrentSelectedLayout = currentLayout,
LayoutViewIsOnFirstPage = LayoutViewIsOnFirstPageFeedback.BoolValue, LayoutViewIsOnFirstPage = LayoutViewIsOnFirstPageFeedback.BoolValue,
LayoutViewIsOnLastPage = LayoutViewIsOnLastPageFeedback.BoolValue, LayoutViewIsOnLastPage = LayoutViewIsOnLastPageFeedback.BoolValue,
CanSwapContentWithThumbnail = CanSwapContentWithThumbnailFeedback.BoolValue, CanSwapContentWithThumbnail = CanSwapContentWithThumbnailFeedback.BoolValue,
@@ -3415,11 +3445,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
//OnPasswordRequired(false, false, true, ""); //OnPasswordRequired(false, false, true, "");
} }
public void CancelPasswordPrompt()
{
OnPasswordRequired(false, false, true, "Login Cancelled");
}
void OnPasswordRequired(bool lastAttemptIncorrect, bool loginFailed, bool loginCancelled, string message) void OnPasswordRequired(bool lastAttemptIncorrect, bool loginFailed, bool loginCancelled, string message)
{ {
var handler = PasswordRequired; var handler = PasswordRequired;
@@ -3464,19 +3489,19 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
StartSharingOnlyMeeting(eSharingMeetingMode.None, 30, String.Empty); StartSharingOnlyMeeting(eSharingMeetingMode.None, 30, String.Empty);
} }
public void StartSharingOnlyMeeting(eSharingMeetingMode mode) public void StartSharingOnlyMeeting(eSharingMeetingMode displayMode)
{ {
StartSharingOnlyMeeting(mode, 30, String.Empty); StartSharingOnlyMeeting(displayMode, DefaultMeetingDurationMin, String.Empty);
} }
public void StartSharingOnlyMeeting(eSharingMeetingMode mode, ushort duration) public void StartSharingOnlyMeeting(eSharingMeetingMode displayMode, uint duration)
{ {
StartSharingOnlyMeeting(mode, duration, String.Empty); StartSharingOnlyMeeting(displayMode, duration, String.Empty);
} }
public void StartSharingOnlyMeeting(eSharingMeetingMode mode, ushort duration, string password) public void StartSharingOnlyMeeting(eSharingMeetingMode displayMode, uint duration, string password)
{ {
SendText(String.Format("zCommand Dial Sharing Duration: {0} DisplayState: {1} Password: {2}", duration, mode, password)); SendText(String.Format("zCommand Dial Sharing Duration: {0} DisplayState: {1} Password: {2}", duration, displayMode, password));
} }
public void StartNormalMeetingFromSharingOnlyMeeting() public void StartNormalMeetingFromSharingOnlyMeeting()
@@ -3568,6 +3593,18 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
void OnShareInfoChanged(zStatus.Sharing status) void OnShareInfoChanged(zStatus.Sharing status)
{ {
Debug.Console(2, this,
@"ShareInfoChanged:
isSharingHDMI: {0}
isSharingAirplay: {1}
AirplayPassword: {2}
OSD Display State: {3}
",
status.isSharingBlackMagic,
status.isAirHostClientConnected,
status.password,
status.dispState);
var handler = ShareInfoChanged; var handler = ShareInfoChanged;
if (handler != null) if (handler != null)
{ {

View File

@@ -101,7 +101,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
}, },
new JoinMetadata new JoinMetadata
{ {
Description = "FB Indicates the password prompt is active", Description = "Pulse to start an ad-hoc meeting with the default duration",
JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinCapabilities = eJoinCapabilities.FromSIMPL,
JoinType = eJoinType.Digital JoinType = eJoinType.Digital
}); });
@@ -373,6 +373,20 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
JoinType = eJoinType.Digital JoinType = eJoinType.Digital
}); });
[JoinName("MeetingCanRecord")]
public JoinDataComplete MeetingCanRecord = new JoinDataComplete(
new JoinData
{
JoinNumber = 246,
JoinSpan = 1
},
new JoinMetadata
{
Description = "When high, indicated that the current meeting can be recorded",
JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Digital
});
#region Sharing Status #region Sharing Status

View File

@@ -4,6 +4,7 @@ using System.Linq;
using System.Text; using System.Text;
using Crestron.SimplSharp; using Crestron.SimplSharp;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using PepperDash.Core; using PepperDash.Core;
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
@@ -29,11 +30,13 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
/* This layout will be selected when Sharing starts (either from Far end or locally)*/ /* This layout will be selected when Sharing starts (either from Far end or locally)*/
[JsonProperty("defaultSharingLayout")] [JsonProperty("defaultSharingLayout")]
public string DefaultSharingLayout { get; set; } [JsonConverter(typeof(StringEnumConverter))]
public zConfiguration.eLayoutStyle DefaultSharingLayout { get; set; }
//This layout will be selected when a call is connected and no content is being shared //This layout will be selected when a call is connected and no content is being shared
[JsonProperty("defaultCallLayout")] [JsonProperty("defaultCallLayout")]
public string DefaultCallLayout { get; set; } [JsonConverter(typeof(StringEnumConverter))]
public zConfiguration.eLayoutStyle DefaultCallLayout { get; set; }
[JsonProperty("minutesBeforeMeetingStart")] [JsonProperty("minutesBeforeMeetingStart")]
public int MinutesBeforeMeetingStart { get; set; } public int MinutesBeforeMeetingStart { get; set; }