Esempio n. 1
0
        private void DataTemplateBasic(View view, int i, AnimeReviewData animeReviewData)
        {
            if (!_reviewStates.ContainsKey(animeReviewData))
            {
                _reviewStates.Add(animeReviewData, false);
            }

            if (_reviewStates[animeReviewData])
            {
                LoadScores(view, animeReviewData);
                view.FindViewById(Resource.Id.AnimeReviewItemLayoutReviewContent).Visibility = ViewStates.Visible;
            }
            else
            {
                view.FindViewById <LinearLayout>(Resource.Id.AnimeReviewItemLayoutMarksList).RemoveAllViews();
                view.FindViewById(Resource.Id.AnimeReviewItemLayoutReviewContent).Visibility = ViewStates.Gone;
            }


            view.FindViewById <TextView>(Resource.Id.AnimeReviewItemLayoutAuthor).Text       = animeReviewData.Author;
            view.FindViewById <TextView>(Resource.Id.AnimeReviewItemLayoutDate).Text         = animeReviewData.Date;
            view.FindViewById <TextView>(Resource.Id.AnimeReviewItemLayoutOverallScore).Text = animeReviewData.OverallRating;
            view.FindViewById <TextView>(Resource.Id.AnimeReviewItemLayoutEpsSeen).Text      = animeReviewData.EpisodesSeen;
            view.FindViewById <TextView>(Resource.Id.AnimeReviewItemLayoutHelpfulCount).Text = animeReviewData.HelpfulCount;
        }
Esempio n. 2
0
        private void DataTemplateFling(View view, int i, AnimeReviewData animeReviewData)
        {
            var img = view.FindViewById <ImageViewAsync>(Resource.Id.AnimeReviewItemLayoutAvatarImage);

            if (img.IntoIfLoaded(animeReviewData.AuthorAvatar, new CircleTransformation()))
            {
                view.FindViewById(Resource.Id.AnimeReviewItemImgPlaceholder).Visibility = ViewStates.Gone;
            }
            else
            {
                view.FindViewById(Resource.Id.AnimeReviewItemImgPlaceholder).Visibility = ViewStates.Visible;
            }
        }
        private View GetTemplateDelegate(int i, AnimeReviewData animeReviewData, View convertView)
        {
            var view = convertView;

            if (!_reviewStates.ContainsKey(animeReviewData))
            {
                _reviewStates.Add(animeReviewData, false);
            }

            if (view == null)
            {
                view        = MainActivity.CurrentContext.LayoutInflater.Inflate(Resource.Layout.AnimeReviewItemLayout, null);
                view.Click += OnReviewClick;
            }
            view.Tag = new ReviewWrapperClass()
            {
                Data = animeReviewData
            };

            view.FindViewById(Resource.Id.AnimeReviewItemLayoutReviewContent).Visibility =
                _reviewStates[animeReviewData] ? ViewStates.Visible : ViewStates.Gone;

            var img = view.FindViewById <ImageViewAsync>(Resource.Id.AnimeReviewItemLayoutAvatarImage);

            ImageService.Instance.LoadUrl(animeReviewData.AuthorAvatar, TimeSpan.FromDays(1))
            .FadeAnimation(false).Success(() => img.AnimateFadeIn())
            .Into(img);
            view.FindViewById <TextView>(Resource.Id.AnimeReviewItemLayoutAuthor).Text        = animeReviewData.Author;
            view.FindViewById <TextView>(Resource.Id.AnimeReviewItemLayoutDate).Text          = animeReviewData.Date;
            view.FindViewById <TextView>(Resource.Id.AnimeReviewItemLayoutOverallScore).Text  = animeReviewData.OverallRating;
            view.FindViewById <TextView>(Resource.Id.AnimeReviewItemLayoutEpsSeen).Text       = animeReviewData.EpisodesSeen;
            view.FindViewById <TextView>(Resource.Id.AnimeReviewItemLayoutHelpfulCount).Text  = animeReviewData.HelpfulCount;
            view.FindViewById <TextView>(Resource.Id.AnimeReviewItemLayoutReviewContent).Text = animeReviewData.Review;

            var scores = view.FindViewById <LinearLayout>(Resource.Id.AnimeReviewItemLayoutMarksList);

            scores.RemoveAllViews();
            foreach (var score in animeReviewData.Score)
            {
                var txt = new TextView(view.Context);
                txt.Text     = $"{score.Field} - {score.Score}";
                txt.Typeface = Typeface.Create(ResourceExtension.FontSizeLight, TypefaceStyle.Normal);
                txt.SetTextColor(new Color(ResourceExtension.BrushText));
                scores.AddView(txt);
            }

            return(view);
        }
