Ejemplo n.º 1
0
        public IDisposable LoadAvatars(SourceList <ItemModel> items, Range prevRange, Range range)
        {
            var disposable = new CompositeDisposable();

            // load avatar bitmaps for new range
            for (int i = range.From; i <= range.To; i++)
            {
                int index = i;

                items.Edit(list =>
                {
                    var item = list[index];
                    if (item is MessageModel messageModel)
                    {
                        var user = messageModel.Message.User;
                        var chat = messageModel.Message.Chat;

                        if (messageModel.Avatar?.Bitmap == null)
                        {
                            messageModel.Avatar = user == null
                                ? _avatarLoader.GetAvatar(chat, AvatarSize.Big)
                                : _avatarLoader.GetAvatar(user, AvatarSize.Big);
                        }

                        if (messageModel.Avatar?.Bitmap == null)
                        {
                            if (user == null)
                            {
                                _avatarLoader.LoadAvatar(chat, AvatarSize.Big)
                                .ObserveOn(TaskPoolScheduler.Default)
                                .SubscribeOn(RxApp.MainThreadScheduler)
                                .Subscribe(avatar =>
                                {
                                    messageModel.Avatar = avatar;
                                })
                                .DisposeWith(disposable);
                            }
                            else
                            {
                                _avatarLoader.LoadAvatar(user, AvatarSize.Big)
                                .ObserveOn(TaskPoolScheduler.Default)
                                .SubscribeOn(RxApp.MainThreadScheduler)
                                .Subscribe(avatar =>
                                {
                                    messageModel.Avatar = avatar;
                                })
                                .DisposeWith(disposable);
                            }
                        }
                    }
                });
            }

            return(disposable);
        }
Ejemplo n.º 2
0
        private static IObservable <Avatar> LoadAvatar(IAvatarLoader avatarLoader, MessageModel entry)
        {
            if (entry.Message?.UserData != null)
            {
                return(avatarLoader.LoadAvatar(entry.Message.UserData, AvatarSize.Regular));
            }

            if (entry.Message?.ChatData != null)
            {
                return(avatarLoader.LoadAvatar(entry.Message.ChatData, AvatarSize.Regular));
            }

            return(Observable.Empty <Avatar>());
        }
Ejemplo n.º 3
0
        private IDisposable BindInfo(
            Target target, IAvatarLoader avatarLoader)
        {
            switch (target)
            {
            case Chat chat:
                Model.IsVisible = true;
                Model.Title     = chat.ChatData.Title;
                Model.Label     = chat.ChatData.Title;
                return(avatarLoader.LoadAvatar(chat.ChatData)
                       .SubscribeOn(TaskPoolScheduler.Default)
                       .ObserveOn(RxApp.MainThreadScheduler)
                       .Subscribe(avatar =>
                {
                    Model.Avatar = avatar;
                }));

            case Aggregate aggregate:
                Model.Title = aggregate.Id.ToString();
                Model.Label = aggregate.Id.ToString();
                return(Disposable.Empty);
            }

            return(Disposable.Empty);
        }
Ejemplo n.º 4
0
        private static IObservable <Avatar> LoadAvatar(IAvatarLoader avatarLoader, EntryModel entry)
        {
            switch (entry)
            {
            case ChatEntryModel chatEntryModel:
                return(avatarLoader.LoadAvatar(chatEntryModel.Chat.ChatData));

            case AggregateEntryModel aggregateEntryModel:
                return(avatarLoader.LoadAvatar(new TdApi.Chat
                {
                    Id = aggregateEntryModel.Aggregate.Id
                }));
            }

            return(Observable.Empty <Avatar>());
        }
Ejemplo n.º 5
0
        public IObservable <Avatar> LoadAvatars(IList <MessageModel> models)
        {
            return(models.ToObservable()
                   .SelectMany(messageModel =>
            {
                var user = messageModel.Message.User;
                var chat = messageModel.Message.Chat;

                if (messageModel.Avatar?.Bitmap == null)
                {
                    return user == null
                            ? _avatarLoader.LoadAvatar(chat)
                            : _avatarLoader.LoadAvatar(user);
                }

                return Observable.Return <Avatar>(null);
            }));
        }
Ejemplo n.º 6
0
        private IObservable <Avatar> LoadAvatar(IAvatarLoader avatarLoader, EntryModel entry)
        {
            if (entry.Avatar != null)
            {
                return(Observable.Return(entry.Avatar));
            }

            switch (entry.Target)
            {
            case Chat chat:
                return(avatarLoader.LoadAvatar(chat.ChatData));

            case Aggregate aggregate:
                return(avatarLoader.LoadAvatar(new TdApi.Chat
                {
                    Id = aggregate.Id
                }));
            }

            return(Observable.Return <Avatar>(null));
        }
