Esempio n. 1
0
        public HohoemaViewModelBase(
            HohoemaApp hohoemaApp,
            PageManager pageManager
            )
        {
            PageRequireServiceLevel = HohoemaAppServiceLevel.Offline;

            _NavigationToLock = new SemaphoreSlim(1, 1);
            HohoemaApp        = hohoemaApp;
            PageManager       = pageManager;

            NowSignIn = false;


            _CompositeDisposable           = new CompositeDisposable();
            _NavigatingCompositeDisposable = new CompositeDisposable();

            IsPageAvailable = HohoemaApp.ObserveProperty(x => x.ServiceStatus)
                              .Select(x => x >= PageRequireServiceLevel)
                              .ToReactiveProperty()
                              .AddTo(_CompositeDisposable);

            if (Helpers.DeviceTypeHelper.IsXbox)
            {
                IsForceTVModeEnable = new ReactiveProperty <bool>(true);
            }
            else
            {
                IsForceTVModeEnable = HohoemaApp.UserSettings.AppearanceSettings.ObserveProperty(x => x.IsForceTVModeEnable)
                                      .ToReactiveProperty();
            }

            SubstitutionBackNavigation = new Dictionary <string, Func <bool> >();
        }
Esempio n. 2
0
        public NicoAccountIntroductionPageViewModel(HohoemaApp hohoema)
        {
            _HohoemaApp = hohoema;

            IsLoggedIn = _HohoemaApp.ObserveProperty(x => x.IsLoggedIn)
                         .ToReadOnlyReactiveProperty();
        }
Esempio n. 3
0
        public LoginPageViewModel(HohoemaApp hohoemaApp, PageManager pageManager)
            : base(hohoemaApp, pageManager)
        {
            var version = Windows.ApplicationModel.Package.Current.Id.Version;

            VersionText = $"{version.Major}.{version.Minor}.{version.Build}";

            Mail     = new ReactiveProperty <string>("", mode: ReactivePropertyMode.DistinctUntilChanged);
            Password = new ReactiveProperty <string>("", mode: ReactivePropertyMode.DistinctUntilChanged);

            IsRememberPassword = new ReactiveProperty <bool>(!string.IsNullOrEmpty(Password.Value));

            IsValidAccount        = new ReactiveProperty <bool>(hohoemaApp.IsLoggedIn);
            NowProcessLoggedIn    = new ReactiveProperty <bool>(false);
            IsAuthoricationFailed = new ReactiveProperty <bool>(false);
            IsServiceUnavailable  = new ReactiveProperty <bool>(false);

            LoginErrorText = HohoemaApp.ObserveProperty(x => x.LoginErrorText)
                             .ToReactiveProperty();

            // メールかパスワードが変更されたらログイン検証されていないアカウントとしてマーク
            TryLoginCommand = Observable.CombineLatest(
                Mail.Select(x => !string.IsNullOrWhiteSpace(x)),
                Password.Select(x => !string.IsNullOrWhiteSpace(x)),
                NowProcessLoggedIn.Select(x => !x)
                )
                              .Select(x => x.All(y => y))
                              .ToReactiveCommand();

            TryLoginCommand.Subscribe(async _ =>
            {
                NowProcessLoggedIn.Value = true;

                try
                {
                    await TryLogin();
                }
                finally
                {
                    NowProcessLoggedIn.Value = false;
                }
            });
        }
