PageRenderTime 64ms CodeModel.GetById 33ms RepoModel.GetById 1ms app.codeStats 0ms

/BaconographyWP8Core/MainPage.xaml.cs

https://github.com/hippiehunter/Baconography
C# | 550 lines | 433 code | 82 blank | 35 comment | 90 complexity | 6d95313a42653071ad3e2dc9f920af30 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Navigation;
  8. using Microsoft.Phone.Controls;
  9. using Microsoft.Phone.Shell;
  10. using BaconographyPortable.Services;
  11. using Microsoft.Practices.ServiceLocation;
  12. using BaconographyPortable.ViewModel;
  13. using Newtonsoft.Json;
  14. using BaconographyWP8.View;
  15. using GalaSoft.MvvmLight.Messaging;
  16. using BaconographyPortable.Messages;
  17. using BaconographyWP8.Messages;
  18. using BaconographyWP8Core;
  19. using BaconographyWP8.ViewModel;
  20. using System.Threading.Tasks;
  21. using System.Windows.Controls.Primitives;
  22. using Microsoft.Phone.Reactive;
  23. using System.Windows.Media;
  24. using System.Windows.Media.Imaging;
  25. using GalaSoft.MvvmLight;
  26. using BaconographyWP8Core.Common;
  27. using BaconographyWP8.Converters;
  28. using BaconographyWP8Core.View;
  29. using ReviewNotifier.Apollo;
  30. using System.Windows.Data;
  31. using System.Collections.Specialized;
  32. namespace BaconographyWP8
  33. {
  34. [ViewUri("/BaconographyWP8Core;component/MainPage.xaml")]
  35. public partial class MainPage : PhoneApplicationPage
  36. {
  37. // Constructor
  38. ISettingsService _settingsService;
  39. IViewModelContextService _viewModelContextService;
  40. ISmartOfflineService _smartOfflineService;
  41. INavigationService _navigationService;
  42. IUserService _userService;
  43. public MainPage()
  44. {
  45. InitializeComponent();
  46. // Sample code to localize the ApplicationBar
  47. //BuildLocalizedApplicationBar();
  48. Loaded +=MainPage_Loaded;
  49. Messenger.Default.Register<UserLoggedInMessage>(this, OnUserLoggedIn);
  50. _settingsService = ServiceLocator.Current.GetInstance<ISettingsService>();
  51. _viewModelContextService = ServiceLocator.Current.GetInstance<IViewModelContextService>();
  52. _smartOfflineService = ServiceLocator.Current.GetInstance<ISmartOfflineService>();
  53. _navigationService = ServiceLocator.Current.GetInstance<INavigationService>();
  54. _userService = ServiceLocator.Current.GetInstance<IUserService>();
  55. MaybeUserIsLoggedIn();
  56. }
  57. private void MainPage_Loaded(object sender, RoutedEventArgs e)
  58. {
  59. ReviewNotification.TriggerAsync("Like what we're doing? Please leave us a review on the store\n\nGot a Nag? Let us know what we can improve on /r/baconography", "Review", 5);
  60. }
  61. public RedditView CurrentRedditView
  62. {
  63. get { return (RedditView)GetValue(CurrentRedditViewProperty); }
  64. set { SetValue(CurrentRedditViewProperty, value); }
  65. }
  66. // Using a DependencyProperty as the backing store for CurrentRedditView. This enables animation, styling, binding, etc...
  67. public static readonly DependencyProperty CurrentRedditViewProperty =
  68. DependencyProperty.Register("CurrentRedditView", typeof(RedditView), typeof(MainPage), new PropertyMetadata(null));
  69. private void AdjustForOrientation(PageOrientation orientation)
  70. {
  71. Messenger.Default.Send<OrientationChangedMessage>(new OrientationChangedMessage { Orientation = orientation });
  72. lastKnownOrientation = orientation;
  73. if (LayoutRoot != null)
  74. {
  75. if (orientation == PageOrientation.LandscapeRight)
  76. LayoutRoot.Margin = new Thickness(40, 0, 0, 0);
  77. else if (orientation == PageOrientation.LandscapeLeft)
  78. LayoutRoot.Margin = new Thickness(0, 0, 35, 0);
  79. else
  80. LayoutRoot.Margin = new Thickness(0, 0, 0, 0);
  81. }
  82. }
  83. PageOrientation lastKnownOrientation;
  84. protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
  85. {
  86. if (e.NavigationMode == NavigationMode.Back && DataContext is ViewModelBase)
  87. {
  88. _viewModelContextService.PopViewModelContext(DataContext as ViewModelBase);
  89. }
  90. base.OnNavigatingFrom(e);
  91. }
  92. protected override void OnNavigatedTo(NavigationEventArgs e)
  93. {
  94. this.AdjustForOrientation(this.Orientation);
  95. if (e.NavigationMode == NavigationMode.Back)
  96. {
  97. if (CurrentRedditView != null)
  98. {
  99. CurrentRedditView.LoadWithScroll();
  100. }
  101. }
  102. else if (e.NavigationMode == NavigationMode.Refresh)
  103. {
  104. }
  105. else if (e.NavigationMode == NavigationMode.New)
  106. {
  107. if(DataContext is ViewModelBase)
  108. _viewModelContextService.PushViewModelContext(DataContext as ViewModelBase);
  109. _smartOfflineService.NavigatedToView(typeof(MainPage), (e.NavigationMode == NavigationMode.New));
  110. if (this.NavigationContext.QueryString.ContainsKey("data") && !string.IsNullOrWhiteSpace(this.NavigationContext.QueryString["data"]))
  111. {
  112. try
  113. {
  114. var unescapedData = Uri.UnescapeDataString(this.NavigationContext.QueryString["data"]);
  115. var deserializedObject = JsonConvert.DeserializeObject<SelectTemporaryRedditMessage>(unescapedData);
  116. if (deserializedObject is SelectTemporaryRedditMessage)
  117. {
  118. Messenger.Default.Send<SelectTemporaryRedditMessage>(deserializedObject as SelectTemporaryRedditMessage);
  119. int indexToPosition;
  120. if (DataContext != null && (((MultipleRedditMainViewModel)DataContext).FindSubredditMessageIndex(deserializedObject as SelectTemporaryRedditMessage, out indexToPosition)))
  121. {
  122. Messenger.Default.Send<SelectIndexMessage>(new SelectIndexMessage { Index = indexToPosition, TypeContext = typeof(MultipleRedditMainViewModel)});
  123. }
  124. }
  125. }
  126. catch (UriFormatException)
  127. {
  128. ServiceLocator.Current.GetInstance<IBaconProvider>().GetService<INotificationService>().CreateNotification("Invalid main page uri state, please PM /u/hippiehunter with details");
  129. }
  130. }
  131. else if (this.NavigationContext.QueryString.ContainsKey("WallpaperSettings"))
  132. {
  133. _navigationService.Navigate<SettingsPageView>("lockscreen");
  134. while (NavigationService.BackStack.Count() > 0)
  135. NavigationService.RemoveBackEntry();
  136. return;
  137. }
  138. }
  139. }
  140. protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
  141. {
  142. if (sortPopup.IsOpen == true)
  143. {
  144. sortPopup.IsOpen = false;
  145. e.Cancel = true;
  146. }
  147. else
  148. {
  149. base.OnBackKeyPress(e);
  150. }
  151. }
  152. protected override void OnOrientationChanged(OrientationChangedEventArgs e)
  153. {
  154. AdjustForOrientation(e.Orientation);
  155. base.OnOrientationChanged(e);
  156. }
  157. private string loginItemText = "login";
  158. private async void MaybeUserIsLoggedIn()
  159. {
  160. try
  161. {
  162. var currentUser = await _userService.GetUser();
  163. if (currentUser != null && !string.IsNullOrWhiteSpace(currentUser.LoginCookie))
  164. OnUserLoggedIn(new UserLoggedInMessage { CurrentUser = currentUser, UserTriggered = false });
  165. }
  166. catch {}
  167. }
  168. private void OnUserLoggedIn(UserLoggedInMessage message)
  169. {
  170. if (appMenuItems == null || ApplicationBar.MenuItems.Count == 0)
  171. BuildMenu();
  172. bool loggedIn = message.CurrentUser != null && message.CurrentUser.Username != null;
  173. if (loggedIn)
  174. {
  175. loginItemText = "switch user / logout";
  176. }
  177. else
  178. {
  179. loginItemText = "login";
  180. }
  181. appMenuItems[(int)MenuEnum.Login].Text = loginItemText;
  182. if (loggedIn)
  183. {
  184. appBarButtons[(int)ButtonEnum.Mail].IsEnabled = true;
  185. appMenuItems[(int)MenuEnum.Submit].IsEnabled = true;
  186. }
  187. else
  188. {
  189. appBarButtons[(int)ButtonEnum.Mail].IsEnabled = false;
  190. appMenuItems[(int)MenuEnum.Submit].IsEnabled = false;
  191. }
  192. }
  193. private void MenuLogin_Click(object sender, EventArgs e)
  194. {
  195. var _navigationService = ServiceLocator.Current.GetInstance<INavigationService>();
  196. _navigationService.Navigate(typeof(LoginPageView), null);
  197. }
  198. private void MenuClose_Click(object sender, EventArgs e)
  199. {
  200. if (CurrentRedditView != null && CurrentRedditView.DataContext is RedditViewModel)
  201. {
  202. Messenger.Default.Send<CloseSubredditMessage>(new CloseSubredditMessage { Heading = ((RedditViewModel)CurrentRedditView.DataContext).Heading });
  203. }
  204. }
  205. private void MenuPin_Click(object sender, EventArgs e)
  206. {
  207. if (CurrentRedditView == null)
  208. return;
  209. var trvm = CurrentRedditView.DataContext as RedditViewModel;
  210. if (trvm == null || !trvm.IsTemporary)
  211. return;
  212. Messenger.Default.Send<CloseSubredditMessage>(new CloseSubredditMessage { Heading = trvm.Heading });
  213. Messenger.Default.Send<SelectSubredditMessage>(new SelectSubredditMessage { Subreddit = trvm.SelectedSubreddit, AddOnly = false });
  214. }
  215. private void MenuSettings_Click(object sender, EventArgs e)
  216. {
  217. var _navigationService = ServiceLocator.Current.GetInstance<INavigationService>();
  218. _navigationService.Navigate(typeof(SettingsPageView), null);
  219. }
  220. private void MenuMail_Click(object sender, EventArgs e)
  221. {
  222. var _navigationService = ServiceLocator.Current.GetInstance<INavigationService>();
  223. _navigationService.Navigate(typeof(MessagingPageView), null);
  224. }
  225. private void MenuSubmit_Click(object sender, EventArgs e)
  226. {
  227. var locator = Styles.Resources["Locator"] as ViewModelLocator;
  228. if (locator != null)
  229. {
  230. locator.Submit.RefreshUser.Execute(locator.Submit);
  231. }
  232. var _navigationService = ServiceLocator.Current.GetInstance<INavigationService>();
  233. _navigationService.Navigate(typeof(ComposePostPageView), null);
  234. }
  235. private void MenuManage_Click(object sender, EventArgs e)
  236. {
  237. var _navigationService = ServiceLocator.Current.GetInstance<INavigationService>();
  238. _navigationService.Navigate(typeof(SimpleSubredditManagerView), null);
  239. }
  240. private void MenuSort_Click(object sender, EventArgs e)
  241. {
  242. double height = 480;
  243. double width = 325;
  244. if (LayoutRoot.ActualHeight <= 480)
  245. height = LayoutRoot.ActualHeight;
  246. sortPopup.Height = height;
  247. sortPopup.Width = width;
  248. RedditViewModel rvm = CurrentRedditView.DataContext as RedditViewModel;
  249. if (rvm == null)
  250. return;
  251. var child = sortPopup.Child as SelectSortTypeView;
  252. if (child == null)
  253. child = new SelectSortTypeView();
  254. child.SortOrder = rvm.SortOrder;
  255. child.Height = height;
  256. child.Width = width;
  257. child.button_ok.Click += (object buttonSender, RoutedEventArgs buttonArgs) =>
  258. {
  259. sortPopup.IsOpen = false;
  260. rvm.SortOrder = child.SortOrder;
  261. };
  262. child.button_cancel.Click += (object buttonSender, RoutedEventArgs buttonArgs) =>
  263. {
  264. sortPopup.IsOpen = false;
  265. };
  266. sortPopup.Child = child;
  267. sortPopup.IsOpen = true;
  268. }
  269. List<ApplicationBarMenuItem> appMenuItems;
  270. List<ApplicationBarIconButton> appBarButtons;
  271. enum MenuEnum
  272. {
  273. Login = 0,
  274. Search,
  275. Sidebar,
  276. Submit,
  277. Close,
  278. Pin
  279. }
  280. enum ButtonEnum
  281. {
  282. ManageSubreddits = 0,
  283. Mail,
  284. Settings,
  285. Sort
  286. }
  287. private void BuildMenu()
  288. {
  289. var simpleLayoutMode = _settingsService.SimpleLayoutMode;
  290. appBarButtons = new List<ApplicationBarIconButton>();
  291. appMenuItems = new List<ApplicationBarMenuItem>();
  292. appBarButtons.Add(new ApplicationBarIconButton());
  293. appBarButtons[(int)ButtonEnum.ManageSubreddits].IconUri = new Uri("\\Assets\\Icons\\manage.png", UriKind.Relative);
  294. appBarButtons[(int)ButtonEnum.ManageSubreddits].Text = "manage subs";
  295. appBarButtons[(int)ButtonEnum.ManageSubreddits].IsEnabled = true;
  296. appBarButtons[(int)ButtonEnum.ManageSubreddits].Click += MenuManage_Click;
  297. appBarButtons.Add(new ApplicationBarIconButton());
  298. SetMailButtonIcon(null);
  299. appBarButtons[(int)ButtonEnum.Mail].Text = "mail";
  300. appBarButtons[(int)ButtonEnum.Mail].IsEnabled = false;
  301. appBarButtons[(int)ButtonEnum.Mail].Click += MenuMail_Click;
  302. ServiceLocator.Current.GetInstance<MessagesViewModel>().PropertyChanged += (sender, args) =>
  303. {
  304. SetMailButtonIcon(args);
  305. };
  306. appBarButtons.Add(new ApplicationBarIconButton());
  307. appBarButtons[(int)ButtonEnum.Settings].IconUri = new Uri("\\Assets\\Icons\\settings.png", UriKind.Relative);
  308. appBarButtons[(int)ButtonEnum.Settings].Text = "settings";
  309. appBarButtons[(int)ButtonEnum.Settings].IsEnabled = true;
  310. appBarButtons[(int)ButtonEnum.Settings].Click += MenuSettings_Click;
  311. appBarButtons.Add(new ApplicationBarIconButton());
  312. appBarButtons[(int)ButtonEnum.Sort].IconUri = new Uri("\\Assets\\Icons\\sort.png", UriKind.Relative);
  313. appBarButtons[(int)ButtonEnum.Sort].Text = "sort";
  314. appBarButtons[(int)ButtonEnum.Sort].IsEnabled = true;
  315. appBarButtons[(int)ButtonEnum.Sort].Click += MenuSort_Click;
  316. ApplicationBar.Buttons.Clear();
  317. try
  318. {
  319. if (simpleLayoutMode)
  320. {
  321. ApplicationBar.Buttons.Add(appBarButtons[(int)ButtonEnum.Mail] as IApplicationBarIconButton);
  322. ApplicationBar.Buttons.Add(appBarButtons[(int)ButtonEnum.Settings] as IApplicationBarIconButton);
  323. }
  324. else
  325. {
  326. foreach (var button in appBarButtons)
  327. ApplicationBar.Buttons.Add(button as IApplicationBarIconButton);
  328. }
  329. }
  330. catch (Exception e)
  331. {
  332. }
  333. appMenuItems.Add(new ApplicationBarMenuItem());
  334. appMenuItems[(int)MenuEnum.Login].Text = loginItemText;
  335. appMenuItems[(int)MenuEnum.Login].IsEnabled = true;
  336. appMenuItems[(int)MenuEnum.Login].Click += MenuLogin_Click;
  337. appMenuItems.Add(new ApplicationBarMenuItem());
  338. appMenuItems[(int)MenuEnum.Search].Text = "search";
  339. appMenuItems[(int)MenuEnum.Search].IsEnabled = true;
  340. appMenuItems[(int)MenuEnum.Search].Click += MenuSearch_Click;
  341. appMenuItems.Add(new ApplicationBarMenuItem());
  342. appMenuItems[(int)MenuEnum.Sidebar].Text = "sidebar";
  343. appMenuItems[(int)MenuEnum.Sidebar].IsEnabled = true;
  344. appMenuItems[(int)MenuEnum.Sidebar].Click += MenuSidebar_Click;
  345. appMenuItems.Add(new ApplicationBarMenuItem());
  346. appMenuItems[(int)MenuEnum.Submit].Text = "new post";
  347. appMenuItems[(int)MenuEnum.Submit].IsEnabled = false;
  348. appMenuItems[(int)MenuEnum.Submit].Click += MenuSubmit_Click;
  349. appMenuItems.Add(new ApplicationBarMenuItem());
  350. appMenuItems[(int)MenuEnum.Close].Text = "close subreddit";
  351. appMenuItems[(int)MenuEnum.Close].IsEnabled = true;
  352. appMenuItems[(int)MenuEnum.Close].Click += MenuClose_Click;
  353. appMenuItems.Add(new ApplicationBarMenuItem());
  354. appMenuItems[(int)MenuEnum.Pin].Text = "pin subreddit";
  355. appMenuItems[(int)MenuEnum.Pin].IsEnabled = true;
  356. appMenuItems[(int)MenuEnum.Pin].Click += MenuPin_Click;
  357. ApplicationBar.MenuItems.Clear();
  358. ApplicationBar.MenuItems.Add(appMenuItems[(int)MenuEnum.Login]);
  359. ApplicationBar.MenuItems.Add(appMenuItems[(int)MenuEnum.Search]);
  360. ApplicationBar.MenuItems.Add(appMenuItems[(int)MenuEnum.Submit]);
  361. }
  362. private void MenuSidebar_Click(object sender, EventArgs e)
  363. {
  364. if (CurrentRedditView != null && CurrentRedditView.DataContext is RedditViewModel)
  365. {
  366. var vm = CurrentRedditView.DataContext as RedditViewModel;
  367. var _navigationService = ServiceLocator.Current.GetInstance<INavigationService>();
  368. _navigationService.Navigate(typeof(AboutSubreddit), new Tuple<string>(vm.SelectedSubreddit.Data.Url));
  369. }
  370. }
  371. private void SetMailButtonIcon(System.ComponentModel.PropertyChangedEventArgs args)
  372. {
  373. if (args == null || args.PropertyName == "HasMail")
  374. {
  375. if (ServiceLocator.Current.GetInstance<MessagesViewModel>().HasMail)
  376. appBarButtons[(int)ButtonEnum.Mail].IconUri = new Uri("\\Assets\\Icons\\read.png", UriKind.Relative);
  377. else
  378. appBarButtons[(int)ButtonEnum.Mail].IconUri = new Uri("\\Assets\\Icons\\email.png", UriKind.Relative);
  379. }
  380. }
  381. private void MenuSearch_Click(object sender, EventArgs e)
  382. {
  383. var _navigationService = ServiceLocator.Current.GetInstance<INavigationService>();
  384. _navigationService.Navigate(typeof(SearchView), null);
  385. }
  386. private void UpdateMenuItems()
  387. {
  388. if (appMenuItems == null || ApplicationBar.MenuItems.Count == 0)
  389. BuildMenu();
  390. var selectedViewModel = CurrentRedditView == null ? null : CurrentRedditView.DataContext as RedditViewModel;
  391. if (selectedViewModel != null && selectedViewModel.IsMultiReddit)
  392. {
  393. if(ApplicationBar.MenuItems.Contains(appMenuItems[(int)MenuEnum.Sidebar]))
  394. ApplicationBar.MenuItems.Remove(appMenuItems[(int)MenuEnum.Sidebar]);
  395. }
  396. else
  397. {
  398. if(!ApplicationBar.MenuItems.Contains(appMenuItems[(int)MenuEnum.Sidebar]))
  399. ApplicationBar.MenuItems.Insert(0, appMenuItems[(int)MenuEnum.Sidebar]);
  400. }
  401. if (selectedViewModel != null && selectedViewModel.IsTemporary)
  402. {
  403. if (!ApplicationBar.MenuItems.Contains(appMenuItems[(int)MenuEnum.Close]))
  404. {
  405. ApplicationBar.MenuItems.Insert(0, appMenuItems[(int)MenuEnum.Close]);
  406. ApplicationBar.MenuItems.Insert(0, appMenuItems[(int)MenuEnum.Pin]);
  407. }
  408. }
  409. else if (ApplicationBar.MenuItems.Contains(appMenuItems[(int)MenuEnum.Close]))
  410. {
  411. ApplicationBar.MenuItems.Remove(appMenuItems[(int)MenuEnum.Close]);
  412. ApplicationBar.MenuItems.Remove(appMenuItems[(int)MenuEnum.Pin]);
  413. }
  414. }
  415. private void OnLoadedPivotItem(object sender, PivotItemEventArgs e)
  416. {
  417. UpdateMenuItems();
  418. }
  419. int appBarState = 0;
  420. private void appBar_StateChanged(object sender, ApplicationBarStateChangedEventArgs e)
  421. {
  422. //switch (appBarState++)
  423. //{
  424. // case 0:
  425. // ApplicationBar.IsMenuEnabled = false;
  426. // ApplicationBar.Mode = ApplicationBarMode.Default;
  427. // ApplicationBar.IsMenuEnabled = true;
  428. // break;
  429. // case 2:
  430. // ApplicationBar.Mode = ApplicationBarMode.Minimized;
  431. // break;
  432. // case 4:
  433. // ApplicationBar.IsMenuEnabled = false;
  434. // ApplicationBar.Mode = ApplicationBarMode.Default;
  435. // ApplicationBar.Mode = ApplicationBarMode.Minimized;
  436. // ApplicationBar.IsMenuEnabled = true;
  437. // appBarState = 0;
  438. // break;
  439. //}
  440. }
  441. private void pivot_DoubleTap(object sender, System.Windows.Input.GestureEventArgs e)
  442. {
  443. if (!(e.OriginalSource is TextBlock))
  444. return;
  445. if (CurrentRedditView != null)
  446. {
  447. var context = CurrentRedditView.DataContext as RedditViewModel;
  448. var source = e.OriginalSource as TextBlock;
  449. if (source.Text != context.Heading)
  450. return;
  451. CurrentRedditView.linksView.ScrollTo(context.Links.First());
  452. }
  453. }
  454. // Sample code for building a localized ApplicationBar
  455. //private void BuildLocalizedApplicationBar()
  456. //{
  457. // // Set the page's ApplicationBar to a new instance of ApplicationBar.
  458. // ApplicationBar = new ApplicationBar();
  459. // // Create a new button and set the text value to the localized string from AppResources.
  460. // ApplicationBarIconButton appBarButton = new ApplicationBarIconButton(new Uri("/Assets/AppBar/appbar.add.rest.png", UriKind.Relative));
  461. // appBarButton.Text = AppResources.AppBarButtonText;
  462. // ApplicationBar.Buttons.Add(appBarButton);
  463. // // Create a new menu item with the localized string from AppResources.
  464. // ApplicationBarMenuItem appBarMenuItem = new ApplicationBarMenuItem(AppResources.AppBarMenuItemText);
  465. // ApplicationBar.MenuItems.Add(appBarMenuItem);
  466. //}
  467. }
  468. }