private View GetTemplateDelegate(int i, MalNewsUnitModel malNewsUnitModel, View convertView)
        {
            var view = convertView;

            if (view == null)
            {
                view = Activity.LayoutInflater.Inflate(Resource.Layout.ArtclesPageItem, null);
                view.SetOnClickListener(new OnClickListener(OnItemClick));
                if (ViewModel.ThumbnailWidth == 100)
                {
                    view.FindViewById <ImageViewAsync>(Resource.Id.ArticlesPageItemImage).SetScaleType(ImageView.ScaleType.Center);
                }
            }
            view.Tag = malNewsUnitModel.Wrap();

            view.FindViewById <TextView>(Resource.Id.ArticlesPageItemAuthor).Text    = malNewsUnitModel.Author;
            view.FindViewById <TextView>(Resource.Id.ArticlesPageItemViews).Text     = malNewsUnitModel.Views;
            view.FindViewById <TextView>(Resource.Id.ArticlesPageItemTags).Text      = malNewsUnitModel.Tags;
            view.FindViewById <TextView>(Resource.Id.ArticlesPageItemHeader).Text    = malNewsUnitModel.Title;
            view.FindViewById <TextView>(Resource.Id.ArticlesPageItemHighlight).Text = malNewsUnitModel.Highlight;

            try
            {
                view.FindViewById <ImageViewAsync>(Resource.Id.ArticlesPageItemImage).Into(malNewsUnitModel.ImgUrl);
            }
            catch (Exception)
            {
                //network on mian thread
            }


            return(view);
        }
예제 #2
0
 private static TileBinding GenerateTileBindingLarge(MalNewsUnitModel news)
 {
     return(new TileBinding
     {
         Content = new TileBindingContentAdaptive()
         {
             PeekImage = new TilePeekImage
             {
                 Source = news.ImgUrl,
             },
             BackgroundImage = new TileBackgroundImage
             {
                 Source = news.ImgUrl,
                 HintOverlay = 50,
             },
             Children =
             {
                 new AdaptiveText
                 {
                     Text = news.Title,
                     HintMaxLines = 3,
                     HintWrap = true,
                     HintStyle = AdaptiveTextStyle.Subtitle,
                 },
                 new AdaptiveText
                 {
                     Text = news.Highlight,
                     HintMaxLines = 12,
                     HintWrap = true,
                     HintStyle = AdaptiveTextStyle.BodySubtle,
                 }
             }
         }
     });
 }
예제 #3
0
        private static TileBinding GenerateTileBindingWide(MalNewsUnitModel news)
        {
            return(new TileBinding
            {
                Content = new TileBindingContentAdaptive()
                {
                    BackgroundImage = new TileBackgroundImage
                    {
                        HintOverlay = 50,
                        Source = news.ImgUrl,
                    },

                    Children =
                    {
                        new AdaptiveText
                        {
                            Text = news.Title,
                            HintMaxLines = 2,
                            HintWrap = true,
                            HintStyle = AdaptiveTextStyle.Body,
                        },
                        new AdaptiveText
                        {
                            Text = news.Highlight,
                            HintMaxLines = 10,
                            HintWrap = true,
                            HintStyle = AdaptiveTextStyle.CaptionSubtle,
                        }
                    }
                }
            });
        }
예제 #4
0
 private async void LoadArticle(MalNewsUnitModel data)
 {
     LoadingVisibility      = true;
     ArticleIndexVisibility = false;
     ViewModelLocator.GeneralMain.CurrentStatus = data.Title;
     CurrentNews = Articles.IndexOf(data);
     OpenWebView?.Invoke(await new MalArticleQuery(data.Url, data.Title, data.Type).GetArticleHtml(), data);
 }
예제 #5
0
 private async void ViewModelOnOpenWebView(string html, MalNewsUnitModel item)
 {
     ViewModelLocator.NavMgr.RegisterOneTimeOverride(new RelayCommand(() =>
     {
         ViewModel.WebViewVisibility      = false;
         ViewModel.ArticleIndexVisibility = true;
     }));
     _currentId = ViewModel.Articles.IndexOf(item);
     ArticlesPageWebView.LoadDataWithBaseURL(null, ResourceLocator.CssManager.WrapWithCss(html), "text/html; charset=utf-8", "UTF-8", null);
 }
