Installed apps + Compare UX + Settings + Bandwidth Planner fixes - #14
Merged
Conversation
Split InstalledPackageService into ListWithoutIcons (fast WinRT enumeration,
~0.4s for 219 packages) and per-package ResolveIcon. The Apps pane now
renders the list in <1s and streams icons in afterward instead of blocking
several seconds on icon I/O upfront.
MainPageViewModel.LoadInstalledAppsAsync does two passes with a
CancellationTokenSource so closing the pane mid-resolution stops the
background work. Icon updates replace each row via 'pkg with { IconBytes = ... }'
so x:Bind picks them up via ObservableCollection's replace notification.
+7 tests (147 total, all green).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ection - BitmapImage decode moved off the UI thread's blocking path: VM now properly awaits SetSourceAsync, stores the decoded image on InstalledPackage.IconImage, and yields between rows. UI stays responsive while icons stream in. - Top alignment: removed NavView.Header (the empty package-path TextBlock was reserving ~80px above the pane); set AlwaysShowHeader=False. Overview card already shows the package name/version. - Start-menu filter: InstalledPackageService.TryMap now uses Package.GetAppListEntries() to drop background services, media extensions, and other non-app packages (matches what users see in Start). - Single 'Applications' section replaces the per-Application nav-noise (was showing ms-resource:appDisplayName x3 + each EntryPoint name for multi-app packages like WinGet). Content side aggregates all Applications. - Bumped SupportedOSPlatform to 10.0.19041.0 to match GetAppListEntries. 147/147 Core tests passing. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
MainPage: - Sections nav (Overview/Identity/Properties/etc.) moves out of NavView.MenuItems into a dedicated Sections secondary pane in column 0, mirroring the Apps pane. - Export Markdown / Export JSON / Raw XML move out of NavView.FooterMenuItems into action buttons at the bottom of the Sections pane. - Auto-collapse the primary NavView pane when a package loads so attention shifts to the loaded package. - Overview icon changes from Home glyph to Info glyph; Properties from wrench to gear. ComparePage: - Same pattern: a left Actions sidebar (visible when HasResult) hosts the Export Markdown / Export JSON buttons; inline export buttons removed from the body. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
MainPage: - Apps pane closes automatically when the user picks an app so the Sections pane (app info) takes over the column. - 'Open Package…' removed from the top NavView; opening a .msix from disk is now a primary action button inside the Apps pane, since both paths are ways to pick a package to analyze. - Top NavView is now just Apps + Compare Versions. - Welcome hint text updated to match. ComparePage: - Top toolbar removed (no more 'Back to Analyse' — top NavView provides navigation). The Compare-mode banner is gone, freeing vertical space. - The left sidebar is renamed 'Bandwidth Planner' with title + intro at the top, always visible. Export buttons stay at the bottom, visible after a comparison runs. - OnBackClick handler deleted (no callers). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… views + add swap button - Add per-tool nav (Diff, Bandwidth Planner, Duplicates) to ComparePage sidebar, mirroring the Sections pane pattern from MainPage. Diff is the default view after each successful comparison; Bandwidth Planner and Duplicates are accessed by selecting the matching sidebar item. - ListView selection driven from code-behind (Loaded + ViewModel.PropertyChanged) instead of x:Bind IsSelected on items to avoid a UIA re-entrancy crash that happened when accessibility tools probed the tree during SelectionChanged. - InfoBadges on Diff and Duplicates nav items show file-change and duplicate-group counts. - Duplicates view shows a positive empty-state InfoBar when the comparison found no duplicates. - Add Swap button between the Old/New package pickers — flips OldPath ↔ NewPath in one click for users who pick the target version first. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The CLI was crashing at startup with FileNotFoundException for Spectre.Console.Ansi because Spectre now ships as multiple assemblies (Spectre.Console, Spectre.Console.Ansi, ...). The hard-coded copy list only pulled Spectre.Console.dll, so the runtime couldn't resolve Ansi support when 'msixplainer' was launched from PATH. Switch to a glob of Spectre.Console*.dll so any future split is picked up automatically. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- CLI: --version/-v flag; version line in banner; stamp assembly version from manifest in Package.ps1 - WinUI: Settings footer NavView item -> SettingsPage with Light/Dark/System theme selector (persisted in LocalSettings) and About card (version + architecture + GitHub link) - ThemeService applies persisted theme on app launch - MainPageViewModel: IsSettingsMode / IsHomeMode mutually exclusive with IsCompareMode Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Stamping assembly Version caused CLI to bind to Core 1.0.20.0 while Core shipped as 1.0.0.0 (built separately by WinUI), giving FileNotFoundException at runtime. InformationalVersion alone gives us the displayed version without breaking the assembly reference. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…d WinUI Align all assembly versions with the package manifest version so CLI --version, WinUI Settings 'About', and the .msixbundle all show the same number. Stamping the WinUI build too means Core (built as a project ref by both projects) ends up at the same version everywhere, avoiding the earlier FileNotFoundException. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Bundles like Microsoft.DesktopAppInstaller ship more than one
application-type inner package for the same architecture (main +
companion partitions), which made the old 'app|{arch}' MatchKey collide
and UpdateDiffService.CompareBundles throw 'An item with the same key
has already been added. Key: app|x64'.
- BundleInnerPackage.MatchKey now includes ResourceId and language/scale
qualifiers so split partitions don't collide.
- UpdateDiffService now builds the lookup with TryAdd to tolerate any
remaining duplicates rather than crashing.
- New regression test CompareBundles_HandlesMultipleInnersWithSameArchitecture.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Real-world bundles like Microsoft.DesktopAppInstaller include 'stub' inner packages whose FileName attribute is e.g. 'AppxMetadata\Stub\AppInstaller_x64_stub.msix'. These are metadata-only placeholders used by the platform for delta servicing — they don't carry a real block map. Diffing them threw 'Bundle does not contain expected inner package'. - BundleManifestParser now normalizes backslash separators and skips entries under AppxMetadata/. - New test BundleManifestParser_SkipsStubPackages. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Merges the in-flight installed-apps / compare / settings / bandwidth-planner work into main.
Highlights
Compare (bandwidth planner UX)
TryAdd.Bundle does not contain expected inner package 'AppxMetadata\Stub\...'— stub packages are metadata-only and are now skipped.Installed apps pane (issue #13)
CLI + settings
msixplainer --version/-v; version line under the banner.Package.ps1now stampsVersion/AssemblyVersion/FileVersion/InformationalVersionon both CLI and WinUI builds so all surfaces report the same number as the.msixbundle.Package.ps1now globsSpectre.Console*.dllsoSpectre.Console.Ansi.dllships (fixes CLI startupFileNotFoundException).Misc
CA1416viaIsWindowsVersionAtLeastguard.Tests
149 / 149
MSIXplainer.Core.Testspassing.