[Release] v5.0.0 (50000011) (#343)

* [Radarr] Added very basic localization file for testing

* Added minimal LunaSea localization file

* Translations update from Weblate (#325)

* Added translation using Weblate (German)

* Translated using Weblate (German)

Currently translated at 25.0% (1 of 4 strings)

Translation: LunaSea/Radarr
Translate-URL: https://hosted.weblate.org/projects/lunasea/radarr/de/

* Added translation using Weblate (French)

* Translated using Weblate (French)

Currently translated at 25.0% (1 of 4 strings)

Translation: LunaSea/Radarr
Translate-URL: https://hosted.weblate.org/projects/lunasea/radarr/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (4 of 4 strings)

Translation: LunaSea/Radarr
Translate-URL: https://hosted.weblate.org/projects/lunasea/radarr/fr/

* Deleted translation using Weblate (German)

Co-authored-by: Jagandeep Brar <me@jagandeepbrar.io>
Co-authored-by: Antoine C <contact+weblate@antoinecardon.fr>

* [Localization] Updated keys

* [Strings] Removed internal constant LunaSea to ease localization efforts

* Added translation using Weblate (French)

* Translated using Weblate (French)

Currently translated at 100.0% (1 of 1 strings)

Translation: LunaSea/LunaSea
Translate-URL: https://hosted.weblate.org/projects/lunasea/lunasea/fr/

* [Radarr] Added additional localization strings

* [Locale/Radarr] Additional strings

* Added translation using Weblate (Norwegian Bokmål)

* Added translation using Weblate (Norwegian Bokmål)

* Translated using Weblate (French)

Currently translated at 100.0% (11 of 11 strings)

Translation: LunaSea/Radarr
Translate-URL: https://hosted.weblate.org/projects/lunasea/radarr/fr/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 100.0% (1 of 1 strings)

Translation: LunaSea/LunaSea
Translate-URL: https://hosted.weblate.org/projects/lunasea/lunasea/nb_NO/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 90.9% (10 of 11 strings)

Translation: LunaSea/Radarr
Translate-URL: https://hosted.weblate.org/projects/lunasea/radarr/nb_NO/

* Translated using Weblate (French)

Currently translated at 100.0% (11 of 11 strings)

Translation: LunaSea/Radarr
Translate-URL: https://hosted.weblate.org/projects/lunasea/radarr/fr/

* [localizations] sort keys

* [Packages] Migration to Fluttter v2 and NNBD Compatibility (#329)

* Updated packages
* Added system level Firebase Crashlytics to replace Sentry
* Started migration to crashlytics
* [Crashlytics] Adjusted dialog to reflect analytics, add crash button
* [Settings] Removed test crash tile
* [Changelog] Pull changelog version and build from application package
* Added easy_localization package
* Added stub localization handler

* [Localization] Added package and assembly script (#330)

* Updated packages
* Added system level Firebase Crashlytics to replace Sentry
* Started migration to crashlytics
* [Crashlytics] Adjusted dialog to reflect analytics, add crash button
* [Settings] Removed test crash tile
* [Changelog] Pull changelog version and build from application package
* Added easy_localization package
* Added stub localization handler
* [Localization] Added easy_localization package, added script to concat all localization files

* Removed license shield

* [Localization] Integrated system localization handling (#331)

* [Localization] use dash delimiter

* Translated using Weblate (English)

Currently translated at 100.0% (11 of 11 strings)

Translation: LunaSea/Radarr
Translate-URL: https://hosted.weblate.org/projects/lunasea/radarr/en/

* [Localization] Added ability to switch languages, updated Radarr localization (#333)

* [Scripts, Localization] Updated prepare script to print nicer JSON, add additional strings for Radarr
* Updated localizations, switch remaining Radarr strings that are available

* Translated using Weblate (French)

Currently translated at 100.0% (12 of 12 strings)

Translation: LunaSea/Radarr
Translate-URL: https://hosted.weblate.org/projects/lunasea/radarr/fr/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 100.0% (12 of 12 strings)

Translation: LunaSea/Radarr
Translate-URL: https://hosted.weblate.org/projects/lunasea/radarr/nb_NO/

* Generated new local assets

* [radarr/add_movie] Strings adapted for localizations and added to localization files

* Translated using Weblate (English)

Currently translated at 100.0% (2 of 2 strings)

Translation: LunaSea/LunaSea
Translate-URL: https://hosted.weblate.org/projects/lunasea/lunasea/en/

* [Localizations] Rebuild

* Translated using Weblate (French)

Currently translated at 100.0% (18 of 18 strings)

Translation: LunaSea/Radarr
Translate-URL: https://hosted.weblate.org/projects/lunasea/radarr/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (2 of 2 strings)

Translation: LunaSea/LunaSea
Translate-URL: https://hosted.weblate.org/projects/lunasea/lunasea/fr/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 100.0% (2 of 2 strings)

Translation: LunaSea/LunaSea
Translate-URL: https://hosted.weblate.org/projects/lunasea/lunasea/nb_NO/

* [Radarr/Add Movie] Adapted for localized strings

* [Radarr/Add Details] Adapted for localized strings

* [Radarr/Edit Movie] Adapted for localized strings

* Translated using Weblate (French)

Currently translated at 100.0% (3 of 3 strings)

Translation: LunaSea/LunaSea
Translate-URL: https://hosted.weblate.org/projects/lunasea/lunasea/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (25 of 25 strings)

Translation: LunaSea/Radarr
Translate-URL: https://hosted.weblate.org/projects/lunasea/radarr/fr/

* [Chore] Rebuilt localizations

* [Radarr/Dialogs] Updated a few dialogs to reflect localized titles

* [Localization] Ability to disable localization options internally

* [DateTime] Show "Just Now" when time difference is under 10 seconds

* [Search] Switch to new XML parsing package/engine

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 96.7% (30 of 31 strings)

Translation: LunaSea/Radarr
Translate-URL: https://hosted.weblate.org/projects/lunasea/radarr/nb_NO/

* Translated using Weblate (French)

Currently translated at 100.0% (31 of 31 strings)

Translation: LunaSea/Radarr
Translate-URL: https://hosted.weblate.org/projects/lunasea/radarr/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (4 of 4 strings)

Translation: LunaSea/LunaSea
Translate-URL: https://hosted.weblate.org/projects/lunasea/lunasea/fr/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 100.0% (4 of 4 strings)

Translation: LunaSea/LunaSea
Translate-URL: https://hosted.weblate.org/projects/lunasea/lunasea/nb_NO/

* [Localization] (chore) Rebuild localization

* [Chore] Moved localization to system folder

* Added translation using Weblate (Swedish)

* Added translation using Weblate (Swedish)

* Translated using Weblate (Swedish)

Currently translated at 100.0% (4 of 4 strings)

Translation: LunaSea/LunaSea
Translate-URL: https://hosted.weblate.org/projects/lunasea/lunasea/sv/

* Translated using Weblate (Swedish)

Currently translated at 100.0% (31 of 31 strings)

Translation: LunaSea/Radarr
Translate-URL: https://hosted.weblate.org/projects/lunasea/radarr/sv/

* [Localization] Added support for Swedish (sv)

* [Radarr/Types] Adapted all type readable strings for localization

* [Radarr] Continued work on adapting for localization

* Translated using Weblate (French)

Currently translated at 100.0% (71 of 71 strings)

Translation: LunaSea/Radarr
Translate-URL: https://hosted.weblate.org/projects/lunasea/radarr/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (9 of 9 strings)

Translation: LunaSea/LunaSea
Translate-URL: https://hosted.weblate.org/projects/lunasea/lunasea/fr/

* [Localization] (chore) Build localization

* [Chore] Cleanup, move and adapt drawer to LunaUI

* [Drawer] Cleanup drawer builder

* Translated using Weblate (English)

Currently translated at 100.0% (9 of 9 strings)

Translation: LunaSea/LunaSea
Translate-URL: https://hosted.weblate.org/projects/lunasea/lunasea/en/

* Translated using Weblate (English)

Currently translated at 100.0% (10 of 10 strings)

Translation: LunaSea/LunaSea
Translate-URL: https://hosted.weblate.org/projects/lunasea/lunasea/en/

* [UI] Move "luna_ui" to "ui", old "ui" to "deprecated_ui"

* [-arr/Add] Tags set when adding content are now stored in the database

* [-arr/Links] Added Trakt link, normalize sizes, update TMDB logo

* Add weblate link, disable additional languages on release mode, updated changelog

Co-authored-by: Weblate (bot) <hosted@weblate.org>
Co-authored-by: Antoine C <contact+weblate@antoinecardon.fr>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Patrik Hauguth <patrik.hauguth@gmail.com>
This commit is contained in:
Jagandeep Brar
2021-03-07 20:30:58 -06:00
committed by GitHub
parent 88faa812e5
commit f35c4bf571
491 changed files with 2429 additions and 1566 deletions

View File

@@ -1,5 +1,35 @@
# LunaSea Changelog
## v5.0.0 (50000011)
#### NEW
- `[Radarr/Add]` Tags set when adding a movie are now stored in the database
- `[Radarr/Overview]` Add a link to the movie's Trakt page
- `[Settings]` Added a link to the Weblate localization page
- `[Settings]` Added language switcher (currently only English, but preparing for WIP localization support)
- `[Sonarr/Add]` Tags set when adding a series are now stored in the database
- `[Sonarr/Overview]` Add a link to the series' Trakt page
#### TWEAKS
- `[Branding/TMDB]` Updated the logo to The Movie Database's new logo
- `[Logging/Tracking]` Switched from Sentry to Firebase Crashlytics
- `[Radarr/Overview]` Move the links underneath the description to more closely match the layout of the web GUI
- `[Search]` Switched to a new package to parse XML responses
- `[Settings/Tracking]` Adjusted the dialog and warn users that a reboot of the application is required to set tracking state
- `[Sonarr/Overview]` Move the links underneath the description to more closely match the layout of the web GUI
- `[DateTime]` Show "Just Now" when time differences are less than 10 seconds
#### FIXES
- `[Branding]` Normalize size of all branded logos to have the same widths for consistency
- `[Flutter]` Fully move to Flutter v2
- `[Flutter]` Upgrade many packages to NNBD
- `[Radarr/Add]` Grey screen could potentially be shown if no initial search query is passed to the route
- `[Radarr/Add]` The navigation bar could jitter on first load in some cases
- `[Radarr/Catalogue]` The search query would not stay active between profile switches
- `[Radarr/Sorting]` Changing the releases sorting/filtering method could throw an error
---
## v5.0.0 (50000010)
#### NEW

View File

@@ -51,3 +51,4 @@ LunaSea even comes with support for multiple instances of applications using pro
- [Gitbook](https://www.gitbook.com): Gitbook is used to host LunaSea's documentation
- [Hellonext](https://www.hellonext.co): Hellonext is used to host LunaSea's feedback, changelog, and roadmap
- [Weblate](https://hosted.weblate.org/engage/lunasea): Weblate is used to gather community localization for LunaSea

View File

@@ -24,6 +24,7 @@ if (flutterVersionName == null) {
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
def keystoreProperties = new Properties()

View File

@@ -13,6 +13,9 @@
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/ic_notification_background" />
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="true" />
<activity
android:name=".MainActivity"
android:launchMode="singleTop"

View File

@@ -9,6 +9,7 @@ buildscript {
classpath 'com.android.tools.build:gradle:3.6.4'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.3.3'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.2.0'
}
}

View File

@@ -1,58 +1,114 @@
{
"motd": "This build introduces deeper support for notifications/webhooks (alpha) by supporting deep linking to content and displaying images within the system notifications!\n\nThis build also adds a new button the AppBar when you are within a series/movie/artist page. The pencil/edit icon now takes you directly to the edit page, and the three vertical dots will open the menu to refresh, delete, etc.",
"version": "5.0.0",
"build": "50000010",
"motd": "This build offers some additional quality-of-life changes when adding a new series or movie, as now the tags you have set will be stored in the database! This build also now includes Trakt links on the overview for series and movies.\n\nFinally this build starts laying the groundwork to add full localization support to LunaSea. While additional languages have not yet been enabled, there is now a language option available in the settings to prepare. You can head to the Weblate page (found in Settings/Resources) to start helping localize LunaSea into your language!",
"new": [
{
"module": "Webhooks",
"module": "Radarr/\nAdd",
"changes": [
"Show series, movie, or artist cover photos in incoming system notifications"
"Tags set when adding a movie are now stored in the database"
]
},
{
"module": "Webhooks/\nRadarr",
"module": "Radarr/\nOverview",
"changes": [
"Jump directly into the content by tapping the notification"
"Add a link to the movie's Trakt page"
]
},
{
"module": "Webhooks/\nSonarr",
"module": "Settings",
"changes": [
"Jump directly into the content by tapping the notification"
"Added a link to the Weblate localization page",
"Added language switcher (currently only English, but preparing for localization support)"
]
},
{
"module": "-arr/\nDetails",
"module": "Sonarr/\nAdd",
"changes": [
"Added a button to the AppBar to jump directly into the edit page"
"Tags set when adding a series are now stored in the database"
]
},
{
"module": "Sonarr/\nOverview",
"changes": [
"Add a link to the series' Trakt page"
]
}
],
"tweaks": [
{
"module": "Radarr/\nFiles",
"module": "Branding/\nTMDB",
"changes": [
"Moved the video block above the audio block"
"Updated the logo to The Movie Database's new logo"
]
},
{
"module": "Logging/\nTracking",
"changes": [
"Switched from Sentry to Firebase Crashlytics"
]
},
{
"module": "Radarr/\nOverview",
"changes": [
"Move the links underneath the description to more closely match the layout of the web GUI"
]
},
{
"module": "Search",
"changes": [
"Switched to a new package to parse XML responses"
]
},
{
"module": "Settings/\nTracking",
"changes": [
"Adjusted the dialog and warn users that a reboot of the application is required to set tracking state"
]
},
{
"module": "Sonarr/\nOverview",
"changes": [
"Move the links underneath the description to more closely match the layout of the web GUI"
]
},
{
"module": "DateTime",
"changes": [
"Show \"Just Now\" when time differences are less than 10 seconds"
]
}
],
"fixes": [
{
"module": "AppBar/\nDropdown",
"module": "Branding",
"changes": [
"Vertical padding around title when the profile dropdown is visible was incorrect"
"Normalize size of all branded logos to have the same widths for consistency"
]
},
{
"module": "Radarr/\nDetails",
"module": "Flutter",
"changes": [
"If the movie was not found it would show an infinite loader, now shows a \"No Movies Found\" message"
"Fully move to Flutter v2",
"Upgrade many packages to NNBD"
]
},
{
"module": "Radarr/\nReleases",
"module": "Radarr/\nAdd",
"changes": [
"Changing the sorting or filter method would not scroll the list back to the top"
"Grey screen could potentially be shown if no initial search query is passed to the route",
"The navigation bar could jitter on first load in some cases"
]
},
{
"module": "Radarr/\nCatalogue",
"changes": [
"The search query would not stay active between profile switches"
]
},
{
"module": "Radarr/\nSorting",
"changes": [
"Changing the releases sorting/filtering method could throw an error"
]
}
]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,82 @@
{
"lunasea.AnErrorHasOccurred": "An Error Has Occurred",
"lunasea.ComingSoon": "Coming Soon",
"lunasea.GoBack": "Go Back",
"lunasea.ModuleIsNotEnabled": "{} Is Not Enabled",
"lunasea.Refresh": "Refresh",
"lunasea.ReturnToDashboard": "Return to Dashboard",
"lunasea.SearchTextBar": "Search…",
"lunasea.Settings": "Settings",
"lunasea.TryAgain": "Try Again",
"radarr.Age": "Age",
"radarr.All": "All",
"radarr.AddMovie": "Add Movie",
"radarr.AddMovieAndSearch": "Add + Search",
"radarr.Alphabetical": "Alphabetical",
"radarr.Approved": "Approved",
"radarr.AvailabilityUnknown": "Availability Unknown",
"radarr.AvailableIn": "Available in {}",
"radarr.AvailableToday": "Available Today",
"radarr.BackupDatabase": "Backup Database",
"radarr.CinemaDateUnknown": "Cinema Date Unknown",
"radarr.CutoffUnmet": "Cutoff Unmet",
"radarr.DateAdded": "Date Added",
"radarr.Discover": "Discover",
"radarr.DownloadFailed": "Download Failed",
"radarr.DownloadIgnored": "Download Ignored",
"radarr.EditMovie": "Edit Movie",
"radarr.FilterCatalogue": "Filter Catalogue",
"radarr.GrabbedFrom": "Grabbed from {}",
"radarr.History": "History",
"radarr.HistoryDescription": "View Recent Activity",
"radarr.InCinemasIn": "In Cinemas in {}",
"radarr.InCinemasToday": "In Cinemas Today",
"radarr.MinimumAvailability": "Minimum Availability",
"radarr.Missing": "Missing",
"radarr.Monitored": "Monitored",
"radarr.MonitoredDescription": "Monitor for new releases",
"radarr.MonitorMovie": "Monitor Movie",
"radarr.More": "More",
"radarr.Movies": "Movies",
"radarr.MovieFileDeleted": "Movie File Deleted",
"radarr.MovieFileRenamed": "Movie File Renamed",
"radarr.MovieImported": "Movie Imported ({})",
"radarr.MovieNotFound": "Movie Not Found",
"radarr.MoviePath": "Movie Path",
"radarr.NoHistoryFound": "No History Found",
"radarr.NoMoviesFound": "No Movies Found",
"radarr.NoResultsFound": "No Results Found",
"radarr.NoSummaryIsAvailable": "No summary is available.",
"radarr.QualityProfile": "Quality Profile",
"radarr.Queue": "Queue",
"radarr.QueueDescription": "View Active & Queued Content",
"radarr.RefreshMovie": "Refresh Movie",
"radarr.Rejected": "Rejected",
"radarr.Released": "Released",
"radarr.ReleasedToday": "Released Today",
"radarr.RemoveMovie": "Remove Movie",
"radarr.RootFolder": "Root Folder",
"radarr.Runtime": "Runtime",
"radarr.RunRSSSync": "Run RSS Sync",
"radarr.Search": "Search",
"radarr.SearchAllMissing": "Search All Missing",
"radarr.SearchFor": "Search for {}",
"radarr.Seeders": "Seeders",
"radarr.Size": "Size",
"radarr.SortCatalogue": "Sort Catalogue",
"radarr.Studio": "Studio",
"radarr.SystemStatus": "System Status",
"radarr.SystemStatusDescription": "System Status & Disk Space",
"radarr.Tags": "Tags",
"radarr.TagsDescription": "Manage Your Tags",
"radarr.Type": "Type",
"radarr.Unmonitored": "Unmonitored",
"radarr.UnmonitorMovie": "Unmonitor Movie",
"radarr.Upcoming": "Upcoming",
"radarr.UpdateLibrary": "Update Library",
"radarr.UpdateMovie": "Update Movie",
"radarr.ViewWebGUI": "View Web GUI",
"radarr.Wanted": "Wanted",
"radarr.Weight": "Weight",
"radarr.Year": "Year"
}

View File

@@ -0,0 +1,82 @@
{
"lunasea.AnErrorHasOccurred": "Une erreur s'est produite",
"lunasea.ComingSoon": "Prochainement",
"lunasea.GoBack": "Retour en arrière",
"lunasea.ModuleIsNotEnabled": "{} n'est pas activé",
"lunasea.Refresh": "Rafraichir",
"lunasea.ReturnToDashboard": "Retour au tableau de bord",
"lunasea.SearchTextBar": "Rechercher…",
"lunasea.Settings": "Réglages",
"lunasea.TryAgain": "Réessayer",
"radarr.AddMovie": "Ajouter un film",
"radarr.AddMovieAndSearch": "Ajouter + Rechercher",
"radarr.Age": "Âge",
"radarr.All": "Tout",
"radarr.Alphabetical": "Alphabétique",
"radarr.Approved": "Approuvé",
"radarr.AvailabilityUnknown": "Disponibilité inconnue",
"radarr.AvailableIn": "Disponible dans {}",
"radarr.AvailableToday": "Disponible aujourd'hui",
"radarr.BackupDatabase": "Sauvegarder la base de donnée",
"radarr.CinemaDateUnknown": "Date de sortie au cinéma inconnue",
"radarr.CutoffUnmet": "Qualité préférée non atteinte",
"radarr.DateAdded": "Date ajoutée",
"radarr.Discover": "Découvrir",
"radarr.DownloadFailed": "Echec du téléchargement",
"radarr.DownloadIgnored": "Télécharger Ignoré",
"radarr.EditMovie": "Modifier le film",
"radarr.FilterCatalogue": "Catalogue des filtres",
"radarr.GrabbedFrom": "Récupéré depuis {}",
"radarr.History": "Historique",
"radarr.HistoryDescription": "Voir les activités récentes",
"radarr.InCinemasIn": "Dans les cinémas en {}",
"radarr.InCinemasToday": "Au cinéma aujourd'hui",
"radarr.MinimumAvailability": "Disponibilité minimale",
"radarr.Missing": "Manquant",
"radarr.MonitorMovie": "Surveiller le film",
"radarr.Monitored": "Surveillé",
"radarr.MonitoredDescription": "Surveiller les nouvelles versions",
"radarr.More": "Plus",
"radarr.MovieFileDeleted": "Fichier vidéo supprimé",
"radarr.MovieFileRenamed": "Fichier vidéo renommé",
"radarr.MovieImported": "Film importé ({})",
"radarr.MovieNotFound": "Film non trouvé",
"radarr.MoviePath": "Chemin du film",
"radarr.Movies": "Films",
"radarr.NoHistoryFound": "Pas d'historique trouvé",
"radarr.NoMoviesFound": "Aucun film trouvé",
"radarr.NoResultsFound": "Aucun résultat",
"radarr.NoSummaryIsAvailable": "Aucun résumé n'est disponible.",
"radarr.QualityProfile": "Profil de la qualité",
"radarr.Queue": "File d'attente",
"radarr.QueueDescription": "Voir le contenu actif et en attente",
"radarr.RefreshMovie": "Rafraichir le film",
"radarr.Rejected": "Rejeté",
"radarr.Released": "Sortie",
"radarr.ReleasedToday": "Sortie aujourd'hui",
"radarr.RemoveMovie": "Supprimer le film",
"radarr.RootFolder": "Dossier racine",
"radarr.RunRSSSync": "Lancer la synchronisation RSS",
"radarr.Runtime": "Durée",
"radarr.Search": "Rechercher",
"radarr.SearchAllMissing": "Rechercher tous les manquants",
"radarr.SearchFor": "Rechercher {}",
"radarr.Seeders": "Seeders",
"radarr.Size": "Taille",
"radarr.SortCatalogue": "Trier le catalogue",
"radarr.Studio": "Studio",
"radarr.SystemStatus": "État du système",
"radarr.SystemStatusDescription": "État du système et espace disque",
"radarr.Tags": "Tags",
"radarr.TagsDescription": "Gérer vos tags",
"radarr.Type": "Type",
"radarr.UnmonitorMovie": "Ne plus surveiller le film",
"radarr.Unmonitored": "Non surveillé",
"radarr.Upcoming": "À venir",
"radarr.UpdateLibrary": "Mettre à jour la bibliothèque",
"radarr.UpdateMovie": "Mettre à jour le film",
"radarr.ViewWebGUI": "Voir l'interface web",
"radarr.Wanted": "Recherché",
"radarr.Weight": "Poids",
"radarr.Year": "Année"
}

View File

@@ -0,0 +1,37 @@
{
"lunasea.AnErrorHasOccurred": "En feil har inntruffet",
"lunasea.Refresh": "Gjenoppfrisk",
"lunasea.SearchTextBar": "Søk …",
"lunasea.Settings": "Innstillinger",
"radarr.AddMovie": "Legg til film",
"radarr.AddMovieAndSearch": "Legg til + søk",
"radarr.Discover": "Oppdag",
"radarr.EditMovie": "Rediger fil",
"radarr.FilterCatalogue": "Filtrer katalog",
"radarr.History": "Historikk",
"radarr.HistoryDescription": "Vis nylig historikk",
"radarr.MinimumAvailability": "Minimumstilgjengelighet",
"radarr.Missing": "Mangler",
"radarr.Monitored": "På oppsynsliste",
"radarr.MonitoredDescription": "Hold oppsyn med nye utgivelser",
"radarr.More": "Mer",
"radarr.MovieNotFound": "Fant ikke filmen",
"radarr.MoviePath": "Filmsti",
"radarr.Movies": "Filmer",
"radarr.NoMoviesFound": "Fant ingen filmer",
"radarr.NoResultsFound": "Resultatløst",
"radarr.NoSummaryIsAvailable": "Mangler sammendrag.",
"radarr.QualityProfile": "Kvalitetsprofil",
"radarr.Queue": "Kø",
"radarr.QueueDescription": "Vis aktivt og køplassert innhold",
"radarr.RootFolder": "Rotmappe",
"radarr.Search": "Søk",
"radarr.SearchFor": "Søkk etter {}",
"radarr.SortCatalogue": "Sorter katelog",
"radarr.SystemStatus": "Systemstatus",
"radarr.SystemStatusDescription": "Systemstatus og diskplass",
"radarr.Tags": "Etiketter",
"radarr.TagsDescription": "Håndter dine etiketter",
"radarr.Upcoming": "Kommende",
"radarr.UpdateMovie": "Oppdater film"
}

View File

@@ -0,0 +1,37 @@
{
"lunasea.AnErrorHasOccurred": "Ett fel har inträffat",
"lunasea.Refresh": "Uppdatera",
"lunasea.SearchTextBar": "Sök…",
"lunasea.Settings": "Inställningar",
"radarr.AddMovie": "Lägg till Film",
"radarr.AddMovieAndSearch": "Lägg till + Sök",
"radarr.Discover": "Utforska",
"radarr.EditMovie": "Redigera Film",
"radarr.FilterCatalogue": "Filterkatalog",
"radarr.History": "Historik",
"radarr.HistoryDescription": "Visa Senaste Aktivitet",
"radarr.MinimumAvailability": "Minsta Tillgänglighet",
"radarr.Missing": "Saknas",
"radarr.Monitored": "Bevakad",
"radarr.MonitoredDescription": "Bevaka för nya utgåvor",
"radarr.More": "Mer",
"radarr.MovieNotFound": "Film Hittades Inte",
"radarr.MoviePath": "Film Sökväg",
"radarr.Movies": "Filmer",
"radarr.NoMoviesFound": "Inga Filmer Funna",
"radarr.NoResultsFound": "Inga Resultat Funna",
"radarr.NoSummaryIsAvailable": "Ingen sammanfattning finns tillgänglig.",
"radarr.QualityProfile": "Kvalitetsprofil",
"radarr.Queue": "Kö",
"radarr.QueueDescription": "Visa Aktivt & Köat Innehåll",
"radarr.RootFolder": "Rotmapp",
"radarr.Search": "Sök",
"radarr.SearchFor": "Sök efter {}",
"radarr.SortCatalogue": "Sortera Katalog",
"radarr.SystemStatus": "Systemstatus",
"radarr.SystemStatusDescription": "Systemstatus & Disk Utrymme",
"radarr.Tags": "Taggar",
"radarr.TagsDescription": "Hantera Dina Taggar",
"radarr.Upcoming": "Kommande",
"radarr.UpdateMovie": "Uppdatera Film"
}

View File

@@ -1,5 +1,5 @@
PODS:
- cloud_firestore (0.16.0-1):
- cloud_firestore (1.0.0):
- Firebase/Firestore (= 7.3.0)
- firebase_core
- Flutter
@@ -45,6 +45,9 @@ PODS:
- FirebaseAuth (~> 7.3.0)
- Firebase/CoreOnly (7.3.0):
- FirebaseCore (= 7.3.0)
- Firebase/Crashlytics (7.3.0):
- Firebase/CoreOnly
- FirebaseCrashlytics (~> 7.3.0)
- Firebase/Firestore (7.3.0):
- Firebase/CoreOnly
- FirebaseFirestore (~> 7.3.0)
@@ -54,18 +57,21 @@ PODS:
- Firebase/Storage (7.3.0):
- Firebase/CoreOnly
- FirebaseStorage (~> 7.3.0)
- firebase_auth (0.20.1):
- firebase_auth (1.0.0):
- Firebase/Auth (= 7.3.0)
- firebase_core
- Flutter
- firebase_core (0.7.0):
- firebase_core (1.0.0):
- Firebase/CoreOnly (= 7.3.0)
- Flutter
- firebase_messaging (8.0.0-dev.15):
- firebase_crashlytics (1.0.0):
- Firebase/Crashlytics (= 7.3.0)
- firebase_core
- firebase_messaging (9.0.0):
- Firebase/Messaging (= 7.3.0)
- firebase_core
- Flutter
- firebase_storage (7.0.0):
- firebase_storage (8.0.0):
- Firebase/Storage (= 7.3.0)
- firebase_core
- Flutter
@@ -78,18 +84,24 @@ PODS:
- FirebaseCoreDiagnostics (~> 7.0)
- GoogleUtilities/Environment (~> 7.0)
- GoogleUtilities/Logger (~> 7.0)
- FirebaseCoreDiagnostics (7.6.0):
- FirebaseCoreDiagnostics (7.3.0):
- GoogleDataTransport (~> 8.0)
- GoogleUtilities/Environment (~> 7.0)
- GoogleUtilities/Logger (~> 7.0)
- nanopb (~> 2.30907.0)
- nanopb (~> 2.30906.0)
- FirebaseCrashlytics (7.3.0):
- FirebaseCore (~> 7.0)
- FirebaseInstallations (~> 7.0)
- GoogleDataTransport (~> 8.0)
- nanopb (~> 2.30906.0)
- PromisesObjC (~> 1.2)
- FirebaseFirestore (7.3.0)
- FirebaseInstallations (7.6.0):
- FirebaseInstallations (7.7.0):
- FirebaseCore (~> 7.0)
- GoogleUtilities/Environment (~> 7.0)
- GoogleUtilities/UserDefaults (~> 7.0)
- PromisesObjC (~> 1.2)
- FirebaseInstanceID (7.6.0):
- FirebaseInstanceID (7.7.0):
- FirebaseCore (~> 7.0)
- FirebaseInstallations (~> 7.0)
- GoogleUtilities/Environment (~> 7.0)
@@ -105,8 +117,8 @@ PODS:
- FirebaseCore (~> 7.0)
- GTMSessionFetcher/Core (~> 1.4)
- Flutter (1.0.0)
- GoogleDataTransport (8.2.0):
- nanopb (~> 2.30907.0)
- GoogleDataTransport (8.1.0):
- nanopb (~> 2.30906.0)
- GoogleUtilities/AppDelegateSwizzler (7.2.2):
- GoogleUtilities/Environment
- GoogleUtilities/Logger
@@ -127,19 +139,17 @@ PODS:
- GTMSessionFetcher/Core (1.5.0)
- in_app_purchase (0.0.1):
- Flutter
- nanopb (2.30907.0):
- nanopb/decode (= 2.30907.0)
- nanopb/encode (= 2.30907.0)
- nanopb/decode (2.30907.0)
- nanopb/encode (2.30907.0)
- nanopb (2.30906.0):
- nanopb/decode (= 2.30906.0)
- nanopb/encode (= 2.30906.0)
- nanopb/decode (2.30906.0)
- nanopb/encode (2.30906.0)
- network_info_plus (0.0.1):
- Flutter
- package_info (0.0.1):
- Flutter
- path_provider (0.0.1):
- Flutter
- "permission_handler (5.1.0+2)":
- Flutter
- PromisesObjC (1.2.12)
- quick_actions (0.0.1):
- Flutter
@@ -147,14 +157,10 @@ PODS:
- SDWebImage (5.10.4):
- SDWebImage/Core (= 5.10.4)
- SDWebImage/Core (5.10.4)
- Sentry (6.1.4):
- Sentry/Core (= 6.1.4)
- Sentry/Core (6.1.4)
- sentry_flutter (0.0.1):
- Flutter
- Sentry (~> 6.1.4)
- share_plus (0.0.1):
- Flutter
- shared_preferences (0.0.1):
- Flutter
- SwiftyGif (5.4.0)
- url_launcher (0.0.1):
- Flutter
@@ -166,6 +172,7 @@ DEPENDENCIES:
- Firebase/Messaging
- firebase_auth (from `.symlinks/plugins/firebase_auth/ios`)
- firebase_core (from `.symlinks/plugins/firebase_core/ios`)
- firebase_crashlytics (from `.symlinks/plugins/firebase_crashlytics/ios`)
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
- firebase_storage (from `.symlinks/plugins/firebase_storage/ios`)
- FirebaseFirestore (from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `7.3.0`)
@@ -174,10 +181,9 @@ DEPENDENCIES:
- network_info_plus (from `.symlinks/plugins/network_info_plus/ios`)
- package_info (from `.symlinks/plugins/package_info/ios`)
- path_provider (from `.symlinks/plugins/path_provider/ios`)
- permission_handler (from `.symlinks/plugins/permission_handler/ios`)
- quick_actions (from `.symlinks/plugins/quick_actions/ios`)
- sentry_flutter (from `.symlinks/plugins/sentry_flutter/ios`)
- share_plus (from `.symlinks/plugins/share_plus/ios`)
- shared_preferences (from `.symlinks/plugins/shared_preferences/ios`)
- url_launcher (from `.symlinks/plugins/url_launcher/ios`)
SPEC REPOS:
@@ -188,6 +194,7 @@ SPEC REPOS:
- FirebaseAuth
- FirebaseCore
- FirebaseCoreDiagnostics
- FirebaseCrashlytics
- FirebaseInstallations
- FirebaseInstanceID
- FirebaseMessaging
@@ -199,7 +206,6 @@ SPEC REPOS:
- PromisesObjC
- Reachability
- SDWebImage
- Sentry
- SwiftyGif
EXTERNAL SOURCES:
@@ -213,6 +219,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/firebase_auth/ios"
firebase_core:
:path: ".symlinks/plugins/firebase_core/ios"
firebase_crashlytics:
:path: ".symlinks/plugins/firebase_crashlytics/ios"
firebase_messaging:
:path: ".symlinks/plugins/firebase_messaging/ios"
firebase_storage:
@@ -230,14 +238,12 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/package_info/ios"
path_provider:
:path: ".symlinks/plugins/path_provider/ios"
permission_handler:
:path: ".symlinks/plugins/permission_handler/ios"
quick_actions:
:path: ".symlinks/plugins/quick_actions/ios"
sentry_flutter:
:path: ".symlinks/plugins/sentry_flutter/ios"
share_plus:
:path: ".symlinks/plugins/share_plus/ios"
shared_preferences:
:path: ".symlinks/plugins/shared_preferences/ios"
url_launcher:
:path: ".symlinks/plugins/url_launcher/ios"
@@ -247,41 +253,41 @@ CHECKOUT OPTIONS:
:tag: 7.3.0
SPEC CHECKSUMS:
cloud_firestore: 357b92d4778d7715d76a393db5f89e7dcc9b7401
cloud_firestore: efd6d2bafe5147690cff2ccfbde13752a56fa281
connectivity_plus: f5e5e0b894ec1187bfab9816d6c2f034da8d46da
DKImagePickerController: b5eb7f7a388e4643264105d648d01f727110fc3d
DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179
file_picker: 3e6c3790de664ccf9b882732d9db5eaf6b8d4eb1
Firebase: 26223c695fe322633274198cb19dca8cb7e54416
firebase_auth: 7220e26fc14a501a63093edc10443de6bca0d7e8
firebase_core: 91b27774a52f41f8b58484a75edf71197ac01c59
firebase_messaging: caf0273c76e54f0a10dfe5048ac47b89e75bb78a
firebase_storage: 554b8ce9192bfe0bd35f63da42d0d1f6ae819ccc
firebase_auth: f07f3ee03813d95157ee08ce763c649c656174b5
firebase_core: f47224dd6a9b928b4cf0128b0d004ec9e47d4bf2
firebase_crashlytics: a62319db93baf2bfeca8a2384af3f29e3d62b09c
firebase_messaging: fc1811236795c2313b8339c35d31295b1cd8486f
firebase_storage: a4b292db6551a64c3697c7e67cb1df524b494bb1
FirebaseAuth: c224a0cf1afa0949bd5c7bfcf154b4f5ce8ddef2
FirebaseCore: 4d3c72622ce0e2106aaa07bb4b2935ba2c370972
FirebaseCoreDiagnostics: ee1184d51da3293335b83355aad20f537acc24cf
FirebaseCoreDiagnostics: d50e11039e5984d92c8a512be2395f13df747350
FirebaseCrashlytics: d31325312c92e2cb2f0386d589b9aa44e303d99b
FirebaseFirestore: 46e32f479aac127e742b1cf873930f7bb43e7b45
FirebaseInstallations: 6e4e77396559bc2ae0504823837ed737b1c7e47f
FirebaseInstanceID: cf243611700eddc916b093353adbd4da822cfa63
FirebaseInstallations: 42c86e7b02ff75b7f27f85833bf5dcb5f38a9774
FirebaseInstanceID: cf940324a20ac14a27ad1e931d15ac9d335526db
FirebaseMessaging: 68d1bcb14880189558a8ae57167abe0b7e417232
FirebaseStorage: 5002b1895bfe74a5ce92ad54f966e6162d0da2e5
Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c
GoogleDataTransport: 1024b1a4dfbd7a0e92cb20d7e0a6f1fb66b449a4
GoogleDataTransport: 116c84c4bdeb76be2a7a46de51244368f9794eab
GoogleUtilities: 31c5b01f978a70c6cff2afc6272b3f1921614b43
GTMSessionFetcher: b3503b20a988c4e20cc189aa798fd18220133f52
in_app_purchase: 3e2155afa9d03d4fa32d9e62d567885080ce97d6
nanopb: 59221d7f958fb711001e6a449489542d92ae113e
nanopb: 1bf24dd71191072e120b83dd02d08f3da0d65e53
network_info_plus: b78876159360f5580608c2cea620d6ceffabd0ad
package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62
path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c
permission_handler: ccb20a9fad0ee9b1314a52b70b76b473c5f8dab0
PromisesObjC: 3113f7f76903778cf4a0586bd1ab89329a0b7b97
quick_actions: 6cb2390c4dab0e737c94573c27e18d9666710720
Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96
SDWebImage: c666b97e1fa9c64b4909816a903322018f0a9c84
Sentry: 9d055e2de30a77685e86b219acf02e59b82091fc
sentry_flutter: 8b2b2e1c0101ef562106b5d272d3c0c741512c01
share_plus: 2e6276f752c279a84cd68a9fc27dfbbe2a74b072
shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d
SwiftyGif: 5d4af95df24caf1c570dbbcb32a3b8a0763bc6d7
url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef

View File

@@ -3,13 +3,11 @@
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
2A9501F70E4ADE3B795C4BD7 /* Pods_ImageNotification.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E8B58106185CA1FE7B7C6832 /* Pods_ImageNotification.framework */; };
3355779EEB7C12DC262232AF /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5A8F6AE14D184A58D8A7331 /* Pods_Runner.framework */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
@@ -19,6 +17,8 @@
9C5DBBF2257EB50400836D8D /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 9C5DBBF1257EB50400836D8D /* GoogleService-Info.plist */; };
9C7092B325E77E470056AE0B /* NotificationService.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C7092B225E77E470056AE0B /* NotificationService.m */; };
9C7092B725E77E470056AE0B /* ImageNotification.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 9C7092AF25E77E470056AE0B /* ImageNotification.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
DDC17BDC4C5044EAC4528466 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7FD90D1B5F59BF35333F5918 /* Pods_Runner.framework */; };
F9367914379E317C1CA4A461 /* Pods_ImageNotification.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F1A8C9DEAECA3D6663706E77 /* Pods_ImageNotification.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -56,13 +56,19 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
06B283DCF068808AD480D95A /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
30F261257F9F405626922227 /* Pods-ImageNotification.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.debug.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.debug.xcconfig"; sourceTree = "<group>"; };
3392DF551C1BF6D77A2B3208 /* Pods-ImageNotification.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.release.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.release.xcconfig"; sourceTree = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
688E21D2AFE08631A83E52E2 /* Pods-ImageNotification.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.profile.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.profile.xcconfig"; sourceTree = "<group>"; };
713F55F4545D00C46010F8E5 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
7EF2984A57FD1E0C98A7277A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
7FD90D1B5F59BF35333F5918 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
805E3FD8D2123AFBFB3413E4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -79,13 +85,7 @@
9C7092B125E77E470056AE0B /* NotificationService.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotificationService.h; sourceTree = "<group>"; };
9C7092B225E77E470056AE0B /* NotificationService.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotificationService.m; sourceTree = "<group>"; };
9C7092B425E77E470056AE0B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
9C9E2734C6D4DC2FF1815F04 /* Pods-ImageNotification.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.debug.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.debug.xcconfig"; sourceTree = "<group>"; };
A046209115F73D5EC348E242 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
D5A8F6AE14D184A58D8A7331 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
DBA43D9DEB26304D56B42917 /* Pods-ImageNotification.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.profile.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.profile.xcconfig"; sourceTree = "<group>"; };
E2F8912DE8B8A6F72277E96C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
E8B58106185CA1FE7B7C6832 /* Pods_ImageNotification.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ImageNotification.framework; sourceTree = BUILT_PRODUCTS_DIR; };
FAED45593175690B5B62C40E /* Pods-ImageNotification.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ImageNotification.release.xcconfig"; path = "Target Support Files/Pods-ImageNotification/Pods-ImageNotification.release.xcconfig"; sourceTree = "<group>"; };
F1A8C9DEAECA3D6663706E77 /* Pods_ImageNotification.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ImageNotification.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -94,7 +94,7 @@
buildActionMask = 2147483647;
files = (
9C2991242453FE3100B93AB2 /* StoreKit.framework in Frameworks */,
3355779EEB7C12DC262232AF /* Pods_Runner.framework in Frameworks */,
DDC17BDC4C5044EAC4528466 /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -102,7 +102,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
2A9501F70E4ADE3B795C4BD7 /* Pods_ImageNotification.framework in Frameworks */,
F9367914379E317C1CA4A461 /* Pods_ImageNotification.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -182,8 +182,8 @@
isa = PBXGroup;
children = (
9C2991232453FE3100B93AB2 /* StoreKit.framework */,
D5A8F6AE14D184A58D8A7331 /* Pods_Runner.framework */,
E8B58106185CA1FE7B7C6832 /* Pods_ImageNotification.framework */,
F1A8C9DEAECA3D6663706E77 /* Pods_ImageNotification.framework */,
7FD90D1B5F59BF35333F5918 /* Pods_Runner.framework */,
);
name = Frameworks;
sourceTree = "<group>";
@@ -191,12 +191,12 @@
F5D05D221249C73674C5DB0D /* Pods */ = {
isa = PBXGroup;
children = (
E2F8912DE8B8A6F72277E96C /* Pods-Runner.debug.xcconfig */,
7EF2984A57FD1E0C98A7277A /* Pods-Runner.release.xcconfig */,
A046209115F73D5EC348E242 /* Pods-Runner.profile.xcconfig */,
9C9E2734C6D4DC2FF1815F04 /* Pods-ImageNotification.debug.xcconfig */,
FAED45593175690B5B62C40E /* Pods-ImageNotification.release.xcconfig */,
DBA43D9DEB26304D56B42917 /* Pods-ImageNotification.profile.xcconfig */,
30F261257F9F405626922227 /* Pods-ImageNotification.debug.xcconfig */,
3392DF551C1BF6D77A2B3208 /* Pods-ImageNotification.release.xcconfig */,
688E21D2AFE08631A83E52E2 /* Pods-ImageNotification.profile.xcconfig */,
06B283DCF068808AD480D95A /* Pods-Runner.debug.xcconfig */,
713F55F4545D00C46010F8E5 /* Pods-Runner.release.xcconfig */,
805E3FD8D2123AFBFB3413E4 /* Pods-Runner.profile.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
@@ -208,16 +208,17 @@
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
A453887CF430C3DC2D462993 /* [CP] Check Pods Manifest.lock */,
C5D0533ADA1E3EA4004D7DAE /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
FB187DB152E6AC8A61142056 /* [CP] Embed Pods Frameworks */,
3BA7760032A55E21F5FE79FC /* [CP] Copy Pods Resources */,
9C7092B825E77E470056AE0B /* Embed App Extensions */,
9CF1F8FD25F2A02100D93ED1 /* Firebase Crashlytics */,
E436C3831B5DC5C13E209B54 /* [CP] Embed Pods Frameworks */,
36A81FE406DC4A67407ADCD2 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -233,7 +234,7 @@
isa = PBXNativeTarget;
buildConfigurationList = 9C7092BC25E77E470056AE0B /* Build configuration list for PBXNativeTarget "ImageNotification" */;
buildPhases = (
BBE8B4F04EBFF199FEB18CC2 /* [CP] Check Pods Manifest.lock */,
6236732558BE076D98ED487B /* [CP] Check Pods Manifest.lock */,
9C7092AB25E77E470056AE0B /* Sources */,
9C7092AC25E77E470056AE0B /* Frameworks */,
9C7092AD25E77E470056AE0B /* Resources */,
@@ -312,21 +313,7 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
3BA7760032A55E21F5FE79FC /* [CP] Copy Pods Resources */ = {
36A81FE406DC4A67407ADCD2 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -344,43 +331,21 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
showEnvVarsInLog = 0;
};
9740EEB61CF901F6004384FC /* Run Script */ = {
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Run Script";
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
A453887CF430C3DC2D462993 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
BBE8B4F04EBFF199FEB18CC2 /* [CP] Check Pods Manifest.lock */ = {
6236732558BE076D98ED487B /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -402,7 +367,63 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
FB187DB152E6AC8A61142056 /* [CP] Embed Pods Frameworks */ = {
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Run Script";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
9CF1F8FD25F2A02100D93ED1 /* Firebase Crashlytics */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)",
);
name = "Firebase Crashlytics";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "${PODS_ROOT}/FirebaseCrashlytics/run\n";
};
C5D0533ADA1E3EA4004D7DAE /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
E436C3831B5DC5C13E209B54 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -414,6 +435,7 @@
"${BUILT_PRODUCTS_DIR}/FirebaseAuth/FirebaseAuth.framework",
"${BUILT_PRODUCTS_DIR}/FirebaseCore/FirebaseCore.framework",
"${BUILT_PRODUCTS_DIR}/FirebaseCoreDiagnostics/FirebaseCoreDiagnostics.framework",
"${BUILT_PRODUCTS_DIR}/FirebaseCrashlytics/FirebaseCrashlytics.framework",
"${BUILT_PRODUCTS_DIR}/FirebaseInstallations/FirebaseInstallations.framework",
"${BUILT_PRODUCTS_DIR}/FirebaseInstanceID/FirebaseInstanceID.framework",
"${BUILT_PRODUCTS_DIR}/FirebaseMessaging/FirebaseMessaging.framework",
@@ -424,7 +446,6 @@
"${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework",
"${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework",
"${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework",
"${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework",
"${BUILT_PRODUCTS_DIR}/SwiftyGif/SwiftyGif.framework",
"${BUILT_PRODUCTS_DIR}/connectivity_plus/connectivity_plus.framework",
"${BUILT_PRODUCTS_DIR}/file_picker/file_picker.framework",
@@ -434,8 +455,8 @@
"${BUILT_PRODUCTS_DIR}/package_info/package_info.framework",
"${BUILT_PRODUCTS_DIR}/path_provider/path_provider.framework",
"${BUILT_PRODUCTS_DIR}/quick_actions/quick_actions.framework",
"${BUILT_PRODUCTS_DIR}/sentry_flutter/sentry_flutter.framework",
"${BUILT_PRODUCTS_DIR}/share_plus/share_plus.framework",
"${BUILT_PRODUCTS_DIR}/shared_preferences/shared_preferences.framework",
"${BUILT_PRODUCTS_DIR}/url_launcher/url_launcher.framework",
);
name = "[CP] Embed Pods Frameworks";
@@ -445,6 +466,7 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseAuth.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCore.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCoreDiagnostics.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseCrashlytics.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstallations.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseInstanceID.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FirebaseMessaging.framework",
@@ -455,7 +477,6 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Sentry.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyGif.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/connectivity_plus.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/file_picker.framework",
@@ -465,8 +486,8 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/package_info.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/quick_actions.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sentry_flutter.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/share_plus.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher.framework",
);
runOnlyForDeploymentPostprocessing = 0;
@@ -592,7 +613,10 @@
);
INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
@@ -706,7 +730,8 @@
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
@@ -730,7 +755,10 @@
);
INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
@@ -763,7 +791,10 @@
);
INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
@@ -794,7 +825,11 @@
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = ImageNotification/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = app.lunasea.lunasea.ImageNotification;
@@ -822,7 +857,11 @@
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = ImageNotification/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = app.lunasea.lunasea.ImageNotification;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -849,7 +888,11 @@
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = ImageNotification/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = app.lunasea.lunasea.ImageNotification;
PRODUCT_NAME = "$(TARGET_NAME)";

View File

@@ -74,5 +74,7 @@
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>FirebaseCrashlyticsCollectionEnabled</key>
<true/>
</dict>
</plist>

View File

@@ -1,8 +1,8 @@
export 'core/constants.dart';
export 'core/database.dart';
export 'core/deprecated_ui.dart';
export 'core/dialogs.dart';
export 'core/extensions.dart';
export 'core/luna_ui.dart';
export 'core/mixins.dart';
export 'core/models.dart';
export 'core/system.dart';
@@ -10,6 +10,7 @@ export 'core/ui.dart';
export 'core/utilities.dart';
export 'core/widgets.dart';
export 'dart:async';
export 'package:easy_localization/easy_localization.dart';
export 'package:flash/flash.dart';
export 'package:fluro/fluro.dart';
export 'package:hive/hive.dart';

View File

@@ -1,8 +1,6 @@
class Constants {
Constants._();
static const APPLICATION_NAME = 'LunaSea';
static const TEXT_EMDASH = '';
static const TEXT_BULLET = '';
static const TEXT_ELLIPSIS = '';
@@ -18,13 +16,14 @@ class Constants {
static const NO_SERVICES_ENABLED = '<<NO_SERVICES_ENABLED>>';
static const URL_CHANGELOG = 'https://feedback.lunasea.app/changelog';
static const URL_CRASHLYTICS = 'https://firebase.google.com/products/crashlytics';
static const URL_DISCORD = 'https://www.lunasea.app/discord';
static const URL_DOCUMENTATION = 'https://www.lunasea.app/docs';
static const URL_FEEDBACK = 'https://www.lunasea.app/feedback';
static const URL_GITHUB = 'https://www.lunasea.app/github';
static const URL_REDDIT = 'https://www.lunasea.app/reddit';
static const URL_SENTRY = 'https://sentry.io';
static const URL_TESTFLIGHT = 'https://www.lunasea.app/testflight';
static const URL_WEBLATE = 'https:/www.lunasea.app/translate';
static const URL_WEBSITE = 'https://www.lunasea.app';
static const USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Safari/605.1.15';

View File

@@ -0,0 +1,20 @@
export 'deprecated_ui/button.dart';
export 'deprecated_ui/card.dart';
export 'deprecated_ui/containers.dart';
export 'deprecated_ui/description_block.dart';
export 'deprecated_ui/dialogs.dart';
export 'deprecated_ui/divider.dart';
export 'deprecated_ui/expandable.dart';
export 'deprecated_ui/floating_action_button.dart';
export 'deprecated_ui/icon.dart';
export 'deprecated_ui/input_bar.dart';
export 'deprecated_ui/listview.dart';
export 'deprecated_ui/loader.dart';
export 'deprecated_ui/messages.dart';
export 'deprecated_ui/navigation_bar.dart';
export 'deprecated_ui/network_image.dart';
export 'deprecated_ui/refresh_indicator.dart';
export 'deprecated_ui/shape.dart';
export 'deprecated_ui/snackbar.dart';
export 'deprecated_ui/table.dart';
export 'deprecated_ui/text.dart';

View File

@@ -0,0 +1,2 @@
export 'button/button.dart';
export 'button/button_slim.dart';

View File

@@ -0,0 +1,2 @@
export 'card/card.dart';
export 'card/card_tile.dart';

View File

@@ -7,6 +7,7 @@ class LSCard extends StatelessWidget {
final bool reducedMargin;
final Color color;
final Decoration decoration;
final double height;
LSCard({
@required this.child,
@@ -14,6 +15,7 @@ class LSCard extends StatelessWidget {
this.reducedMargin = false,
this.color,
this.decoration,
this.height,
});
@override
@@ -26,6 +28,7 @@ class LSCard extends StatelessWidget {
child: Container(
child: child,
decoration: decoration,
height: height,
),
elevation: LunaUI.ELEVATION,
margin: reducedMargin

View File

@@ -0,0 +1 @@
export 'containers/row.dart';

View File

@@ -1,8 +1,9 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
class LunaDivider extends Divider {
LunaDivider() : super(
class LSDivider extends StatelessWidget {
@override
Widget build(BuildContext context) => Divider(
thickness: 1.0,
color: LunaColours.splash,
indent: 60.0,

View File

@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
class LunaTextInputBar extends StatefulWidget {
class LSTextInputBar extends StatefulWidget {
final TextEditingController controller;
final TextInputAction action;
final TextInputType keyboardType;
@@ -11,12 +11,12 @@ class LunaTextInputBar extends StatefulWidget {
final bool autofocus;
final bool obscureText;
final bool isFormField;
final void Function(String) onChanged;
final void Function(String, bool) onChanged;
final void Function(String) onSubmitted;
final String Function(String) validator;
final EdgeInsets margin;
LunaTextInputBar({
LSTextInputBar({
@required this.controller,
this.onChanged,
this.onSubmitted,
@@ -30,15 +30,13 @@ class LunaTextInputBar extends StatefulWidget {
this.autofocus = false,
this.obscureText = false,
this.isFormField = false,
}) {
assert(controller != null);
}
});
@override
State<StatefulWidget> createState() => _State();
}
class _State extends State<LunaTextInputBar> {
class _State extends State<LSTextInputBar> {
bool _isFocused = false;
@override
@@ -72,10 +70,7 @@ class _State extends State<LunaTextInputBar> {
color: LunaColours.accent,
size: 24.0,
),
onTap: widget.onChanged == null ? null : () {
widget.controller.text = '';
widget.onChanged('');
}
onTap: () => widget?.onChanged('', true),
),
opacity: !_isFocused || widget.controller.text == '' ? 0.0 : 1.0,
duration: Duration(milliseconds: 200),
@@ -103,7 +98,7 @@ class _State extends State<LunaTextInputBar> {
autocorrect: false,
keyboardType: widget.keyboardType,
validator: widget?.validator,
onChanged: widget.onChanged == null ? null : widget.onChanged,
onChanged: widget.onChanged == null ? null : (value) => widget.onChanged(value, false),
onFieldSubmitted: widget?.onSubmitted,
);
@@ -118,7 +113,7 @@ class _State extends State<LunaTextInputBar> {
obscureText: widget.obscureText,
autocorrect: false,
keyboardType: widget.keyboardType,
onChanged: widget.onChanged == null ? null : widget.onChanged,
onChanged: widget.onChanged == null ? null : (value) => widget.onChanged(value, false),
onSubmitted: widget?.onSubmitted,
);
}

View File

@@ -2,11 +2,11 @@ import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:lunasea/core.dart';
class LunaLoader extends StatelessWidget {
class LSLoader extends StatelessWidget {
final double size;
final Color color;
LunaLoader({
LSLoader({
Key key,
this.size = 25.0,
this.color,

View File

@@ -0,0 +1,38 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
// ignore: non_constant_identifier_names
Widget LSNetworkImage({
@required double height,
@required double width,
@required String url,
@required String placeholder,
Map<String, String> headers,
bool roundCorners = true,
}) => ClipRRect(
child: Container(
child: Stack(
fit: StackFit.expand,
children: <Widget>[
Image.asset(placeholder),
if(url != null) FadeInImage(
height: height,
width: width,
fadeInDuration: Duration(milliseconds: LunaUI.ANIMATION_IMAGE_FADE_IN_SPEED),
fadeOutDuration: Duration(milliseconds: 1),
placeholder: AssetImage(placeholder),
fit: BoxFit.cover,
image: NetworkImage(
url,
headers: headers,
),
),
],
),
height: height,
width: width,
),
borderRadius: roundCorners
? BorderRadius.circular(Constants.UI_BORDER_RADIUS)
: null,
);

View File

@@ -0,0 +1,28 @@
import 'package:flutter/material.dart';
class LSRefreshIndicator extends StatefulWidget {
final Widget child;
final Function onRefresh;
final GlobalKey<RefreshIndicatorState> refreshKey;
LSRefreshIndicator({
@required this.child,
@required this.onRefresh,
@required this.refreshKey,
});
@override
State<StatefulWidget> createState() => _State();
}
class _State extends State<LSRefreshIndicator> {
@override
Widget build(BuildContext context) {
return RefreshIndicator(
key: widget.refreshKey,
backgroundColor: Theme.of(context).primaryColor,
onRefresh: widget.onRefresh,
child: widget.child,
);
}
}

View File

@@ -0,0 +1,19 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
// ignore: non_constant_identifier_names
ShapeBorder LSRoundedShape({
double borderRadius = Constants.UI_BORDER_RADIUS,
}) => RoundedRectangleBorder(
borderRadius: BorderRadius.circular(borderRadius),
);
// ignore: non_constant_identifier_names
ShapeBorder LSRoundedShapeWithBorder({
double borderRadius = Constants.UI_BORDER_RADIUS,
}) => RoundedRectangleBorder(
borderRadius: BorderRadius.circular(borderRadius),
side: BorderSide(
color: Colors.white12,
),
);

View File

@@ -0,0 +1,90 @@
import 'package:flutter/material.dart';
import 'package:flash/flash.dart';
import 'package:lunasea/core.dart';
enum SNACKBAR_TYPE {
success,
failure,
info,
}
const _LEFT_PADDING = 8.0;
// ignore: non_constant_identifier_names
Future<void> LSSnackBar({
@required BuildContext context,
@required String title,
String message = LunaLogger.CHECK_LOGS_MESSAGE,
Duration duration,
SNACKBAR_TYPE type = SNACKBAR_TYPE.info,
bool showButton = false,
String buttonText = 'view',
Function buttonOnPressed,
}) async {
if(showButton) assert(buttonOnPressed != null);
Color color;
IconData icon;
switch(type) {
case SNACKBAR_TYPE.failure: color = LunaColours.red; icon = Icons.error_outline; break;
case SNACKBAR_TYPE.success: color = LunaColours.accent; icon = Icons.check_circle_outline; break;
case SNACKBAR_TYPE.info: color = LunaColours.blue; icon = Icons.info_outline; break;
}
showFlash(
context: context,
duration: duration != null
? duration
: showButton
? Duration(seconds: 4)
: Duration(seconds: 2),
builder: (context, controller) => Flash(
backgroundColor: Theme.of(context).primaryColor,
controller: controller,
style: FlashStyle.floating,
boxShadows: [BoxShadow(blurRadius: 6.0, spreadRadius: 4.0, color: Colors.black.withOpacity(0.10))],
horizontalDismissDirection: HorizontalDismissDirection.horizontal,
margin: EdgeInsets.all(8.0),
borderRadius: BorderRadius.circular(Constants.UI_BORDER_RADIUS),
borderColor: LunaDatabaseValue.THEME_AMOLED.data && LunaDatabaseValue.THEME_AMOLED_BORDER.data
? Colors.white12
: Colors.transparent,
child: FlashBar(
title: Text(
title,
style: TextStyle(
fontWeight: LunaUI.FONT_WEIGHT_BOLD,
fontSize: Constants.UI_FONT_SIZE_TITLE,
),
),
message: Text(
message,
style: TextStyle(
color: Colors.white70,
fontSize: Constants.UI_FONT_SIZE_SUBTITLE,
),
),
icon: Padding(
child: LSIconButton(
icon: icon,
color: color,
),
padding: EdgeInsets.only(left: _LEFT_PADDING),
),
primaryAction: showButton
? TextButton(
child: Text(
buttonText.toUpperCase(),
style: TextStyle(
fontWeight: LunaUI.FONT_WEIGHT_BOLD,
color: LunaColours.accent,
),
),
onPressed: () {
controller.dismiss();
buttonOnPressed();
},
)
: null,
),
),
);
}

View File

@@ -0,0 +1,2 @@
export 'table/block.dart';
export 'table/content.dart';

View File

@@ -0,0 +1,4 @@
export 'text/header.dart';
export 'text/text_highlighted.dart';
export 'text/text_title.dart';
export 'text/text_subtitle.dart';

View File

@@ -13,6 +13,7 @@ extension DateTimeExtension on DateTime {
String get lunaAge {
if(this == null) return 'Unknown';
Duration diff = DateTime.now().toLocal().difference(this);
if(diff.inSeconds < 10) return 'Just Now';
if(diff.inDays >= 1) return '${diff.inDays} ${diff.inDays == 1 ? 'Day' : 'Days'} Ago';
if(diff.inHours >= 1) return '${diff.inHours} ${diff.inHours == 1 ? 'Hour' : 'Hours'} Ago';
if(diff.inMinutes >= 1) return '${diff.inMinutes} ${diff.inMinutes == 1 ? 'Minute' : 'Minutes'} Ago';

View File

@@ -65,6 +65,12 @@ extension StringLinksExtension on String {
/// Attach this string as a series ID to TheTVDB and attempt to launch it as a URL.
Future<void> lunaOpenTheTVDB() async => await _openLink('https://www.thetvdb.com/?id=$this&tab=series');
/// Attach this string as a TVDB ID to Trakt and attempt to launch it as a URL.
Future<void> lunaOpenTraktSeries() async => await _openLink('http://trakt.tv/search/tvdb/$this?id_type=show');
/// Attach this string as a TMDB ID to Trakt and attempt to launch it as a URL.
Future<void> lunaOpenTraktMovie() async => await _openLink('https://trakt.tv/search/tmdb/$this?id_type=movie');
/// Attach this string as a series ID to TVMaze and attempt to launch it as a URL.
Future<void> lunaOpenTVMaze() async => await _openLink('https://www.tvmaze.com/shows/$this');
}

View File

@@ -1,61 +0,0 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
export 'luna_ui/appbar.dart';
export 'luna_ui/bottom_modal_sheet.dart';
export 'luna_ui/bottom_navigation_bar.dart';
export 'luna_ui/button.dart';
export 'luna_ui/card.dart';
export 'luna_ui/colors.dart';
export 'luna_ui/containers.dart';
export 'luna_ui/controllers.dart';
export 'luna_ui/decoration.dart';
export 'luna_ui/divider.dart';
export 'luna_ui/header.dart';
export 'luna_ui/highlighted_node.dart';
export 'luna_ui/icons.dart';
export 'luna_ui/input_bar.dart';
export 'luna_ui/invalid_route.dart';
export 'luna_ui/list_tile.dart';
export 'luna_ui/list_view.dart';
export 'luna_ui/loader.dart';
export 'luna_ui/message.dart';
export 'luna_ui/network_image.dart';
export 'luna_ui/popup_menu_button.dart';
export 'luna_ui/refresh_indicator.dart';
export 'luna_ui/shape.dart';
export 'luna_ui/sliver_sticky_header.dart';
export 'luna_ui/snackbar.dart';
export 'luna_ui/switch.dart';
export 'luna_ui/table.dart';
export 'luna_ui/text.dart';
export 'luna_ui/theme.dart';
class LunaUI {
// Text Constants
static const String TEXT_ARROW_LEFT = '';
static const String TEXT_ARROW_RIGHT = '';
static const String TEXT_BULLET = '';
static const String TEXT_ELLIPSIS = '';
static const String TEXT_EMDASH = '';
// Font-Related
static const double FONT_SIZE_APP_BAR = 18.0;
static const double FONT_SIZE_BUTTON = 14.0;
static const double FONT_SIZE_GRAPH_LEGEND = 10.0;
static const double FONT_SIZE_HEADER = 18.0;
static const double FONT_SIZE_HIGHLIGHTED_NODE = 12.0;
static const double FONT_SIZE_MESSAGES = 16.0;
static const double FONT_SIZE_NAVIGATION_BAR = 13.0;
static const double FONT_SIZE_SUBHEADER = 12.0;
static const double FONT_SIZE_SUBTITLE = 13.0;
static const double FONT_SIZE_TITLE = 16.0;
static const FontWeight FONT_WEIGHT_BOLD = FontWeight.w600;
// UI-Related
static const int ANIMATION_SPEED = 250;
static const int ANIMATION_IMAGE_FADE_IN_SPEED = 125;
static const double BORDER_RADIUS = 10.0;
static const double ELEVATION = 0.0;
static const EdgeInsets MARGIN_CARD = const EdgeInsets.symmetric(horizontal: 12.0, vertical: 6.0);
// Border-Related
static bool get shouldUseBorder => LunaDatabaseValue.THEME_AMOLED.data && LunaDatabaseValue.THEME_AMOLED_BORDER.data;
static ShapeBorder get shapeBorder => shouldUseBorder ? LunaShapeBorder.roundedWithBorder() : LunaShapeBorder.rounded();
}

View File

@@ -1,146 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:lunasea/core.dart';
enum _BUTTON_SIZE {
REGULAR,
SLIM,
}
class LunaButton extends StatelessWidget {
final Color textColor;
final Color backgroundColor;
final EdgeInsets margin;
final LunaLoadingState loadingState;
final Function onTap;
final Function onLongPress;
final String text;
final Widget child;
final _BUTTON_SIZE size;
LunaButton._({
Key key,
@required this.onTap,
@required this.onLongPress,
@required this.size,
@required this.text,
@required this.child,
@required this.textColor,
@required this.backgroundColor,
@required this.margin,
@required this.loadingState,
}) : super(key: key);
/// Create a standard-sized button.
factory LunaButton({
Key key,
@required Function onTap,
Function onLongPress,
String text = '',
Widget child,
Color textColor = Colors.white,
Color backgroundColor = LunaColours.accent,
EdgeInsets margin = const EdgeInsets.symmetric(horizontal: 6.0, vertical: 6.0),
LunaLoadingState loadingState = LunaLoadingState.INACTIVE,
}) {
return LunaButton._(
key: key,
onTap: onTap,
onLongPress: onLongPress,
text: text,
child: child,
textColor: textColor,
backgroundColor: backgroundColor,
margin: margin,
loadingState: loadingState,
size: _BUTTON_SIZE.REGULAR,
);
}
/// Create a slim-sized button, typically used within table blocks.
factory LunaButton.slim({
Key key,
@required Function onTap,
Function onLongPress,
String text = '',
Widget child,
Color textColor = Colors.white,
Color backgroundColor = LunaColours.accent,
EdgeInsets margin = const EdgeInsets.symmetric(horizontal: 6.0, vertical: 6.0),
LunaLoadingState loadingState = LunaLoadingState.INACTIVE,
}) {
return LunaButton._(
key: key,
onTap: onTap,
onLongPress: onLongPress,
text: text,
child: child,
textColor: textColor,
backgroundColor: backgroundColor,
margin: margin,
loadingState: loadingState,
size: _BUTTON_SIZE.SLIM,
);
}
@override
Widget build(BuildContext context) {
return Row(
children: [
Expanded(
child: Card(
child: InkWell(
child: size == _BUTTON_SIZE.REGULAR ? _regular() : _slim(),
borderRadius: BorderRadius.circular(LunaUI.BORDER_RADIUS),
onTap: () async {
HapticFeedback.lightImpact();
if(onTap != null && loadingState != LunaLoadingState.ACTIVE) onTap();
},
onLongPress: () async {
HapticFeedback.heavyImpact();
if(onLongPress != null && loadingState != LunaLoadingState.ACTIVE) onLongPress();
},
),
margin: margin,
color: backgroundColor,
elevation: LunaUI.ELEVATION,
shape: LunaUI.shapeBorder,
),
),
],
);
}
Widget _regular() {
return ListTile(title: _title());
}
Widget _slim() {
return Padding(
child: _title(),
padding: EdgeInsets.symmetric(vertical: 14.0),
);
}
Widget _title() {
if(loadingState == LunaLoadingState.ACTIVE) return LunaLoader(
color: textColor,
size: size == _BUTTON_SIZE.REGULAR ? 20.0 : 17.0,
);
if(loadingState == LunaLoadingState.ERROR) return Icon(
Icons.error,
color: textColor,
size: size == _BUTTON_SIZE.REGULAR ? 20.0 : 17.0,
);
if(child != null) return child;
return Text(
text,
style: TextStyle(
color: textColor,
fontWeight: LunaUI.FONT_WEIGHT_BOLD,
fontSize: LunaUI.FONT_SIZE_BUTTON,
),
textAlign: TextAlign.center,
);
}
}

View File

@@ -1,24 +0,0 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
class LunaCard extends Card {
LunaCard({
Key key,
@required BuildContext context,
@required Widget child,
EdgeInsets margin = LunaUI.MARGIN_CARD,
Color color,
Decoration decoration,
}) : super(
key: key,
child: Container(child: child, decoration: decoration),
margin: margin,
color: color == null ? Theme.of(context).primaryColor : color,
shape: LunaUI.shapeBorder,
elevation: LunaUI.ELEVATION,
clipBehavior: Clip.antiAlias,
) {
assert(context != null);
assert(child != null);
}
}

View File

@@ -1 +0,0 @@
export 'containers/button_container.dart';

View File

@@ -1,42 +0,0 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
class LunaNetworkImage extends ClipRRect {
LunaNetworkImage({
double height,
double width,
String url,
@required String placeholderAsset,
Map headers,
bool roundCorners = true,
}) : super(
child: Container(
child: Stack(
fit: StackFit.expand,
children: [
Image.asset(
placeholderAsset,
height: height,
width: width,
),
if(url != null && url.isNotEmpty) FadeInImage(
height: height,
width: width,
fadeInDuration: Duration(milliseconds: LunaUI.ANIMATION_IMAGE_FADE_IN_SPEED),
fadeOutDuration: Duration(milliseconds: 1),
placeholder: AssetImage(placeholderAsset),
fit: BoxFit.cover,
image: NetworkImage(url, headers: headers?.cast<String, String>()),
),
],
),
height: height,
width: width,
),
borderRadius: roundCorners ? BorderRadius.circular(LunaUI.BORDER_RADIUS) : null,
) {
// assert(height != null);
// assert(width != null);
assert(placeholderAsset != null);
}
}

View File

@@ -1,15 +0,0 @@
import 'package:flutter/material.dart';
class LunaRefreshIndicator extends RefreshIndicator {
LunaRefreshIndicator({
GlobalKey<RefreshIndicatorState> key,
@required BuildContext context,
@required Future<void> Function() onRefresh,
@required Widget child,
}) : super(
key: key,
backgroundColor: Theme.of(context).primaryColor,
onRefresh: onRefresh,
child: child,
);
}

View File

@@ -1,14 +0,0 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
class LunaShapeBorder extends RoundedRectangleBorder {
LunaShapeBorder._internal({
bool useBorder = false,
}) : super(
borderRadius: BorderRadius.circular(LunaUI.BORDER_RADIUS),
side: useBorder ? BorderSide(color: Colors.white12) : BorderSide.none,
);
factory LunaShapeBorder.rounded() => LunaShapeBorder._internal();
factory LunaShapeBorder.roundedWithBorder() => LunaShapeBorder._internal(useBorder: true);
}

View File

@@ -1,4 +0,0 @@
export 'snackbar/snackbar.dart';
export 'snackbar/snackbar_error.dart';
export 'snackbar/snackbar_info.dart';
export 'snackbar/snackbar_success.dart';

View File

@@ -1,2 +0,0 @@
export 'table/table_card.dart';
export 'table/table_content.dart';

View File

@@ -1,67 +0,0 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
class LunaText extends Text {
/// Create a new [Text] widget.
LunaText({
@required String text,
Key key,
int maxLines,
TextOverflow overflow,
bool softWrap,
TextStyle style,
TextAlign textAlign,
}) : super(
text,
key: key,
maxLines: maxLines,
overflow: overflow,
softWrap: softWrap,
style: style,
textAlign: textAlign,
);
/// Create a [LunaText] widget with the styling pre-assigned to be a LunaSea title.
factory LunaText.title({
Key key,
@required String text,
int maxLines = 1,
bool softWrap = false,
TextAlign textAlign = TextAlign.start,
Color color = Colors.white,
bool darken = false,
}) => LunaText(
text: text,
key: key,
maxLines: maxLines,
overflow: TextOverflow.fade,
softWrap: softWrap,
textAlign: textAlign,
style: TextStyle(
color: darken ? color.withOpacity(0.30) : color,
fontWeight: LunaUI.FONT_WEIGHT_BOLD,
fontSize: LunaUI.FONT_SIZE_TITLE,
),
);
/// Create a [LunaText] widget with the styling pre-assigned to be a LunaSea subtitle.
factory LunaText.subtitle({
Key key,
@required String text,
int maxLines = 1,
bool softWrap = false,
TextAlign textAlign = TextAlign.start,
Color color = Colors.white70,
bool darken = false,
}) => LunaText(
key: key,
text: text,
softWrap: softWrap,
maxLines: maxLines,
textAlign: textAlign,
style: TextStyle(
color: darken ? color.withOpacity(0.30) : color,
fontSize: LunaUI.FONT_SIZE_SUBTITLE,
),
);
}

View File

@@ -1,5 +1,5 @@
export 'models/hive_objects.dart';
export 'models/module_state.dart';
export 'models/router.dart';
export 'models/state.dart';
export 'models/types.dart';
export 'models/webhooks.dart';

View File

@@ -1,2 +0,0 @@
export 'state/module_state.dart';
export 'state/state.dart';

View File

@@ -1,8 +1,10 @@
export 'system/firebase.dart';
export 'system/image_cache.dart';
export 'system/in_app_purchases.dart';
export 'system/localization.dart';
export 'system/logger.dart';
export 'system/modules.dart';
export 'system/networking.dart';
export 'system/quick_actions.dart';
export 'system/router.dart';
export 'system/state.dart';

View File

@@ -1,5 +1,6 @@
export 'firebase/auth.dart';
export 'firebase/core.dart';
export 'firebase/crashlytics.dart';
export 'firebase/firestore.dart';
export 'firebase/messaging.dart';
export 'firebase/storage.dart';

View File

@@ -0,0 +1,17 @@
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:lunasea/core.dart';
class LunaFirebaseCrashlytics {
/// Returns an instance of [FirebaseCrashlytics].
///
/// Throws an error if [LunaFirebase.initialize] has not been called.
static FirebaseCrashlytics get instance => FirebaseCrashlytics.instance;
/// Set the enabled state of Firebase Crashlytics.
///
/// If `enabled` is supplied, use that value, else use [LunaDatabaseValue.ENABLED_SENTRY].
void setEnabledState() {
bool state = LunaDatabaseValue.ENABLED_SENTRY.data;
instance.setCrashlyticsCollectionEnabled(state);
}
}

View File

@@ -90,7 +90,7 @@ class LunaFirebaseMessaging {
if(result) {
module?.handleWebhook(message.data);
} else {
showLunaErrorSnackBar(title: 'Unknown Profile', message: '"$profile" does not exist in ${Constants.APPLICATION_NAME}');
showLunaErrorSnackBar(title: 'Unknown Profile', message: '"$profile" does not exist in LunaSea');
}
}
}

View File

@@ -0,0 +1,81 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
class LunaLocalization {
/// List of [LunaLanguage] values with all currently supported languages
List<LunaLanguage> get supportedLanguages => LunaLanguage.values.where((lang) => lang.enabled).toList();
/// Returns an iterable list of [Locale] objects containing all supported & enabled locales.
Iterable<Locale> get supportedLocales => supportedLanguages.map<Locale>((lang) => lang.locale).toList();
Locale get fallbackLocale => LunaLanguage.ENGLISH.locale;
/// Directory containing all localization files
String get fileDirectory => 'assets/localization';
/// Initialize the localization system.
Future<void> initialize() async {
await EasyLocalization.ensureInitialized();
}
}
enum LunaLanguage {
ENGLISH,
FRENCH,
NORWEGIAN_BOKMAL,
SWEDISH,
}
extension LunaLanguageExtension on LunaLanguage {
LunaLanguage fromLocale(Locale locale) {
if(locale.toLanguageTag() == LunaLanguage.ENGLISH.languageTag) return LunaLanguage.ENGLISH;
if(locale.toLanguageTag() == LunaLanguage.FRENCH.languageTag) return LunaLanguage.FRENCH;
if(locale.toLanguageTag() == LunaLanguage.NORWEGIAN_BOKMAL.languageTag) return LunaLanguage.NORWEGIAN_BOKMAL;
if(locale.toLanguageTag() == LunaLanguage.SWEDISH.languageTag) return LunaLanguage.SWEDISH;
return null;
}
bool get enabled {
switch(this) {
case LunaLanguage.ENGLISH: return true;
case LunaLanguage.FRENCH: return kDebugMode;
case LunaLanguage.NORWEGIAN_BOKMAL: return kDebugMode;
case LunaLanguage.SWEDISH: return kDebugMode;
}
throw Exception('Invalid LunaLanguage');
}
String get name {
switch(this) {
case LunaLanguage.ENGLISH: return 'English';
case LunaLanguage.FRENCH: return 'French';
case LunaLanguage.NORWEGIAN_BOKMAL: return 'Norwegian (Bokmål)';
case LunaLanguage.SWEDISH: return 'Swedish';
}
throw Exception('Invalid LunaLanguage');
}
String get languageTag {
switch(this) {
case LunaLanguage.ENGLISH: return 'en';
case LunaLanguage.FRENCH: return 'fr';
case LunaLanguage.NORWEGIAN_BOKMAL: return 'nb-NO';
case LunaLanguage.SWEDISH: return 'sv';
}
throw Exception('Invalid LunaLanguage');
}
Locale get locale {
switch(this) {
case LunaLanguage.ENGLISH: return Locale('en');
case LunaLanguage.FRENCH: return Locale('fr');
case LunaLanguage.NORWEGIAN_BOKMAL: return Locale('nb', 'NO');
case LunaLanguage.SWEDISH: return Locale('sv');
}
throw Exception('Invalid LunaLanguage');
}
Future<void> use(BuildContext context) => context.setLocale(this.locale);
}

View File

@@ -1,25 +1,24 @@
import 'dart:async';
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:f_logs/f_logs.dart' show FLog, DataLogType, FormatType, LogsConfig;
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:stack_trace/stack_trace.dart';
class LunaLogger {
static const SENTRY_DSN = 'https://511f76efcf714ecfb5ed6b26b5819bd6@o426090.ingest.sentry.io/5367513';
static const CHECK_LOGS_MESSAGE = 'Check the logs for more details';
/// Initialize the logger by setting the timestamp format and capturing errors on [FlutterError.onError].
void initialize() {
LunaFirebaseCrashlytics().setEnabledState();
LogsConfig config = FLog.getDefaultConfigurations()
..formatType = FormatType.FORMAT_SQUARE
..timestampFormat = 'MMMM dd, y - hh:mm:ss a';
FLog.applyConfigurations(config);
FlutterError.onError = (FlutterErrorDetails details, { bool forceReport = false }) async {
if (kDebugMode) FlutterError.dumpErrorToConsole(details, forceReport: forceReport);
LunaFirebaseCrashlytics.instance.recordFlutterError(details);
Zone.current.handleUncaughtError(details.exception, details.stack);
};
}
@@ -40,6 +39,7 @@ class LunaLogger {
/// Log a new error-level log.
void error(String text, dynamic error, StackTrace stack) {
if(LunaFirebaseCrashlytics.instance.isCrashlyticsCollectionEnabled) LunaFirebaseCrashlytics.instance.recordError(error, stack);
Trace _trace = stack == null ? null : Trace.from(stack);
FLog.error(
className: (_trace?.frames?.length ?? 0) >= 1 ? _trace.frames[1].uri.toString() ?? 'Unknown' : 'Unknown',
@@ -49,14 +49,11 @@ class LunaLogger {
stacktrace: stack,
dataLogType: DataLogType.DEFAULT.toString(),
);
if(!(error is DioError) && LunaDatabaseValue.ENABLED_SENTRY.data) Sentry.captureException(
error,
stackTrace: stack,
);
}
/// Log a new fatal-level log.
void fatal(dynamic error, StackTrace stack) {
if(LunaFirebaseCrashlytics.instance.isCrashlyticsCollectionEnabled) LunaFirebaseCrashlytics.instance.recordError(error, stack);
Trace _trace = stack == null ? null : Trace.from(stack);
FLog.fatal(
className: (_trace?.frames?.length ?? 0) >= 1 ? _trace.frames[1].uri.toString() ?? 'Unknown' : 'Unknown',
@@ -66,10 +63,6 @@ class LunaLogger {
stacktrace: stack,
dataLogType: DataLogType.DEFAULT.toString(),
);
if(!(error is DioError) && LunaDatabaseValue.ENABLED_SENTRY.data) Sentry.captureException(
error,
stackTrace: stack,
);
}
/// Export all logs, and return the [File] object containing the log file.

View File

@@ -184,7 +184,7 @@ extension LunaModuleExtension on LunaModule {
case LunaModule.NZBGET: return 'NZBGet is a binary downloader, which downloads files from Usenet based on information given in nzb-files.';
case LunaModule.RADARR: return 'Radarr is a movie collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new movies and will interface with clients and indexers to grab, sort, and rename them. It can also be configured to automatically upgrade the quality of existing files in the library when a better quality format becomes available.';
case LunaModule.SABNZBD: return 'SABnzbd is a multi-platform binary newsgroup downloader. The program works in the background and simplifies the downloading verifying and extracting of files from Usenet.';
case LunaModule.SEARCH: return '${Constants.APPLICATION_NAME} currently supports all indexers that support the newznab protocol, including NZBHydra2.';
case LunaModule.SEARCH: return 'LunaSea currently supports all indexers that support the newznab protocol, including NZBHydra2.';
case LunaModule.SETTINGS: return null;
case LunaModule.SONARR: return 'Sonarr is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.';
case LunaModule.TAUTULLI: return 'Tautulli is an application that you can run alongside your Plex Media Server to monitor activity and track various statistics. Most importantly, these statistics include what has been watched, who watched it, when and where they watched it, and how it was watched.';

View File

@@ -1,21 +1,62 @@
import 'package:flutter/material.dart';
import 'package:lunasea/core.dart';
export 'ui/appbar.dart';
export 'ui/bottom_modal_sheet.dart';
export 'ui/bottom_navigation_bar.dart';
export 'ui/button.dart';
export 'ui/card.dart';
export 'ui/colors.dart';
export 'ui/containers.dart';
export 'ui/description_block.dart';
export 'ui/dialogs.dart';
export 'ui/controllers.dart';
export 'ui/decoration.dart';
export 'ui/divider.dart';
export 'ui/drawer.dart';
export 'ui/expandable.dart';
export 'ui/floating_action_button.dart';
export 'ui/icon.dart';
export 'ui/header.dart';
export 'ui/highlighted_node.dart';
export 'ui/icons.dart';
export 'ui/input_bar.dart';
export 'ui/listview.dart';
export 'ui/invalid_route.dart';
export 'ui/list_tile.dart';
export 'ui/list_view.dart';
export 'ui/loader.dart';
export 'ui/messages.dart';
export 'ui/navigation_bar.dart';
export 'ui/message.dart';
export 'ui/network_image.dart';
export 'ui/popup_menu_button.dart';
export 'ui/refresh_indicator.dart';
export 'ui/shape.dart';
export 'ui/sliver_sticky_header.dart';
export 'ui/snackbar.dart';
export 'ui/switch.dart';
export 'ui/table.dart';
export 'ui/text.dart';
export 'ui/theme.dart';
class LunaUI {
// Text Constants
static const String TEXT_ARROW_LEFT = '';
static const String TEXT_ARROW_RIGHT = '';
static const String TEXT_BULLET = '';
static const String TEXT_ELLIPSIS = '';
static const String TEXT_EMDASH = '';
// Font-Related
static const double FONT_SIZE_APP_BAR = 18.0;
static const double FONT_SIZE_BUTTON = 14.0;
static const double FONT_SIZE_GRAPH_LEGEND = 10.0;
static const double FONT_SIZE_HEADER = 18.0;
static const double FONT_SIZE_HIGHLIGHTED_NODE = 12.0;
static const double FONT_SIZE_MESSAGES = 16.0;
static const double FONT_SIZE_NAVIGATION_BAR = 13.0;
static const double FONT_SIZE_SUBHEADER = 12.0;
static const double FONT_SIZE_SUBTITLE = 13.0;
static const double FONT_SIZE_TITLE = 16.0;
static const FontWeight FONT_WEIGHT_BOLD = FontWeight.w600;
// UI-Related
static const int ANIMATION_SPEED = 250;
static const int ANIMATION_IMAGE_FADE_IN_SPEED = 125;
static const double BORDER_RADIUS = 10.0;
static const double ELEVATION = 0.0;
static const EdgeInsets MARGIN_CARD = const EdgeInsets.symmetric(horizontal: 12.0, vertical: 6.0);
// Border-Related
static bool get shouldUseBorder => LunaDatabaseValue.THEME_AMOLED.data && LunaDatabaseValue.THEME_AMOLED_BORDER.data;
static ShapeBorder get shapeBorder => shouldUseBorder ? LunaShapeBorder.roundedWithBorder() : LunaShapeBorder.rounded();
}

View File

@@ -1,2 +1,146 @@
export 'button/button.dart';
export 'button/button_slim.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:lunasea/core.dart';
enum _BUTTON_SIZE {
REGULAR,
SLIM,
}
class LunaButton extends StatelessWidget {
final Color textColor;
final Color backgroundColor;
final EdgeInsets margin;
final LunaLoadingState loadingState;
final Function onTap;
final Function onLongPress;
final String text;
final Widget child;
final _BUTTON_SIZE size;
LunaButton._({
Key key,
@required this.onTap,
@required this.onLongPress,
@required this.size,
@required this.text,
@required this.child,
@required this.textColor,
@required this.backgroundColor,
@required this.margin,
@required this.loadingState,
}) : super(key: key);
/// Create a standard-sized button.
factory LunaButton({
Key key,
@required Function onTap,
Function onLongPress,
String text = '',
Widget child,
Color textColor = Colors.white,
Color backgroundColor = LunaColours.accent,
EdgeInsets margin = const EdgeInsets.symmetric(horizontal: 6.0, vertical: 6.0),
LunaLoadingState loadingState = LunaLoadingState.INACTIVE,
}) {
return LunaButton._(
key: key,
onTap: onTap,
onLongPress: onLongPress,
text: text,
child: child,
textColor: textColor,
backgroundColor: backgroundColor,
margin: margin,
loadingState: loadingState,
size: _BUTTON_SIZE.REGULAR,
);
}
/// Create a slim-sized button, typically used within table blocks.
factory LunaButton.slim({
Key key,
@required Function onTap,
Function onLongPress,
String text = '',
Widget child,
Color textColor = Colors.white,
Color backgroundColor = LunaColours.accent,
EdgeInsets margin = const EdgeInsets.symmetric(horizontal: 6.0, vertical: 6.0),
LunaLoadingState loadingState = LunaLoadingState.INACTIVE,
}) {
return LunaButton._(
key: key,
onTap: onTap,
onLongPress: onLongPress,
text: text,
child: child,
textColor: textColor,
backgroundColor: backgroundColor,
margin: margin,
loadingState: loadingState,
size: _BUTTON_SIZE.SLIM,
);
}
@override
Widget build(BuildContext context) {
return Row(
children: [
Expanded(
child: Card(
child: InkWell(
child: size == _BUTTON_SIZE.REGULAR ? _regular() : _slim(),
borderRadius: BorderRadius.circular(LunaUI.BORDER_RADIUS),
onTap: () async {
HapticFeedback.lightImpact();
if(onTap != null && loadingState != LunaLoadingState.ACTIVE) onTap();
},
onLongPress: () async {
HapticFeedback.heavyImpact();
if(onLongPress != null && loadingState != LunaLoadingState.ACTIVE) onLongPress();
},
),
margin: margin,
color: backgroundColor,
elevation: LunaUI.ELEVATION,
shape: LunaUI.shapeBorder,
),
),
],
);
}
Widget _regular() {
return ListTile(title: _title());
}
Widget _slim() {
return Padding(
child: _title(),
padding: EdgeInsets.symmetric(vertical: 14.0),
);
}
Widget _title() {
if(loadingState == LunaLoadingState.ACTIVE) return LunaLoader(
color: textColor,
size: size == _BUTTON_SIZE.REGULAR ? 20.0 : 17.0,
);
if(loadingState == LunaLoadingState.ERROR) return Icon(
Icons.error,
color: textColor,
size: size == _BUTTON_SIZE.REGULAR ? 20.0 : 17.0,
);
if(child != null) return child;
return Text(
text,
style: TextStyle(
color: textColor,
fontWeight: LunaUI.FONT_WEIGHT_BOLD,
fontSize: LunaUI.FONT_SIZE_BUTTON,
),
textAlign: TextAlign.center,
);
}
}

Some files were not shown because too many files have changed in this diff Show More