Esempio n. 4
0
        public HohoemaViewModelBase(
            HohoemaApp hohoemaApp,
            PageManager pageManager,
            bool canActivateBackgroundUpdate = true,
            bool useDefaultPageTitle         = true
            )
        {
            AvailableServiceLevel = HohoemaAppServiceLevel.Offline;

            _SignStatusLock   = new SemaphoreSlim(1, 1);
            _NavigationToLock = new SemaphoreSlim(1, 1);
            HohoemaApp        = hohoemaApp;
            PageManager       = pageManager;

            NowSignIn = false;

            CanActivateBackgroundUpdate = canActivateBackgroundUpdate;
            UseDefaultPageTitle         = useDefaultPageTitle;

            _CompositeDisposable             = new CompositeDisposable();
            _NavigatingCompositeDisposable   = new CompositeDisposable();
            _UserSettingsCompositeDisposable = new CompositeDisposable();

            IsPageAvailable = HohoemaApp.ObserveProperty(x => x.ServiceStatus)
                              .Select(x => x >= AvailableServiceLevel)
                              .ToReactiveProperty()
                              .AddTo(_CompositeDisposable);

            if (Util.DeviceTypeHelper.IsXbox)
            {
                IsForceTVModeEnable = new ReactiveProperty <bool>(true);
            }
            else
            {
                IsForceTVModeEnable = HohoemaApp.UserSettings.AppearanceSettings.ObserveProperty(x => x.IsForceTVModeEnable)
                                      .ToReactiveProperty();
            }

            SubstitutionBackNavigation = new Dictionary <string, Func <bool> >();
        }
