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)