Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: Open minimized window on Windows startup #14309

Merged
merged 1 commit into from
Dec 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 50 additions & 17 deletions src/Files.App/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,17 +65,21 @@ protected override void OnLaunched(LaunchActivatedEventArgs e)

async Task ActivateAsync()
{
// Initialize and activate MainWindow
MainWindow.Instance.Activate();
// Get AppActivationArguments
var appActivationArguments = Microsoft.Windows.AppLifecycle.AppInstance.GetCurrent().GetActivatedEventArgs();
var isStartupTask = appActivationArguments.Data is Windows.ApplicationModel.Activation.IStartupTaskActivatedEventArgs;

// Wait for the Window to initialize
await Task.Delay(10);
if (!isStartupTask)
{
// Initialize and activate MainWindow
MainWindow.Instance.Activate();

SplashScreenLoadingTCS = new TaskCompletionSource();
MainWindow.Instance.ShowSplashScreen();
// Wait for the Window to initialize
await Task.Delay(10);

// Get AppActivationArguments
var appActivationArguments = Microsoft.Windows.AppLifecycle.AppInstance.GetCurrent().GetActivatedEventArgs();
SplashScreenLoadingTCS = new TaskCompletionSource();
MainWindow.Instance.ShowSplashScreen();
}

// Start tracking app usage
if (appActivationArguments.Data is Windows.ApplicationModel.Activation.IActivatedEventArgs activationEventArgs)
Expand All @@ -90,6 +94,21 @@ async Task ActivateAsync()
AppLifecycleHelper.ConfigureAppCenter();
#endif

var userSettingsService = Ioc.Default.GetRequiredService<IUserSettingsService>();
var isLeaveAppRunning = userSettingsService.GeneralSettingsService.LeaveAppRunning;

if (isStartupTask && !isLeaveAppRunning)
{
// Initialize and activate MainWindow
MainWindow.Instance.Activate();

// Wait for the Window to initialize
await Task.Delay(10);

SplashScreenLoadingTCS = new TaskCompletionSource();
MainWindow.Instance.ShowSplashScreen();
}

// TODO: Replace with DI
QuickAccessManager = Ioc.Default.GetRequiredService<QuickAccessManager>();
HistoryWrapper = Ioc.Default.GetRequiredService<StorageHistoryWrapper>();
Expand All @@ -105,15 +124,28 @@ async Task ActivateAsync()

Logger.LogInformation($"App launched. Launch args type: {appActivationArguments.Data.GetType().Name}");

// Wait for the UI to update
await SplashScreenLoadingTCS!.Task.WithTimeoutAsync(TimeSpan.FromMilliseconds(500));
SplashScreenLoadingTCS = null;
if (!(isStartupTask && isLeaveAppRunning))
{
// Wait for the UI to update
await SplashScreenLoadingTCS!.Task.WithTimeoutAsync(TimeSpan.FromMilliseconds(500));
SplashScreenLoadingTCS = null;

// Create a system tray icon
SystemTrayIcon = new SystemTrayIcon().Show();
// Create a system tray icon
SystemTrayIcon = new SystemTrayIcon().Show();

_ = AppLifecycleHelper.InitializeAppComponentsAsync();
_ = MainWindow.Instance.InitializeApplicationAsync(appActivationArguments.Data);
_ = MainWindow.Instance.InitializeApplicationAsync(appActivationArguments.Data);
}

await AppLifecycleHelper.InitializeAppComponentsAsync();

if (isStartupTask && isLeaveAppRunning)
{
// Create a system tray icon when initialization is done
SystemTrayIcon = new SystemTrayIcon().Show();
App.Current.Exit();
}
else
await AppLifecycleHelper.CheckAppUpdate();
}
}

Expand All @@ -122,11 +154,12 @@ async Task ActivateAsync()
/// </summary>
public async Task OnActivatedAsync(AppActivationArguments activatedEventArgs)
{
Logger.LogInformation($"The app is being activated. Activation type: {activatedEventArgs.Data.GetType().Name}");
var activatedEventArgsData = activatedEventArgs.Data;
Logger.LogInformation($"The app is being activated. Activation type: {activatedEventArgsData.GetType().Name}");

// InitializeApplication accesses UI, needs to be called on UI thread
await MainWindow.Instance.DispatcherQueue.EnqueueOrInvokeAsync(()
=> MainWindow.Instance.InitializeApplicationAsync(activatedEventArgs.Data));
=> MainWindow.Instance.InitializeApplicationAsync(activatedEventArgsData));
}

/// <summary>
Expand Down
2 changes: 0 additions & 2 deletions src/Files.App/Helpers/Application/AppLifecycleHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,6 @@ await Task.WhenAll(

FileTagsHelper.UpdateTagsDb();

await CheckAppUpdate();

static Task OptionalTaskAsync(Task task, bool condition)
{
if (condition)
Expand Down
11 changes: 5 additions & 6 deletions src/Files.App/Utils/Taskbar/SystemTrayIcon.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public class SystemTrayIcon : IDisposable

private bool _notifyIconCreated;

private DispatcherQueueTimer _timer;
private DateTime _lastLaunchDate;

// Properties

Expand Down Expand Up @@ -266,18 +266,17 @@ private void ShowContextMenu()
private void OnLeftClicked()
{
// Prevents duplicate launch
if (_timer?.IsRunning ?? false)
if (DateTime.Now - _lastLaunchDate < TimeSpan.FromSeconds(1))
return;

if (Program.Pool is not null)
{
_timer ??= DispatcherQueue.GetForCurrentThread().CreateTimer();
_timer.Interval = TimeSpan.FromSeconds(1);
_timer.IsRepeating = false;
_timer.Start();
_lastLaunchDate = DateTime.Now;

_ = Launcher.LaunchUriAsync(new Uri("files-uwp:"));
}
else
MainWindow.Instance.Activate();
yaira2 marked this conversation as resolved.
Show resolved Hide resolved
}

private void OnDocumentationClicked()
Expand Down