Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
695b7fc
[skip ci] Update README.md
neon-nyan Jun 21, 2026
3b02a26
[skip ci] Sync translation Translate en_US.json in ja_JP
transifex-integration[bot] Jun 21, 2026
71ffc4d
Shorten Console Log calls
neon-nyan Jul 5, 2026
f0dba15
[BG][Placeholder] Adds ForceSoftwareDecoding property
neon-nyan Jul 5, 2026
c373da6
Update NuGet
neon-nyan Jul 5, 2026
f14ff61
Make video player zero-copy
shatyuka Jul 8, 2026
f22b4fe
Enable read-ahead buffer to reduce video playback stutter
shatyuka Jul 8, 2026
451daa1
Make cache duration longer
shatyuka Jul 8, 2026
7790427
Revert "Make video player zero-copy"
shatyuka Jul 8, 2026
56730f0
Fix SharedLastMediaPosition memory leak and thread safety
shatyuka Jul 8, 2026
e39fed9
Fix video playback memory leaks and thread safety
shatyuka Jul 8, 2026
a88a218
[skip ci] Update DD Static Analyzer
bagusnl Jul 9, 2026
a1b920d
fix(plugin): improve game install progress UI for plugin-backed updates
Cryotechnic Jul 10, 2026
6cecd09
fix(honkai): align dispatch and gateway fetches with renamed async APIs
Cryotechnic Jul 10, 2026
5b3a241
chore(deps): bump Microsoft.Windows.SDK.BuildTools to 10.0.28000.2270
Cryotechnic Jul 10, 2026
5103e5d
chore(deps): bump Hi3Helper.Plugin.Core for Reconciling progress state
Cryotechnic Jul 10, 2026
c3fa9ee
chore(deps): Bump submodules
Cryotechnic Jul 10, 2026
7fc140d
Merge branch 'main' of github.com:CollapseLauncher/Collapse
Cryotechnic Jul 10, 2026
5f471a3
Fix SharedLastMediaPosition position cache
shatyuka Jul 11, 2026
87e9a84
Fix MediaPlayer event cleanup before disposal
shatyuka Jul 11, 2026
eb59d6e
Refactor video player (#891)
neon-nyan Jul 12, 2026
4d8bb1d
Enable newline auto return
neon-nyan Jul 12, 2026
5ff21c5
Fix compile
neon-nyan Jul 12, 2026
8eaaf94
fix(deps): bump Plugin.Core for Reconciling state
Cryotechnic Jul 13, 2026
990de6d
fix(deps): bump Plugin.Core for Reconciling state (#892)
Cryotechnic Jul 15, 2026
6716e72
Update i18n for drag-n-drop plugin window
Cryotechnic Jul 15, 2026
7e98591
Add new drop indicator overlay in plugin window
Cryotechnic Jul 15, 2026
7f35ae4
Add file drag-and-drop support to WindowUtility
Cryotechnic Jul 15, 2026
9301d8f
Add drag-and-drop import & refactor import logic
Cryotechnic Jul 15, 2026
2aa513b
Improve error handling for plugin imports
Cryotechnic Jul 16, 2026
883fdc9
Remove foreground window check in drag logic
Cryotechnic Jul 16, 2026
0d472e9
Add volume mount point support
shatyuka Jul 18, 2026
63f7d7c
Skip cps value validation
shatyuka Jul 18, 2026
2579160
Fix maximize disable not working after AOT
shatyuka Jul 18, 2026
5f6273f
Fix trim in non-AOT mode
shatyuka Jul 18, 2026
5d610db
Fix NativeAOT Debug build freeze
shatyuka Jul 18, 2026
21645ec
Cancel in-flight background loading on game switch
shatyuka Jul 19, 2026
6dc517b
Cache background URLs for instant background on game switch
shatyuka Jul 22, 2026
a74c3f8
Fix potential ArgumentNullException in PreloadBackground when staticB…
shatyuka Jul 23, 2026
0ede238
Fix potential deadlock in RestoreSavedAccent when extracting accent f…
shatyuka Jul 23, 2026
f970b8b
Fix preset background not showing during region load
shatyuka Jul 23, 2026
d72d222
Fix PreloadBackground clearing PlaceholderBackgroundLayer from visual…
shatyuka Jul 23, 2026
5ba59c5
Fix background transition animation lost after switching games
shatyuka Jul 23, 2026
a634042
Fix occasional flicker
shatyuka Jul 23, 2026
584e706
Add error handling and move PInvoke to Win32 submodule
neon-nyan Aug 1, 2026
dcbf0a0
Add Sentry exception handler on error
neon-nyan Aug 1, 2026
f20b110
Update Hi3Helper.Win32
neon-nyan Aug 1, 2026
2092fde
Adjust localization
neon-nyan Aug 1, 2026
4748c71
Cache background URLs for instant background on game switch (#896)
neon-nyan Aug 1, 2026
fa62c89
Update Hi3Helper.Win32
neon-nyan Aug 1, 2026
80947e1
Fix drag mechanism in Plugin Management Menu (#894)
neon-nyan Aug 1, 2026
61dd95b
Update NuGet
neon-nyan Aug 1, 2026
eae1770
Update FFmpeg version check
neon-nyan Aug 1, 2026
a9f37ce
Update locale in regard FFmpeg version change
neon-nyan Aug 1, 2026
04e9bc2
Enable XAML opted-in experimental features
neon-nyan Aug 2, 2026
dc50437
Bump up SDK revision
neon-nyan Aug 2, 2026
648d76b
Logger] Make buffer shared for async methods
neon-nyan Aug 5, 2026
f1a772d
Minor alloc improvement
neon-nyan Aug 5, 2026
e38153a
Revert "Logger] Make buffer shared for async methods"
neon-nyan Aug 5, 2026
2cc30de
docs: fix broken links in Thai localized README
latent-9 Aug 6, 2026
31d05e7
Update submodule
Cryotechnic Aug 10, 2026
f6b702d
Harden cleanup and expand ZZZ uninstall purge
Cryotechnic Aug 10, 2026
9294188
docs: fix broken links in Thai localized README (#898)
Cryotechnic Aug 12, 2026
aa93969
[skip ci] Sync translation Translate en_US.json in ja_JP
transifex-integration[bot] Aug 14, 2026
00b5cfd
Update NuGet
bagusnl Aug 17, 2026
5dca837
[MainApp] Wrap XamlOptionalChanges.EnableChanges in Try-Catch
bagusnl Aug 17, 2026
41d11be
Update submodules
bagusnl Aug 17, 2026
f3130ce
[SDK] Update to 10.0.400 (10.0.11)
bagusnl Aug 17, 2026
ee205ad
Update setup-dotnet action to v6
bagusnl Aug 17, 2026
424c751
Update .NET Pipeline version
bagusnl Aug 17, 2026
36e469a
[skip ci] Update actions dependencies
bagusnl Aug 17, 2026
a725b14
Update NuGet
neon-nyan Aug 25, 2026
46a8241
[Local Changes] Use WASDK Optimizations
neon-nyan Aug 25, 2026
5f07568
[Local Changes] Use stock FFmpeg 8.x by default
neon-nyan Aug 25, 2026
6474dd8
Fix crash due to unnecessary assertion in generated code.
neon-nyan Aug 25, 2026
d1d9f70
Fix preload package detection
neon-nyan Aug 25, 2026
92f49be
Fix Sophon force redirect logic
neon-nyan Aug 25, 2026
c590007
Avoid FFmpeg lib on subdirectory deleted on publish
neon-nyan Aug 25, 2026
2d0a9a0
[skip ci] Bump version
neon-nyan Aug 25, 2026
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
16 changes: 8 additions & 8 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v7
with:
submodules: recursive

Expand All @@ -54,7 +54,7 @@ jobs:
}

- name: Install .NET
uses: actions/setup-dotnet@v4
uses: actions/setup-dotnet@v6
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
dotnet-quality: ${{ env.DOTNET_QUALITY }}
Expand All @@ -69,7 +69,7 @@ jobs:
dotnet publish CollapseLauncher -c ${{matrix.Configuration}} -p:PublishProfile=Publish-DebugCIRelease -p:PublishDir=".\debug-build\" -p:PublishAot=false

- name: Upload Artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: collapse_${{ matrix.platform }}-${{ matrix.configuration }}_${{ matrix.framework }}_${{ github.sha }}
path: ./CollapseLauncher/debug-build/
Expand Down Expand Up @@ -97,7 +97,7 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v7
with:
submodules: recursive

Expand All @@ -110,7 +110,7 @@ jobs:
}

- name: Install .NET
uses: actions/setup-dotnet@v4
uses: actions/setup-dotnet@v6
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
dotnet-quality: ${{ env.DOTNET_QUALITY }}
Expand All @@ -125,7 +125,7 @@ jobs:
dotnet publish CollapseLauncher -c ${{matrix.Configuration}} -p:PublishProfile=Publish-DebugCIReleaseAOT -p:PublishDir=".\debug-aot-build\" -p:PublishAotSelf=true

- name: Upload debug symbols
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: aot-experimental-symbols_collapse_${{ matrix.platform }}-${{ matrix.configuration }}_${{ matrix.framework }}_${{ github.sha }}
path: ./CollapseLauncher/debug-aot-build/**/*.pdb
Expand All @@ -136,7 +136,7 @@ jobs:
Remove-Item -Path "./CollapseLauncher/debug-aot-build/*.pdb" -Recurse -Force

- name: Upload Artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: aot-experimental_collapse_${{ matrix.platform }}-${{ matrix.configuration }}_${{ matrix.framework }}_${{ github.sha }}
path: ./CollapseLauncher/debug-aot-build/
Expand All @@ -148,7 +148,7 @@ jobs:
needs: [build, build-nativeaot]
steps:
- name: Notify Discord
uses: sarisia/actions-status-discord@v1.15.1
uses: sarisia/actions-status-discord@v1.16
if: always()
continue-on-error: true
with:
Expand Down
6 changes: 4 additions & 2 deletions .github/workflows/dd-static-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,13 @@ jobs:

- name: Check code meets quality and security standards
id: datadog-static-analysis
uses: DataDog/datadog-static-analyzer-github-action@v1
uses: DataDog/datadog-static-analyzer-github-action@v3
with:
dd_api_key: ${{ secrets.DD_API_KEY }}
dd_app_key: ${{ secrets.DD_APP_KEY }}
dd_site: ap1.datadoghq.com
secrets_enabled: false
static_analysis_enabled: true
cpu_count: 2
cpu_count: 4
diff_aware: true
enable_performance_statistics: true
4 changes: 2 additions & 2 deletions .github/workflows/qodana-scan-pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
steps:
# skip all the steps if the head repo is not the same as the main repo
# https://github.com/orgs/community/discussions/26829#discussioncomment-3253575
- uses: actions/checkout@v4
- uses: actions/checkout@v7
if: ${{ github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name }}
with:
ref: ${{ github.event.pull_request.head.sha }} # to check out the actual pull request commit, not the merge commit
Expand All @@ -49,7 +49,7 @@ jobs:
}

- name: Install .NET
uses: actions/setup-dotnet@v4
uses: actions/setup-dotnet@v6
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
dotnet-quality: ${{ env.DOTNET_QUALITY }}
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/qodana-scan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ jobs:
checks: write
security-events: write
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7
with:
ref: ${{ github.event.pull_request.head.sha }} # to check out the actual pull request commit, not the merge commit
submodules: recursive # many many submodules
Expand All @@ -42,7 +42,7 @@ jobs:
}

