/// <summary>
        /// Called when we should get the trending subs
        /// </summary>
        public void GetTrendingSubreddits()
        {
            // Check to see if we should update.
            DateTime now = DateTime.Now;
            if(LastTrendingSubs.Count == 0 || now.Day != LastUpdate.Day || now.Month != LastUpdate.Month)
            {
                // Make the subreddit
                Subreddit trendingSub = new Subreddit()
                {
                    DisplayName = "trendingsubreddits",
                    Id = "311a2",
                    Title = "Trending Subreddits",
                    PublicDescription = "Trending Subreddits",
                };

                // Get the collector
                m_collector = PostCollector.GetCollector(trendingSub, m_baconMan, SortTypes.New);
                m_collector.OnCollectionUpdated += Collector_OnCollectionUpdated;
                m_collector.OnCollectorStateChange += Collector_OnCollectorStateChange;

                // Force an update, get only one story.
                m_collector.Update(true, 1);
            }
            else
            {
                // If not just fire the event now with the cached subs
                FireReadyEvent(LastTrendingSubs);
            }
        }
示例#2
0
        /// <summary>
        /// Creates a secondary tile given a subreddit.
        /// </summary>
        /// <param name="subreddit"></param>
        /// <returns></returns>
        public async Task<bool> CreateSubredditTile(Subreddit subreddit)
        {
            // If it already exists get out of here.
            if (IsSubredditPinned(subreddit.DisplayName))
            {
                return true;
            }

            // Try to make the tile
            SecondaryTile tile = new SecondaryTile();
            tile.DisplayName = subreddit.DisplayName;
            tile.TileId = c_subredditTitleId + subreddit.DisplayName;
            tile.Arguments = c_subredditOpenArgument + subreddit.DisplayName;

            // Set the visuals
            tile.VisualElements.Square150x150Logo = new Uri("ms-appx:///Assets/AppAssets/Square150x150/Square150.png", UriKind.Absolute);
            tile.VisualElements.Square310x310Logo = new Uri("ms-appx:///Assets/AppAssets/Square310x310/Square210.png", UriKind.Absolute);
            tile.VisualElements.Square44x44Logo = new Uri("ms-appx:///Assets/AppAssets/Square44x44/Square44.png", UriKind.Absolute);
            tile.VisualElements.Square71x71Logo = new Uri("ms-appx:///Assets/AppAssets/Square71x71/Square71.png", UriKind.Absolute);
            tile.VisualElements.Wide310x150Logo = new Uri("ms-appx:///Assets/AppAssets/Wide310x310/Wide310.png", UriKind.Absolute);
            tile.VisualElements.ShowNameOnSquare150x150Logo = true;
            tile.VisualElements.ShowNameOnSquare310x310Logo = true;
            tile.VisualElements.ShowNameOnWide310x150Logo = true;
            tile.RoamingEnabled = true;

            // Request the create.
            return await tile.RequestCreateAsync();
        }