예제 #6
0
 private async void LoadArticle(MalNewsUnitModel data)
 {
     LoadingVisibility      = Visibility.Visible;
     ArticleIndexVisibility = Visibility.Collapsed;
     ViewModelLocator.Main.CurrentStatus = data.Title;
     NavMgr.RegisterBackNav(PageIndex.PageArticles,
                            data.Type == MalNewsType.Article
             ? MalArticlesPageNavigationArgs.Articles
             : MalArticlesPageNavigationArgs.News);
     OpenWebView?.Invoke(await new MalArticleQuery(data.Url, data.Title, data.Type).GetArticleHtml(), Articles.IndexOf(data));
 }
예제 #7
0
        private void ViewModelOnOpenWebView(string html, MalNewsUnitModel id)
        {
            //back nav
            ViewModelLocator.NavMgr.RegisterOneTimeMainOverride(new RelayCommand(() =>
            {
                ViewModel.WebViewVisibility                = false;
                ViewModel.ArticleIndexVisibility           = true;
                ViewModelLocator.GeneralMain.CurrentStatus = ViewModel.PrevWorkMode != null &&
                                                             ViewModel.PrevWorkMode.Value == ArticlePageWorkMode.Articles
                    ? "Articles"
                    : "News";
                ViewModel.CurrentNews = -1;
            }));
            //


            ArticleWebView.NavigateToString(ResourceLocator.CssManager.WrapWithCss(html));
        }
예제 #8
0
 private static TileBinding GenerateTileBindingMedium(MalNewsUnitModel news)
 {
     return(new TileBinding
     {
         Content = new TileBindingContentAdaptive()
         {
             PeekImage = new TilePeekImage
             {
                 Source = news.ImgUrl,
                 HintCrop = TilePeekImageCrop.Default,
             },
             Children =
             {
                 new AdaptiveText
                 {
                     Text = news.Title,
                     HintWrap = true,
                 }
             }
         }
     });
 }
예제 #9
0
        private void ViewModelOnOpenWebView(string html, MalNewsUnitModel item)
        {
            //BackNav
            ViewModelLocator.NavMgr.RegisterBackNav(PageIndex.PageArticles,
                                                    item.Type == MalNewsType.Article
                    ? MalArticlesPageNavigationArgs.Articles
                    : MalArticlesPageNavigationArgs.News);
            //
            _currentId = ViewModel.Articles.IndexOf(item);
            var uiSettings = new Windows.UI.ViewManagement.UISettings();
            var color      = uiSettings.GetColorValue(Windows.UI.ViewManagement.UIColorType.Accent);
            var color1     = uiSettings.GetColorValue(Windows.UI.ViewManagement.UIColorType.AccentDark2);
            var color2     = uiSettings.GetColorValue(Windows.UI.ViewManagement.UIColorType.AccentLight2);
            var css        = Css.Replace("AccentColourBase", "#" + color.ToString().Substring(3)).
                             Replace("AccentColourLight", "#" + color2.ToString().Substring(3)).
                             Replace("AccentColourDark", "#" + color1.ToString().Substring(3))
                             .Replace("BodyBackgroundThemeColor",
                                      Settings.SelectedTheme == (int)ApplicationTheme.Dark ? "#2d2d2d" : "#e6e6e6")
                             .Replace("BodyForegroundThemeColor",
                                      Settings.SelectedTheme == (int)ApplicationTheme.Dark ? "white" : "black").Replace(
                "HorizontalSeparatorColor", Settings.SelectedTheme == (int)ApplicationTheme.Dark ? "#0d0d0d" : "#b3b3b3");

            ArticleWebView.NavigateToString(css + Begin + html + "</div></body></html>");
        }
