From 9d951227b5620272eb4f6353f40d5641d334764c Mon Sep 17 00:00:00 2001 From: Yair <39923744+yaira2@users.noreply.github.com> Date: Thu, 19 Jun 2025 19:21:34 -0400 Subject: [PATCH] Feature: Less annoying review prompt --- src/Files.App/Strings/en-US/Resources.resw | 14 +++-- src/Files.App/ViewModels/MainPageViewModel.cs | 37 +++++++++++++ src/Files.App/Views/MainPage.xaml | 13 +++++ src/Files.App/Views/MainPage.xaml.cs | 55 ++----------------- 4 files changed, 64 insertions(+), 55 deletions(-) diff --git a/src/Files.App/Strings/en-US/Resources.resw b/src/Files.App/Strings/en-US/Resources.resw index 98fb96bb6696..acef44a16ef4 100644 --- a/src/Files.App/Strings/en-US/Resources.resw +++ b/src/Files.App/Strings/en-US/Resources.resw @@ -2012,11 +2012,17 @@ Behaviors - - Review Files + + Hello! - - Would you like to review Files? + + Enjoying Files? Please consider reviewing in the Microsoft Store. + + + Rate us + + + Dismiss Set as background diff --git a/src/Files.App/ViewModels/MainPageViewModel.cs b/src/Files.App/ViewModels/MainPageViewModel.cs index 0cc67281514d..432f52939cab 100644 --- a/src/Files.App/ViewModels/MainPageViewModel.cs +++ b/src/Files.App/ViewModels/MainPageViewModel.cs @@ -8,7 +8,10 @@ using Microsoft.UI.Xaml.Media.Imaging; using Microsoft.UI.Xaml.Navigation; using System.Windows.Input; +using Windows.ApplicationModel; +using Windows.Services.Store; using Windows.System; +using WinRT.Interop; namespace Files.App.ViewModels { @@ -127,16 +130,31 @@ context.PageType is not ContentPageTypes.Home && context.PageType is not ContentPageTypes.ReleaseNotes && context.PageType is not ContentPageTypes.Settings; + public bool ShowReviewPrompt + { + get + { + var isTargetPackage = Package.Current.Id.Name == "49306atecsolution.FilesUWP" || Package.Current.Id.Name == "49306atecsolution.FilesPreview"; + var hasNotClickedReview = !UserSettingsService.ApplicationSettingsService.ClickedToReviewApp; + var launchCountReached = AppLifecycleHelper.TotalLaunchCount == 30; + + return isTargetPackage && hasNotClickedReview && launchCountReached; + } + } // Commands public ICommand NavigateToNumberedTabKeyboardAcceleratorCommand { get; } + public ICommand ReviewAppCommand { get; } + public ICommand DismissReviewPromptCommand { get; } // Constructor public MainPageViewModel() { NavigateToNumberedTabKeyboardAcceleratorCommand = new RelayCommand(ExecuteNavigateToNumberedTabKeyboardAcceleratorCommand); + ReviewAppCommand = new RelayCommand(ExecuteReviewAppCommand); + DismissReviewPromptCommand = new RelayCommand(ExecuteDismissReviewPromptCommand); AppearanceSettingsService.PropertyChanged += (s, e) => { @@ -302,6 +320,25 @@ await Task.WhenAll( // Command methods + private async void ExecuteReviewAppCommand() + { + UserSettingsService.ApplicationSettingsService.ClickedToReviewApp = true; + OnPropertyChanged(nameof(ShowReviewPrompt)); + + try + { + var storeContext = StoreContext.GetDefault(); + InitializeWithWindow.Initialize(storeContext, MainWindow.Instance.WindowHandle); + await storeContext.RequestRateAndReviewAppAsync(); + } + catch (Exception) { } + } + + private void ExecuteDismissReviewPromptCommand() + { + UserSettingsService.ApplicationSettingsService.ClickedToReviewApp = true; + } + private async void ExecuteNavigateToNumberedTabKeyboardAcceleratorCommand(KeyboardAcceleratorInvokedEventArgs? e) { var indexToSelect = e!.KeyboardAccelerator.Key switch diff --git a/src/Files.App/Views/MainPage.xaml b/src/Files.App/Views/MainPage.xaml index 0c0eff66ff1d..a7cb40424092 100644 --- a/src/Files.App/Views/MainPage.xaml +++ b/src/Files.App/Views/MainPage.xaml @@ -366,6 +366,19 @@ + + + diff --git a/src/Files.App/Views/MainPage.xaml.cs b/src/Files.App/Views/MainPage.xaml.cs index c4de28ae66cc..d060ba68c9d9 100644 --- a/src/Files.App/Views/MainPage.xaml.cs +++ b/src/Files.App/Views/MainPage.xaml.cs @@ -2,24 +2,19 @@ // Licensed under the MIT License. using CommunityToolkit.WinUI; -using CommunityToolkit.WinUI.Helpers; -using CommunityToolkit.WinUI.Controls; +using Files.App.Controls; using Microsoft.Extensions.Logging; using Microsoft.UI.Dispatching; using Microsoft.UI.Input; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; using Microsoft.UI.Xaml.Navigation; -using Windows.ApplicationModel; using Windows.Foundation.Metadata; using Windows.Graphics; -using Windows.Services.Store; -using WinRT.Interop; -using VirtualKey = Windows.System.VirtualKey; using GridSplitter = Files.App.Controls.GridSplitter; -using Files.App.Controls; -using Microsoft.UI.Xaml.Media; +using VirtualKey = Windows.System.VirtualKey; namespace Files.App.Views { @@ -59,37 +54,6 @@ public MainPage() ApplySidebarWidthState(); } - private async Task PromptForReviewAsync() - { - var promptForReviewDialog = new ContentDialog - { - Title = Strings.ReviewFiles.ToLocalized(), - Content = Strings.ReviewFilesContent.ToLocalized(), - PrimaryButtonText = Strings.Yes.ToLocalized(), - SecondaryButtonText = Strings.No.ToLocalized() - }; - - if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 8)) - promptForReviewDialog.XamlRoot = MainWindow.Instance.Content.XamlRoot; - - var result = await promptForReviewDialog.TryShowAsync(); - - if (result == ContentDialogResult.Primary) - { - try - { - var storeContext = StoreContext.GetDefault(); - InitializeWithWindow.Initialize(storeContext, MainWindow.Instance.WindowHandle); - var storeRateAndReviewResult = await storeContext.RequestRateAndReviewAppAsync(); - - App.Logger.LogInformation($"STORE: review request status: {storeRateAndReviewResult.Status}"); - - UserSettingsService.ApplicationSettingsService.ClickedToReviewApp = true; - } - catch (Exception) { } - } - } - private async Task AppRunningAsAdminPromptAsync() { var runningAsAdminPrompt = new ContentDialog @@ -250,7 +214,7 @@ private async Task OnPreviewKeyDownAsync(KeyRoutedEventArgs e) if (command.Code is CommandCodes.OpenItem && source?.FindAscendantOrSelf() is not null) break; - + if (command.Code is not CommandCodes.None && keyReleased) { @@ -310,17 +274,6 @@ AppLifecycleHelper.AppEnvironment is not AppEnvironment.Dev && { DispatcherQueue.TryEnqueue(async () => await AppRunningAsAdminPromptAsync()); } - - // ToDo put this in a StartupPromptService - if (Package.Current.Id.Name != "49306atecsolution.FilesUWP" || UserSettingsService.ApplicationSettingsService.ClickedToReviewApp) - return; - - var totalLaunchCount = AppLifecycleHelper.TotalLaunchCount; - if (totalLaunchCount is 50 or 200) - { - // Prompt user to review app in the Store - DispatcherQueue.TryEnqueue(async () => await PromptForReviewAsync()); - } } private void PreviewPane_Loaded(object sender, RoutedEventArgs e)