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; }
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); }
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); } }
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; }
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); }
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 == " " ? "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); }