Esempio n. 4
0
        private void LoadScores(View view, AnimeReviewData animeReviewData)
        {
            var scores = view.FindViewById <LinearLayout>(Resource.Id.AnimeReviewItemLayoutMarksList);

            scores.RemoveAllViews();
            foreach (var score in animeReviewData.Score)
            {
                var txt = new TextView(view.Context)
                {
                    Text     = $"{score.Field} {score.Score}",
                    Typeface = Typeface.Create(ResourceExtension.FontSizeLight, TypefaceStyle.Normal)
                };
                txt.SetTextColor(new Color(ResourceExtension.BrushText));
                scores.AddView(txt);
            }
        }
Esempio n. 5
0
        private void DataTemplateFull(View view, int i, AnimeReviewData animeReviewData)
        {
            var img = view.FindViewById <ImageViewAsync>(Resource.Id.AnimeReviewItemLayoutAvatarImage);

            if (img.Tag == null || (string)img.Tag != animeReviewData.AuthorAvatar)
            {
                img.Into(animeReviewData.AuthorAvatar, new CircleTransformation());
                img.Tag = animeReviewData.AuthorAvatar;
            }
            else
            {
                img.Visibility = ViewStates.Visible;
            }

            view.FindViewById(Resource.Id.AnimeReviewItemImgPlaceholder).Visibility = ViewStates.Gone;
        }
Esempio n. 6
0
        public async Task <List <AnimeReviewData> > GetAnimeReviews(bool force = false)
        {
            var output = force
                ? new List <AnimeReviewData>()
                : await DataCache.RetrieveReviewsData(_targetId, _anime) ?? new List <AnimeReviewData>();

            if (output.Count != 0)
            {
                return(output);
            }

            var raw = await GetRequestResponse(false);

            if (string.IsNullOrEmpty(raw))
            {
                return(null);
            }

            try
            {
                var doc = new HtmlDocument();
                doc.LoadHtml(raw);
                var reviewNodes = doc.DocumentNode.Descendants("div")
                                  .Where(
                    node =>
                    node.Attributes.Contains("class") &&
                    node.Attributes["class"].Value ==
                    HtmlClassMgr.ClassDefs["#Reviews:reviewNode:class"]).Take(Settings.ReviewsToPull);

                foreach (var reviewNode in reviewNodes)
                {
                    try
                    {
                        var current = new AnimeReviewData();
                        //Details
                        var detailsNode = reviewNode.Descendants("div").First();
                        var pictureNode = detailsNode.Descendants("div").Where(node =>
                                                                               node.Attributes.Contains("class") &&
                                                                               node.Attributes["class"].Value ==
                                                                               HtmlClassMgr.ClassDefs["#Reviews:reviewNode:pictureNodeClass"])
                                          .Skip(1)
                                          .First()                   //2nd picSurround
                                          .Descendants("a").First(); //2nd a tag
                        current.Author       = pictureNode.Attributes["href"].Value.Split('/')[2];
                        current.AuthorAvatar = pictureNode.Descendants("img").First().Attributes["data-src"].Value;
                        //
                        current.HelpfulCount = detailsNode.Descendants("div")
                                               .First(node =>
                                                      node.Attributes.Contains("class") &&
                                                      node.Attributes["class"].Value ==
                                                      HtmlClassMgr.ClassDefs["#Reviews:reviewNode:helpfulCountNode"]).InnerText;
                        //
                        var rightTableNodeDivs =
                            detailsNode.Descendants("td").Skip(2).First().Descendants("div").ToList();
                        current.Date          = rightTableNodeDivs[0].InnerText;
                        current.EpisodesSeen  = rightTableNodeDivs[1].InnerText;
                        current.OverallRating = rightTableNodeDivs[2].InnerText;
                        //Review Content
                        var reviewNodeContent = reviewNode.Descendants("div").First(node =>
                                                                                    node.Attributes.Contains("class") &&
                                                                                    node.Attributes["class"].Value == HtmlClassMgr.ClassDefs["#Reviews:reviewNode:contentNode"]);
                        reviewNodeContent.ChildNodes.Remove(1);
                        current.Review =
                            WebUtility.HtmlDecode(reviewNodeContent.InnerText.Trim().Replace("read more", ""));

                        output.Add(current);
                    }
                    catch (Exception)
                    {
                        //something unexpected
                    }
                }
            }
            catch (Exception)
            {
                //no reviews
            }
            DataCache.SaveAnimeReviews(_targetId, output, _anime);

            return(output);
        }
