diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e89d066..c24db9e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -128,19 +128,33 @@ jobs: cache: true cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" # optional, change this to force refresh cache cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" # optional, change this to specify the cache path - + - name: Get dependencies run: flutter pub get - name: Build Windows EXE run: flutter build windows --build-number=${{ github.run_number }} - - name: Archive Windows artifact + - name: Compile Inno Setup installer + uses: Minionguyjpro/Inno-Setup-Action@v1.2.2 + with: + path: windows/windows_setup.iss + options: /O+ + env: + FLADDER_VERSION: ${{needs.fetch-info.outputs.version_name}} + + - name: Archive Windows portable artifact uses: actions/upload-artifact@v4.0.0 with: - name: fladder-windows + name: fladder-windows-portable path: build\windows\x64\runner\Release\ + - name: Archive Windows installer artifact + uses: actions/upload-artifact@v4.0.0 + with: + name: fladder-windows-installer + path: windows\Output\fladder_setup.exe + build-ios: runs-on: macos-latest needs: [fetch-info] @@ -360,15 +374,26 @@ jobs: mv fladder-android/release-signed.apk Fladder-Android-${{needs.fetch-info.outputs.version_name}}.apk mv fladder-android/release-signed.aab Fladder-Android-${{needs.fetch-info.outputs.version_name}}.aab - - name: Download Artifacts Windows + - name: Download Windows portable artifact uses: actions/download-artifact@v4 with: - name: fladder-windows - path: fladder-windows + name: fladder-windows-portable + path: fladder-windows-portable + + - name: Download Windows installer artifact + uses: actions/download-artifact@v4 + with: + name: fladder-windows-installer + path: fladder-windows-installer + + - name: Rename Windows installer + run: | + cd fladder-windows-installer + ren fladder_setup.exe Fladder-Windows-${{needs.fetch-info.outputs.version_name}}-Setup.exe - name: Compress Windows run: | - cd fladder-windows + cd fladder-windows-portable zip -r ../Fladder-Windows-${{needs.fetch-info.outputs.version_name}}.zip . - name: Download Artifacts iOS @@ -428,9 +453,11 @@ jobs: generate_release_notes: true files: | Fladder-Android-${{needs.fetch-info.outputs.version_name}}.apk + Fladder-Windows-${{needs.fetch-info.outputs.version_name}}-Setup.exe Fladder-Windows-${{needs.fetch-info.outputs.version_name}}.zip Fladder-iOS-${{needs.fetch-info.outputs.version_name}}.ipa Fladder-macOS-${{needs.fetch-info.outputs.version_name}}.dmg Fladder-Web-${{needs.fetch-info.outputs.version_name}}.zip Fladder-Linux-${{needs.fetch-info.outputs.version_name}}.zip Fladder-Linux-${{needs.fetch-info.outputs.version_name}}.flatpak + diff --git a/.gitignore b/.gitignore index d530458..7836eb5 100644 --- a/.gitignore +++ b/.gitignore @@ -53,3 +53,6 @@ app.*.map.json # Affinity lock *.afdesign~lock~ *.afphoto~lock~ + +# Inno Setup builds +Output diff --git a/INSTALL.md b/INSTALL.md index 6e33c13..e9d0a6f 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -20,9 +20,16 @@ Platform-specific installation instructions can be found in this document. ## Windows +### Installer + +Download the latest `.exe` installer from the [Releases](https://github.com/DonutWare/Fladder/releases) page and open it. Follow the on-screen instructions. + +### Portable + Download the latest `.zip` file from the [Releases](https://github.com/DonutWare/Fladder/releases) page and extract it somewhere on your PC. Run `fladder.exe` to start the application. + ## macOS 1. Download the latest `*.dmg` file from the [Releases](https://github.com/DonutWare/Fladder/releases) page. @@ -47,6 +54,7 @@ Run `fladder.exe` to start the application. Download the latest Linux `.zip` file from the [Releases](https://github.com/DonutWare/Fladder/releases) page and extract it somewhere on your computer. Open a terminal and `cd` to the directory where you extracted Fladder to. Run `./Fladder` to open the application. + ### Arch An AUR package is available for download (thanks to @tam1m). @@ -74,6 +82,7 @@ Open a terminal and `cd` to the directory where you extracted Fladder to. Run `. This is the recommended way to install Fladder on Android. Get it on Google Play + ### Manual If your device can't access the Play Store, you can install Fladder manually. diff --git a/assets/windows-installer/fladder-installer-100.bmp b/assets/windows-installer/fladder-installer-100.bmp new file mode 100644 index 0000000..c7bdee9 Binary files /dev/null and b/assets/windows-installer/fladder-installer-100.bmp differ diff --git a/assets/windows-installer/fladder-installer-125.bmp b/assets/windows-installer/fladder-installer-125.bmp new file mode 100644 index 0000000..4069bc6 Binary files /dev/null and b/assets/windows-installer/fladder-installer-125.bmp differ diff --git a/assets/windows-installer/fladder-installer-150.bmp b/assets/windows-installer/fladder-installer-150.bmp new file mode 100644 index 0000000..f2267ba Binary files /dev/null and b/assets/windows-installer/fladder-installer-150.bmp differ diff --git a/icons/production/fladder_icon.ico b/icons/production/fladder_icon.ico new file mode 100644 index 0000000..ca6280a Binary files /dev/null and b/icons/production/fladder_icon.ico differ diff --git a/windows/windows_setup.iss b/windows/windows_setup.iss new file mode 100644 index 0000000..55418ed --- /dev/null +++ b/windows/windows_setup.iss @@ -0,0 +1,144 @@ +[Setup] +AppId={{D573EDD5-117A-47AD-88AC-62C8EBD11DC7} +AppName="Fladder" +AppVersion={%FLADDER_VERSION|latest} +AppPublisher="DonutWare" +AppPublisherURL="https://github.com/DonutWare/Fladder" +AppSupportURL="https://github.com/DonutWare/Fladder" +AppUpdatesURL="https://github.com/DonutWare/Fladder" +DefaultDirName={localappdata}\Programs\Fladder +ArchitecturesAllowed=x64compatible +ArchitecturesInstallIn64BitMode=x64compatible +DisableProgramGroupPage=yes +PrivilegesRequired=lowest +PrivilegesRequiredOverridesAllowed=dialog +OutputBaseFilename=fladder_setup +Compression=lzma +SolidCompression=yes +WizardStyle=modern + +SetupLogging=yes +UninstallLogging=yes +UninstallDisplayName="Fladder" +UninstallDisplayIcon={app}\fladder.exe +SetupIconFile="D:\a\Fladder\Fladder\icons\production\fladder_icon.ico" +LicenseFile="D:\a\Fladder\Fladder\LICENSE" +WizardImageFile=D:\a\Fladder\Fladder\assets\windows-installer\fladder-installer-100.bmp,D:\a\Fladder\Fladder\assets\windows-installer\fladder-installer-125.bmp,D:\a\Fladder\Fladder\assets\windows-installer\fladder-installer-150.bmp + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked + +[Files] +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\fladder.exe"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-console-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-console-l1-2-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-datetime-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-debug-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-errorhandling-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-fibers-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-file-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-file-l1-2-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-file-l2-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-handle-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-heap-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-interlocked-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-libraryloader-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-localization-l1-2-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-memory-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-namedpipe-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-processenvironment-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-processthreads-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-processthreads-l1-1-1.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-profile-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-rtlsupport-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-string-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-synch-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-synch-l1-2-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-sysinfo-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-timezone-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-core-util-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-crt-conio-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-crt-convert-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-crt-environment-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-crt-filesystem-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-crt-heap-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-crt-locale-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-crt-math-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-crt-multibyte-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-crt-private-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-crt-process-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-crt-runtime-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-crt-stdio-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-crt-string-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-crt-time-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-crt-utility-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-downlevel-kernel32-l2-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\api-ms-win-eventing-provider-l1-1-0.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\concrt140.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\d3dcompiler_47.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\desktop_drop_plugin.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\dynamic_color_plugin.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\ffmpeg-7.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\flutter_windows.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\fvp_plugin.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\isar.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\isar_flutter_libs_plugin.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\libass.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\libc++.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\libEGL.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\libGLESv2.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\libmpv-2.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\local_auth_windows_plugin.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\mdk.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\media_kit_libs_windows_video_plugin.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\media_kit_video_plugin.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\msvcp140.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\msvcp140_1.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\msvcp140_2.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\msvcp140_atomic_wait.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\msvcp140_codecvt_ids.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\screen_brightness_windows_plugin.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\screen_retriever_windows_plugin.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\share_plus_plugin.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\smtc_windows.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\ucrtbase.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\ucrtbased.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\url_launcher_windows_plugin.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\vccorlib140.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\vccorlib140d.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\vcruntime140.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\vcruntime140_1.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\vcruntime140_1d.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\vcruntime140d.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\vk_swiftshader.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\vulkan-1.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\window_manager_plugin.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\zlib.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "D:\a\Fladder\Fladder\build\windows\x64\runner\Release\data\*"; DestDir: "{app}\data"; Flags: ignoreversion recursesubdirs createallsubdirs + +[Icons] +Name: "{autoprograms}\Fladder"; Filename: "{app}\fladder.exe" +Name: "{autodesktop}\Fladder"; Filename: "{app}\fladder.exe"; Tasks: desktopicon + +[Run] +Filename: "{app}\fladder.exe"; Description: "{cm:LaunchProgram,Fladder}"; Flags: nowait postinstall skipifsilent + +[Code] +procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); +begin + case CurUninstallStep of + usUninstall: + begin + if MsgBox("Would you like to delete the application's data? This action cannot be undone. Synced files will remain unaffected.", mbConfirmation, MB_YESNO) = IDYES then + begin + if DelTree(ExpandConstant('{localappdata}\DonutWare'), True, True, True) = False then + begin + Log(ExpandConstant('{localappdata}\DonutWare could not be deleted. Skipping...')); + end; + end; + end; + end; +end; \ No newline at end of file