- name: Install .NET
uses: actions/setup-dotnet@v4
uses: actions/setup-dotnet@v6
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
dotnet-quality: ${{ env.DOTNET_QUALITY }}
Expand Down
16 changes: 8 additions & 8 deletions .github/workflows/release-signed.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ jobs:
echo "::notice::Signing Policy: $env:SIGNING_POLICY_SLUG"

- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v7
with:
submodules: recursive

Expand All @@ -82,7 +82,7 @@ jobs:
}

- name: Install .NET
uses: actions/setup-dotnet@v4
uses: actions/setup-dotnet@v6
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
dotnet-quality: ${{ env.DOTNET_QUALITY }}
Expand Down Expand Up @@ -112,14 +112,14 @@ jobs:

- name: Upload Artifact (unsigned)
id: upload-unsigned-artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: collapse-v${{ env.VERSION }}_${{ env.SIGNING_POLICY_SLUG }}-${{ env.CONFIGURATION_STRATEGY }}_${{ env.PUBLISH_PROFILE }}
path: ./CollapseLauncher/SignArtifact
compression-level: 9

- name: Notify Discord for pending build
uses: sarisia/actions-status-discord@v1.15.3
uses: sarisia/actions-status-discord@v1.16
if: always()
continue-on-error: true
with:
Expand Down Expand Up @@ -173,14 +173,14 @@ jobs:
}

