Пример #1
0
        public ExplorerProvider(
            Target target,
            IExplorerTrigger trigger,
            IMessageLoader messageLoader,
            IMessageModelFactory messageModelFactory,
            IAvatarManager avatarManager
            )
        {
            _items = new SourceList <ItemModel>();

            var loadRequests = Observable.FromEventPattern <MessageLoadRequestedArgs>(
                h => trigger.MessageLoadRequested += h,
                h => trigger.MessageLoadRequested -= h)
                               .Select(args => args.EventArgs);

            BindLoading(loadRequests, target, messageLoader, messageModelFactory)
            .DisposeWith(_serviceDisposable);

            var visibleRangeChanges = Observable.FromEventPattern <VisibleRangeNotifiedArgs>(
                h => trigger.VisibleRangeNotified += h,
                h => trigger.VisibleRangeNotified -= h)
                                      .Select(args => args.EventArgs);

            BindAvatarLoading(visibleRangeChanges, avatarManager)
            .DisposeWith(_serviceDisposable);

            BindMediaLoading(visibleRangeChanges)
            .DisposeWith(_serviceDisposable);
        }
Пример #2
0
        public FriendViewModel(IDataService dataService, int friendNumber)
        {
            _toxModel      = dataService.ToxModel;
            _avatarManager = dataService.AvatarManager;

            FriendNumber = friendNumber;

            Conversation  = new ConversationViewModel(dataService, this);
            FileTransfers = new FileTransfersViewModel(dataService, friendNumber);
            Call          = new CallViewModel(friendNumber);

            Name = _toxModel.GetFriendName(friendNumber);
            if (Name == string.Empty)
            {
                Name = _toxModel.GetFriendPublicKey(friendNumber).ToString();
            }

            StatusMessage = _toxModel.GetFriendStatusMessage(friendNumber);
            if (StatusMessage == string.Empty)
            {
                StatusMessage = "Friend request sent.";
            }

            SetFriendStatus(_toxModel.GetFriendStatus(friendNumber));
            IsConnected = _toxModel.IsFriendOnline(friendNumber);

            _avatarManager.FriendAvatarChanged += FriendAvatarChangedHandler;

            _toxModel.FriendNameChanged             += FriendNameChangedHandler;
            _toxModel.FriendStatusMessageChanged    += FriendStatusMessageChangedHandler;
            _toxModel.FriendStatusChanged           += FriendStatusChangedHandler;
            _toxModel.FriendConnectionStatusChanged += FriendConnectionStatusChangedHandler;
        }
Пример #3
0
        private ProfileViewModel(IDataService dataService, ToxData toxData, ToxDataInfo toxDataInfo)
        {
            _toxModel      = dataService.ToxModel;
            _avatarManager = dataService.AvatarManager;

            _toxData     = toxData;
            _toxDataInfo = toxDataInfo;
        }
Пример #4
0
        public UserViewModel(IDataService dataService)
        {
            _toxModel      = dataService.ToxModel;
            _avatarManager = dataService.AvatarManager;

            _toxModel.PropertyChanged        += ToxModelPropertyChangedHandler;
            _avatarManager.UserAvatarChanged += UserAvatarChangedHandler;
        }
        public ProfileManagementViewModel(IDataService dataService)
        {
            _dataService   = dataService;
            _toxModel      = dataService.ToxModel;
            _avatarManager = dataService.AvatarManager;

            Profiles = new ObservableCollection <ProfileViewModel>();
        }
Пример #6
0
        public ProfileSettingsViewModel(IDataService dataService)
        {
            _toxModel      = dataService.ToxModel;
            _avatarManager = dataService.AvatarManager;

            _toxModel.PropertyChanged             += ToxModelPropertyChangedHandler;
            _avatarManager.UserAvatarChanged      += UserAvatarChangedHandler;
            _avatarManager.IsUserAvatarSetChanged += IsUserAvatarSetChangedHandler;
            RefreshQrCodeId();
        }
