[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>
30
CHANGELOG.md
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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'
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 12 KiB |
BIN
assets/images/services/trakt.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 12 KiB |
82
assets/localization/en.json
Normal 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"
|
||||
}
|
||||
82
assets/localization/fr.json
Normal 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"
|
||||
}
|
||||
37
assets/localization/nb-NO.json
Normal 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"
|
||||
}
|
||||
37
assets/localization/sv.json
Normal 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"
|
||||
}
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)";
|
||||
|
||||
@@ -74,5 +74,7 @@
|
||||
</array>
|
||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||
<false/>
|
||||
<key>FirebaseCrashlyticsCollectionEnabled</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
|
||||
20
lib/core/deprecated_ui.dart
Normal 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';
|
||||
2
lib/core/deprecated_ui/button.dart
Normal file
@@ -0,0 +1,2 @@
|
||||
export 'button/button.dart';
|
||||
export 'button/button_slim.dart';
|
||||
2
lib/core/deprecated_ui/card.dart
Normal file
@@ -0,0 +1,2 @@
|
||||
export 'card/card.dart';
|
||||
export 'card/card_tile.dart';
|
||||
@@ -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
|
||||
1
lib/core/deprecated_ui/containers.dart
Normal file
@@ -0,0 +1 @@
|
||||
export 'containers/row.dart';
|
||||
@@ -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,
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
38
lib/core/deprecated_ui/network_image.dart
Normal 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,
|
||||
);
|
||||
28
lib/core/deprecated_ui/refresh_indicator.dart
Normal 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,
|
||||
);
|
||||
}
|
||||
}
|
||||
19
lib/core/deprecated_ui/shape.dart
Normal 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,
|
||||
),
|
||||
);
|
||||
90
lib/core/deprecated_ui/snackbar.dart
Normal 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,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
2
lib/core/deprecated_ui/table.dart
Normal file
@@ -0,0 +1,2 @@
|
||||
export 'table/block.dart';
|
||||
export 'table/content.dart';
|
||||
4
lib/core/deprecated_ui/text.dart
Normal file
@@ -0,0 +1,4 @@
|
||||
export 'text/header.dart';
|
||||
export 'text/text_highlighted.dart';
|
||||
export 'text/text_title.dart';
|
||||
export 'text/text_subtitle.dart';
|
||||
@@ -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';
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
export 'containers/button_container.dart';
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
export 'snackbar/snackbar.dart';
|
||||
export 'snackbar/snackbar_error.dart';
|
||||
export 'snackbar/snackbar_info.dart';
|
||||
export 'snackbar/snackbar_success.dart';
|
||||
@@ -1,2 +0,0 @@
|
||||
export 'table/table_card.dart';
|
||||
export 'table/table_content.dart';
|
||||
@@ -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,
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -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';
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
export 'state/module_state.dart';
|
||||
export 'state/state.dart';
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
17
lib/core/system/firebase/crashlytics.dart
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
81
lib/core/system/localization.dart
Normal 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);
|
||||
}
|
||||
@@ -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',
|
||||
@@ -48,15 +48,12 @@ class LunaLogger {
|
||||
exception: error,
|
||||
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.
|
||||
|
||||
@@ -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.';
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||