Commit Graph

59 Commits

Author SHA1 Message Date
Rico Berger
abd3c24f68 [core] Remove Blank in Item Preview Description (#86)
This commit removes all blank lines in the item preview description, so
that we do not render a blank line as the last line. This was done to
improve the style of the item previews, which looked ugly when the last
line was a blank line.
2023-11-29 21:47:53 +01:00
Rico Berger
04ef618295 [core] Add Right Click Support for Item Actions (#85)
Until now it was only possible to show the actions for an item by
pressing longer on the item. Now a user can also right click on the item
to display the actions which feels a bit more natural on desktop
devices.
2023-11-29 21:14:27 +01:00
Rico Berger
a58c93be8a [podcast] Stop Audio Playback on Windows and Linux (#84)
On Windows and Linux it could happen that the audio playback for a
podcast wasn't stopped when the item details view for a podcast item was
closed.

This commit "fixes" the problem, by pausing the audio player, before the
widget is disposed.

This commit also fixes the condition when the background audio services
should be initialized in the `main.dart` file. Instead of the macOS
check, we checked for iOS twice.
2023-11-29 21:06:06 +01:00
ricoberger
9233e4d373 [core] Fix 2023-11-26 20:07:18 +01:00
Rico Berger
6e50af16a7 [core] Fix build.gradle File for Android Release (#82)
The change introduced in #71 so that we can run the Android build in a
GitHub action, broke the `flutter build appbundle` command to build the
Android version for the Google Play store. This commit should fix this,
so that we can build the Android version in a GitHub Action and for
Google Play.
2023-11-26 19:40:54 +01:00
ricoberger
046479071b Prepare v1.2.0 Release 2023-11-26 17:51:09 +01:00
Rico Berger
eb606b5f6c [core] Improve Subtitle in Details View (#77)
This commit improves the displayed subtitle in the details view of an
item. For that we have adjusted the `ItemSubtitle` widget to diplay next
to the source title, author and publishing time an corresponding icon.
We also increased the space between the items and we are using a `|`
instead of a `/` as seperator.
2023-11-26 16:09:48 +01:00
Rico Berger
df927516b1 [core] Improve Icon Handling (#76)
Instead of defining the icons for a source only within the `SourceIcon`
widget, the icons are now defined as extension for the `FDSourceType`
enum. The background and foreground colors are also defined within the
enum now. This allows us to access the icon of a source outside of the
`SourceIcon` widget and we only have to touch the `source.dart` file
when adding a new source type.
2023-11-26 14:52:15 +01:00
Rico Berger
2298176c3b [pinterest] Add Support for Pinterest (#74)
This commit adds a new source type "pinterest", which can be used to
follow the post of an user or a board on Pinterest. To use the new
source type a user can select the "Pinterest" item in the add source
modal. In the form a user can provide the username or board he wants to
follow via FeedDeck.

In the corresponding Supabase function we then convert the input
provided by the user to an valid RSS feed url for Pinterest. This means
that we have to add `/feed.rss` for users and `.rss` for boards to the
Pinterest url.

Then we generate the source and items as for the other sources and reuse
the existing components to render the preview and details item. We had
to adjust the rendering logic for these items, to ignore empty values,
from which also other sources will benefit.
2023-11-25 18:04:19 +01:00
Rico Berger
db9363e7af [rss] Allow Users to Provide a Website URL (#72)
Users can now provide the URL of a website instead of the url of a RSS
feed via the input field for the RSS source.

This is possible because we are now trying to get and parse the RSS feed
for the provided url as usual, but if this operation fails, we try to
parse the text as html, so that we can check if it contains a
"<link type="application/rss+xml" href="RSS_FEED_URL">" tag. If this is
the case we are using this value to try to get and parse the RSS feed
again. If it fails again we are returning an error as before.
2023-11-24 23:11:50 +01:00
Rico Berger
ce36761c64 [core] Add GitHub Action for iOS and Android (#71)
This commit adds 2 new jobs to the existing "Continuous Delivery" GitHub
Action to test the build of the iOS and Android app.

For this we also had to adjust the "build.gradle" file for the Android
app, so that the test build in the GitHub Action is signed with dummy
credentials, since we do not provide the keystore properties.
2023-11-24 17:37:24 +01:00
Rico Berger
4e38cfdb5c [core] Update Flutter to Version 3.16.0 (#70)
Update the used Flutter version to 3.16.0 and all Flutter packages to
their latest version.

This commit also fixes all of the newly added analysis options and the
layout changes introduced with the new Flutter version (e.g. we have to
set the "tabAlignment" property in the "TabBar" widget).
2023-11-24 17:12:08 +01:00
Rico Berger
1c7c88a9ca [core] Submit "Add Source" Forms on Enter (#69)
All our forms were submitable via enter except the forms used to add a
new source to a column. This is now changed so that also these forms can
be submitted by pressing enter in a text field.
2023-11-07 23:12:46 +01:00
dependabot[bot]
c7d208de23 Bump the pub group in /app with 8 updates (#68)
* Bump the pub group in /app with 8 updates

Bumps the pub group in /app with 8 updates:

| Package | From | To |
| --- | --- | --- |
| [flutter_lints](https://github.com/flutter/packages/tree/main/packages) | `2.0.3` | `3.0.1` |
| [flutter_native_splash](https://github.com/jonbhanson/flutter_native_splash) | `2.3.3` | `2.3.5` |
| [msix](https://github.com/YehudaKremer/msix) | `3.16.4` | `3.16.6` |
| [package_info_plus](https://github.com/fluttercommunity/plus_plugins/tree/main/packages/package_info_plus) | `4.1.0` | `4.2.0` |
| [purchases_flutter](https://github.com/RevenueCat/purchases-flutter) | `6.0.0` | `6.2.0` |
| [supabase_flutter](https://github.com/supabase/supabase-flutter/tree/main/packages) | `1.10.22` | `1.10.24` |
| [timeago](https://github.com/andresaraujo/timeago.dart) | `3.5.0` | `3.6.0` |
| [url_launcher](https://github.com/flutter/packages/tree/main/packages/url_launcher) | `6.1.14` | `6.2.1` |


Updates `flutter_lints` from 2.0.3 to 3.0.1
- [Release notes](https://github.com/flutter/packages/releases)
- [Commits](https://github.com/flutter/packages/commits/pigeon-v3.0.1/packages)

Updates `flutter_native_splash` from 2.3.3 to 2.3.5
- [Release notes](https://github.com/jonbhanson/flutter_native_splash/releases)
- [Changelog](https://github.com/jonbhanson/flutter_native_splash/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jonbhanson/flutter_native_splash/commits/v2.3.5)

Updates `msix` from 3.16.4 to 3.16.6
- [Release notes](https://github.com/YehudaKremer/msix/releases)
- [Changelog](https://github.com/YehudaKremer/msix/blob/main/CHANGELOG.md)
- [Commits](https://github.com/YehudaKremer/msix/compare/v3.16.4...v3.16.6)

Updates `package_info_plus` from 4.1.0 to 4.2.0
- [Release notes](https://github.com/fluttercommunity/plus_plugins/releases)
- [Commits](https://github.com/fluttercommunity/plus_plugins/commits/package_info_plus-v4.2.0/packages/package_info_plus)

Updates `purchases_flutter` from 6.0.0 to 6.2.0
- [Release notes](https://github.com/RevenueCat/purchases-flutter/releases)
- [Changelog](https://github.com/RevenueCat/purchases-flutter/blob/main/CHANGELOG.md)
- [Commits](https://github.com/RevenueCat/purchases-flutter/compare/6.0.0...6.2.0)

Updates `supabase_flutter` from 1.10.22 to 1.10.24
- [Changelog](https://github.com/supabase/supabase-flutter/blob/main/CHANGELOG.md)
- [Commits](https://github.com/supabase/supabase-flutter/commits/supabase_flutter-v1.10.24/packages)

Updates `timeago` from 3.5.0 to 3.6.0
- [Commits](https://github.com/andresaraujo/timeago.dart/commits)

Updates `url_launcher` from 6.1.14 to 6.2.1
- [Release notes](https://github.com/flutter/packages/releases)
- [Commits](https://github.com/flutter/packages/commits/url_launcher-v6.2.1/packages/url_launcher)

---
updated-dependencies:
- dependency-name: flutter_lints
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: pub
- dependency-name: flutter_native_splash
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: pub
- dependency-name: msix
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: pub
- dependency-name: package_info_plus
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: pub
- dependency-name: purchases_flutter
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: pub
- dependency-name: supabase_flutter
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: pub
- dependency-name: timeago
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: pub
- dependency-name: url_launcher
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: pub
...

Signed-off-by: dependabot[bot] <support@github.com>

* Update Flutter Packages

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: ricoberger <mail@ricoberger.de>
2023-11-05 23:33:01 +01:00
Rico Berger
bcd03e7e60 [core] Add Custom Cache Manager (#67)
This commit adds a custom cache manager "CustomCacheManager" which is
used in the "CachedNetworkImage" widget. The custom cache manager is
required, so that we can adjust the stale periode of cached images. By
default the package used 30 days as stale periode, but for our use case
7 days should be enough and we can reduce the storage used by the app.

Note: We also fixed the "run.sh" script to work with devices where the
name contains a space.
2023-11-05 17:35:37 +01:00
Rico Berger
92bea5d715 [core] Improve Media Handling (#66)
This commit improves / simplifies the media handling within the app.
Until now we always had to provide the type of the media file (item
media / source icon) when we wanted to display it. This is now not
necessary anymore. Instead we always display the image from it's
original path when the url starts with "http://" or "https://".
Additionally we also check the platform to proxy the image request on
the web. If the image doesn't start with "http://" or "https://" we
always try to display the image from the Supabase storage.

For this we also adjusted the corresponding Deno function, so that we
check if the image starts with "http://" or "https://" before we upload
it to the Supabase storage. If this is the case we upload the source
icon to the Supabase storage. If the upload fails, we will use the
original path of the icon.

Last but not least this commit also introduces our own
"CachedNetworkImage" widget, which wraps the original
"CachedNetworkImage" widget. Our own widget will ensure that we use the
correct url for the image request, so that we do not have to use this
function all over the app anymore. Later this widget can also be used to
introduce our own cache manager.
2023-11-04 18:27:17 +01:00
Rico Berger
d62bf10eaf [github] Fix Icons in Item Preview (#64)
The icons for GitHub items were not shown, because we did not set the
correct "sourceIconType", which was required for the "ItemSource"
widget.
2023-11-04 11:48:12 +01:00
Rico Berger
3afbe5674b [core] Add Development Setup for Neovim (#63)
Add some stuff to make the development with Neovim easier:

- Add a "deno.json" file, which is required by the Deno language server,
  when working in Neovim to detect the "import_map.json" file.
- Add a "run.sh" script to easily run the Flutter app from the command
  line.
- Add the "run.sh" script and an example for Neovim to the contributing
  guide.
2023-11-04 11:47:53 +01:00
Rico Berger
6d5a699db6 [core] Add Missing Divider to Video Quality Selection (#58)
In the modal bottom sheet where a user can select the video quality the
dividers between the different qualities were missing. This commit adds
the missing divider, so that the modal bottom sheet looks similar to the
other modal bottom sheets we are using (e.g. sign out, account
settings).
2023-10-30 19:49:21 +01:00
Rico Berger
e19885a594 [core] Fix Modal Bottom Sheet Size for Images (#57)
The size of the modal bottom sheet to display images had always a max
width of 640px on large screens. This wasn't intended an the modal
bottom sheet should fill the whole screen. This is now fixed, so that
when a user clicks on an image in the details view of an item, the whole
screen is used to display the image.
2023-10-30 12:08:57 +01:00
Rico Berger
6e27eb751c [youtube] Add Desktop Support (#56)
It is now pissible to play YouTube videos on the native desktop clients.
To achieve this we removed the "youtube_player_iframe" package which was
used before to play YouTube video, but which only supported web, iOS and
Android as target platforms.

On the web we are now using our own implementation to render an iframe
with for the YouTube video.

On all other platforms we are now using the "youtube_explode_dart"
package to fetch the video urls for a YouTube video and then we display
them within our own video player (the "ItemVideoPlayer" widget which was
added in #51). We also decided to switch the package for the iOS and
Android implementation which already worked before, because we are now
able to play YouTube videos in fullscreen and we only have to maintain
an exception for the web implementation.

The "ItemVideoPlayer" widget now also supports multiple qualities of an
video via the "qualities" paramter, which allows a user to switch
between the different video qualities which are available for a YouTube
video. Last but not least the widget now uses our primary color for the
seek bar.
2023-10-29 22:48:54 +01:00
Rico Berger
e994ab6214 [core] Sign Out from Current Device (#54)
Until now a user was always signed out from all devices when he clicked
on the "Sign Out" button in the settings. Now we will display a actions
modal bottom sheet where a user can select if he wants to sign out from
the current device or from all devices.

For this we pass the [SignOutScope] to the "signOut" function of
Supabase. if the scope is "local" the user will be signed out from the
current device. If the scope is "global" the user will be signed out
from all devices.
2023-10-29 10:39:28 +01:00
Rico Berger
4906f9dc27 [core] Improve Tabs Handling in Small Deck Layout (#53)
This commit improves the handling of tabs in the samll deck layout. We
are now saving the selected tabs index in the newly added
"LayoutRepository" so that we can reuse the selected tab when a user
switches between the small and large layout. We can now also set the tab
which should be initially selected in the large layout when a user
selects a column in the navigation rail. Last but not least we can also
reset the initial tab index when a user selects a new deck in the
settings, so that we always display the first column instead of the
column with the same index as it was selected in the previous deck.
2023-10-28 17:36:01 +02:00
Rico Berger
55c6da07d9 [rss] Improve Rendering of Items (#52)
The items of an RSS feed are now rendered better, to achieve this we did
the following changes:

- Remove leading and trailing whitespaces from the item description
  which should be rendered.
- Check if the media file of an item is an SVG image. If this is the
  case we will not add it to the "media" field in the database, because
  currently the CachedNetworkImage widget can not render SVGs. If we
  want to render them, we run into serious performance issue so we skip
  them completly.
- Always assume that the content of an RSS feed contains HTML and render
  them as plain text in the preview and as markdown in the details.
  Since we also render images from the description now, we check if the
  "item.media" image should be rendered. If the description contains an
  image we do not render our own image. If the description doesn't
  contain a image we render it.
2023-10-28 11:37:00 +02:00
Rico Berger
8dc83a5d5a [mastodon] Add Support for Videos (#51)
It is now possible to play videos from toots within FeedDeck. For that
we are using the "madia_kit" package, which is already used for the
Podcast player on Windows and Linux.

The videos from a toot are saved within the "options.videos" field of an
item next to the "options.media" field. In the "ItemDetailsMastodon"
widget we are then checking if this field is present and contains a list
of video urls. These urls can then be played via the "ItemVideos"
widget.
2023-10-27 15:22:27 +02:00
ricoberger
f4a9f84061 Fix app.feeddeck.feeddeck.metainfo.xml 2023-10-22 20:28:10 +02:00
Rico Berger
f147481606 Prepare v1.1.1 Release (#40) 2023-10-22 18:06:51 +02:00
Rico Berger
ebb0b63411 [core] Improve Android App Icons (#48)
This commit improves the Android app icons, by adjusting the size of the
icons.
2023-10-22 17:56:04 +02:00
Rico Berger
8248816577 [core] Clear Cached Items (#47)
The cached items in the "ItemsRepositoryStore" are now cleared when a
user selects an active deck in the settings and when a user signes out
of the app.

This is done to force a reload of the items in a column, when a user
switches between decks. For me this works better because, when I switch
between decks I manually trigger a reload for all columns, which is now
not necessary anymore.
2023-10-22 13:29:58 +02:00
Rico Berger
db454b0ebc [core] Fix Number of Loaded Items per Fetch (#46)
We always loaded 51 items per fetch instead of 50 items, because we used
a range of 0 to 50 which includes the item at position 0 and at position
50. This is now fixed by adjusting the range to 0 to 49, so that exactly
50 items are loaded per fetch request.

This commit also improves the number of loaded items shown in the column
header. If the status of the ItemsRepository is "loaded" we add a small
"+" symbol behind the number to indicat that there are more items, which
could be loaded. If the last page was already fetched (status ==
"loadedLast") then the "+" symbol isn't shown.
2023-10-22 12:42:14 +02:00
Rico Berger
74664612fd [core] Fix ItemsRepository Status (#45)
This commit fixes the status of an ItemsRepository when the repository
is initalized from the ItemsRepositoryStore instead of the "_getItems"
function.

After the repository was initialized from the ItemsRepositoryStore we
always set the status of the repository to "loaded", also when we had
less then 50 items. Because of that we also always displayed the "Load
More" button. This is now fixed by adding the status of the repository
to the ItemsRepositoryStore, so that the "Load More" button is only
shown when there are more items to load.
2023-10-22 12:21:00 +02:00
Rico Berger
f60b8795dc [core] Fix Border Radius for Drawer (#44)
This commit fixes the border radius for the drawer used in the large
deck layout. Until now the drawer used the border radius on all edges.
This is now fixed to only use the border radius on the right side of the
drawer. This is more aligned how the border radius is used in the side
sheet for the item details, where we also only use it on the left side.
2023-10-22 11:50:00 +02:00
Rico Berger
a3ad273b5f [core] Fix Status Bar for iOS (#43)
The status bar wasn't visible on iOS when the application was launched.
This is now fixed so that a user can still see the current time, battery
life, etc. when the application is running.

This commit also updates the Podfile for iOS and macOS, which was not
done within #42, so that some dependencies were missing.
2023-10-22 11:34:24 +02:00
Rico Berger
50f1638805 [podcast] Fix Audio Player for Windows and Linux (#42)
Instead of using the "just_audio_windows" and "just_audio_mpv" packages
for Windows and Linux, we are now using "just_audio_media_kit", so that
the audio player is working reliable on these platforms.

Note: We have to adjust the Flatpak, to include the dependencies which
are required on Linux.
2023-10-20 20:09:15 +02:00
Rico Berger
cf8762560e [core] Add Privacy Policy and Terms & Conditions (#39)
This commit adds links to the privacy policy and terms & conditions to
the distributed apps as it is required for the in-app purchase
submission in the Apple App Store.

This commit also updates the terms & conditions to include a specify
section when FeedDeck is used via the Apple App Store, Google Play Store
or the Windows Store.
2023-10-18 21:19:40 +02:00
Rico Berger
f8262dbe7f [core] Enable In-App Purchases for Android (#38)
This commit enables in-app purchases for Android, so that a user can
also subscribe to FeedDeck Premium on Android.
2023-10-18 21:04:32 +02:00
Rico Berger
37b44da41f [podcast] Fix Duration and Play Button (#37)
This commit fixes two bugs within the Podcast player.

It could happen that the play time and remaining time was not shown
correctly in the player. This mainly occured in Safari and is now fixed
by not using a regular expression to show the time, but instead we have
added a new "_printDuration" function which handles the formatting of
the durations.

Not only, but mainly on Safari it could also happen, that once a Podcast
was started and then paused, the loading spinner was displayed and a
user could not continue with the Podcast. This is now fixed, by removing
the spinner and only show the play, pause or replay button. As loading
indication we are now only using the seek bar.

Last but not least this commit also improves the readability of the
code, for parsing the icon of a Podcast feed.
2023-10-18 19:06:49 +02:00
ricoberger
9693fefa81 Fix Linux Release 2023-10-16 22:14:25 +02:00
ricoberger
9ed9d732f6 Prepare v1.1.0 Release 2023-10-16 21:12:48 +02:00
Rico Berger
ef1b37995f [core] Fix Google Client ID (#35)
Fix the used Google Client ID required for the Android login. The Google
Client ID must also be changed in all the Supabase projects.
2023-10-16 20:37:37 +02:00
Rico Berger
8e1e1c0eca [core] Rework Profile Edge Function (#34)
This commit introduces a new "profile-v2" edge function and deprecates
the "profile-v1" edge function. We decided to provide a new edge
function for all profile related operation to improve the handling of
the different operation the edge function is responsible for.

The main differences to the "profile-v1" functions are:
- Pass the operation id within the request url instead of the body of
  the request.
- Move the operations for accounts (e.g. GitHub) to seperate files, to
  improve the readability of the function.
- Do not require the "sourceType" anymore, instead we are using the
  operation id and request method to determine the operation which
  should be executed
- The request body is now only used for the data of the corresponding
  account and not for any other information like the operation id and
  source information.
2023-10-14 21:20:08 +02:00
Rico Berger
88550940a3 [core] Update Flutter to v3.13.7 (#29)
Update the used Flutter version to 3.13.7 and update all Flutter
packages to their latest version.
2023-10-13 17:04:47 +02:00
Rico Berger
20aea17a55 [core] Fix Title Alignment (#28)
When we used the AppBar widget we did not specify the "centerTitle"
property, so that the title was aligned within the default of the
platform. This means on iOS and macOS the title was centered, but on
Android, Windows and Linux the title was aligned on the left side.

This wasn't intended and we want to have the same style on all
Platforms, so that the title is now centered on all Platforms like it
was already done on iOS and macOS.
2023-10-12 23:22:50 +02:00
Rico Berger
4393e3271e [core] Fix Vertical Scrolling (#27)
As reported in #25 the list of sources in a column can not be scrolled
vertically when there are a lot of sources which can not all be
displayed within the existing space.

This problem only occures when a user has no touch device or trackpad,
e.g. on Linux, Windows or the Web.

To fix this we changed the scroll behaviour in the app to allow
scrolling via drag gestures. For the reported case this means the list
of sources can be dragged to the right or left side to view all the
other sources which are hidden.
2023-10-12 21:31:29 +02:00
Rico Berger
0487dbdcde [core] Add In-App Purchases (#24)
We have to add in-app purchases for the iOS, macOS and Android store, so
that users can also get the premium features of the app without using
Stripe for payments.

The in-app purchases are only enabled when a user uses the app with the
default Supabase environment or with the Supabase environment provided
during build time. If a user uses his own Supabase instance, he will not
be able to upgrade to the premium tier via in-app purchases.

We are using RevenueCat for in-app purchases, which automatically sends
all the events for a user to the "revenuecat-webhooks-v1" edge function.
Depending on the received event we can then upgrade / downgrade the
users profile. To be able to use RevenueCat as an additional provider to
Stripe we also had to add a new "subscriptionProvider" provider column
to the "profiles" table, which stores the information via which provider
a user upgraded his account.
2023-10-12 19:53:11 +02:00
Rico Berger
58e38a0a10 [core] Add Flatpak Files to Build Archive (#23)
Instead of downloading the Flatpak files from GitHub in the
"app.feeddeck.feeddeck.yml" file, we are now adding the files to the
archive we create during the release process.
2023-10-11 18:31:29 +02:00
Rico Berger
e83b367e3f [core] Fix Update of Read State for Large List of Items (#22)
When a user scrolls through a list of items and loads more items via the
"Load More" button and then clicks on the mark all items as read button,
it could happen that the request fails, because Supabase can not handle
the update filter with a large list of item ids.

To avoid this error we are splitting the list of item ids provided in
the "updateReadStates" into chunks of 25 items for the in clause in the
update filter.
2023-10-08 20:24:39 +02:00
Rico Berger
86db47c291 [nitter] Allow Usage of Custom Nitter Instances (#19)
It is now possible to use a custom Nitter instances. This means a user
must not rely on our Nitter instance and can instead use his own
instance. To use a custom Nitter instance a user must provide the full
RSS feed url for the instance.
2023-10-03 21:51:09 +02:00
Rico Berger
f4e96e32fd [core] Add "Get Started" Guide (#16)
This commit adds a "Get Started" guide for the mobile and desktop
version of FeedDeck. The guide describes the basic concepts and settings
of the app to make it easier to get started with the FeedDeck.

This is also used for the review process in the different app stores to
make it easier to get the app approved.
2023-10-02 18:03:05 +02:00
ricoberger
f1c4ce06fb [core] Fix app.feeddeck.feeddeck.yml 2023-10-01 10:16:08 +02:00