Compare commits

...

8 Commits

Author SHA1 Message Date
ricoberger
63f7ab7bf6 Prepare v1.4.1 Release 2024-08-07 17:38:04 +02:00
Rico Berger
676ff316d7 [core] Fix Warnings and Regenerate Splash Screens (#186)
This commit fixes the following warnings for the web build:

```
Warning: In index.html:38: Local variable for "serviceWorkerVersion" is deprecated. Use "{{flutter_service_worker_version}}" template token instead.
Warning: In index.html:60: "FlutterLoader.loadEntrypoint" is deprecated. Use "FlutterLoader.load" instead.
```

To re-add the slash screen we alsow run the
`flutter pub run flutter_native_splash:create` command again, which also
updated the splash screens for iOS and Android.

Last but not least this commit also fixes the following warnings for the
Windows build:

```
windows/runner/flutter_window.cpp does not ensure the show window callback is called, updating.
windows/flutter/CMakeLists.txt does not use FLUTTER_TARGET_PLATFORM, updating.
```
2024-08-07 17:34:19 +02:00
Rico Berger
3eccb0bd4a [core] Fix Web Build (#185)
Fix web build be initializing `JustAudioMediaKit` only on Linux and
Windows where it is really used. The corresponding issue for the broken
web build can be found here
https://github.com/Pato05/just_audio_media_kit/issues/15.

To test the web build on every PR to avoid such issues, the CI/CD
pipeline for the web build is now also run on every PR. On PRs we skip
the upload to Cloudflare for the web build.
2024-08-06 17:05:26 +02:00
Rico Berger
351c61f613 [core] Fix Metadata for Flatpak (#184)
The Linux version of the app is distributed via Flatpak, this commit
fixes some issues shown in the validation on Flathub. This includes the
summary and branding color and the app icon which should be square
instead of round.
2024-08-06 14:27:09 +02:00
Rico Berger
333e762539 [core] Upload Raw Build in Windows CI/CD Pipeline (#183)
Upload the raw build of the app in the Windows CI/CD pipeline, so that
we can test the production build during a new release.

We also had to adjust the Windows runner to `windows-2019`, because the
build on `windows-latest` and `windows-2022` can not be startet after
downloading it.
2024-08-06 09:40:13 +02:00
Rico Berger
280a222210 [podcast] Fix Audio Playback on Windows and Linux (#182)
Fix the audio playback on Windows and Linux for the podcast player by
adding the missing initialization for `JustAudioMediaKit`.
2024-08-06 07:45:15 +02:00
ricoberger
4853eeb0a8 Add Verification File for Flathub 2024-08-04 18:21:27 +02:00
ricoberger
9e9bf01b5b Fix Issues in app.feeddeck.feeddeck.metainfo.xml File 2024-08-04 18:09:59 +02:00
41 changed files with 272 additions and 129 deletions

View File

@@ -122,12 +122,14 @@ jobs:
supabase functions deploy stripe-create-checkout-session-v1 --project-ref $PROJECT_ID --import-map supabase/functions/import_map.json
supabase functions deploy stripe-webhooks-v1 --no-verify-jwt --project-ref $PROJECT_ID --import-map supabase/functions/import_map.json
# The "Web" job builds the Flutter web app and publishes it to Cloudflare Pages. The job only runs when a commit is
# pushed to the main branch or a new tag is created.
# The "Web" job builds the Flutter web app and publishes it to Cloudflare Pages. The job only runs on pull requests or
# when a commit is pushed to the main branch or a new tag is created.
#
# When the job runs on a pull request it only builds the app but doesn't upload the build to Cloudflare.
web:
name: Web
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main' || (github.event_name == 'release' && github.event.action == 'published')
if: github.event_name == 'pull_request' || github.ref == 'refs/heads/main' || (github.event_name == 'release' && github.event.action == 'published')
permissions:
contents: read
defaults:
@@ -185,6 +187,7 @@ jobs:
- name: Publish to Cloudflare Pages
uses: cloudflare/pages-action@v1
if: github.ref == 'refs/heads/main' || (github.event_name == 'release' && github.event.action == 'published')
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
@@ -387,7 +390,7 @@ jobs:
# only runs for pull requests and when a new release is published.
windows:
name: Windows
runs-on: windows-latest
runs-on: windows-2019
if: github.event_name == 'pull_request' || (github.event_name == 'release' && github.event.action == 'published')
permissions:
contents: write
@@ -416,19 +419,22 @@ jobs:
run: |
flutter config --enable-windows-desktop
flutter build windows --release --dart-define SUPABASE_URL=${{ secrets.SUPABASE_PROD_URL }} --dart-define SUPABASE_ANON_KEY=${{ secrets.SUPABASE_PROD_ANON_KEY }} --dart-define SUPABASE_SITE_URL=${{ secrets.SUPABASE_PROD_SITE_URL }} --dart-define GOOGLE_CLIENT_ID=${{ secrets.SUPABASE_PROD_GOOGLE_CLIENT_ID }}
- name: Create Archive
run: |
Compress-Archive -Path build/windows/x64/runner/Release/* -Destination feeddeck-windows-x86_64.zip
- name: Package
run: |
flutter pub run msix:create --output-path build --output-name feeddeck
cd build
7z a -tzip feeddeck-windows-x86_64.zip feeddeck.msix
7z a -tzip feeddeck-windows-x86_64-msix.zip feeddeck.msix
- name: Upload Artifacts (PR)
if: ${{ github.event_name == 'pull_request' }}
uses: actions/upload-artifact@v4
with:
name: feeddeck-windows-x86_64.zip
path: app/build/feeddeck-windows-x86_64.zip
path: app/feeddeck-windows-x86_64.zip
if-no-files-found: error
- name: Upload Artifacts (Release)
@@ -436,7 +442,22 @@ jobs:
if: ${{ github.event_name == 'release' && github.event.action == 'published' }}
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: app/build/feeddeck-windows-x86_64.zip
asset_path: app/feeddeck-windows-x86_64.zip
- name: Upload Artifacts (PR)
if: ${{ github.event_name == 'pull_request' }}
uses: actions/upload-artifact@v4
with:
name: feeddeck-windows-x86_64-msix.zip
path: app/build/feeddeck-windows-x86_64-msix.zip
if-no-files-found: error
- name: Upload Artifacts (Release)
uses: shogo82148/actions-upload-release-asset@v1
if: ${{ github.event_name == 'release' && github.event.action == 'published' }}
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: app/build/feeddeck-windows-x86_64-msix.zip
# The "iOS" job builds the Flutter iOS app on every pull request. This is only used to test that the build of the iOS
# app works. The artifact of the build isn't uploaded / used.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -5,6 +5,10 @@
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
<item name="android:forceDarkAllowed">false</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -1,73 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>FeedDeck</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>feeddeck</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>app.feeddeck.feeddeck</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>FeedDeck</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>feeddeck</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>app.feeddeck.feeddeck</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIStatusBarHidden</key>
<true/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIStatusBarHidden</key>
<false/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict>
</plist>

View File

@@ -19,6 +19,7 @@ import 'package:feeddeck/utils/constants.dart';
import 'package:feeddeck/widgets/confirmation/confirmation.dart';
import 'package:feeddeck/widgets/home/home.dart';
import 'package:feeddeck/widgets/reset_password/reset_password.dart';
import 'package:feeddeck/widgets/item/details/utils/item_audio_palyer/item_audio_player_init/item_audio_player_init.dart';
/// Before we are calling [runApp] we have to ensure that the widget bindings
/// are initialized, so that we can preserve the splash screen until we are done
@@ -50,6 +51,9 @@ void main() async {
/// Initialize the [media_kit] packages, so that we can play audio and video
/// files.
MediaKit.ensureInitialized();
if (!kIsWeb && (Platform.isLinux || Platform.isWindows)) {
ItemAudioPlayerInit().init();
}
/// Initialize the [just_audio_background] package, so that we can play audio
/// files in the background.

View File

@@ -0,0 +1,11 @@
library item_audio_player_init;
import 'item_audio_player_init_stub.dart'
if (dart.library.io) 'item_audio_player_init_native.dart'
if (dart.library.html) 'item_audio_player_init_web.dart';
abstract class ItemAudioPlayerInit {
void init();
factory ItemAudioPlayerInit() => getItemAudioPlayerInit();
}

View File

@@ -0,0 +1,12 @@
import 'package:just_audio_media_kit/just_audio_media_kit.dart';
import 'item_audio_player_init.dart';
class ItemAudioPlayerInitNative implements ItemAudioPlayerInit {
@override
void init() {
JustAudioMediaKit.ensureInitialized();
}
}
ItemAudioPlayerInit getItemAudioPlayerInit() => ItemAudioPlayerInitNative();

View File

@@ -0,0 +1,5 @@
import 'item_audio_player_init.dart';
ItemAudioPlayerInit getItemAudioPlayerInit() => throw UnsupportedError(
'Can not ItemAudioPlayerInit without the packages dart:html or dart:io',
);

View File

@@ -0,0 +1,8 @@
import 'item_audio_player_init.dart';
class ItemAudioPlayerInitWeb implements ItemAudioPlayerInit {
@override
void init() {}
}
ItemAudioPlayerInit getItemAudioPlayerInit() => ItemAudioPlayerInitWeb();

View File

@@ -90,6 +90,11 @@ set_target_properties(${BINARY_NAME}
# them to the application.
include(flutter/generated_plugins.cmake)
# Replace the default memory allocator with mimalloc to avoid memory leaks.
# See:
# - https://github.com/Pato05/just_audio_media_kit#use-mimalloc-from-media-kits-readme
# - https://github.com/media-kit/media-kit#utilize-mimalloc
target_link_libraries(${BINARY_NAME} PRIVATE ${MIMALLOC_LIB})
# === Installation ===
# By default, "installing" just makes a relocatable bundle in the build

View File

@@ -4,7 +4,7 @@
<metadata_license>CC0-1.0</metadata_license>
<project_license>MIT</project_license>
<name>FeedDeck</name>
<summary>Follow your RSS and Social Media Feeds</summary>
<summary>Feed reader</summary>
<developer_name>Rico Berger</developer_name>
<url type="homepage">https://feeddeck.app</url>
@@ -15,14 +15,15 @@
<launchable type="desktop-id">app.feeddeck.feeddeck.desktop</launchable>
<provides>
<id>app.feeddeck.feeddeck</id>
</provides>
<content_rating type="oars-1.1">
<content_attribute id="money-purchasing">intense</content_attribute>
</content_rating>
<branding>
<color type="primary" scheme_preference="light">#1f2229</color>
<color type="primary" scheme_preference="dark">#1f2229</color>
</branding>
<description>
<p>
FeedDeck is an open source RSS and social media feed reader, inspired by TweetDeck. FeedDeck allows you to follow your favorite feeds in one place on all platforms. FeedDeck is written in Flutter and uses Supabase and Deno as it's backend.
@@ -31,7 +32,7 @@
<li>Available for mobile and desktop: FeedDeck provides the same experience for mobile and desktop with nearly 100% code sharing.</li>
<li>RSS and Social Media Feeds: Follow your favorite RSS and social media feeds.</li>
<li>News: Get the latest news from your favorite RSS feeds and Google News.</li>
<li>Social Media: Follow your friends and favorite topics on Medium, Nitter, Reddit, Tumblr and X.</li>
<li>Social Media: Follow your friends and favorite topics on Medium, Reddit and Tumblr.</li>
<li>GitHub: Get your GitHub notifications and follow your repository activities.</li>
<li>Podcasts: Follow and listen to your favorite podcasts, via the built-in podcast player.</li>
<li>YouTube: Follow and view your favorite YouTube channels.</li>
@@ -45,12 +46,26 @@
</keywords>
<categories>
<category>System</category>
<category>Utilities</category>
<category>Utility</category>
</categories>
<releases>
<release version="v1.4.0" date="2024-08-04">
<release version="v1.4.1" date="2024-08-07">
<description>
<p>Fixed</p>
<ul>
<li>#186: [core] Fix Warnings and Regenerate Splash Screens @ricoberger</li>
<li>#185: [core] Fix Web Build @ricoberger</li>
<li>#184: [core] Fix Metadata for Flatpak @ricoberger</li>
<li>#183: [core] Upload Raw Build in Windows CI/CD Pipeline @ricoberger</li>
<li>#182: [podcast] Fix Audio Playback on Windows and Linux @ricoberger</li>
</ul>
</description>
<url>https://github.com/feeddeck/feeddeck/releases/tag/v1.2.1</url>
</release>
<release version="v1.4.0" date="2024-08-04">
<description>
<p>Added</p>
<ul>
@@ -330,18 +345,23 @@
<screenshots>
<screenshot type="default">
<image>https://raw.githubusercontent.com/feeddeck/feeddeck/main/app/linux/flatpak/screenshots/1.png</image>
<caption>Deck View</caption>
</screenshot>
<screenshot type="default">
<image>https://raw.githubusercontent.com/feeddeck/feeddeck/main/app/linux/flatpak/screenshots/2.png</image>
<caption>Details View</caption>
</screenshot>
<screenshot type="default">
<image>https://raw.githubusercontent.com/feeddeck/feeddeck/main/app/linux/flatpak/screenshots/3.png</image>
<caption>YouTube</caption>
</screenshot>
<screenshot type="default">
<image>https://raw.githubusercontent.com/feeddeck/feeddeck/main/app/linux/flatpak/screenshots/4.png</image>
<caption>Podcasts</caption>
</screenshot>
<screenshot type="default">
<image>https://raw.githubusercontent.com/feeddeck/feeddeck/main/app/linux/flatpak/screenshots/5.png</image>
<caption>GitHub</caption>
</screenshot>
</screenshots>
</component>

View File

@@ -2,8 +2,8 @@
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 4096 4096" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g id="icon-linux">
<g id="bg" transform="matrix(1.77687,0,0,1.77687,-1011.62,-1480.98)">
<circle cx="1721.91" cy="1986.06" r="1152.59" style="fill:rgb(73,211,180);"/>
<g id="bg" transform="matrix(2.30943,0,0,2.25704,-1582.56,-1114.43)">
<path d="M2339.78,621.098C2339.78,619.166 2338.24,617.598 2336.35,617.598L809.714,617.598C807.826,617.598 806.293,619.166 806.293,621.098L806.293,2183.17C806.293,2185.11 807.826,2186.67 809.714,2186.67L2336.35,2186.67C2338.24,2186.67 2339.78,2185.11 2339.78,2183.17L2339.78,621.098Z" style="fill:rgb(73,211,180);"/>
</g>
<g id="fg" transform="matrix(13.5357,0,0,13.0255,-2722.19,-2672.07)">
<path d="M443.567,272.226C438.383,276.258 434.063,278.274 430.607,278.274C423.695,278.274 416.783,274.146 409.871,265.89L369.263,293.826C362.927,298.434 359.759,304.194 359.759,311.106L359.759,429.186L359.471,429.474C359.471,432.354 358.559,435.234 356.735,438.114C354.911,440.994 352.943,442.434 350.831,442.434L350.255,442.434L350.255,439.554L347.951,442.722C345.071,442.53 337.583,439.17 325.487,432.642L325.487,432.93C313.199,425.826 302.927,422.274 294.671,422.274C286.223,422.274 278.447,425.442 271.343,431.778C268.079,434.658 265.439,438.162 263.423,442.29C261.407,446.418 260.111,451.266 259.535,456.834C263.759,451.842 268.943,449.058 275.087,448.482C276.239,448.482 277.007,448.386 277.391,448.194L277.967,448.194C282.191,448.194 290.351,450.594 302.447,455.394C308.207,457.698 315.215,458.85 323.471,458.85C334.991,458.85 347.471,455.778 360.911,449.634C376.271,442.53 385.871,434.082 389.711,424.29C390.287,422.946 390.575,421.602 390.575,420.258L390.863,370.722L410.735,370.722L410.735,431.778L421.391,431.778L421.391,301.314C425.231,300.354 428.687,298.482 431.759,295.698C434.831,292.914 437.807,289.314 440.687,284.898C443.183,281.058 444.431,278.274 444.431,276.546L444.719,276.258C444.719,275.49 444.911,274.53 445.295,273.378L443.567,272.226ZM356.015,297.282C350.447,298.242 345.503,299.874 341.183,302.178C336.863,304.482 332.975,307.266 329.519,310.53C321.647,317.634 317.711,326.562 317.711,337.314L317.711,338.754L317.999,339.042L317.999,340.194C317.231,340.194 316.655,340.098 316.271,339.906L313.679,339.906C298.127,339.906 290.351,347.874 290.351,363.81C290.351,368.418 291.695,372.498 294.383,376.05C297.071,379.602 300.719,381.378 305.327,381.378L305.327,379.362L305.039,379.074L305.039,377.922L304.751,377.634C304.751,373.218 308.015,371.01 314.543,371.01L316.559,371.01L317.135,371.298L318.287,371.298L318.287,413.634C318.095,414.018 317.951,414.498 317.855,415.074C317.759,415.65 317.615,416.13 317.423,416.514C317.039,417.282 316.703,418.194 316.415,419.25C316.127,420.306 315.887,421.026 315.695,421.41L318.575,421.41L319.151,421.122L319.727,421.122L320.015,420.834C322.703,420.834 326.351,419.202 330.959,415.938C344.399,407.106 351.119,396.93 351.119,385.41L351.119,310.818C351.119,308.706 351.647,306.45 352.703,304.05C353.759,301.65 355.055,300.162 356.591,299.586L356.015,297.282ZM375.023,266.754C370.415,270.978 365.231,273.09 359.471,273.09C351.407,273.09 345.647,272.226 342.191,270.498L341.615,270.498L341.327,270.21C338.063,269.634 335.375,269.106 333.263,268.626C331.151,268.146 329.615,267.81 328.655,267.618L325.775,267.618C320.207,267.042 317.231,266.562 316.847,266.178L314.831,267.042C298.319,267.426 286.799,273.186 280.271,284.322C277.391,289.314 275.951,293.73 275.951,297.57L275.951,300.162C282.671,295.938 286.991,293.826 288.911,293.826L290.063,293.826L290.351,293.538C294.767,293.538 302.063,294.594 312.239,296.706C321.839,298.818 329.039,299.874 333.839,299.874L334.127,300.162L335.279,300.162C344.687,300.162 353.615,297.09 362.063,290.946C371.087,284.418 376.079,276.642 377.039,267.618L375.023,266.754ZM409.583,301.89C409.775,301.89 409.919,301.938 410.015,302.034C410.111,302.13 410.351,302.082 410.735,301.89L410.735,340.482L390.863,340.482L390.863,294.402C397.967,299.394 404.207,301.89 409.583,301.89Z" style="fill:rgb(31,34,41);fill-rule:nonzero;"/>

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix.
version: 1.4.0+11
version: 1.4.1+12
environment:
sdk: '>=3.3.0 <4.0.0'
@@ -169,7 +169,7 @@ msix_config:
publisher_display_name: Rico Berger
identity_name: 26077RicoBerger.FeedDeck
publisher: CN=7740451A-C179-450A-B346-7231CA231332
msix_version: 1.4.0.0
msix_version: 1.4.1.0
logo_path: templates/app-icon/windows.png
languages: en-us
capabilities: internetClient

View File

@@ -2,8 +2,8 @@
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 4096 4096" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g id="icon-linux">
<g id="bg" transform="matrix(1.77687,0,0,1.77687,-1011.62,-1480.98)">
<circle cx="1721.91" cy="1986.06" r="1152.59" style="fill:rgb(73,211,180);"/>
<g id="bg" transform="matrix(2.30943,0,0,2.25704,-1582.56,-1114.43)">
<path d="M2339.78,621.098C2339.78,619.166 2338.24,617.598 2336.35,617.598L809.714,617.598C807.826,617.598 806.293,619.166 806.293,621.098L806.293,2183.17C806.293,2185.11 807.826,2186.67 809.714,2186.67L2336.35,2186.67C2338.24,2186.67 2339.78,2185.11 2339.78,2183.17L2339.78,621.098Z" style="fill:rgb(73,211,180);"/>
</g>
<g id="fg" transform="matrix(13.5357,0,0,13.0255,-2722.19,-2672.07)">
<path d="M443.567,272.226C438.383,276.258 434.063,278.274 430.607,278.274C423.695,278.274 416.783,274.146 409.871,265.89L369.263,293.826C362.927,298.434 359.759,304.194 359.759,311.106L359.759,429.186L359.471,429.474C359.471,432.354 358.559,435.234 356.735,438.114C354.911,440.994 352.943,442.434 350.831,442.434L350.255,442.434L350.255,439.554L347.951,442.722C345.071,442.53 337.583,439.17 325.487,432.642L325.487,432.93C313.199,425.826 302.927,422.274 294.671,422.274C286.223,422.274 278.447,425.442 271.343,431.778C268.079,434.658 265.439,438.162 263.423,442.29C261.407,446.418 260.111,451.266 259.535,456.834C263.759,451.842 268.943,449.058 275.087,448.482C276.239,448.482 277.007,448.386 277.391,448.194L277.967,448.194C282.191,448.194 290.351,450.594 302.447,455.394C308.207,457.698 315.215,458.85 323.471,458.85C334.991,458.85 347.471,455.778 360.911,449.634C376.271,442.53 385.871,434.082 389.711,424.29C390.287,422.946 390.575,421.602 390.575,420.258L390.863,370.722L410.735,370.722L410.735,431.778L421.391,431.778L421.391,301.314C425.231,300.354 428.687,298.482 431.759,295.698C434.831,292.914 437.807,289.314 440.687,284.898C443.183,281.058 444.431,278.274 444.431,276.546L444.719,276.258C444.719,275.49 444.911,274.53 445.295,273.378L443.567,272.226ZM356.015,297.282C350.447,298.242 345.503,299.874 341.183,302.178C336.863,304.482 332.975,307.266 329.519,310.53C321.647,317.634 317.711,326.562 317.711,337.314L317.711,338.754L317.999,339.042L317.999,340.194C317.231,340.194 316.655,340.098 316.271,339.906L313.679,339.906C298.127,339.906 290.351,347.874 290.351,363.81C290.351,368.418 291.695,372.498 294.383,376.05C297.071,379.602 300.719,381.378 305.327,381.378L305.327,379.362L305.039,379.074L305.039,377.922L304.751,377.634C304.751,373.218 308.015,371.01 314.543,371.01L316.559,371.01L317.135,371.298L318.287,371.298L318.287,413.634C318.095,414.018 317.951,414.498 317.855,415.074C317.759,415.65 317.615,416.13 317.423,416.514C317.039,417.282 316.703,418.194 316.415,419.25C316.127,420.306 315.887,421.026 315.695,421.41L318.575,421.41L319.151,421.122L319.727,421.122L320.015,420.834C322.703,420.834 326.351,419.202 330.959,415.938C344.399,407.106 351.119,396.93 351.119,385.41L351.119,310.818C351.119,308.706 351.647,306.45 352.703,304.05C353.759,301.65 355.055,300.162 356.591,299.586L356.015,297.282ZM375.023,266.754C370.415,270.978 365.231,273.09 359.471,273.09C351.407,273.09 345.647,272.226 342.191,270.498L341.615,270.498L341.327,270.21C338.063,269.634 335.375,269.106 333.263,268.626C331.151,268.146 329.615,267.81 328.655,267.618L325.775,267.618C320.207,267.042 317.231,266.562 316.847,266.178L314.831,267.042C298.319,267.426 286.799,273.186 280.271,284.322C277.391,289.314 275.951,293.73 275.951,297.57L275.951,300.162C282.671,295.938 286.991,293.826 288.911,293.826L290.063,293.826L290.351,293.538C294.767,293.538 302.063,294.594 312.239,296.706C321.839,298.818 329.039,299.874 333.839,299.874L334.127,300.162L335.279,300.162C344.687,300.162 353.615,297.09 362.063,290.946C371.087,284.418 376.079,276.642 377.039,267.618L375.023,266.754ZM409.583,301.89C409.775,301.89 409.919,301.938 410.015,302.034C410.111,302.13 410.351,302.082 410.735,301.89L410.735,340.482L390.863,340.482L390.863,294.402C397.967,299.394 404.207,301.89 409.583,301.89Z" style="fill:rgb(31,34,41);fill-rule:nonzero;"/>

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

View File

@@ -1,7 +1,4 @@
<!DOCTYPE html>
<html>
<head>
<!DOCTYPE html><html><head>
<!--
If you are serving your web app in a path other than the root, change the
href value below to reflect the base path you are serving from.
@@ -32,45 +29,82 @@
<title>FeedDeck</title>
<link rel="manifest" href="manifest.json">
<style id="splash-screen-style">
html {
height: 100%
}
<script>
// The value below is injected by flutter build, do not touch.
var serviceWorkerVersion = null;
body {
margin: 0;
min-height: 100%;
background-color: #49d3b4;
background-size: 100% 100%;
}
.center {
margin: 0;
position: absolute;
top: 50%;
left: 50%;
-ms-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
.contain {
display:block;
width:100%; height:100%;
object-fit: contain;
}
.stretch {
display:block;
width:100%; height:100%;
}
.cover {
display:block;
width:100%; height:100%;
object-fit: cover;
}
.bottom {
position: absolute;
bottom: 0;
left: 50%;
-ms-transform: translate(-50%, 0);
transform: translate(-50%, 0);
}
.bottomLeft {
position: absolute;
bottom: 0;
left: 0;
}
.bottomRight {
position: absolute;
bottom: 0;
right: 0;
}
</style>
<script id="splash-screen-script">
function removeSplashFromWeb() {
document.getElementById("splash")?.remove();
document.getElementById("splash-branding")?.remove();
document.body.style.background = "transparent";
}
</script>
<!-- This script adds the flutter initialization JS code -->
<script src="flutter.js" defer=""></script>
<link rel="stylesheet" type="text/css" href="splash/style.css">
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
<script src="splash/splash.js"></script>
</head>
<body>
<picture id="splash">
<source
srcset="splash/img/light-1x.png 1x, splash/img/light-2x.png 2x, splash/img/light-3x.png 3x, splash/img/light-4x.png 4x"
media="(prefers-color-scheme: light)">
<source
srcset="splash/img/dark-1x.png 1x, splash/img/dark-2x.png 2x, splash/img/dark-3x.png 3x, splash/img/dark-4x.png 4x"
media="(prefers-color-scheme: dark)">
<img class="center" aria-hidden="true" src="splash/img/light-1x.png" alt="">
<source srcset="splash/img/light-1x.png 1x, splash/img/light-2x.png 2x, splash/img/light-3x.png 3x, splash/img/light-4x.png 4x" media="(prefers-color-scheme: light)">
<source srcset="splash/img/dark-1x.png 1x, splash/img/dark-2x.png 2x, splash/img/dark-3x.png 3x, splash/img/dark-4x.png 4x" media="(prefers-color-scheme: dark)">
<img class="center" aria-hidden="true" src="splash/img/light-1x.png" alt="">
</picture>
<script>
window.addEventListener('load', function (ev) {
// Download main.dart.js
_flutter.loader.loadEntrypoint({
serviceWorker: {
serviceWorkerVersion: serviceWorkerVersion,
},
onEntrypointLoaded: function (engineInitializer) {
engineInitializer.initializeEngine().then(function (appRunner) {
appRunner.runApp();
});
}
});
});
</script>
<script src="flutter_bootstrap.js" async=""></script>
</body>
</html>
</body></html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -8,7 +8,7 @@ set(BINARY_NAME "feeddeck")
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
# versions of CMake.
cmake_policy(SET CMP0063 NEW)
cmake_policy(VERSION 3.14...3.25)
# Define build configuration option.
get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
@@ -52,6 +52,7 @@ add_subdirectory(${FLUTTER_MANAGED_DIR})
# Application build; see runner/CMakeLists.txt.
add_subdirectory("runner")
# Generated plugin build rules, which manage building the plugins and adding
# them to the application.
include(flutter/generated_plugins.cmake)
@@ -86,6 +87,12 @@ if(PLUGIN_BUNDLED_LIBRARIES)
COMPONENT Runtime)
endif()
# Copy the native assets provided by the build.dart from all packages.
set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/")
install(DIRECTORY "${NATIVE_ASSETS_DIR}"
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
COMPONENT Runtime)
# Fully re-copy the assets directory on each build to avoid having stale files
# from a previous install.
set(FLUTTER_ASSET_DIR_NAME "flutter_assets")

View File

@@ -10,6 +10,11 @@ include(${EPHEMERAL_DIR}/generated_config.cmake)
# https://github.com/flutter/flutter/issues/57146.
set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper")
# Set fallback configurations for older versions of the flutter tool.
if (NOT DEFINED FLUTTER_TARGET_PLATFORM)
set(FLUTTER_TARGET_PLATFORM "windows-x64")
endif()
# === Flutter Library ===
set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll")
@@ -92,7 +97,7 @@ add_custom_command(
COMMAND ${CMAKE_COMMAND} -E env
${FLUTTER_TOOL_ENVIRONMENT}
"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"
windows-x64 $<CONFIG>
${FLUTTER_TARGET_PLATFORM} $<CONFIG>
VERBATIM
)
add_custom_target(flutter_assemble DEPENDS

View File

@@ -31,6 +31,11 @@ bool FlutterWindow::OnCreate() {
this->Show();
});
// Flutter can complete the first frame before the "show window" callback is
// registered. The following call ensures a frame is pending to ensure the
// window is shown. It is a no-op if the first frame hasn't completed yet.
flutter_controller_->ForceRedraw();
return true;
}

View File

@@ -45,9 +45,11 @@ std::string Utf8FromUtf16(const wchar_t* utf16_string) {
if (utf16_string == nullptr) {
return std::string();
}
int target_length = ::WideCharToMultiByte(
unsigned int target_length = ::WideCharToMultiByte(
CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
-1, nullptr, 0, nullptr, nullptr);
-1, nullptr, 0, nullptr, nullptr)
-1; // remove the trailing null character
int input_length = (int)wcslen(utf16_string);
std::string utf8_string;
if (target_length == 0 || target_length > utf8_string.max_size()) {
return utf8_string;
@@ -55,8 +57,7 @@ std::string Utf8FromUtf16(const wchar_t* utf16_string) {
utf8_string.resize(target_length);
int converted_length = ::WideCharToMultiByte(
CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
-1, utf8_string.data(),
target_length, nullptr, nullptr);
input_length, utf8_string.data(), target_length, nullptr, nullptr);
if (converted_length == 0) {
return std::string();
}

View File

@@ -0,0 +1 @@
20244c45-9009-4178-acee-660520651cd4