Ejemplo n.º 7
0
        private IObservable <Avatar> LoadAvatar(IAvatarLoader avatarLoader, EntryModel entry)
        {
            if (entry.Avatar != null)
            {
                return(Observable.Return(entry.Avatar));
            }

            switch (entry)
            {
            case ChatEntryModel chatEntry:
                return(avatarLoader.LoadAvatar(chatEntry.Chat.ChatData, AvatarSize.Small));

            case AggregateEntryModel aggregateEntry:
                return(avatarLoader.LoadAvatar(new TdApi.Chat
                {
                    Id = aggregateEntry.Aggregate.Id
                }, AvatarSize.Small));
            }

            return(Observable.Return <Avatar>(null));
        }
Ejemplo n.º 8
0
 private IDisposable LoadAvatar(IUserLoader userLoader, IAvatarLoader avatarLoader)
 {
     return(userLoader
            .GetMe()
            .SelectMany(user => avatarLoader.LoadAvatar(user.UserData, AvatarSize.Big))
            .SubscribeOn(TaskPoolScheduler.Default)
            .ObserveOn(AvaloniaScheduler.Instance)
            .Subscribe(avatar =>
     {
         Avatar = avatar;
     }));
 }
Ejemplo n.º 9
0
 private IDisposable BindAvatar(
     IUserLoader userLoader,
     IAvatarLoader avatarLoader)
 {
     return(userLoader
            .GetMe()
            .SelectMany(user => avatarLoader.LoadAvatar(user.UserData))
            .SubscribeOn(TaskPoolScheduler.Default)
            .ObserveOn(RxApp.MainThreadScheduler)
            .Subscribe(avatar =>
     {
         Model.Avatar = avatar;
     }));
 }
Ejemplo n.º 10
0
 public static IDisposable BindUserAvatar(
     this NavigationModel model,
     IAvatarLoader avatarLoader,
     IUserLoader userLoader)
 {
     return(userLoader
            .GetMe()
            .SelectMany(user => avatarLoader.LoadAvatar(user.UserData, AvatarSize.Regular))
            .SubscribeOn(RxApp.TaskpoolScheduler)
            .ObserveOn(RxApp.MainThreadScheduler)
            .Accept(avatar =>
     {
         model.Avatar = avatar;
     }));
 }
Ejemplo n.º 11
0
        public static IDisposable BindInformer(
            this InformerModel model,
            Chat chat,
            IAvatarLoader avatarLoader)
        {
            model.Title = chat.ChatData.Title;
            model.Label = chat.ChatData.Title;

            return(avatarLoader.LoadAvatar(chat.ChatData, AvatarSize.Regular)
                   .SubscribeOn(RxApp.TaskpoolScheduler)
                   .ObserveOn(RxApp.MainThreadScheduler)
                   .Accept(avatar =>
            {
                model.Avatar = avatar;
            }));
        }
Ejemplo n.º 12
0
        private IDisposable BindInfo(IAvatarLoader avatarLoader, Target target)
        {
            switch (target)
            {
            case Chat chat:
                Title = chat.ChatData.Title;
                Label = chat.ChatData.Title;
                return(avatarLoader.LoadAvatar(chat.ChatData, AvatarSize.Big)
                       .SubscribeOn(TaskPoolScheduler.Default)
                       .ObserveOn(RxApp.MainThreadScheduler)
                       .Subscribe(avatar =>
                {
                    Avatar = avatar;
                }));

            case Aggregate aggregate:
                Title = aggregate.Id.ToString();
                Label = aggregate.Id.ToString();
                return(Disposable.Empty);
            }

            return(Disposable.Empty);
        }
Ejemplo n.º 13
0
        public IObservable <Action> LoadAvatars(SourceList <ItemModel> items, Range prevRange, Range range)
        {
            var messageModels = new List <MessageModel>();

            items.Edit(list =>
            {
                // load avatar bitmaps for new range
                for (int i = range.From; i <= range.To; i++)
                {
                    if (i >= list.Count)
                    {
                        break;
                    }

                    var item = list[i];
                    if (item is MessageModel messageModel)
                    {
                        messageModels.Add(messageModel);
                    }
                }
            });

            return(messageModels.ToObservable()
                   .SelectMany(messageModel =>
            {
                var user = messageModel.Message.User;
                var chat = messageModel.Message.Chat;

                var observable = Observable.Empty <Action>();

                if (messageModel.Avatar?.Bitmap == null)
                {
                    var avatar = user == null
                            ? _avatarLoader.GetAvatar(chat, AvatarSize.Big)
                            : _avatarLoader.GetAvatar(user, AvatarSize.Big);

                    observable = observable.Concat(Observable.Return(
                                                       new Action(() =>
                    {
                        messageModel.Avatar = avatar;
                    })
                                                       ));
                }

                if (messageModel.Avatar?.Bitmap == null)
                {
                    if (user == null)
                    {
                        observable = observable.Concat(_avatarLoader.LoadAvatar(chat, AvatarSize.Big)
                                                       .Select(avatar => new Action(() =>
                        {
                            messageModel.Avatar = avatar;
                        }))
                                                       );
                    }
                    else
                    {
                        observable = observable.Concat(_avatarLoader.LoadAvatar(user, AvatarSize.Big)
                                                       .Select(avatar => new Action(() =>
                        {
                            messageModel.Avatar = avatar;
                        }))
                                                       );
                    }
                }

                return observable;
            }));
        }