示例#3
0
        /// <summary>
        /// Removes a subreddit tile that is pinned.
        /// </summary>
        /// <param name="subreddit"></param>
        /// <returns></returns>
        public async Task<bool> RemoveSubredditTile(Subreddit subreddit)
        {
            // Check that is exists
            if (!IsSubredditPinned(subreddit.DisplayName))
            {
                return true;
            }

            // Get all tiles
            IReadOnlyList<SecondaryTile> tiles = await SecondaryTile.FindAllAsync();

            // Find this one
            foreach (SecondaryTile tile in tiles)
            {
                if (tile.TileId.Equals(c_subredditTitleId + subreddit.DisplayName))
                {
                    return await tile.RequestDeleteAsync();
                }
            }

            // We failed
            return false;
        }
        /// <summary>
        /// Fired when the panel is being created.
        /// </summary>
        /// <param name="host">A reference to the host.</param>
        /// <param name="arguments">Arguments for the panel</param>
        public void PanelSetup(IPanelHost host, Dictionary<string, object> arguments)
        {
            // Capture the host
            m_host = host;

            // Check for the subreddit arg
            if (!arguments.ContainsKey(PanelManager.NAV_ARGS_SUBREDDIT_NAME))
            {
                throw new Exception("No subreddit was given!");
            }
            string subredditName = (string)arguments[PanelManager.NAV_ARGS_SUBREDDIT_NAME];

            // Kick off a background task to do the work
            Task.Run(async () =>
            {
                // Try to get the subreddit from the local cache.
                Subreddit subreddit = App.BaconMan.SubredditMan.GetSubredditByDisplayName(subredditName);

                // It is very rare that we can't get it from the cache because something
                // else usually request it from the web and then it will be cached.
                if (subreddit == null)
                {
                    // Since this can take some time, show the loading overlay
                    ShowFullScreenLoading();

                    // Try to get the subreddit from the web
                    subreddit = await App.BaconMan.SubredditMan.GetSubredditFromWebByDisplayName((string)arguments[PanelManager.NAV_ARGS_SUBREDDIT_NAME]);
                }

                // Check again.
                if (subreddit == null)
                {
                    // Hmmmm. We can't load the subreddit. Show a message and go back
                    App.BaconMan.MessageMan.ShowMessageSimple("Hmmm, That's Not Right", "We can't load this subreddit right now, check your Internet connection.");

                    // We need to wait some time until the transition animation is done or we can't go back.
                    // If we call GoBack while we are still navigating it will be ignored.
                    await Task.Delay(1000);

                    // Now try to go back.
                    await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Low, () =>
                    {
                        m_host.GoBack();
                    });

                    // Get out of here.
                    return;
                }

                // Capture the subreddit
                m_subreddit = subreddit;

                // Get the current sort
                m_currentSort = arguments.ContainsKey(PanelManager.NAV_ARGS_SUBREDDIT_SORT) ? (SortTypes)arguments[PanelManager.NAV_ARGS_SUBREDDIT_SORT] : SortTypes.Hot;

                // Get the current sort time
                m_currentSortTime = arguments.ContainsKey(PanelManager.NAV_ARGS_SUBREDDIT_SORT_TIME) ? (SortTimeTypes)arguments[PanelManager.NAV_ARGS_SUBREDDIT_SORT_TIME] : SortTimeTypes.Week;

                // Try to get the target post id
                if (arguments.ContainsKey(PanelManager.NAV_ARGS_POST_ID))
                {
                    m_targetPost = (string)arguments[PanelManager.NAV_ARGS_POST_ID];
                }

                // Try to get the force post, this will make us show only one post for the subreddit,
                // which is the post given.
                string forcePostId = null;
                if (arguments.ContainsKey(PanelManager.NAV_ARGS_FORCE_POST_ID))
                {
                    forcePostId = (string)arguments[PanelManager.NAV_ARGS_FORCE_POST_ID];

                    // If the UI isn't already shown show the loading UI. Most of the time this post wont' be cached
                    // so it can take some time to load.
                    ShowFullScreenLoading();
                }

                // See if we are targeting a comment
                if (arguments.ContainsKey(PanelManager.NAV_ARGS_FORCE_COMMENT_ID))
                {
                    m_targetComment = (string)arguments[PanelManager.NAV_ARGS_FORCE_COMMENT_ID];
                }

                // Get the collector and register for updates.
                m_collector = PostCollector.GetCollector(m_subreddit, App.BaconMan, m_currentSort, m_currentSortTime, forcePostId);
                m_collector.OnCollectionUpdated += Collector_OnCollectionUpdated;

                // Kick off an update of the subreddits if needed.
                m_collector.Update();

                // Set any posts that exist right now
                UpdatePosts(0, m_collector.GetCurrentPosts());
            });
        }
示例#5
0
        public void SetupPage(Subreddit subreddit, SortTypes sortType, SortTimeTypes sortTimeType)
        {
            // Capture the subreddit
            m_subreddit = subreddit;

            // Get the sort type
            SetCurrentSort(sortType);

            // Set the time sort
            SetCurrentTimeSort(sortTimeType);

            // Get the collector and register for updates.
            m_collector = PostCollector.GetCollector(m_subreddit, App.BaconMan, m_currentSortType, m_currentSortTimeType);
            m_collector.OnCollectorStateChange += Collector_OnCollectorStateChange;
            m_collector.OnCollectionUpdated += Collector_OnCollectionUpdated;

            // Kick off an update of the subreddits if needed.
            m_collector.Update(false, 30);

            // Set any posts that exist right now
            SetPosts(0, m_collector.GetCurrentPosts(), true);

            // Setup the UI with the name.
            ui_subredditName.Text = $"/r/{m_subreddit.DisplayName}";
        }
示例#6
0
 /// <summary>
 /// Navigates to a subreddit.
 /// </summary>
 /// <param name="subreddit"></param>
 private void NavigateToSubreddit(Subreddit subreddit)
 {
     Dictionary<string, object> args = new Dictionary<string, object>();
     args.Add(PanelManager.NAV_ARGS_SUBREDDIT_NAME, subreddit.DisplayName.ToLower());
     m_panelManager.Navigate(typeof(SubredditPanel), subreddit.GetNavigationUniqueId(SortTypes.Hot), args);
 }