Esempio n. 5
0
        public MenuNavigatePageBaseViewModel(
            HohoemaApp hohoemaApp,
            PageManager pageManager
            )
        {
            PageManager = pageManager;
            HohoemaApp  = hohoemaApp;

            // TV Mode
            if (Util.DeviceTypeHelper.IsXbox)
            {
                IsTVModeEnable = new ReactiveProperty <bool>(true);
            }
            else
            {
                IsTVModeEnable = HohoemaApp.UserSettings
                                 .AppearanceSettings.ObserveProperty(x => x.IsForceTVModeEnable)
                                 .ToReactiveProperty();
            }

            ServiceLevel = HohoemaApp.ObserveProperty(x => x.ServiceStatus)
                           .ToReadOnlyReactiveProperty();

            IsNeedFullScreenToggleHelp
                = ApplicationView.PreferredLaunchWindowingMode == ApplicationViewWindowingMode.FullScreen;

            IsOpenPane = new ReactiveProperty <bool>(false);

            MenuItems = new List <PageTypeSelectableItem>()
            {
                new PageTypeSelectableItem(HohoemaPageType.Search, OnMenuItemSelected, "検索", Symbol.Find),
                new PageTypeSelectableItem(HohoemaPageType.RankingCategoryList, OnMenuItemSelected, "ランキング", Symbol.Flag),
                new PageTypeSelectableItem(HohoemaPageType.UserMylist, OnMenuItemSelected, "マイリスト", Symbol.Bookmarks),
                new PageTypeSelectableItem(HohoemaPageType.FollowManage, OnMenuItemSelected, "フォロー", Symbol.OutlineStar),
                new PageTypeSelectableItem(HohoemaPageType.FeedGroupManage, OnMenuItemSelected, "フィード", Symbol.List),
            };

            SubMenuItems = new List <PageTypeSelectableItem>()
            {
                new PageTypeSelectableItem(HohoemaPageType.History, OnMenuItemSelected, "視聴履歴", Symbol.Clock),
                new PageTypeSelectableItem(HohoemaPageType.CacheManagement, OnMenuItemSelected, "キャッシュ管理", Symbol.Download),
                new PageTypeSelectableItem(HohoemaPageType.Settings, OnMenuItemSelected, "設定", Symbol.Setting),
                new PageTypeSelectableItem(HohoemaPageType.UserInfo, OnAccountMenuItemSelected, "アカウント", Symbol.Account),
            };

            AllMenuItems = MenuItems.Concat(SubMenuItems).ToList();

            MainSelectedItem = new ReactiveProperty <PageTypeSelectableItem>(MenuItems[0], ReactivePropertyMode.DistinctUntilChanged);
            SubSelectedItem  = new ReactiveProperty <PageTypeSelectableItem>(null, ReactivePropertyMode.DistinctUntilChanged);

            Observable.Merge(
                MainSelectedItem,
                SubSelectedItem
                )
            .Where(x => x != null)
            .Subscribe(x => x.SelectedAction(x.Source));

            PageManager.ObserveProperty(x => x.CurrentPageType)
            .Subscribe(pageType =>
            {
//                    IsOpenPane.Value = false;

                bool isMenuItemOpened = false;
                foreach (var item in MenuItems)
                {
                    if (item.Source == pageType)
                    {
                        MainSelectedItem.Value = item;
                        SubSelectedItem.Value  = null;
                        isMenuItemOpened       = true;
                        break;
                    }
                }

                foreach (var item in SubMenuItems)
                {
                    if (item.Source == pageType)
                    {
                        SubSelectedItem.Value  = item;
                        MainSelectedItem.Value = null;
                        isMenuItemOpened       = true;
                        break;
                    }
                }

                if (!isMenuItemOpened)
                {
                    MainSelectedItem.Value = null;
                    SubSelectedItem.Value  = null;
                }
            });

            IsSubMenuItemPage = PageManager.ObserveProperty(x => x.CurrentPageType)
                                .Select(x => SubMenuItems.Any(y => y.Source == x))
                                .ToReactiveProperty();



            PageManager.ObserveProperty(x => x.PageTitle)
            .Subscribe(x =>
            {
                TitleText = x;
            });


            IsVisibleMenu = PageManager.ObserveProperty(x => x.CurrentPageType)
                            .Select(x =>
            {
                return(PageManager.DontNeedMenuPageTypes.All(dontNeedMenuPageType => x != dontNeedMenuPageType));
            })
                            .ToReactiveProperty();

            NowNavigating = PageManager.ObserveProperty(x => x.PageNavigating)
                            .ToReactiveProperty();


            PageManager.StartWork    += PageManager_StartWork;
            PageManager.ProgressWork += PageManager_ProgressWork;
            PageManager.CompleteWork += PageManager_CompleteWork;
            PageManager.CancelWork   += PageManager_CancelWork;



            var updater = HohoemaApp.BackgroundUpdater;

            var bgUpdateStartedObserver = Observable.FromEventPattern <BackgroundUpdateScheduleHandler>(
                handler => updater.BackgroundUpdateStartedEvent += handler,
                handler => updater.BackgroundUpdateStartedEvent -= handler
                );

            var bgUpdateCompletedObserver = Observable.FromEventPattern <BackgroundUpdateScheduleHandler>(
                handler => updater.BackgroundUpdateCompletedEvent += handler,
                handler => updater.BackgroundUpdateCompletedEvent -= handler
                );


            var bgUpdateCanceledObserver = Observable.FromEventPattern <BackgroundUpdateScheduleHandler>(
                handler => updater.BackgroundUpdateCanceledEvent += handler,
                handler => updater.BackgroundUpdateCanceledEvent -= handler
                );

            BGUpdateText    = new ReactiveProperty <string>();
            HasBGUpdateText = BGUpdateText.Select(x => !string.IsNullOrEmpty(x))
                              .ToReactiveProperty();
            bgUpdateStartedObserver.Subscribe(x =>
            {
                if (!string.IsNullOrEmpty(x.EventArgs.Label))
                {
                    BGUpdateText.Value = $"{x.EventArgs.Label} を処理中...";
                }
                else
                {
                    BGUpdateText.Value = $"{x.EventArgs.Id} を処理中...";
                }
            });


            Observable.Merge(
                bgUpdateCompletedObserver,
                bgUpdateCanceledObserver
                )
            .Throttle(TimeSpan.FromSeconds(2))
            .Subscribe(x =>
            {
                BGUpdateText.Value = null;
            });

            HohoemaApp.ObserveProperty(x => x.IsLoggedIn)
            .Subscribe(x => IsLoggedIn = x);

            HohoemaApp.ObserveProperty(x => x.LoginUserName)
            .Subscribe(x =>
            {
                UserName = x;
                UserMail = AccountManager.GetPrimaryAccountId();
            });

            HohoemaApp.ObserveProperty(x => x.UserIconUrl)
            .Subscribe(x => UserIconUrl = x);



            // 検索
            SearchKeyword = new ReactiveProperty <string>("");
            SearchTarget  = new ReactiveProperty <Models.SearchTarget>(Models.SearchTarget.Keyword);

            SearchCommand = SearchKeyword
                            .Select(x => !string.IsNullOrWhiteSpace(x))
                            .ToReactiveCommand();
            SearchCommand.Subscribe(_ =>
            {
                ISearchPagePayloadContent searchContent =
                    SearchPagePayloadContentHelper.CreateDefault(SearchTarget.Value, SearchKeyword.Value);
                PageManager.Search(searchContent);

                IsMobileNowSearching = false;
            });
        }
