/// <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); } }
/// <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(); }
/// <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()); }); }
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}"; }
/// <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); }
/// <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); }
/// <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(); }