示例#7
0
        /// <summary>
        /// This function handles subreddits that are being parsed from the web. It will add
        /// any subreddits that need to be added
        /// </summary>
        private void HandleSubredditsFromWeb(List<Subreddit> subreddits)
        {
            // Add the defaults
            // #todo figure out what to add here
            Subreddit subreddit = new Subreddit()
            {
                DisplayName = "all",
                Title = "The top of reddit",
                Id = "all",
                IsArtifical = true
            };
            subreddits.Add(subreddit);
            subreddit = new Subreddit()
            {
                DisplayName = "frontpage",
                Title = "Your front page",
                Id = "frontpage",
                IsArtifical = true
            };
            subreddits.Add(subreddit);

            if(!m_baconMan.UserMan.IsUserSignedIn)
            {
                // If the user isn't signed in add baconit, windowsphone, and windows for free!
                subreddit = new Subreddit()
                {
                    DisplayName = "baconit",
                    Title = "The best reddit app ever!",
                    Id = "2rfk9"
                };
                subreddits.Add(subreddit);
                subreddit = new Subreddit()
                {
                    DisplayName = "windowsphone",
                    Title = "Everything Windows Phone!",
                    Id = "2r71o"
                };
                subreddits.Add(subreddit);
                subreddit = new Subreddit()
                {
                    DisplayName = "windows",
                    Title = "Windows",
                    Id = "2qh3k"
                };
                subreddits.Add(subreddit);
            }
            else
            {
                // If the user is signed in, add the saved subreddit.
                subreddit = new Subreddit()
                {
                    DisplayName = "saved",
                    Title = "Your saved posts",
                    Id = "saved",
                    IsArtifical = true
                };
                subreddits.Add(subreddit);
            }

            // Send them on
            SetSubreddits(subreddits);
        }
        /// <summary>
        /// THREAD BLOCKING this function will get post from a subreddit while blocking
        /// the calling thread.
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        private List<Post> GetSubredditStories(string name)
        {
            // Create a fake subreddit, the ID needs to be unique
            Subreddit subreddit = new Subreddit() { Id = DateTime.Now.Ticks.ToString(), DisplayName = name };

            // Get the collector for the subreddit
            SubredditCollector collector = SubredditCollector.GetCollector(subreddit, m_baconMan);

            // Sub to the collector callback
            collector.OnCollectionUpdated += Collector_OnCollectionUpdated;

            // Reset the event
            m_autoReset.Reset();
            m_currentSubredditPosts = null;

            // Kick off the update
            collector.Update(true);

            // Block until the posts are done or until 10 seconds passes
            m_autoReset.WaitOne(10000);

            return m_currentSubredditPosts;
        }
        /// <summary>
        /// This will kick off the process of getting the stories for a subreddit.
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        private void GetSubredditStories(string name, UpdateTypes type)
        {
            // Create a fake subreddit, the ID needs to be unique
            Subreddit subreddit = new Subreddit() { Id = DateTime.Now.Ticks.ToString(), DisplayName = name };

            // Get the collector for the subreddit
            PostCollector collector = PostCollector.GetCollector(subreddit, m_baconMan);

            // Sub to the collector callback
            if(type == UpdateTypes.LockScreen)
            {
                collector.OnCollectionUpdated += Collector_OnCollectionUpdatedLockScreen;
                collector.OnCollectorStateChange += Collector_OnCollectorStateChangeLockScreen;
            }
            else if(type == UpdateTypes.Band)
            {
                collector.OnCollectionUpdated += Collector_OnCollectionUpdatedBand;
                collector.OnCollectorStateChange += Collector_OnCollectorStateChangeBand;
            }
            else
            {
                collector.OnCollectionUpdated += Collector_OnCollectionUpdatedDesktop;
                collector.OnCollectorStateChange += Collector_OnCollectorStateChangeDesktop;
            }

            // Kick off the update
            collector.Update(true);
        }
示例#10
0
        /// <summary>
        /// Fired when we should show a subreddit.
        /// </summary>
        /// <param name="subreddit"></param>
        public void SetSubreddit(IPanelHost host, Subreddit subreddit)
        {
            // Capture host
            m_host = host;

            // Make sure we don't already have it.
            if (m_currentSubreddit != null && m_currentSubreddit.Id.Equals(subreddit.Id))
            {
                // Update the buttons
                SetSubButton();
                SetSearchButton();
                SetPinButton();

                // Scroll the scroller to the top
                ui_contentRoot.ChangeView(null, 0, null, true);

                return;
            }

            // Set the current subreddit
            m_currentSubreddit = subreddit;

            // Set the title
            ui_titleTextBlock.Text = m_currentSubreddit.DisplayName;

            // Set the subs, if the value doesn't exist or the subreddit is fake make it "many"
            if (m_currentSubreddit.SubscriberCount.HasValue && !m_currentSubreddit.IsArtifical)
            {
                ui_subscribersTextBlock.Text = String.Format("{0:N0}", m_currentSubreddit.SubscriberCount) + " subscribers";
            }
            else
            {
                ui_subscribersTextBlock.Text = "many subscribers";
            }

            // Set the subscribe button
            SetSubButton();
            SetPinButton();
            SetSearchButton();

            // Set the markdown
            SetMarkdown();
        }