- name: Re-upload Signed Artifact to GitHub
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: SIGNED_collapse-v${{ env.VERSION }}_${{ env.SIGNING_POLICY_SLUG }}-${{ env.CONFIGURATION_STRATEGY }}_${{ env.PUBLISH_PROFILE }}
path: ${{ runner.temp }}/SignedArtifact
compression-level: 9

- name: Final Notify Discord
uses: sarisia/actions-status-discord@v1.15.3
uses: sarisia/actions-status-discord@v1.16
if: always()
continue-on-error: true
with:
Expand All @@ -194,7 +194,7 @@ jobs:
Click [here](https://nightly.link/CollapseLauncher/Collapse/actions/runs/${{ github.run_id }}) to download!

- name: Install Sentry CLI
uses: MinoruSekine/setup-scoop@v4.0.1
uses: MinoruSekine/setup-scoop@v5.0.1
with:
buckets: extras
apps: sentry-cli
Expand Down Expand Up @@ -229,7 +229,7 @@ jobs:
}

- name: Attest Build Provenance
uses: actions/attest-build-provenance@v3
uses: actions/attest-build-provenance@v4
with:
subject-path: "${{ runner.temp }}/SignedArtifact/BuildArtifact-${{ env.VERSION }}/**"

15 changes: 7 additions & 8 deletions CollapseLauncher/Classes/CachesManagement/Honkai/Fetch.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,20 +91,19 @@ private async Task BuildGameRepoURL(HttpClient client, CancellationToken token)
KianaDispatch dispatch = null;
Exception lastException = null;

