/// <summary> Конструктор </summary> public ViewModelCallRedirect(ModelCall currentModelCall) { var callerModelContact = currentModelCall?.ModelContactObj; ListModelContact = callerModelContact == null?DataSourceContact.GetListModelContact() : DataSourceContact.GetListModelContact().Where(a => a.Id != currentModelCall.ModelContactObj.Id).ToList(); CurrentModelCall = currentModelCall; ApplyFilter(); // автоматически присвоит CurrentListModelContact CallbackRouter.Instance.ListModelContactStatusChanged += OnListModelContactStatusChanged; CallbackRouter.Instance.ListModelContactSubscriptionChanged += OnListModelContactSubscriptionChanged; CallbackRouter.Instance.ModelCallChanged += OnModelCallChanged; CommandApplyFilterAllContact = new Command(obj => ApplyFilterListFilterContact(@"ViewModelCallRedirect_AllContact")); CommandApplyFilterDodicallContact = new Command(obj => ApplyFilterListFilterContact(@"ViewModelCallRedirect_DodicallContact")); CommandApplyFilterSavedContact = new Command(obj => ApplyFilterListFilterContact(@"ViewModelCallRedirect_SavedContact")); CommandApplyFilterBlockedContact = new Command(obj => ApplyFilterListFilterContact(@"ViewModelCallRedirect_BlockedContact")); CommandApplyFilterWhiteContact = new Command(obj => ApplyFilterListFilterContact(@"ViewModelCallRedirect_WhiteContact")); CommandSelectContactList = new Command(obj => SelectContactList()); CommandSelectHistoryList = new Command(obj => SelectHistoryList()); CommandSelectDialpadList = new Command(obj => SelectDialpadList()); ContactList = true; }
/// <summary> Обработчик изменения звонка </summary> private void OnModelCallChanged(object sender, ModelCall modelCall) { Action action = () => { CurrentModelCall = modelCall?.GetDeepCopy(); if (CurrentModelCall == null || CurrentModelCall.ModelEnumCallStateObj.Code == 6) // Ended (почему то иногда прилетает null, видимо в разных потоках уже закрытый звонок удаляется из списка активных в бизнес логике быстрее чем прилетает данный колбек в этом потоке) { OnCloseView(); } }; CurrentDispatcher.BeginInvoke(action); }
/// <summary> Конвертировать ModelCall в CallModelManaged </summary> private static CallModelManaged ConvertCallModelCallToCallModelManaged(ModelCall modelCall) { var result = new CallModelManaged { Id = modelCall.Id, Duration = modelCall.Duration, Identity = modelCall.Identity, Contact = DataSourceContact.GetContactModelManagedFromModelContact(modelCall.ModelContactObj), Direction = (CallDirectionManaged)modelCall.ModelEnumCallDirectionObj.Code, AddressType = (CallAddressTypeManaged)modelCall.ModelEnumCallAddressTypeObj.Code, Encription = (VoipEncryptionModeManaged)modelCall.ModelEnumVoipEncryptionObj.Code, State = (CallStateManaged)modelCall.ModelEnumCallStateObj.Code }; return(result); }
/// <summary> Конвертировать CallModelManaged в ModelCall </summary> private static ModelCall ConvertCallModelManagedToModelCall(CallModelManaged callModelManaged) { var result = new ModelCall { Id = callModelManaged.Id, Duration = callModelManaged.Duration, Identity = callModelManaged.Identity, ModelContactObj = DataSourceContact.GetModelContactFromContactModelManaged(callModelManaged.Contact), ModelEnumCallDirectionObj = ModelEnumCallDirection.GetModelEnum((int)callModelManaged.Direction), ModelEnumCallAddressTypeObj = ModelEnumCallAddressType.GetModelEnum((int)callModelManaged.AddressType), ModelEnumVoipEncryptionObj = ModelEnumVoipEncryption.GetModelEnum((int)callModelManaged.Encription), ModelEnumCallStateObj = ModelEnumCallState.GetModelEnum((int)callModelManaged.State) }; return(result); }
/// <summary> Конструктор </summary> public ViewModelCallActive(ModelCall modelCall) { CallbackRouter.Instance.ModelCallChanged += OnModelCallChanged; if (modelCall != null) { CurrentModelCall = modelCall; } else { OnCloseView(); } CommandAcceptCall = new Command(obj => AcceptCall()); CommandHangupCall = new Command(obj => HangupCall()); Mute = DataSourceCall.CheckMuteMicrophone(); ExistCall = true; }
/// <summary> Обработчик изменения звонка </summary> private void OnModelCallChanged(object sender, ModelCall modelCall) { // хз какой брать currentModelCall.ModelEnumCallStateObj.Code потому что СВ в отпуске, а в дебаггере приходит Ringing, наверно его надо брать if (modelCall != null && modelCall.ModelEnumCallDirectionObj.Code == 1 /* Incoming */ && modelCall.ModelEnumCallStateObj.Code == 2 /* Ringing */) { Action action = () => OnEventViewModel("IncomingCall"); CurrentDispatcher.BeginInvoke(action); } // Ended (почему то иногда прилетает null, видимо в разных потоках уже закрытый звонок удаляется из списка активных в бизнес логике быстрее чем прилетает данный колбек в этом потоке) if (modelCall == null || modelCall.ModelEnumCallStateObj.Code == 6) { OnEventViewModel("CallEnableChanged", true); } else { OnEventViewModel("CallEnableChanged", false); } }
/// <summary> Конструктор </summary> public ViewCallRedirect(ModelCall currentModelCall) { InitializeComponent(); _viewModelCallRedirect = new ViewModelCallRedirect(currentModelCall); DataContext = _viewModelCallRedirect; _viewModelCallRedirect.CommandSelectDialpadList = new Command(obj => ShowComingSoon()); _viewModelCallRedirect.CommandSelectHistoryList = new Command(obj => ShowComingSoon()); _viewModelCallRedirect.PropertyChanged += _viewModelCallRedirect_PropertyChanged; _currentListModelContact = new ObservableCollection <ExtendedModelContact>(_viewModelCallRedirect.CurrentListModelContact.Select(a => new ExtendedModelContact() { ModelContactObj = a })); OnPropertyChanged("CurrentListModelContact"); _viewModelCallRedirect.CloseView += ViewCallRedirectOnCloseView; }
/// <summary> Возвращает окно WindowStandard с ViewCallRedirect </summary> public static WindowStandard GetWindowCallRedirect(ModelCall currentModelCall) { var windowDispacher = WindowDispacher.GetInstance; var result = windowDispacher.GetWindowByUserControl(typeof(ViewCallRedirect)) as WindowStandard; if (result != null) { return(result); } result = new WindowStandard(new ViewCallRedirect(currentModelCall)) { MinWidth = 400, MinHeight = 630, Height = 630, Width = 400, WindowStartupLocation = WindowStartupLocation.CenterOwner }; result.Activated += (sender, args) => { windowDispacher.SetActiveWindow(result); }; windowDispacher.AddToListWindow(result); result.Closed += (sender, args) => { windowDispacher.DeleteToListWindow(result); }; return(result); }
/// <summary> Инвокатор события ModelCallChanged </summary> private void OnModelCallChanged(ModelCall modelCall) { ModelCallChanged?.Invoke(this, modelCall); }
///<summary> Открыть вкладку вызовов и выбрать вызов </summary> public void OpenCall(ModelCall modelCall) { GridHistory_Click(null, null); }
/// <summary> Завершить вызов </summary> public static bool HangupCall(ModelCall modelCall) { return(modelCall != null?Logic.HangupCall(modelCall.Id) : false); }
/// <summary> Принять вызов </summary> public static bool AcceptCall(ModelCall modelCall) { return(modelCall != null?Logic.AcceptCall(modelCall.Id, CallOptionsManaged.Default) : false); }