Пример #7
0
        /// <summary>
        ///     Invoked when the application is launched normally by the end user.  Other entry points
        ///     will be used such as when the application is launched to open a specific file.
        /// </summary>
        /// <param name="e">Details about the launch request and process.</param>
        protected override async void OnLaunched(LaunchActivatedEventArgs e)
        {
            DispatcherHelper.Initialize();

            // We cheat a little bit here... TODO: Fix it! Until then: Please, don't use ServiceLocator anywhere else in the code than ViewModelLocator!
            var dataService = ServiceLocator.Current.GetInstance <IDataService>();

            _toxModel      = dataService.ToxModel;
            _avatarManager = dataService.AvatarManager;

            var rootFrame = Window.Current.Content as Frame;

            // Do not repeat app initialization when the Window already has content,
            // just ensure that the window is active

            if (rootFrame == null)
            {
                // Create a Frame to act as the navigation context and navigate to the first page
                rootFrame = new Frame();
                // Associate the frame with a SuspensionManager key
                SuspensionManager.RegisterFrame(rootFrame, "AppFrame");
                // Set the default language
                rootFrame.Language = ApplicationLanguages.Languages[0];

                rootFrame.NavigationFailed += OnNavigationFailed;

                await HandlePreviousExecutionState(e.PreviousExecutionState);

                await InitializeSingletons();

                // Place the frame in the current Window
                Window.Current.Content = rootFrame;
            }
            if (rootFrame.Content == null)
            {
                // When the navigation stack isn't restored navigate to the first page,
                // configuring the new page by passing required information as a navigation
                // parameter
                if (Window.Current.Bounds.Width < 930)
                {
                    rootFrame.Navigate(typeof(FriendListPage));
                }
                else
                {
                    rootFrame.Navigate(typeof(MainPage));
                }
            }
            // Ensure the current window is active
            Window.Current.Activate();

            ApplicationView.GetForCurrentView().SetPreferredMinSize(new Size {
                Width = 500, Height = 500
            });
        }
Пример #8
0
        public ExplorerController(
            Target target,
            IMessageManager messageManager,
            IAvatarManager avatarManager)
        {
            _items = new SourceList <ItemModel>();

            BindSource()
            .DisposeWith(this);

            BindVisibleRangeChanges(target, messageManager, avatarManager)
            .DisposeWith(this);

            InitMessageLoading(target, messageManager, avatarManager)
            .DisposeWith(this);
        }
Пример #9
0
        public ExplorerModel(
            IMessageManager messageManager,
            IAvatarManager avatarManager,
            Target target
            )
        {
            var visibleRangeChanges = this.WhenAnyValue(m => m.VisibleIndexes)
                                      .Select(tuple => new Range(tuple?.Item1 ?? 0, tuple?.Item2 ?? 0))
                                      .SubscribeOn(TaskPoolScheduler.Default);

            BindMessages(target, messageManager, visibleRangeChanges)
            .DisposeWith(_modelDisposable);

            BindAvatars(avatarManager, visibleRangeChanges)
            .DisposeWith(_modelDisposable);
        }
Пример #10
0
        private IDisposable BindAvatars(
            IAvatarManager avatarManager,
            IObservable <Range> visibleRangeChanges)
        {
            var prevRange = new Range(0, 0);

            return(visibleRangeChanges
                   .SelectMany(range =>
            {
                var releases = avatarManager.ReleaseAvatars(_items, prevRange, range);
                var loads = avatarManager.LoadAvatars(_items, prevRange, range);

                return releases.Concat(loads);
            })
                   .SubscribeOn(TaskPoolScheduler.Default)
                   .ObserveOn(RxApp.MainThreadScheduler)
                   .Subscribe(action => action()));
        }
Пример #11
0
        private IDisposable InitMessageLoading(
            Target target,
            IMessageManager messageManager,
            IAvatarManager avatarManager)
        {
            var messageLoading = messageManager.LoadPrevMessages(target)
                                 .Select(models => new {
                Action = new Action(() =>
                {
                    _items.InsertRange(models, 0);
                }),
                Models = models
            });

            var avatarLoading = messageLoading
                                .SelectMany(item =>
            {
                var action = item.Action;
                var models = item.Models;

                var messageLoadAction = Observable.Return(action);

                var avatarPreloadAction = avatarManager.PreloadAvatars(models)
                                          .Select((avatar, i) => new Action(() =>
                {
                    var messageModel    = models[i];
                    messageModel.Avatar = avatar;
                }));

                var avatarLoadAction = avatarManager.LoadAvatars(models)
                                       .Select((avatar, i) => new Action(() =>
                {
                    var messageModel    = models[i];
                    messageModel.Avatar = avatar;
                }));

                return(messageLoadAction
                       .Concat(avatarPreloadAction)
                       .Concat(avatarLoadAction));
            });

            return(SubscribeToActions(avatarLoading));
        }