Esempio n. 7
0
        public async Task <List <AnimeReviewData> > GetAnimeReviews(bool force = false)
        {
            var output = force
                ? new List <AnimeReviewData>()
                : await DataCache.RetrieveReviewsData(_targetId, _anime) ?? new List <AnimeReviewData>();

            if (output.Count != 0)
            {
                return(output);
            }

            var raw = await GetRequestResponse(false);

            if (string.IsNullOrEmpty(raw))
            {
                return(null);
            }

            try
            {
                var doc = new HtmlDocument();
                doc.LoadHtml(raw);
                var reviewNodes = doc.DocumentNode.WhereOfDescendantsWithClass("div", "borderDark").Take(Settings.ReviewsToPull);

                foreach (var reviewNode in reviewNodes)
                {
                    try
                    {
                        var current = new AnimeReviewData();
                        //Details
                        var detailsNode = reviewNode.ChildNodes.First(node => node.Name == "div");
                        var pictureNode = detailsNode.WhereOfDescendantsWithClass("div", "picSurround")
                                          .First()                   //1nd picSurround
                                          .Descendants("a").First(); //2nd a tag
                        current.Author       = pictureNode.Attributes["href"].Value.Split('/').Last();
                        current.AuthorAvatar = pictureNode.Descendants("img").First().Attributes["data-src"].Value;
                        //
                        current.HelpfulCount =
                            detailsNode.WhereOfDescendantsWithClass("div", "lightLink spaceit")
                            .Skip(1)
                            .First()
                            .InnerText.Trim()
                            .TrimWhitespaceInside();
                        //
                        var rightTableNode     = reviewNode.FirstOfDescendantsWithClass("div", "mb8");
                        var rightTableNodeDivs = rightTableNode.Descendants("div").ToList();
                        current.Date          = rightTableNode.ChildNodes[0].InnerText.Trim();
                        current.EpisodesSeen  = rightTableNodeDivs[0].InnerText.Trim();
                        current.OverallRating = rightTableNodeDivs[1].InnerText.Trim().TrimWhitespaceInside();
                        //Review Content
                        var reviewNodeContent = reviewNode.FirstOfDescendantsWithClass("div", "spaceit textReadability word-break pt8 mt8");
                        foreach (var scoreRow in reviewNodeContent.ChildNodes[1].Descendants("tr").Skip(1))
                        {
                            var tds = scoreRow.Descendants("td").ToList();
                            current.Score.Add(new ReviewScore {
                                Field = tds[0].InnerText, Score = tds[1].InnerText == "&nbsp;" ? "N/A" : tds[1].InnerText
                            });
                        }
                        reviewNodeContent.ChildNodes.Remove(1);
                        current.Review =
                            WebUtility.HtmlDecode(reviewNodeContent.InnerText.Replace("read more", "").Replace("Helpful", "").Trim().TrimWhitespaceInside(false));

                        output.Add(current);
                    }
                    catch (Exception)
                    {
                        //something unexpected
                    }
                }
            }
            catch (Exception)
            {
                //no reviews
            }
            DataCache.SaveAnimeReviews(_targetId, output, _anime);

            return(output);
        }