PresetConfig presetConfig = GameVersionManager.GamePreset;
PresetConfig presetConfig = GameVersionManager!.GamePreset!;
int[] version = GameVersion.VersionArray;
string key = presetConfig.DispatcherKey ?? "";

if (string.IsNullOrEmpty(presetConfig.DispatcherKey))
{
throw new NullReferenceException("Dispatcher key is null or empty!");
}

foreach (string baseURL in presetConfig.GameDispatchArrayURL ?? [])
{
try
{
// Init the key and decrypt it if existed.
if (string.IsNullOrEmpty(GameVersionManager.GamePreset.DispatcherKey))
{
throw new NullReferenceException("Dispatcher key is null or empty!");
}

// Try assign dispatcher
if (presetConfig is { GameDispatchURLTemplate: not null, GameDispatchChannelName: not null })
dispatch = await KianaDispatch.GetDispatchAsync(client,
Expand All @@ -129,7 +128,7 @@ private async Task BuildGameRepoURL(HttpClient client, CancellationToken token)

// Get gatewayURl and fetch the gateway
GameGateway = await KianaDispatch.GetGameServerAsync(client,
dispatch,
dispatch!,
presetConfig.GameGatewayDefault!,
key,
version,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,13 @@ public static partial class UIElementExtensions

public static void ChangeAccentColor(this FrameworkElement element, Color baseColor)
{
if (Application.Current.Resources.TryGetValue("AccentColor", out object? existing) &&
existing is SolidColorBrush existingBrush &&
existingBrush.Color.Equals(baseColor))
{
return;
}

Color accentColorMask = baseColor;
Color accentColorTransparent = baseColor;

Expand Down Expand Up @@ -55,30 +62,28 @@ public static void ChangeAccentColor(this FrameworkElement element, Color baseCo

internal static void ReloadPageTheme(this FrameworkElement page)
{
ElementTheme theme = InnerLauncherConfig.CurrentAppTheme switch
ElementTheme target = InnerLauncherConfig.CurrentAppTheme switch
{
AppThemeMode.Dark => ElementTheme.Dark,
AppThemeMode.Light => ElementTheme.Light,
_ => ElementTheme.Default
};

// Force the opposite theme first to ensure ThemeResource re-evaluation.
ElementTheme opposite = target switch
{
ElementTheme.Dark => ElementTheme.Light,
ElementTheme.Light => ElementTheme.Dark,
_ => ElementTheme.Light
};

bool isComplete = false;
while (!isComplete)
{
try
{
page.RequestedTheme = page.RequestedTheme switch
{
ElementTheme.Dark => ElementTheme.Light,
ElementTheme.Light => ElementTheme.Default,
ElementTheme.Default => ElementTheme.Dark,
_ => page.RequestedTheme
};

if (page.RequestedTheme != theme)
{
ReloadPageTheme(page);
}
page.RequestedTheme = opposite;
page.RequestedTheme = target;

isComplete = true;
}
Expand Down
3 changes: 0 additions & 3 deletions CollapseLauncher/Classes/Extension/UIElementExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -543,9 +543,6 @@ internal static ref TReturnType GetApplicationResourceRef<TReturnType>(string re

internal static void SetApplicationResource(string resourceKey, object value)
{
if (!CurrentResourceDictionary.ContainsKey(resourceKey))
throw new KeyNotFoundException($"Application resource with key: {resourceKey} does not exist!");

CurrentResourceDictionary[resourceKey] = value;
}

Expand Down
18 changes: 10 additions & 8 deletions CollapseLauncher/Classes/FileMigrationProcess/IO.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using CollapseLauncher.XAMLs.Theme.ContentDialog;
using Hi3Helper;
using Hi3Helper.Data;
using Hi3Helper.Win32.ManagedTools;
using Microsoft.UI.Xaml.Controls;
using System;
using System.IO;
Expand Down Expand Up @@ -90,8 +91,8 @@ private async ValueTask<bool> IsOutputPathSpaceSufficient(string inputPath, stri
ArgumentException.ThrowIfNullOrEmpty(inputPath);
ArgumentException.ThrowIfNullOrEmpty(outputPath);

DriveInfo inputDriveInfo = new DriveInfo(Path.GetPathRoot(inputPath)!);
DriveInfo outputDriveInfo = new DriveInfo(Path.GetPathRoot(outputPath)!);
string inputVolName = PathUtil.GetPathVolumeName(inputPath);
string outputVolName = PathUtil.GetPathVolumeName(outputPath);

_totalFileSize = await Task.Run(() =>
{
Expand All @@ -110,23 +111,24 @@ private async ValueTask<bool> IsOutputPathSpaceSufficient(string inputPath, stri
return returnSize;
});

IsSameOutputDrive = inputDriveInfo.Name == outputDriveInfo.Name;
IsSameOutputDrive = inputVolName == outputVolName;
if (IsSameOutputDrive)
return true;

bool isSpaceSufficient = outputDriveInfo.TotalFreeSpace > _totalFileSize;
long volumeFreeSpace = PathUtil.GetVolumeFreeSpace(outputPath);
bool isSpaceSufficient = volumeFreeSpace > _totalFileSize;
if (isSpaceSufficient)
{
return true;
}

string errStr = $"Free Space on {outputDriveInfo.Name} is not sufficient! (Free space: {outputDriveInfo.TotalFreeSpace}, Req. Space: {_totalFileSize}, Drive: {outputDriveInfo.Name})";
string errStr = $"Free Space on {outputVolName} is not sufficient! (Free space: {volumeFreeSpace}, Req. Space: {_totalFileSize}, Drive: {outputVolName})";
Logger.LogWriteLine(errStr, LogType.Error, true);
await SimpleDialogs.SpawnDialog(string.Format(Locale.Current.Lang?._Dialogs?.OperationErrorDiskSpaceInsufficientTitle ?? "", outputDriveInfo.Name),
await SimpleDialogs.SpawnDialog(string.Format(Locale.Current.Lang?._Dialogs?.OperationErrorDiskSpaceInsufficientTitle ?? "", outputVolName),
string.Format(Locale.Current.Lang?._Dialogs?.OperationErrorDiskSpaceInsufficientMsg ?? "",
ConverterTool.SummarizeSizeSimple(outputDriveInfo.TotalFreeSpace),
ConverterTool.SummarizeSizeSimple(volumeFreeSpace),
ConverterTool.SummarizeSizeSimple(_totalFileSize),
outputDriveInfo.Name),
outputVolName),
null,
null,
Locale.Current.Lang?._Misc?.Okay,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public void Play(bool isUserRequest = true)
bool hasStaticImage = !string.IsNullOrEmpty(context?.BackgroundImageStaticPath);
if (isUserRequest && hasStaticImage && context != null)
{
LoadImageAtIndex(CurrentSelectedBackgroundIndex, false, CancellationToken.None);
LoadImageAtIndex(CurrentSelectedBackgroundIndex, false, CancellationToken.None, true);
}

// Force to restore autoplay status to true.
Expand All @@ -81,7 +81,7 @@ public void Pause(bool isUserRequest = true)
bool hasStaticImage = !string.IsNullOrEmpty(context?.BackgroundImageStaticPath);
if (isUserRequest && hasStaticImage && context != null)
{
LoadImageAtIndex(CurrentSelectedBackgroundIndex, true, CancellationToken.None);
LoadImageAtIndex(CurrentSelectedBackgroundIndex, true, CancellationToken.None, true);
return;
}

Expand Down
Loading