Esempio n. 6
0
        public MenuNavigatePageBaseViewModel(
            HohoemaApp hohoemaApp,
            PageManager pageManager,
            Models.Niconico.Live.NicoLiveSubscriber nicoLiveSubscriber
            )
        {
            PageManager        = pageManager;
            HohoemaApp         = hohoemaApp;
            NicoLiveSubscriber = nicoLiveSubscriber;

            HohoemaApp.OnSignin  += HohoemaApp_OnSignin;
            HohoemaApp.OnSignout += HohoemaApp_OnSignout;

            CurrentMenuType = new ReactiveProperty <ViewModelBase>();
            VideoMenu       = new VideoMenuSubPageContent(HohoemaApp, HohoemaApp.UserMylistManager, HohoemaApp.Playlist);
            LiveMenu        = new LiveMenuSubPageContent(NicoLiveSubscriber);

            // Back Navigation
            CanGoBackNavigation     = new ReactivePropertySlim <bool>();
            GoBackNavigationCommand = CanGoBackNavigation
                                      .ToReactiveCommand();

            GoBackNavigationCommand.Subscribe(_ =>
            {
                PageManager.NavigationService.GoBack();
            });

            // TV Mode
            if (Helpers.DeviceTypeHelper.IsXbox)
            {
                IsTVModeEnable = new ReactiveProperty <bool>(true);
            }
            else
            {
                IsTVModeEnable = HohoemaApp.UserSettings
                                 .AppearanceSettings.ObserveProperty(x => x.IsForceTVModeEnable)
                                 .ToReactiveProperty();
            }


            ServiceLevel = HohoemaApp.ObserveProperty(x => x.ServiceStatus)
                           .ToReadOnlyReactiveProperty();

            IsNeedFullScreenToggleHelp
                = ApplicationView.PreferredLaunchWindowingMode == ApplicationViewWindowingMode.FullScreen;

            IsOpenPane = new ReactiveProperty <bool>(false);

            MainSelectedItem = new ReactiveProperty <HohoemaListingPageItemBase>(null, ReactivePropertyMode.DistinctUntilChanged);


            PinItems = HohoemaApp.UserSettings.PinSettings.Pins;

            ResetMenuItems();

            PinItems.CollectionChangedAsObservable()
            .Subscribe(async _ =>
            {
                await HohoemaApp.UserSettings.PinSettings.Save();
            });

            /*
             * Observable.Merge(
             *  MainSelectedItem,
             *  SubSelectedItem
             *  )
             *  .Where(x => x != null)
             *  .Subscribe(x => x.SelectedAction(x.Source));
             */
            PageManager.ObserveProperty(x => x.CurrentPageType)
            .Subscribe(pageType =>
            {
                //                    IsOpenPane.Value = false;

                bool isMenuItemOpened = false;
                foreach (var item in MenuItems)
                {
                    if ((item as MenuItemViewModel)?.PageType == pageType)
                    {
                        MainSelectedItem.Value = item;
                        isMenuItemOpened       = true;
                        break;
                    }
                }


                if (!isMenuItemOpened)
                {
                    MainSelectedItem.Value = null;
                }

                if (Helpers.DeviceTypeHelper.IsXbox || HohoemaApp.UserSettings.AppearanceSettings.IsForceTVModeEnable)
                {
                    IsOpenPane.Value = false;
                }
            });


            PageManager.ObserveProperty(x => x.PageTitle)
            .Subscribe(x =>
            {
                TitleText = x;
                AddPinToCurrentPageCommand.RaiseCanExecuteChanged();
            });

            PageManager.ObserveProperty(x => x.CurrentPageType)
            .Subscribe(_ => UpdateCanGoBackNavigation());



            IsVisibleMenu = PageManager.ObserveProperty(x => x.CurrentPageType)
                            .Select(x =>
            {
                return(!PageManager.IsHiddenMenuPage(x));
            })
                            .ToReactiveProperty(false);

            NowNavigating = PageManager.ObserveProperty(x => x.PageNavigating)
                            .ToReactiveProperty();


            PageManager.StartWork    += PageManager_StartWork;
            PageManager.ProgressWork += PageManager_ProgressWork;
            PageManager.CompleteWork += PageManager_CompleteWork;
            PageManager.CancelWork   += PageManager_CancelWork;

            HohoemaApp.ObserveProperty(x => x.IsLoggedIn)
            .Subscribe(x => IsLoggedIn = x);

            HohoemaApp.ObserveProperty(x => x.LoginUserName)
            .Subscribe(x =>
            {
                UserName = x;
            });

            HohoemaApp.ObserveProperty(x => x.UserIconUrl)
            .Subscribe(x => UserIconUrl = x);



            // 検索
            SearchKeyword = new ReactiveProperty <string>("");

            SearchCommand = new ReactiveCommand();
            SearchCommand
            .Subscribe(async _ =>
            {
                await Task.Delay(50);
                var keyword = SearchKeyword.Value;

                if (string.IsNullOrWhiteSpace(keyword))
                {
                    return;
                }

                SearchTarget?searchType = CurrentMenuType.Value is LiveMenuSubPageContent ? SearchTarget.Niconama : SearchTarget.Keyword;
                var searched            = Database.SearchHistoryDb.LastSearchedTarget(keyword);
                if (searched != null)
                {
                    searchType = searched;
                }

                PageManager.Search(SearchPagePayloadContentHelper.CreateDefault(searchType.Value, keyword));

                ResetSearchHistoryItems();
            });

            SearchSuggestionWords = new ObservableCollection <string>();



            // InAppNotification
            IsShowInAppNotification = new ReactiveProperty <bool>(true);



            IsShowPlayerInFill = HohoemaApp.Playlist
                                 .ObserveProperty(x => x.IsPlayerFloatingModeEnable)
                                 .Select(x => !x)
                                 .ToReadOnlyReactiveProperty();

            IsShowPlayerInFill_DelayedRead = IsShowPlayerInFill
                                             .Delay(TimeSpan.FromMilliseconds(300))
                                             .ToReadOnlyReactiveProperty();


            IsShowPlayer = HohoemaApp.Playlist.ObserveProperty(x => x.IsDisplayMainViewPlayer)
                           .ToReactiveProperty(mode: ReactivePropertyMode.DistinctUntilChanged);

            IsContentDisplayFloating = Observable.CombineLatest(
                IsShowPlayerInFill.Select(x => !x),
                IsShowPlayer
                )
                                       .Select(x => x.All(y => y))
                                       .ToReactiveProperty();


            HohoemaApp.Playlist.OpenPlaylistItem += HohoemaPlaylist_OpenPlaylistItem;

            IsShowPlayer
            .Where(x => !x)
            .Subscribe(x =>
            {
                ClosePlayer();
            });

            if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 4))
            {
                Observable.Merge(
                    IsShowPlayer.Where(x => !x),
                    IsContentDisplayFloating.Where(x => x)
                    )
                .Subscribe(async x =>
                {
                    var view = ApplicationView.GetForCurrentView();
                    if (view.IsViewModeSupported(ApplicationViewMode.CompactOverlay))
                    {
                        var result = await view.TryEnterViewModeAsync(ApplicationViewMode.Default);
                    }
                });
            }


            // 検索履歴アイテムを初期化
            ResetSearchHistoryItems();
        }