예제 #10
0
        public async Task <List <MalNewsUnitModel> > GetArticlesIndex(bool force = false)
        {
            if (!force)
            {
                if (_cachedData.ContainsKey(_mode))
                {
                    return(_cachedData[_mode]);
                }
                var possibleData = await DataCache.RetrieveArticleIndexData(_mode);

                if (possibleData != null)
                {
                    return(possibleData);
                }
            }
            var output = new List <MalNewsUnitModel>();
            var raw    = await GetRequestResponse();

            if (string.IsNullOrEmpty(raw))
            {
                return(null);
            }
            var doc = new HtmlDocument();

            doc.LoadHtml(raw);
            switch (_mode)
            {
            case ArticlePageWorkMode.Articles:
                foreach (var newsUnit in doc.WhereOfDescendantsWithClass("div", "news-unit clearfix"))
                {
                    try
                    {
                        var current = new MalNewsUnitModel();
                        var img     = newsUnit.Descendants("a").First();
                        current.Url    = img.Attributes["href"].Value;
                        current.ImgUrl = img.Descendants("img").First().Attributes["data-src"].Value;
                        var contentDivs = newsUnit.Descendants("div").ToList();
                        current.Title     = WebUtility.HtmlDecode(contentDivs[0].Descendants("p").First().InnerText.Trim());
                        current.Highlight = WebUtility.HtmlDecode(contentDivs[1].InnerText.Trim());
                        var infos = contentDivs[2].Descendants("p").ToList();
                        current.Author = infos[0].InnerText.Trim();
                        current.Views  = infos[1].InnerText.Trim();
                        try
                        {
                            current.Tags = string.Join(", ", contentDivs[3].Descendants("a").Select(node => node.InnerText.Trim()));
                        }
                        catch (Exception)
                        {
                            //no tags
                        }
                        current.Type = MalNewsType.Article;
                        output.Add(current);
                    }
                    catch (Exception)
                    {
                        //hatml
                    }
                }
                break;

            case ArticlePageWorkMode.News:
                foreach (var newsUnit in doc.WhereOfDescendantsWithClass("div", "news-unit clearfix rect"))
                {
                    try
                    {
                        var current = new MalNewsUnitModel();
                        var img     = newsUnit.Descendants("a").First();
                        current.Url    = img.Attributes["href"].Value;
                        current.ImgUrl = img.Descendants("img").First().Attributes["src"].Value;
                        var contentDivs = newsUnit.Descendants("div").ToList();
                        current.Title     = WebUtility.HtmlDecode(contentDivs[0].Descendants("p").First().InnerText.Trim());
                        current.Highlight = WebUtility.HtmlDecode(contentDivs[1].InnerText.Trim());
                        var infos = contentDivs[2].Descendants("p").ToList();
                        current.Author = "By: " + infos[0].ChildNodes[1].InnerText.Trim();
                        current.Views  = infos[0].ChildNodes[3].InnerText.Trim();
                        try
                        {
                            current.Tags = string.Join(", ", contentDivs[2].ChildNodes[3].Descendants("a").Select(node => node.InnerText.Trim()));
                        }
                        catch (Exception)
                        {
                            //no tags
                        }
                        current.Type = MalNewsType.News;
                        output.Add(current);
                    }
                    catch (Exception)
                    {
                        //hatml
                    }
                }
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            _cachedData[_mode] = output;
            DataCache.SaveArticleIndexData(_mode, output);
            return(output);
        }
예제 #11
0
        public async Task <List <MalNewsUnitModel> > GetArticlesIndex(bool force = false)
        {
            if (!force)
            {
                if (_cachedData.ContainsKey(_mode))
                {
                    return(_cachedData[_mode]);
                }
                var possibleData = await DataCache.RetrieveArticleIndexData(_mode);

                if (possibleData != null && possibleData.Count > 0)
                {
                    return(possibleData);
                }
            }
            var output = new List <MalNewsUnitModel>();
            var raw    = await GetRequestResponse();

            if (string.IsNullOrEmpty(raw))
            {
                return(null);
            }
            var doc = new HtmlDocument();

            doc.LoadHtml(raw);
            switch (_mode)
            {
            case ArticlePageWorkMode.Articles:
                foreach (var featuredNewsUnit in doc.WhereOfDescendantsWithClass("div", "featured-pickup-unit"))
                {
                    try
                    {
                        var current = new MalNewsUnitModel();
                        var img     = featuredNewsUnit.Descendants("a").First();
                        var imgUrl  = img.Attributes["data-bg"].Value;
                        if (!imgUrl.Contains("questionmark"))
                        {
                            imgUrl         = Regex.Replace(imgUrl, @"\/r\/\d+x\d+", "");
                            current.ImgUrl = imgUrl.Substring(0, imgUrl.IndexOf('?'));
                        }
                        current.Url       = img.Attributes["href"].Value;
                        current.Highlight = WebUtility.HtmlDecode(featuredNewsUnit.Descendants("p").First().InnerText.Trim());
                        current.Title     = WebUtility.HtmlDecode(img.InnerText.Trim());
                        if (current.Title.ToLower().Contains("giveaway"))    // emm I'll pass on these
                        {
                            continue;
                        }
                        var infoDiv            = featuredNewsUnit.FirstOfDescendantsWithClass("div", "information");
                        var infoDivsParagraphs = infoDiv.Descendants("p").ToList();
                        current.Author = WebUtility.HtmlDecode(infoDivsParagraphs[0].InnerText.Trim());
                        current.Views  = WebUtility.HtmlDecode(infoDivsParagraphs[1].InnerText.Trim());
                        current.Tags   = "New";

                        output.Add(current);
                    }
                    catch (Exception)
                    {
                    }
                }
                foreach (var newsUnit in doc.WhereOfDescendantsWithClass("div", "news-unit clearfix"))
                {
                    try
                    {
                        var current = new MalNewsUnitModel();
                        var img     = newsUnit.Descendants("a").First();
                        current.Url = img.Attributes["href"].Value;
                        try
                        {
                            current.ImgUrl = img.Descendants("img").First().Attributes["data-src"].Value;
                        }
                        catch (Exception)
                        {
                            //html here is messy, there may be change here soon
                        }
                        var contentDivs = newsUnit.Descendants("div").ToList();
                        current.Title =
                            WebUtility.HtmlDecode(contentDivs[0].Descendants("p").First().InnerText.Trim());
                        current.Highlight = WebUtility.HtmlDecode(contentDivs[1].InnerText.Trim());
                        var infos = contentDivs[2].Descendants("p").ToList();
                        current.Author = infos[0].InnerText.Trim();
                        current.Views  = infos[1].InnerText.Trim();
                        try
                        {
                            current.Tags = string.Join(", ",
                                                       contentDivs[3].Descendants("a").Select(node => node.InnerText.Trim()));
                        }
                        catch (Exception)
                        {
                            //no tags
                        }
                        current.Type = MalNewsType.Article;
                        output.Add(current);
                    }
                    catch (Exception)
                    {
                        //hatml
                    }
                }

                break;

            case ArticlePageWorkMode.News:
                foreach (var newsUnit in doc.WhereOfDescendantsWithClass("div", "news-unit clearfix rect"))
                {
                    try
                    {
                        var current = new MalNewsUnitModel();
                        var img     = newsUnit.Descendants("a").First();
                        current.Url = img.Attributes["href"].Value;
                        try
                        {
                            current.ImgUrl = img.Descendants("img").First().Attributes["srcset"].Value.Split(' ', ' ')[2];
                        }
                        catch (Exception)
                        {
                            try
                            {
                                current.ImgUrl = img.Descendants("img").First().Attributes["data-src"].Value;
                            }
                            catch (Exception)
                            {
                                //it may work this way, my predicition
                            }
                            //html here is messy, there may be change here soon
                        }
                        var contentDivs = newsUnit.Descendants("div").ToList();
                        current.Title     = WebUtility.HtmlDecode(contentDivs[0].Descendants("p").First().InnerText.Trim());
                        current.Highlight = WebUtility.HtmlDecode(contentDivs[1].InnerText.Trim());
                        var infos = contentDivs[2].Descendants("p").ToList();
                        current.Author = "By: " + infos[0].ChildNodes[1].InnerText.Trim();
                        current.Views  = infos[0].ChildNodes[3].InnerText.Trim();
                        try
                        {
                            current.Tags = string.Join(", ", contentDivs[2].ChildNodes[3].Descendants("a").Select(node => node.InnerText.Trim()));
                        }
                        catch (Exception)
                        {
                            //no tags
                        }
                        current.Type = MalNewsType.News;
                        output.Add(current);
                    }
                    catch (Exception)
                    {
                        //hatml
                    }
                }
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            _cachedData[_mode] = output;
            DataCache.SaveArticleIndexData(_mode, output);
            return(output);
        }