Пример #12
0
        private IDisposable BindAvatarLoading(
            IObservable <VisibleRangeNotifiedArgs> visibleRangeChanges,
            IAvatarManager avatarManager)
        {
            var prevRange = new Range(0, 0);

            return(visibleRangeChanges
                   .ObserveOn(TaskPoolScheduler.Default)
                   .SubscribeOn(RxApp.MainThreadScheduler)
                   .Subscribe(args =>
            {
                var range = args.Range;

                avatarManager.ReleaseAvatars(_items, prevRange, range)
                .DisposeWith(_serviceDisposable);

                avatarManager.LoadAvatars(_items, prevRange, range)
                .DisposeWith(_serviceDisposable);

                prevRange = range;
            }));
        }
Пример #13
0
 /// <summary>
 /// 初始化类<see cref="AvatarController"/>。
 /// </summary>
 /// <param name="avatarManager">存储文件夹接口。</param>
 public AvatarController(IAvatarManager avatarManager)
 {
     _avatarManager = avatarManager;
 }
Пример #14
0
        private IDisposable BindVisibleRangeChanges(
            Target target,
            IMessageManager messageManager,
            IAvatarManager avatarManager)
        {
            var prevRange           = default(Range);
            var visibleRangeChanges = Model.WhenAnyValue(m => m.VisibleRange)
                                      .Select(range => new
            {
                PrevRange = prevRange,
                Range     = range
            })
                                      .Do(item => prevRange = item.Range)
                                      .Do(Console.WriteLine);

            var messageLoading = visibleRangeChanges
                                 .SelectMany(item =>
            {
                if (item.Range.Length > 0)
                {
                    if (item.Range.Index == 0 &&
                        item.Range.Index != item.PrevRange.Index)
                    {
                        var items        = _items.Items.OfType <MessageModel>().ToList();
                        var firstMessage = items.FirstOrDefault();
                        return(messageManager.LoadPrevMessages(target, firstMessage?.Message)
                               .Select(models => new {
                            Action = new Action(() =>
                            {
                                _items.InsertRange(models, 0);
                            }),
                            Models = models
                        }));
                    }

                    if (item.Range.Index + item.Range.Length == _items.Count &&
                        item.Range.LastIndex != item.PrevRange.LastIndex)
                    {
                        var items       = _items.Items.OfType <MessageModel>().ToList();
                        var lastMessage = items.LastOrDefault();
                        return(messageManager.LoadNextMessages(target, lastMessage?.Message)
                               .Select(models => new {
                            Action = new Action(() =>
                            {
                                _items.AddRange(models);
                            }),
                            Models = models
                        }));
                    }
                }

                return(Observable.Empty <IList <MessageModel> >()
                       .Select(models => new
                {
                    Action = new Action(() => { }),
                    Models = models
                }));
            });

            var avatarLoading = messageLoading
                                .SelectMany(item =>
            {
                var action = item.Action;
                var models = item.Models;

                var messageLoadAction = Observable.Return(action);

                var avatarPreloadAction = avatarManager.PreloadAvatars(models)
                                          .Select((avatar, i) => new Action(() =>
                {
                    var messageModel    = models[i];
                    messageModel.Avatar = avatar;
                }));

                var avatarLoadAction = avatarManager.LoadAvatars(models)
                                       .Select((avatar, i) => new Action(() =>
                {
                    var messageModel    = models[i];
                    messageModel.Avatar = avatar;
                }));

                return(messageLoadAction
                       .Concat(avatarPreloadAction)
                       .Concat(avatarLoadAction));
            });

            return(SubscribeToActions(avatarLoading));
        }