private void MediaStatistics(object parameter)
 {
     if (null == MediaStatisticsView.Instance)
     {
         MediaStatisticsView.Instance = new MediaStatisticsView();
     }
     MediaStatisticsView.Instance.Shows();
     DisplayUtil.CenterWindowOnMasterWindowScreen(MediaStatisticsView.Instance, LayoutBackgroundWindow.Instance);
     // 2018/03/08 - Do NOT force media statistics window to be always topest 
     // MediaStatisticsView.Instance.Owner = _layoutBackgroundWindow.GetTopestWindow();
 }
        private void UpdateWindowVisibility()
        {
            LoginStatus loginStatus = LoginManager.Instance.CurrentLoginStatus;
            CallStatus  callStatus  = CallController.Instance.CurrentCallStatus;

            log.InfoFormat("Update window visibility, login status: {0}, call status: {1}", loginStatus, callStatus);
            bool isInCall = CallStatus.Dialing == callStatus ||
                            CallStatus.ConfIncoming == callStatus ||
                            CallStatus.P2pIncoming == callStatus ||
                            CallStatus.P2pOutgoing == callStatus ||
                            CallStatus.Connected == callStatus;
            bool isLoginWindowVisible =
                LoginStatus.NotLogin == loginStatus ||
                LoginStatus.LoggingIn == loginStatus ||
                LoginStatus.LoginFailed == loginStatus ||
                LoginStatus.AnonymousLoggingIn == loginStatus ||
                (LoginStatus.AnonymousLoggedIn == loginStatus && !isInCall);
            bool isMainWindowVisible        = (LoginStatus.LoggedIn == loginStatus) && !isInCall;
            bool isVideoPeopleWindowVisible = isInCall;

            Application.Current.Dispatcher.InvokeAsync(() => {
                if (null != LoginManager.Instance.LoginWindow)
                {
                    log.InfoFormat("Login window visible:{0}", isLoginWindowVisible);
                    Visibility visibility = isLoginWindowVisible ? Visibility.Visible : Visibility.Collapsed;
                    if (visibility != LoginManager.Instance.LoginWindow.Visibility)
                    {
                        LoginManager.Instance.LoginWindow.Visibility = visibility;
                        if (
                            Visibility.Visible == SoftwareUpdateWindow.Instance.Visibility &&
                            Visibility.Visible == LoginManager.Instance.LoginWindow.Visibility
                            )
                        {
                            LoginWindow loginWindow = LoginManager.Instance.LoginWindow as LoginWindow;
                            DisplayUtil.SetWindowCenterAndOwner(SoftwareUpdateWindow.Instance, loginWindow);
                            log.Info("Set soft update window owner to login window");
                        }
                    }
                    else
                    {
                        log.InfoFormat("Login window has been visibility: {0}", visibility);
                    }
                }

                if (null != Application.Current.MainWindow)
                {
                    log.InfoFormat("Main window visible:{0}", isMainWindowVisible);
                    Visibility visibility = isMainWindowVisible ? Visibility.Visible : Visibility.Collapsed;
                    if (visibility != Application.Current.MainWindow.Visibility)
                    {
                        Application.Current.MainWindow.Visibility = visibility;
                        if (
                            Visibility.Visible == SoftwareUpdateWindow.Instance.Visibility &&
                            Visibility.Visible == Application.Current.MainWindow.Visibility &&
                            Application.Current.MainWindow.IsLoaded
                            )
                        {
                            MainWindow mainWindow = Application.Current.MainWindow as MainWindow;
                            DisplayUtil.SetWindowCenterAndOwner(SoftwareUpdateWindow.Instance, mainWindow);
                            log.Info("Set soft update window owner to main window");
                        }
                    }
                    else
                    {
                        log.InfoFormat("Main window has been visibility: {0}", visibility);
                    }
                }

                if (null != VideoPeopleWindow.Instance)
                {
                    log.InfoFormat("Video people window visible:{0}", isVideoPeopleWindowVisible);
                    Visibility visibility = isVideoPeopleWindowVisible ? Visibility.Visible : Visibility.Collapsed;
                    if (visibility != VideoPeopleWindow.Instance.Visibility)
                    {
                        log.InfoFormat(
                            "Update VideoPeopleWindow visible, FirstShow:{0}, ActualWidth:{1}, ActualHeight:{2}, WindowState: {3}"
                            , VideoPeopleWindow.Instance.FirstShow
                            , VideoPeopleWindow.Instance.ActualWidth
                            , VideoPeopleWindow.Instance.ActualHeight
                            , VideoPeopleWindow.Instance.WindowState
                            );
                        Visibility currentStatus = VideoPeopleWindow.Instance.Visibility;
                        if (Visibility.Visible == currentStatus && !isVideoPeopleWindowVisible && WindowState.Minimized == VideoPeopleWindow.Instance.WindowState)
                        {
                            // in the case: sending content and the window is minimized, then disconnect it in remote. it should be resume to preseting state and then hidden.
                            VideoPeopleWindow.Instance.Set2PresettingState();
                        }
                        VideoPeopleWindow.Instance.Visibility = isVideoPeopleWindowVisible ? Visibility.Visible : Visibility.Collapsed;
                        if (isVideoPeopleWindowVisible &&
                            (VideoPeopleWindow.Instance.FirstShow || 0 == VideoPeopleWindow.Instance.ActualWidth || 0 == VideoPeopleWindow.Instance.ActualHeight)
                            )
                        {
                            log.Info("Reset initial size for VideoPeopleWindow");
                            // resume window size and center the screen on first show
                            VideoPeopleWindow.Instance.FirstShow = false;
                            VideoPeopleWindow.Instance.ResetInitialSize();
                            DisplayUtil.CenterWindowOnMasterWindowScreen(View.VideoPeopleWindow.Instance, LoginManager.Instance.LoginWindow as LoginWindow);
                        }
                        //VideoPeopleWindow.Instance.Visibility = isVideoPeopleWindowVisible ? Visibility.Visible : Visibility.Collapsed;
                        if (Visibility.Visible == VideoPeopleWindow.Instance.Visibility && currentStatus != Visibility.Visible)
                        {
                            VideoPeopleWindow.Instance.AdjustWindowSize();
                        }
                        log.InfoFormat("VideoPeopleWindow, left: {0}, top: {1}", VideoPeopleWindow.Instance.Left, VideoPeopleWindow.Instance.Top);
                        if (
                            Visibility.Visible == SoftwareUpdateWindow.Instance.Visibility &&
                            Visibility.Visible == VideoPeopleWindow.Instance.Visibility
                            )
                        {
                            DisplayUtil.SetWindowCenterAndOwner(SoftwareUpdateWindow.Instance, VideoPeopleWindow.Instance);
                            log.Info("Set soft update window owner to video people window");
                        }
                    }
                    else
                    {
                        log.InfoFormat("Video people window has been visibility: {0}", visibility);
                    }
                }
            });
        }