Compare commits

...

1537 Commits

Author SHA1 Message Date
c1064b1ba7 Fix browse comfortable grid 2020-05-24 16:13:52 -04:00
3a9f59b7a5 Finally a working comfortable grid 2020-05-24 15:59:44 -04:00
ccbe240846 Get Started on new Grid, only layout left 2020-05-24 15:59:44 -04:00
2c0d96917f Add multiline sources info for merged sources 2020-05-24 14:13:04 -04:00
0316cf47ed Fix merge with another crash(because of the kotlin dependency update) 2020-05-24 13:37:43 -04:00
e4c8de1145 Lint 2020-05-24 13:34:35 -04:00
9c978c608d Fix hiding the sync favorites option 2020-05-24 13:34:25 -04:00
b4a88926ed Rename EH Settings to Fork Settings 2020-05-24 13:12:51 -04:00
de593f458f Remove language from manga type detection and ignore casing for tags (#26)
* Remove language detection

* Ignore casing for tag detection

Co-authored-by: she11sh0cked <she11sh0cked@users.noreply.github.com>
2020-05-24 19:09:06 +02:00
f3c8b37928 Last few fixes for J2K Auto Migration 2020-05-23 23:30:07 -04:00
91f22c03c0 Multiple fixes for J2K auto migration 2020-05-23 23:15:42 -04:00
Jay
81ee1ce39a Batch select sources for pre migrations
Select none/all, pinned sources, enabled sources from the list

(cherry picked from commit 59c2da3f91052dfb0a292cb23ccb9d39055aadc7)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/migration/manga/design/PreMigrationController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/migration/manga/process/MigrationListController.kt
#	app/src/main/res/drawable/ic_select_all_24dp.xml
#	app/src/main/res/values/strings.xml
2020-05-23 22:51:34 -04:00
Jay
2ed54eed73 Migration updates
When searching manually, the sources used for auto migration will also be used for searching
Can now migrate to the same source if it is the only source being used for migration (for those who cant stop using kakalot)

(cherry picked from commit a3305171d64a8dc4c2fa52d3e5257f45e92f29f1)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchPresenter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/migration/SearchController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/migration/SearchPresenter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/migration/manga/process/MigrationListController.kt
2020-05-23 22:28:25 -04:00
a9ef4bef8e Small migration change 2020-05-23 22:06:22 -04:00
c9b988aca6 Remove unneded update chapter view 2020-05-23 21:55:56 -04:00
b803dbe3af Update view when chapters read status has changed 2020-05-23 21:39:05 -04:00
35ef07d720 Lint 2020-05-23 16:16:52 -04:00
4f596d68b9 Handle empty thumbnail_url when refreshing covers
(cherry picked from commit ac8f2923e5)
2020-05-23 16:05:05 -04:00
26776f8430 Tweak history card design
(cherry picked from commit e9d3b75e2b)
2020-05-23 16:04:58 -04:00
471eb36a92 Avoid replacing covers with null when updating library (sort of closes #3194)
(cherry picked from commit e6bc181e7a)
2020-05-23 16:04:50 -04:00
8b8b377c29 Group advanced settings
(cherry picked from commit a2ece82197)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt
2020-05-23 16:04:21 -04:00
d70d2cdff5 Make metadata updating optional
(cherry picked from commit 259946cf0a)
2020-05-23 15:55:56 -04:00
b0704063f2 Move categories up in library settings
(cherry picked from commit 4fdb4f14a8)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsLibraryController.kt
2020-05-23 15:53:35 -04:00
dde7254dcf Update drag icon
(cherry picked from commit 914f5e569b)
2020-05-23 15:36:20 -04:00
4edb9ed398 Fix recycled icon in source migration list when source isn't installed
(cherry picked from commit 9b4ffd1cd5)
2020-05-23 15:29:40 -04:00
9d764781c3 Update the coroutine dependency and fix issues that were causing the crash 2020-05-23 00:57:41 -04:00
f7d991ab54 Revert coroutines update because of crashes 2020-05-23 00:31:32 -04:00
59b3b7d79d Fix builder 2020-05-22 17:53:00 -04:00
354bf362c0 Lint 2020-05-22 17:50:08 -04:00
69304466a7 Add icons to extension manager so they appear in more views without manually setting them 2020-05-22 17:50:08 -04:00
6e4d4739a6 Add migrate option from manga info view (closes #1903) (doesnt actually do anything in SY)
(cherry picked from commit 035038a0b6)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt
2020-05-22 17:50:08 -04:00
e8947b3107 Dependency updates
(cherry picked from commit ed87dd89a1)

# Conflicts:
#	app/build.gradle
2020-05-22 17:50:08 -04:00
153641a249 Add explicit refresh icon asset (maybe fixes #3218)
(cherry picked from commit 3b41a78e76)
2020-05-22 17:50:08 -04:00
60706e8b8b Rename downloaded chapters (#3216)
(cherry picked from commit 0fccbbc0ca)
2020-05-22 17:50:08 -04:00
19dc859ef2 Change resume button in history to an icon
(cherry picked from commit 067627b51a)
2020-05-22 17:50:08 -04:00
06ff4444c5 Refactor history_item.xml to use ConstraintLayout
(cherry picked from commit 09816ed5b6)
2020-05-22 17:50:08 -04:00
156cfb0c74 Scroll up/down when tapping top/bottom quarters of webtoon viewer
Includes a fix from J2K: 4e45a337da

(cherry picked from commit b457cdb0c2)
2020-05-22 17:50:08 -04:00
e49a25b604 Add bottom padding to history/sources/extensions (fixes #3192)
(cherry picked from commit 5fd1dec347)
2020-05-22 17:50:08 -04:00
b34a137c07 Make library update error notification optional (closes #3200)
(cherry picked from commit 647391ef73)
2020-05-22 17:50:08 -04:00
1fb6b3775d download new chapters changes (#3193)
* download new chapters changes

* move initialFetchChapters logic into onNextChapters

* refractor download new chapter logic to be more explicit

(cherry picked from commit ed029c52ae)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersPresenter.kt
2020-05-22 17:50:08 -04:00
b1c9a204c1 Minor edits
(cherry picked from commit d4ffb09a8b)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourceController.kt
2020-05-22 17:50:08 -04:00
8435be1b1f Implemented review changes
Shorter UI text and >= date comparison instead of >

(cherry picked from commit 6ba052d2af)
2020-05-22 17:50:08 -04:00
7affb9ab63 Fix unread badges not hiding in list view
(cherry picked from commit 2fb0969c75)
2020-05-22 17:50:08 -04:00
5627ad0801 Square covers in list view (closes #3121)
(cherry picked from commit 3357e878a5)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryListHolder.kt
2020-05-22 17:50:08 -04:00
08017a0cd1 Move cover card outline clipping code from item to holder classes
(cherry picked from commit 471d5d62d5)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceGridHolder.kt
2020-05-22 17:50:08 -04:00
b6603c3425 Specify charset for ZIP chapters when using Android N+ (fixes #905)
(cherry picked from commit e810b343cf)
2020-05-22 17:50:08 -04:00
f63323feab Remove redundant helper function
(cherry picked from commit 620be2617a)
2020-05-22 17:50:08 -04:00
eea5f0ba6a Add fastscroller to migration lists
(cherry picked from commit b8ffb87f01)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/migration/MigrationController.kt
2020-05-22 17:50:08 -04:00
9f51dfad33 Sort list of sources in migration alphabetically
(cherry picked from commit 39e1e11f99)
2020-05-22 17:50:08 -04:00
c31789c112 Localize tracker not logged in error
(cherry picked from commit 5f9df78ab0)
2020-05-22 17:50:08 -04:00
86043fbb31 Warn about missing sources before restoring backup
(cherry picked from commit a00d11701f)
2020-05-22 17:50:08 -04:00
1136ec2ad4 Add fastscroller to updates and history
(cherry picked from commit 1cf74a5396)
2020-05-22 17:50:07 -04:00
7910f6e420 Minor cleanup
(cherry picked from commit 8cd27a199d)
2020-05-22 17:50:07 -04:00
a087b0bf4b Return job failure if library update actually doesn't start
(cherry picked from commit 772929b5c6)
2020-05-22 17:50:07 -04:00
d0929c1dc5 Slightly simplify AMOLED theme definition
(cherry picked from commit c4ca3606ad)
2020-05-22 17:50:07 -04:00
46500dcb32 Added missing sorting cases handling
Previous commit missed some cases resulting in errors at runtime

(cherry picked from commit 9e830f1c55)
2020-05-22 17:50:07 -04:00
f85c34b807 Added sorting by upload date
Spanish 'strings' contains the proper translation for the new feature.

(cherry picked from commit ee8c71c14a)
2020-05-22 17:50:07 -04:00
dfc3a5df42 Minor show more info button margin adjustment
(cherry picked from commit 39bd823651)
2020-05-22 17:50:07 -04:00
2b78925c68 Add Croatian to settings
(cherry picked from commit a9d16fad34)
2020-05-22 17:50:07 -04:00
eb2fedd669 Fix Chinese plurals
(cherry picked from commit 1da169319d)
2020-05-22 17:50:07 -04:00
b8b5e70151 Translations (Continuous) (#3125)
* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Polish)

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pl/

Translated using Weblate (Sardinian)

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (French)

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (French)

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (Japanese)

Currently translated at 76.2% (405 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ja/

Translated using Weblate (Turkish)

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Russian)

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Spanish)

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Kannada)

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/kn/

Translated using Weblate (Marathi)

Currently translated at 46.8% (249 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/mr/

Translated using Weblate (Finnish)

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Catalan)

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Greek)

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/el/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Dutch)

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nl/

Translated using Weblate (Dutch)

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nl/

Translated using Weblate (Indonesian)

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

Translated using Weblate (Hindi)

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (German)

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (531 of 531 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese)

Currently translated at 99.4% (525 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

Translated using Weblate (Malay)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (Turkish)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Russian)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Dutch)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nl/

Translated using Weblate (Kannada)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/kn/

Translated using Weblate (Finnish)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Hindi)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (German)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Added translation using Weblate (Spanish (Latin America))

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Romanian)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Italian)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

Translated using Weblate (Italian)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

Translated using Weblate (Italian)

Currently translated at 93.5% (494 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

Translated using Weblate (Italian)

Currently translated at 93.5% (494 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

Translated using Weblate (Hungarian)

Currently translated at 34.0% (180 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hu/

Translated using Weblate (Hungarian)

Currently translated at 30.1% (159 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hu/

Translated using Weblate (Kannada)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/kn/

Translated using Weblate (Marathi)

Currently translated at 46.5% (246 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/mr/

Translated using Weblate (Indonesian)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

Translated using Weblate (Bengali)

Currently translated at 67.9% (359 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/bn/

Translated using Weblate (Kannada)

Currently translated at 55.8% (295 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/kn/

Translated using Weblate (Sardinian)

Currently translated at 99.8% (527 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Portuguese)

Currently translated at 97.9% (517 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Indonesian)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

Translated using Weblate (Indonesian)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

Translated using Weblate (Hindi)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (French)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (Bulgarian)

Currently translated at 99.8% (527 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/bg/

Translated using Weblate (Indonesian)

Currently translated at 97.7% (516 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

Translated using Weblate (Kannada)

Currently translated at 27.6% (146 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/kn/

Translated using Weblate (Marathi)

Currently translated at 34.8% (184 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/mr/

Translated using Weblate (Swedish)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

Translated using Weblate (Swedish)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (German)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Added translation using Weblate (Kannada)

Translated using Weblate (Marathi)

Currently translated at 18.9% (100 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/mr/

Translated using Weblate (Marathi)

Currently translated at 8.5% (45 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/mr/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Greek)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/el/

Translated using Weblate (Finnish)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Catalan)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Turkish)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Russian)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Polish)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pl/

Translated using Weblate (French)

Currently translated at 99.8% (527 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (Spanish)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Romanian)

Currently translated at 100.0% (527 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Greek)

Currently translated at 100.0% (527 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/el/

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.8% (526 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.8% (526 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Finnish)

Currently translated at 100.0% (527 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.8% (526 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Malay)

Currently translated at 100.0% (527 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (Hindi)

Currently translated at 100.0% (527 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (German)

Currently translated at 100.0% (527 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Catalan)

Currently translated at 100.0% (527 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Turkish)

Currently translated at 100.0% (527 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (527 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (German)

Currently translated at 100.0% (527 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (527 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Romanian)

Currently translated at 100.0% (526 of 526 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (526 of 526 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (German)

Currently translated at 100.0% (526 of 526 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Catalan)

Currently translated at 100.0% (526 of 526 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Hindi)

Currently translated at 100.0% (526 of 526 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Dutch)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nl/

Translated using Weblate (Greek)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/el/

Translated using Weblate (Turkish)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (French)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (Finnish)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Catalan)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Swedish)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

Translated using Weblate (Malay)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (Hindi)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (German)

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (528 of 528 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (527 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Sardinian)

Currently translated at 99.8% (526 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (French)

Currently translated at 100.0% (527 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (Greek)

Currently translated at 100.0% (527 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/el/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (527 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (German)

Currently translated at 100.0% (527 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (527 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Czech)

Currently translated at 73.4% (387 of 527 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/cs/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Co-authored-by: Hosted Weblate <hosted@weblate.org>
(cherry picked from commit 2bb1eea2be)
2020-05-22 17:50:07 -04:00
8c00905c99 Move extension preferences to separate controller
(cherry picked from commit 9cb45b92e1)
2020-05-22 17:50:07 -04:00
598af5ebd5 Add lost Croatian translation (#3176)
(cherry picked from commit 4a8d5098da)
2020-05-22 17:50:07 -04:00
8adedee973 Better distinguish between obsolete and unofficial extensions
(cherry picked from commit d875d5ef74)
2020-05-22 17:50:07 -04:00
4dc2143160 Show notification with error log on update failures
(cherry picked from commit fc4e290c49)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/notification/Notifications.kt
2020-05-22 17:50:07 -04:00
aded163e0a Reword "Pager" to "Paged"
(cherry picked from commit ccc198e081)
2020-05-22 17:50:07 -04:00
11a553cbf4 Remove unused function
(cherry picked from commit 9f0ed77423)
2020-05-22 17:50:07 -04:00
a0048e9397 Avoid showing uninstalled source as last used
(cherry picked from commit bb3e616890)
2020-05-22 17:50:07 -04:00
a8a22b5803 Null check for local source cover parent dir
(cherry picked from commit 573f3a392a)
2020-05-22 17:50:07 -04:00
Jay
4122af491c Using a float on the progress on app updates
Not sure if needed but I saw some funny behavior with the progress bar

(cherry picked from commit 830a834ea6)
2020-05-22 17:50:07 -04:00
0de42b6654 Don't throw exception to stop restore job
(cherry picked from commit e4ea5d0344)
2020-05-22 17:50:07 -04:00
d7aa1144cf Copy to clipboard when long pressing tracking title (closes #3163)
(cherry picked from commit 97aed045e6)
2020-05-22 17:50:07 -04:00
855f768e29 Add version bumper (#25)
Co-authored-by: she11sh0cked <she11sh0cked@users.noreply.github.com>
2020-05-22 23:39:24 +02:00
87fbda0b29 Recommendations rewrite (#23)
* WIP Rewrite api requests to use a coroutine scope

* Use scope.async instead of scope.launch

* Use onPageReceived to async update Pager; Reimplement api select logic

* Implement seperate classes; Bug fixes

* More bug fixes

* Use timber; Add more logs

Co-authored-by: she11sh0cked <she11sh0cked@users.noreply.github.com>
2020-05-22 11:35:43 -04:00
99dd9a0750 Fix last chapter and last updated info 2020-05-21 21:38:55 -04:00
c8befdd5ea Fix manual refresh for manga, attempt to fix last chapter and last updated 2020-05-21 17:56:58 -04:00
54cf97170d Fix landscape view(jsut replaced it with a minorly edited portrait view) 2020-05-21 15:10:13 -04:00
a5aa89512a Half fixed landscape view 2020-05-21 00:57:49 -04:00
b02813f30a Fix MangaAllInOneHolder lazy vars 2020-05-21 00:57:33 -04:00
51c8430e9c Totally rewrote the all in one manga page, now is a recycler header
It works perfect, there is no lag it all
2020-05-21 00:30:09 -04:00
a846f7da47 Merge pull request #20 from Jacket-Chan/patch-1
Fixed a spelling error
2020-05-20 17:07:37 +02:00
b4e5443e56 Fixed a spelling error
:)
2020-05-19 22:44:37 -10:00
3fdfd91fff Fix the favorite button 2020-05-19 22:57:41 -04:00
e4b52c036a Lint 2020-05-19 22:01:22 -04:00
43098aa61b Added Auto Webtoon Mode 2020-05-19 22:00:58 -04:00
e4d8fea138 Lewd Filter upgrade, almost finished 2020-05-19 18:51:42 -04:00
6da22ea8b0 Fix multiple recommendation bugs (#18)
* Fix multiple recommendation bugs

* Fix typo

* Fix typings

* Remove unused import

Co-authored-by: she11sh0cked <she11sh0cked@users.noreply.github.com>
2020-05-19 18:42:17 -04:00
5e618e0134 Create PullRequestTester.yml 2020-05-19 18:27:40 -04:00
fd09f64fe6 Recommendation bug fixes (#17)
* Return an empty recommendations list instead of throwing an error

* Fix api response find for searched manga

* Fix spelling

Co-authored-by: she11sh0cked <she11sh0cked@users.noreply.github.com>
2020-05-19 16:54:59 -04:00
ef2241e0cb Fix recommendations throwing to early (#16)
* Fix recommendations throwing to early

Co-authored-by: she11sh0cked <she11sh0cked@users.noreply.github.com>
2020-05-19 16:01:48 -04:00
bcfe5af135 Fix filter button 2020-05-19 15:03:49 -04:00
a598afec43 Spelling correction 2020-05-19 13:54:03 -04:00
3c9ec48da3 Implement lewd filter (#15)
Co-authored-by: she11sh0cked <she11sh0cked@users.noreply.github.com>
2020-05-19 13:30:46 -04:00
7ce15caded Improve recommendations (#14)
* Improve anilist recommendations by matching synonyms; Some bug fixes related to anilist

* Fix formatting

* Sort myanimelist results by result.title matching search.title

* Throw an exception if the result is not the manga we searched

Co-authored-by: she11sh0cked <she11sh0cked@users.noreply.github.com>
2020-05-19 13:29:42 -04:00
7e65e0de0e fix tag detection 2020-05-19 00:19:43 -04:00
07a70d8c92 Add a crapton of detection for sources with only a certain type of manga 2020-05-18 21:39:31 -04:00
038574b107 Remove unused val 2020-05-18 20:23:56 -04:00
24067e1e97 Move new smart recommends to use new manga type detection 2020-05-18 20:19:18 -04:00
68b13c6425 Add modified J2k manga type detection 2020-05-18 20:11:09 -04:00
a9de6a123e Smart recommendations (#10)
* Pass manga through to RecommendsPager

* Implement smart recommendations

* Add null checks

* Add more anilistSmart tags

* Add fallback titles

Co-authored-by: she11sh0cked <she11sh0cked@users.noreply.github.com>
2020-05-18 20:10:54 -04:00
b0251b8177 Add support for EH Visited exported data in batch add 2020-05-18 13:00:13 -04:00
c069d75ede Fix Batch Add 2020-05-17 23:22:56 -04:00
5886cb7406 Fix all in one manga page being blank after clicking a button 2020-05-17 21:39:11 -04:00
1713dd4ea0 Made saved searches always available
Replace filtersheet with saved searches version if no filters are avalible
2020-05-17 20:52:51 -04:00
f5f7971cb5 Fix multiple bugs when fetching manga info 2020-05-17 17:11:46 -04:00
5271abbd1f Migrate the rest of the EH prefreches to Flow Prefrences 2020-05-17 17:11:46 -04:00
7d2ded5944 Implement MyAnimeList recommendations (#7)
Co-authored-by: she11sh0cked <she11sh0cked@users.noreply.github.com>
2020-05-17 15:38:38 -04:00
d2b0319d63 Added last debug features, should fix galleries that dont restore properly for the updater 2020-05-16 20:56:45 -04:00
c15f4c7fd0 Update debug functions 2020-05-16 19:44:12 -04:00
3aee05bf26 Enable new tracking features only if tracking is enabled 2020-05-16 18:37:06 -04:00
9d148a70c8 Fix filters 2020-05-16 18:01:11 -04:00
4a64bb250d Mitigate most of the lag problems, should fix all crashes(inspired by J2k code)
Add tracking button the way J2K has it, my own implementation
2020-05-16 17:53:14 -04:00
e6f5ea172a Filter tracker status (#2)
* Implement library filter for tracker status

Co-authored-by: she11sh0cked <she11sh0cked@users.noreply.github.com>
2020-05-13 20:35:01 -04:00
6a0ab3526a Implement library filter for tracked items (#1)
* Implement library filter for tracked items

* Revert formatting

* Move string 'tracked'

Co-authored-by: she11sh0cked <she11sh0cked@users.noreply.github.com>
2020-05-12 14:04:06 -04:00
fa29b914cc Multiple bug fixes and changes
- Fixed options menu

- Fixed merge with another

- Migrate to MaterialFastScroll
2020-05-11 20:10:51 -04:00
3a79f8fb50 Updated E hentai notifications to new system 2020-05-11 17:11:47 -04:00
321eb38f2d Fix Tag searching and Recommendations button 2020-05-11 17:10:29 -04:00
46dccf8a2d Lint fix 2020-05-11 16:31:19 -04:00
7f02a533fa fix regular font family name (#3154)
(cherry picked from commit 46b01c6134)
2020-05-11 16:28:28 -04:00
38d329a601 Temporarily revert concurrent manga updates
(cherry picked from commit e208fa4020)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt
2020-05-11 16:28:22 -04:00
1c0f08fc5b Cover Update Followup to Address #3139 (#3150)
* update cover logic when thumbnail url becomes null

* always clear cover on refresh even if custom cover is set

* remove concurrency changes

(cherry picked from commit 5723c184b1)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt
2020-05-11 16:08:30 -04:00
a076deeb5f Move notification logic out of LibraryUpdateService
(cherry picked from commit 530daeaa3a)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt
2020-05-11 16:05:16 -04:00
a006bc7d93 Rename EH update notifier 2020-05-11 16:03:32 -04:00
2b215524b6 Replace adapterPosition with bindingAdapterPosition in MigrationProcessHolder 2020-05-11 15:58:26 -04:00
f497e605b4 Style the recommendations buttonm 2020-05-11 15:57:40 -04:00
b09f1fff51 New All In One Manga interface, its optional and can be disabled 2020-05-11 15:33:38 -04:00
92af538b0a Fix Search error 2020-05-11 00:50:15 -04:00
f0b821b122 finish off recommendations
(cherry picked from commit 6473bcd32242abf8ba50b3ac76562ae6b931d0cd)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt
2020-05-11 00:20:51 -04:00
4c5e99142f Display recommendations from AniList
(cherry picked from commit f032667be5d2c9cfa5000ab1e166c7aaedbac701)
2020-05-11 00:05:40 -04:00
b0f39a7d0a add recommendations button to manga info
(cherry picked from commit 0d370004e6c78597957284d67f1af80881e17a49)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt
#	app/src/main/res/layout/manga_info_controller.xml
#	app/src/main/res/values/strings.xml
2020-05-11 00:05:28 -04:00
38b469755f Add simple hentai features option 2020-05-10 23:55:51 -04:00
3bfda338ef Add basic E/Ex-Hentai watched tag settings, possibly more to come 2020-05-10 22:36:52 -04:00
6e1da22353 Convert EH settings to FlowPrefrences 2020-05-10 19:22:10 -04:00
60a0303d7f Minor edits
(cherry picked from commit dd1b5c7ea7)
2020-05-10 16:26:21 -04:00
6135b4daae Animate in/out ActionToolbar
(cherry picked from commit 3cffc6890d)
2020-05-10 16:26:10 -04:00
2fe38192b4 Show date format examples, migrate to FlowPreferences
(cherry picked from commit 04d44f19f5)
2020-05-10 16:25:39 -04:00
ef3f4c2e17 Convert rotation to FlowPreference, remove some unused subscriptions code
Also remove EH lock code(was broken because of RxController changes)

(cherry picked from commit d46a742a43)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt
2020-05-10 16:25:07 -04:00
e4e069ccca Default unreadBadge setting to true (closes #3138)
(cherry picked from commit a94fd24fa9)
2020-05-10 14:27:32 -04:00
505d2e4274 Minor wording edits
(cherry picked from commit 8a4c4c346a)
2020-05-10 14:27:21 -04:00
4cdf2f468c Manga cover updates (#3101)
* cover caching overhaul

* add ui for removing custom cover

* skip some loading work

* minor cleanup

* allow refresh library metadata to refresh local manga

* rename metadata_date to cover_last_modified

* rearrange removeMangaFromLibrary

* change custom cover directory
add setting for updating cover when refreshing library

* remove toggle and explicit action for updating covers

(cherry picked from commit dc54299e24)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/data/database/DbOpenCallback.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryGridHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoPresenter.kt
2020-05-10 14:27:05 -04:00
8c7a2c4262 Add more info in tracking settings section
(cherry picked from commit 436253dd63)

# Conflicts:
#	app/src/main/res/values/strings.xml
2020-05-10 14:11:52 -04:00
156ce14dd8 Action: Remove Acknowledgement pong 2020-05-10 14:03:08 -04:00
27dc6443ec Fix broken updater 2020-05-10 01:23:41 -04:00
0a5773211d Added preview builds link 2020-05-10 01:19:31 -04:00
b3b0c39163 Fix naming of the preview repo 2020-05-10 01:12:56 -04:00
bc6b4d4be6 Test push 2020-05-10 00:52:02 -04:00
a14e5a99d9 Setup first full beta test 2020-05-10 00:29:43 -04:00
d643b947a9 Add files for new action, should allow automatic updating when finished 2020-05-10 00:20:36 -04:00
2033e82ff0 Update android-debug.yml 2020-05-09 22:16:24 -04:00
c2c872d000 Action: make the file a .apk 2020-05-09 21:44:44 -04:00
ae9377f8be Action: Should Fix uploading 2020-05-09 21:30:44 -04:00
93a84cad34 Action: Test Signed path 2 2020-05-09 21:10:40 -04:00
f9ceb92495 Action: Test this path enviorment variable 2020-05-09 21:09:42 -04:00
bfdd5c9ec3 Action: Remove something I forgot 2020-05-09 20:53:12 -04:00
d800528550 Action: Change write file and attempt to fix app signing 2020-05-09 20:52:27 -04:00
6ec656b094 Action: Change way of attempting to get the needed NDK 2020-05-09 20:30:45 -04:00
29c5da1494 Action: Only assemble release 2020-05-09 20:02:15 -04:00
0a21a9e5f0 Remove validate gson 2020-05-09 19:39:12 -04:00
d3aaa3656b Another way to add the json to the actions 2020-05-09 19:29:32 -04:00
69a8223d06 Fix formatting error in action 2020-05-09 19:18:38 -04:00
6959370087 Use another way to create the file 2020-05-09 19:17:23 -04:00
1d0937397f I think I fixed the actions this time 2020-05-09 19:00:45 -04:00
aeeafe8556 Action for some reason had ; 2020-05-09 18:52:04 -04:00
38c5163ab9 Did removing this break the action? 2020-05-09 18:51:15 -04:00
4646e4b0d9 Hopefully this time fixes it 2020-05-09 18:49:07 -04:00
e9f105c52a Hopfully fix google-services.json copying to app 2020-05-09 18:40:19 -04:00
3b225405cb Add Google-services.json to action 2020-05-09 18:28:35 -04:00
b96a870c4e Attempt to fix build errors 2020-05-09 18:09:21 -04:00
b70d70e82d Make a debug build action 2020-05-09 17:56:45 -04:00
f4d1c27cde Fix tapping manga info button and fix not showing full info when first looking at the manga 2020-05-09 13:10:45 -04:00
4195b00e48 Fix not removing the more button when global search doesnt find anything in that source 2020-05-09 13:06:59 -04:00
0a37dabf4b Release 0.9.2.7 2020-05-09 12:20:57 -04:00
2d5ac20c46 Re-Implement the more button in global search 2020-05-09 12:06:36 -04:00
700fd61f34 Update details metadata along with chapters list
(cherry picked from commit 29feee0095)
2020-05-09 11:49:28 -04:00
a0462fb480 Move DB transaction blocks to only the DB portions of restore logic
(cherry picked from commit 63f3180dff)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreService.kt
2020-05-09 11:49:15 -04:00
d9d969406e Revert Nucleus to 3.0.0
Fixes #3028
Fixes #3013
Fixes #3037

(cherry picked from commit 6b3b98cf57)
2020-05-09 11:48:15 -04:00
f19685787f Option to hide unread badges (closes #3095)
(cherry picked from commit 1442e2b53e)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
2020-05-09 11:48:01 -04:00
60caba86a5 Remove redundant DB call in library settings (closes #3128)
(cherry picked from commit 521ebf0678)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreService.kt
2020-05-09 11:43:43 -04:00
80fa7ebe6c String Formatting Fixes (#3118)
String Formatting Fixes

(cherry picked from commit a20874f6a1)
2020-05-09 11:41:45 -04:00
9096edfc92 Concurrently refresh trackers
(cherry picked from commit 40776bdc8d)
2020-05-09 11:41:32 -04:00
f30ad78a4c Do library checks from up to 5 sources concurrently
(cherry picked from commit f853158e6b)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt
2020-05-09 11:40:32 -04:00
ce0d99b78f Download from up to 5 different sources concurrently (closes #2534)
(cherry picked from commit c9035b5df9)
2020-05-09 11:36:04 -04:00
3ffb80c6f1 Concurrently download up to 5 pages at a time
(cherry picked from commit 150132f4dd)
2020-05-09 11:35:52 -04:00
4e3c407583 Replace restore completion string with plurals
(cherry picked from commit fb97ac47bc)
2020-05-09 11:35:43 -04:00
aaf9fc5d92 Translated using Weblate (Swedish) (#3124)
Translations

(cherry picked from commit 5b53b90495)
2020-05-09 11:35:09 -04:00
5043f840a2 Translated using Weblate (Swedish) (#3043)
Translations (Continuous)

(cherry picked from commit c6513d4450)
2020-05-09 11:34:51 -04:00
fac3bd1edd Show icon when chapter is bookmarked
(cherry picked from commit ce6848b3c0)
2020-05-09 11:34:38 -04:00
976cd41a87 MaterialFastScroll updates
(cherry picked from commit d86d861e4b)
2020-05-09 11:34:24 -04:00
4aeaee65c3 Use borderless buttons everywhere for consistency
(cherry picked from commit 3b45fcdb21)
2020-05-09 11:32:48 -04:00
f880a0f1a3 Do some download deletion in coroutines instead of completable
(cherry picked from commit 3d1250f2f8)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt
2020-05-09 11:32:31 -04:00
3a886e39fb Remove fdroid flavor
(cherry picked from commit eaf1ef831a)
2020-05-09 11:30:54 -04:00
005d43a3ec Minor cleanup of wakelocks, extension ID backup
(cherry picked from commit b4c7992726)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt
2020-05-09 11:30:38 -04:00
1d760f4728 Destroy action mode after actioning in chapters list (closes #3004)
(cherry picked from commit 03baa21185)
2020-05-09 11:20:53 -04:00
02e3148efe Adopt MaterialFastScroll from J2K fork
de8cb8c1b0
(cherry picked from commit 694de99a3f)
2020-05-09 11:20:42 -04:00
e9ada7e5fb Increase webtoon setting change page refresh range (closes #3088)
(cherry picked from commit 8383f4fb7b)
2020-05-09 11:20:31 -04:00
2ce01a1c86 Alternative way of reading local manga JSON file
(cherry picked from commit eb3fff6c51)
2020-05-09 11:20:21 -04:00
1af8bc95a8 Tweak about manga heading
(cherry picked from commit 4ff3f0bcba)
2020-05-09 11:20:08 -04:00
0046ed879f Convert app updater to foreground service
(cherry picked from commit 788ea052fc)
2020-05-09 11:18:23 -04:00
4f8c6455bc Fix updates/history section headers in RTL locales
(cherry picked from commit 08ba805bbd)
2020-05-09 11:18:03 -04:00
c80b8c8ce9 Refresh page on 32-bit color setting change
(cherry picked from commit dbd14c6dac)
2020-05-09 11:17:49 -04:00
5435c2fb53 Lighter weight method of rounding cover art and removed rounded covers option
(cherry picked from commit dabca5f09e)
2020-05-09 11:17:07 -04:00
88963758b1 Add specific support for dummy extensions so that read chapter history is able to be freely restored without connecting to the source 2020-05-08 21:18:29 -04:00
e4d40c7693 Made migrate and merge with another only visible if the manga is favorited 2020-05-07 22:01:14 -04:00
2f928ac034 Release 2.9.2.6 2020-05-07 15:11:50 -04:00
509d7b20b4 ReImplement history features 2020-05-07 14:50:24 -04:00
35c4d0bf4e Saved searches now work 2020-05-06 15:19:37 -04:00
5e5f2b0f1a hide 'latest' when merging sources
(cherry picked from commit 40c1967f19d0db475acd04025989ded80571565d)
2020-05-05 15:28:36 -04:00
58135c965c Release 0.9.2.5 2020-05-05 14:34:22 -04:00
5a9b84fe00 Fix issue where some sources just wouldnt work at all (examples are Dynasty and Toonily) 2020-05-05 14:28:21 -04:00
c9a10d9033 Update build.grade and lint fixes 2020-05-05 14:27:28 -04:00
730c316e89 Small brackets change, though I dont think logic will(though knowing my luck this might have been the reason) 2020-05-05 00:54:47 -04:00
29a07429df Release 0.9.2.4 2020-05-04 23:52:34 -04:00
e44616fb3c Fix bottom nav opening if opening manga from updates while in action mode
(cherry picked from commit 5977fca6b9)
2020-05-04 23:41:08 -04:00
cb6ca49607 Remove some unneeded regular tachi stuff 2020-05-04 23:40:46 -04:00
ff8b58ee62 [CI SKIP] Add dev branch deploy script configuration
(cherry picked from commit 018dbce57e)
2020-05-04 23:36:42 -04:00
b1350928ee Remove unused import 2020-05-04 23:35:16 -04:00
52641494d3 Test for saved searches (currently doesnt work) 2020-05-04 21:04:58 -04:00
9bfe4ed829 Remove unneeded backup stuff, now almost everything is from stable 2020-05-04 20:33:09 -04:00
d6f0c0837b Fix downloaded only 2020-05-04 19:20:54 -04:00
074a1bbca4 Implement logic for saved searches 2020-05-04 19:17:14 -04:00
178cd2b52d Add my github 2020-05-04 16:44:29 -04:00
e35f807218 Change source migraton icon 2020-05-04 16:17:32 -04:00
63ca5cc66b Remove dev update checker 2020-05-04 16:17:07 -04:00
6b66d4a34c Move strings to external file 2020-05-04 15:35:25 -04:00
49580a7630 Fixed All Sources in Filter list 2020-05-04 13:58:08 -04:00
0300c1057b Release 0.9.2.3 2020-05-04 02:00:42 -04:00
f5b8d3120d Fix anilist jsonnull issue
41c64b7058
(cherry picked from commit abf47deee3)
2020-05-04 01:40:11 -04:00
fd88db37f7 Bunch of crash fixes
(cherry picked from commit ce0090f0ca)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourceController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt
2020-05-04 01:39:52 -04:00
39e36f957d More extreme method for enforcing WebView availability
(cherry picked from commit 6cd34614f6)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/App.kt
2020-05-04 01:34:02 -04:00
e84c39bf7b Hitomi tag fixes(should now work for most tags) 2020-05-04 01:18:40 -04:00
5641b33bdd Add EH and similar specific tag formatting for global and local search 2020-05-04 00:53:38 -04:00
72681bef83 Fix showing hidden sources like the merged source 2020-05-04 00:16:33 -04:00
6de16125f7 Fix cutoff for new buttons if your screen is small 2020-05-04 00:15:56 -04:00
46478546a8 Implement long click global search for tags 2020-05-04 00:06:20 -04:00
d4659ffaae Fix merge with another crash 2020-05-04 00:05:44 -04:00
e192806950 Fix migration and merge buttons now showing up 2020-05-03 23:09:02 -04:00
1170334fde Fix adding a manga to library crash 2020-05-03 23:05:42 -04:00
d368064549 Possibly fix backup restores 2020-05-03 22:36:30 -04:00
ada0703d17 Remove unneeded variable 2020-05-03 21:46:43 -04:00
06d3a753ac Add manga migration and merge buttons 2020-05-03 21:24:00 -04:00
567c6ea8e7 Merging bugfix 2020-05-03 21:23:33 -04:00
bfc0868721 add built-in source icons
(cherry picked from commit f4533d9c7e0f989095bf40198dda59e58e1a6e01)
2020-05-03 19:35:53 -04:00
f5b7a8db1a Setup for install 2020-05-03 19:33:28 -04:00
bef0a44447 It Builds! 2020-05-03 18:34:46 -04:00
e9ff202851 Basic fixes 2020-05-03 15:03:07 -04:00
4a3323f7d0 Revert to old sorting library (fixes #3034)
(cherry picked from commit e29e94a5a1)
2020-05-03 14:41:17 -04:00
0014a0ca6c Migrate to flow 2020-05-03 14:37:31 -04:00
7e99a9f789 Linting Fixes AZ 2020-05-03 14:36:19 -04:00
03e5c5ca10 Linting fixes
(cherry picked from commit 3f63b320c4)
2020-05-03 14:35:49 -04:00
e4ff988f4d Revert some seekbar event listener changes
(cherry picked from commit 134dbd2f1d)
2020-05-03 14:34:40 -04:00
dde2320afc Replace some listeners with flowbindings
(cherry picked from commit dad010a891)
2020-05-03 14:34:40 -04:00
988d508025 Remove option to turn off app update checks, check every 3 days
(cherry picked from commit 8c1ec43500)
2020-05-03 14:34:11 -04:00
24850450cb Migrate more preferences
(cherry picked from commit 53a3be0703)
2020-05-03 14:33:03 -04:00
e97d1ac257 Replace deprecated adapterPosition with bindingAdapterPosition
(cherry picked from commit c967308859)
2020-05-03 14:31:00 -04:00
bc44eee5b7 Merge branch 'master' of https://github.com/az4521/Tachiyomi
necessary,
2020-05-03 14:29:54 -04:00
7a010e3446 Material Dialogs Eh Part 3 2020-05-03 14:29:11 -04:00
cb4fbb19ed Material Dialogs Eh Part 2 2020-05-03 14:29:10 -04:00
ddf0357c5c Material Dialogs Eh Part 1 2020-05-03 14:28:40 -04:00
800c01ea42 Lint fixes and update build.gradle 2020-05-03 14:27:34 -04:00
68bfba486e Added number of pages to preload configuration 2020-05-03 14:26:05 -04:00
c09f6cb20c Lint fixes 2020-05-03 14:25:41 -04:00
959bad0247 Lint fixes, likely nothing broke 2020-05-03 14:25:24 -04:00
efb8555d76 Update to SDK 29 (Android 10) (#2468)
(cherry picked from commit 83d5e458ca)
2020-05-03 14:24:52 -04:00
a393772083 Move things back into the EH package, no need for them to be in the regular app 2020-05-03 14:24:22 -04:00
b4ade8c15d Lint fixes, likely no visible changes 2020-05-03 14:22:13 -04:00
03502f6533 Merge branch 'master' of https://github.com/az4521/Tachiyomi 2020-05-03 14:21:26 -04:00
42c7669bca database changes for mergedsources 2020-05-03 14:21:26 -04:00
1916751f4f Complete RxBindings to FlowBinding migration
(cherry picked from commit 3d10dad780)
2020-05-03 14:19:54 -04:00
e46dd808e7 Remove unused widget styles and animations
(cherry picked from commit 01dd46c5ed)
2020-05-03 14:16:06 -04:00
5e92664761 Replace some old color attribute usages
(cherry picked from commit 11e10f6eff)
2020-05-03 14:15:36 -04:00
aa5fd22db0 Add confirm exist setting (closes #2615)
(cherry picked from commit 321a4b24b9)
2020-05-03 14:14:45 -04:00
56b1c07f58 Refactor databinding fields to parent abstract classes
(cherry picked from commit 6a532b836d)
2020-05-03 14:12:46 -04:00
2ecac08bcc Round manga info cover
(cherry picked from commit e388f0d563)
2020-05-03 14:11:12 -04:00
95002a6e87 More FlowPreferences migrations
(cherry picked from commit b8152dd7f9)
2020-05-03 14:03:50 -04:00
cea2b42b41 More FlowPreferences migrations
(cherry picked from commit 401210da44)
2020-05-03 14:02:47 -04:00
8bc5a7d746 Migrate some RxSharedPreferences to FlowSharedPreferences
(cherry picked from commit beb81b657e)
2020-05-03 14:00:35 -04:00
85723b975b Lint fix 2020-05-03 13:58:54 -04:00
a2e05cf80b Move bitmap images to nodpi
(cherry picked from commit 7118817df7)
2020-05-03 13:58:29 -04:00
87363e47b0 Remove setting that was accidentally added 2020-05-03 13:57:39 -04:00
aefa7a1a4a Fixes and such for integration to AZ 2020-05-03 13:56:36 -04:00
18f90587f2 Added option to migrate manga from manga details
(cherry picked from commit 3a4780e19b79e9afcb3e830cb02c52bd1c66bddf)
2020-05-03 13:34:42 -04:00
f47e9b6e14 Fixed migration crash when getting chapters
(cherry picked from commit a529667257908ddebaa92d36a83380c3c6c40408)
2020-05-03 13:22:40 -04:00
a7e4c1295d More Plurals
(cherry picked from commit bcd6c33ed8aaa1cf81c027f88ce4a954e379a545)
2020-05-03 13:22:40 -04:00
50097eef9f Fixes for merging from upstream
(cherry picked from commit 5f2eb19ea37ba191d414eee4e8f45f20f1a73e89)
2020-05-03 13:22:39 -04:00
949cdccbae Confirm exit for migrations
(cherry picked from commit 640bd8d9babb3ace1d6a370adad35050271aa008)
2020-05-03 13:22:39 -04:00
3d0dc64de1 Mass Migration now shows progress and total manga in the title
(cherry picked from commit 68c3d28b4bc7b5cc4038648d5f187fe4da9a42a9)
2020-05-03 13:22:18 -04:00
2e0102d689 Migrations now shows how many manual migrations were made after skipping the rest
(cherry picked from commit bac01c98073dbee6c09144b6ebc55b6a0d56d0da)
2020-05-03 13:22:17 -04:00
2557111607 Optimzing Mass-Migration
(cherry picked from commit 504a10a6ebc3f28a5dd761db8a90c709c8794153)
2020-05-03 13:22:17 -04:00
46a626d2c5 Fixed crash when rapidly trying to skip manga
(cherry picked from commit 14c80436fcb92d22f0691b7b68caf524fd09cab5)
2020-05-03 13:22:17 -04:00
fb92b1a0b4 Update MigrationProcessHolder.kt
(cherry picked from commit dbbdc4c62e83328fd5d3623e42e56aa74511c320)
2020-05-03 13:22:16 -04:00
8e6ed194a6 Moved migration icons to main
(cherry picked from commit e89853afcfc2dff47a79a5d5aa67d37b049748cd)
2020-05-03 13:22:16 -04:00
01175e687c Another fix for mass migration
Also fixing some deprecated code

(cherry picked from commit 2535ea92ebc97bad9f30e9e48493629df6db28a3)
2020-05-03 13:22:15 -04:00
00d2d4f969 More refactoring + more bug fixes
Such as when a manga picked has 0 chapters

(cherry picked from commit 332e8c9487b2e5e39a3a90705b2def80183bcc04)
2020-05-03 13:20:57 -04:00
43715f9835 Build fixes and remove possibly unneeded settings? 2020-05-03 13:20:56 -04:00
b99229b033 Refactoring + fixes for auto-migrate
(cherry picked from commit 142dc1c12a95534170517deb077c98896214a2d9)
2020-05-03 13:19:12 -04:00
62df1263b1 Cleanup of olf auto migration
(cherry picked from commit d64754e3e09e92b2e65c181b0b5e84b531490662)
2020-05-03 13:18:47 -04:00
a6f0e7f9b9 Part 2 of Auto-Migration Done
(cherry picked from commit c4321e3adfff1bdfdcd8ba209dd20549348be217)
2020-05-03 13:18:02 -04:00
f1472d4f8b Fixes for this new auto migration ui
(cherry picked from commit 6d6ff9598205e11c767cedf2fbe261f746df0624)
2020-05-03 13:08:47 -04:00
52ad282492 Finished Part 1 of new auto source migration
(cherry picked from commit 10206ae7b30fbd521308a6d725e107e708b97dd0)
2020-05-03 13:08:46 -04:00
e7b39f29f2 Implemented J2K Auto Source Migration
(cherry picked from commit 8ba75831e6f51f6472d85f813405ede3f679cfd8)
2020-05-03 13:07:43 -04:00
c62d3abbc5 Fix Migrations 2020-05-03 02:15:54 -04:00
fb3ce226b5 Made rounded library covers configurable 2020-05-03 02:15:54 -04:00
de5f43713f Rename catalogue classes/layouts -> source
(cherry picked from commit a1e7592bd8)
2020-05-03 02:14:08 -04:00
84aba68b96 Add persistent notch display mode
(cherry picked from commit 444cfa7669166edc874da4994396776a90ded465)
2020-05-03 02:08:53 -04:00
1be0171398 fix fingerprint icon in dark themes 2020-05-03 02:08:33 -04:00
82c49a42c3 fix lockscreen 2020-05-03 02:08:33 -04:00
599a4c7b17 Fix unintended change 2020-05-03 02:08:13 -04:00
895dbbdacb Set needed migrations 2020-05-03 02:07:07 -04:00
77026d4eeb Pure Light Theme fixes and adding eh stuff to strings.xml 2020-05-03 02:06:04 -04:00
256b1881f0 Tweak Button Styles Part 2 2020-05-03 01:57:54 -04:00
2a299485cc Add proper AZ Debug Icon 2020-05-03 01:53:59 -04:00
a6909a76ed Fix common toolbar popup menu text color (fixes #2695)
(cherry picked from commit b9ea6e8d96)
2020-05-03 01:52:05 -04:00
1ecba5bb7e Migrate to MaterialComponents themes
(cherry picked from commit 7d0ea614da)
2020-05-03 01:49:44 -04:00
c381b737d3 Use outlined icons in settings
(cherry picked from commit ace54f8175)
2020-05-03 01:48:03 -04:00
70e7974396 Json build fixes 2020-05-03 01:47:35 -04:00
2104b60b81 Run lint 2020-05-03 01:41:34 -04:00
09dcb8029c Add setting to hide manga content from update/download notifications
(cherry picked from commit f3d69599aa)
2020-05-03 01:41:06 -04:00
f2ed26479f Update for Workmanager 2020-05-03 01:40:53 -04:00
d03d9b344a Reenable Proguard
(cherry picked from commit bb7ed73743)
2020-05-03 01:38:48 -04:00
9b5fbda9a2 move jsoupextensions back pt2 2020-05-03 01:37:58 -04:00
647fbd1f4b Move JsoupExtensions back (fixes #2562) 2020-05-03 01:37:58 -04:00
fa6ed901df Optimize more imports 2020-05-03 01:37:25 -04:00
23ac3d18e5 Optimize imports, disallow wildcard imports because of klint, run linter 2020-05-03 01:36:21 -04:00
f18891a07e Move crash reports setting to advanced
(cherry picked from commit 978ac50015)
2020-05-03 01:34:51 -04:00
c85825f3c7 Run default Android Studio formatter on code
(cherry picked from commit 3ecc883944)
2020-05-03 01:33:58 -04:00
319571edf3 Remove EH custom incognito webview in favor of new activity webview from Dev(I could not get it working with the new system.) 2020-05-03 01:08:08 -04:00
1f20d96191 Convert webview into an activity (#2470)
Based on 65804ebb3a

(cherry picked from commit 797553ce16)
2020-05-03 01:06:07 -04:00
c2e50305eb Converted tachiyomi_circle to webp 2020-05-03 01:05:01 -04:00
d00e1284d6 Convert filter mock image to webp
(cherry picked from commit eb56567812)
2020-05-03 01:04:26 -04:00
ef4430216d fix github updater 2020-05-03 01:00:41 -04:00
643f666178 Notification conflict fix 2020-05-03 01:00:41 -04:00
989b968e5b Merge pull request #7 from jobobby04/Extensions_Overhaul_plus_other
Extensions overhaul plus other
2020-05-03 01:00:27 -04:00
92484e26e5 Set manga last update field based on chapter fetch time (closes #2217)
Based on 3c81f60041 (diff-7e5179d048c3dfaf75b444b7277fc840)

(cherry picked from commit ee8a53188c)
2020-05-03 01:00:27 -04:00
429056f2ca Build fixes 2020-05-03 00:48:34 -04:00
fa2b44eeb3 Move edit categories to library settings 2020-05-03 00:44:30 -04:00
52e742049b Reorganize other util files 2020-05-03 00:39:16 -04:00
97a86269e6 change a dependency to try to fix merged sources 2020-05-03 00:31:59 -04:00
654d98b5c4 unhide merged sources 2020-05-03 00:31:43 -04:00
0509db1935 E-Hentai WatchedList checkbox fix (#2) 2020-05-03 00:31:07 -04:00
acf879d28c Added Ehentai Watched list (#1) 2020-05-03 00:31:07 -04:00
cefe45e8cc fixed double-locking, added secure screen, fixed tsumino for real this time 2020-05-03 00:30:52 -04:00
03b44fff22 update changelog and readme, fix hentaicafe tags 2020-05-03 00:27:44 -04:00
71c373926f lock no longer requires usage access 2020-05-03 00:27:32 -04:00
1af11f076f finish adding drag and drop 2020-05-03 00:25:04 -04:00
Jay
41c99c33a6 cherrypick drag and drop sorting 2020-05-03 00:12:54 -04:00
58cce53746 delegate tsumino 2020-05-02 23:52:58 -04:00
df6cafd6d1 bump version, changelog, hide merged sources 2020-05-02 23:52:21 -04:00
cc6c1b5641 add debug for EH aged flags 2020-05-02 23:51:52 -04:00
d61adc0259 nhentai language filtering, added dev build in settings 2020-05-02 23:51:21 -04:00
9ed7ee65c3 unhide and begin working on merged sources 2020-05-02 23:48:30 -04:00
5f94e230f9 adaptive fingerguns icon 2020-05-02 23:45:00 -04:00
4d8f44ddae merge double upstream 2020-05-02 23:39:46 -04:00
264e04368b Update issue templates 2020-05-02 15:07:47 -04:00
43c11c6ac5 Release 0.9.2 2020-05-02 15:00:10 -04:00
ede42cd6aa Add link to extensions repo 2020-05-02 15:00:03 -04:00
33901dd72f More ActionToolbar tweaks 2020-05-02 14:51:28 -04:00
ac4ae8103e Force FastScrollers to be on right even in RTL (closes #3038) 2020-05-02 14:39:47 -04:00
2c93704b4a Translated using Weblate (Malay) (#3007)
Currently translated at 100.0% (526 of 526 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (French)

Currently translated at 99.8% (525 of 526 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (German)

Currently translated at 100.0% (526 of 526 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Malay)

Currently translated at 100.0% (525 of 525 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (Hindi)

Currently translated at 100.0% (525 of 525 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (French)

Currently translated at 99.6% (523 of 525 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (German)

Currently translated at 100.0% (525 of 525 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (Finnish)

Currently translated at 99.8% (522 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Catalan)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Greek)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/el/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Turkish)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Portuguese)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

Translated using Weblate (Malay)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (French)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Japanese)

Currently translated at 79.3% (415 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ja/

Translated using Weblate (German)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (522 of 522 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (French)

Currently translated at 100.0% (522 of 522 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (French)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (German)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (French)

Currently translated at 99.6% (521 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (Russian)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (French)

Currently translated at 98.8% (517 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Russian)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (German)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Co-authored-by: Hosted Weblate <hosted@weblate.org>
2020-05-02 12:34:55 -04:00
e2158af592 Swap bottom nav and ActionToolbar when appropriate 2020-05-02 12:27:23 -04:00
b06189ff95 Revert last_updated change 2020-05-02 12:11:51 -04:00
d72c51c8dd Hide app/nav bars on scroll 2020-05-02 11:33:31 -04:00
e29e94a5a1 Revert to old sorting library (fixes #3034) 2020-05-02 10:56:03 -04:00
04d7eccc63 Show number of categories in setting summary 2020-05-02 10:47:21 -04:00
e58896bdfb Separate out series viewer setting to its own group in reader sheet 2020-05-02 10:41:56 -04:00
d2bb4487e1 Move pager-specific settings into proper category, add summary for 32-bit color setting 2020-05-02 10:41:38 -04:00
e8623fbd7d Show 32-bit color setting in reader sheet 2020-05-02 10:40:55 -04:00
0a6de2b3ea Fix backup failing when source isn't installed 2020-05-02 10:24:37 -04:00
23a8e31791 Hide filter FAB when opened (closes #3024) 2020-05-02 10:22:28 -04:00
286d2b4cf6 Release 0.9.1 2020-05-01 21:42:34 -04:00
1ab07d169d Add gray reader background option (closes #3019) 2020-05-01 21:40:36 -04:00
abf2d4b718 Start storing extension ID/source name mapping in backup files 2020-05-01 21:25:23 -04:00
37045c77cb Fix manga info being cut off (closes #3006) 2020-05-01 21:09:05 -04:00
fd5d52a709 Remove confirmation prompt for passive biometric unlock (e.g. iris/face) 2020-05-01 21:08:52 -04:00
abcb21491c Reset sort on update if using old sort by source setting 2020-05-01 19:59:08 -04:00
33d2b0984f Fix chapter list selection uninverting (closes #3014) 2020-05-01 19:53:26 -04:00
fc7a040509 Move queue start/pause to FAB 2020-05-01 19:39:30 -04:00
be09dded20 Attempt to remove sound from backup/restore completion notifications 2020-05-01 19:29:15 -04:00
6493b9a6b3 Reword title display mode (closes #3008) 2020-05-01 19:20:05 -04:00
f07fbcc196 Relay extension changes to sources controller (fixes #3002) 2020-05-01 19:17:37 -04:00
cae90ddd08 Disable Proguard
Caused issues for some extensions (e.g. Komga)
2020-05-01 18:28:52 -04:00
7bd9b21e5a Update issue templates 2020-05-01 18:18:29 -04:00
e29fb68375 fix preload never being restricted (#3012)
Fix preload never being restricted
2020-05-01 18:03:27 -04:00
33e0a34916 Release 0.9.0 2020-05-01 10:37:42 -04:00
fccb2e762d Translated using Weblate (Ukrainian) (#2981)
Currently translated at 94.6% (495 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

Translated using Weblate (Portuguese)

Currently translated at 99.2% (519 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

Translated using Weblate (Malay)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (Spanish)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Sardinian)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Spanish)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Spanish)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Russian)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Swedish)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.4% (520 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Russian)

Currently translated at 99.4% (520 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Malay)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (Bulgarian)

Currently translated at 99.8% (522 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/bg/

Translated using Weblate (Finnish)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Catalan)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Greek)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/el/

Translated using Weblate (Turkish)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Romanian)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Hindi)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (German)

Currently translated at 100.0% (523 of 523 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Catalan)

Currently translated at 100.0% (521 of 521 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Turkish)

Currently translated at 100.0% (521 of 521 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (521 of 521 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Indonesian)

Currently translated at 100.0% (521 of 521 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

Translated using Weblate (Indonesian)

Currently translated at 100.0% (521 of 521 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

Translated using Weblate (German)

Currently translated at 100.0% (521 of 521 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (German)

Currently translated at 100.0% (521 of 521 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Indonesian)

Currently translated at 100.0% (521 of 521 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

Translated using Weblate (Catalan)

Currently translated at 100.0% (521 of 521 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Finnish)

Currently translated at 100.0% (521 of 521 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Sardinian)

Currently translated at 99.6% (519 of 521 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Catalan)

Currently translated at 100.0% (521 of 521 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Greek)

Currently translated at 100.0% (521 of 521 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/el/

Translated using Weblate (Turkish)

Currently translated at 100.0% (521 of 521 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Romanian)

Currently translated at 100.0% (521 of 521 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (521 of 521 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Malay)

Currently translated at 100.0% (521 of 521 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (Hindi)

Currently translated at 100.0% (521 of 521 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (German)

Currently translated at 100.0% (521 of 521 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Finnish)

Currently translated at 100.0% (520 of 520 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Tagalog)

Currently translated at 75.3% (392 of 520 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tl/

Translated using Weblate (Catalan)

Currently translated at 100.0% (520 of 520 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Turkish)

Currently translated at 100.0% (520 of 520 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Dutch)

Currently translated at 99.8% (519 of 520 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nl/

Translated using Weblate (Dutch)

Currently translated at 99.8% (519 of 520 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nl/

Translated using Weblate (Malay)

Currently translated at 100.0% (520 of 520 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (Arabic)

Currently translated at 91.5% (476 of 520 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ar/

Translated using Weblate (Dutch)

Currently translated at 84.8% (441 of 520 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nl/

Translated using Weblate (Dutch)

Currently translated at 84.8% (441 of 520 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nl/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (520 of 520 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (German)

Currently translated at 100.0% (520 of 520 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Sardinian)

Currently translated at 99.6% (517 of 519 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Serbian)

Currently translated at 96.1% (499 of 519 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sr/

Translated using Weblate (Greek)

Currently translated at 100.0% (519 of 519 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/el/

Translated using Weblate (Portuguese)

Currently translated at 100.0% (519 of 519 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

Translated using Weblate (Finnish)

Currently translated at 100.0% (519 of 519 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Serbian)

Currently translated at 91.1% (473 of 519 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sr/

Translated using Weblate (Catalan)

Currently translated at 100.0% (519 of 519 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Swedish)

Currently translated at 100.0% (519 of 519 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

Translated using Weblate (Turkish)

Currently translated at 100.0% (519 of 519 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Russian)

Currently translated at 100.0% (519 of 519 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Romanian)

Currently translated at 100.0% (519 of 519 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Malay)

Currently translated at 100.0% (519 of 519 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (Hindi)

Currently translated at 100.0% (519 of 519 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (Serbian)

Currently translated at 90.5% (470 of 519 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sr/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (519 of 519 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (German)

Currently translated at 100.0% (519 of 519 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Sardinian)

Currently translated at 99.4% (513 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Malay)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (German)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Co-authored-by: Hosted Weblate <hosted@weblate.org>
2020-05-01 10:36:24 -04:00
956b3284d3 Always update extensions list on enter 2020-05-01 09:38:35 -04:00
937d0852b3 Always update sources list on enter (fixes #2999) 2020-05-01 09:25:35 -04:00
cf2967cf34 Fix some sheet color issues (closes #3000) 2020-05-01 08:49:45 -04:00
c1e64a839d Update Bangumi link in README 2020-05-01 08:44:53 -04:00
c06928a7a5 Default library updates to daily + wifi 2020-04-30 20:27:02 -04:00
8c0cafc793 Reword action button in source filter sheet (closes #2994) 2020-04-30 20:22:52 -04:00
543ca43e24 Ignore built files 2020-04-30 18:44:07 -04:00
31b86f539b Set backup/restore progress notifications to low priority 2020-04-30 18:40:36 -04:00
dff1f4dd52 Add banner at top of library when downloaded only mode is enabled 2020-04-30 18:35:17 -04:00
276cfed832 Update screenshots in README 2020-04-30 18:11:26 -04:00
bd61c33097 fix copy paste mistake in PreferencesHelper.kt (#2993)
fix copy paste mistake in PreferencesHelper.kt
2020-04-30 11:14:42 -04:00
e2a9c09597 Move google-services.json 2020-04-29 23:07:32 -04:00
5059c6295f Increase next chapter preload threshold to last 5 pages 2020-04-29 23:04:15 -04:00
916c1c9de2 Add ability to inspect WebView in debug builds 2020-04-29 22:46:11 -04:00
2661700d9a Split out backup/restore notifications into separate channels for progress/completion 2020-04-29 22:30:33 -04:00
02502c4ea5 Minor empty state string edits 2020-04-29 17:56:26 -04:00
382e85a8a0 Move google-services.json 2020-04-29 17:56:05 -04:00
05d830eb58 Disable entire checkbox view when disabled (fixes #2989) 2020-04-29 17:42:45 -04:00
7b149425fa Adjust size of more header (closes #2988) 2020-04-29 17:37:49 -04:00
6f0e1965b6 More settings organization 2020-04-29 17:34:44 -04:00
970f1466b5 Fix download queue cutting off if too short 2020-04-29 09:49:54 -04:00
e422b1d6c1 Fix snackbar/FAB overlap in edit categories view 2020-04-29 09:49:43 -04:00
8992f47915 Remove unnecessary checks 2020-04-29 09:42:56 -04:00
fe65f4d6f8 Option to only include pinned sources in global search 2020-04-29 09:29:50 -04:00
8077e421e6 Move extension update preference to settings 2020-04-29 09:13:10 -04:00
4f806a921f Set up extensions check job on update 2020-04-29 09:09:18 -04:00
8efe0502f3 Make search views take up full width 2020-04-29 09:02:09 -04:00
0eb61f34f6 Ensure ActionToolbars don't overlap snackbars or FABs 2020-04-29 08:58:52 -04:00
Jay
cc7735e284 No longer using chapter url for new chapter notification's reader intent 2020-04-28 23:06:34 -04:00
e24ddb9106 Use same header layout for sources/extensions/migration 2020-04-28 23:03:30 -04:00
67d284fc35 Fix top padding in sources tab 2020-04-28 22:44:23 -04:00
a9d32fea37 Handle paused state in download queue summary 2020-04-28 20:23:27 -04:00
3374481912 Refactor tabbed bottom sheet 2020-04-28 19:57:49 -04:00
1972cc25a9 Show download progress in MoreController 2020-04-28 19:44:02 -04:00
6a3cd0054b Minor edits 2020-04-28 18:45:04 -04:00
548dbf4b78 Copy files from cache when downloading 2020-04-28 18:44:58 -04:00
74af40a352 Revert hiding cutout setting from reader sheet 2020-04-28 17:47:34 -04:00
8f26c4bd07 Dependency updates 2020-04-28 09:10:12 -04:00
1d51b06d3e Increase default connect/read timeouts 2020-04-28 09:10:12 -04:00
305ee3c12e Pull basic manga/chapter metadata from EPUB files. (#2962)
* Fill manga and chapter metadata with EPUB metadata where appropriate.

* Use fuzzy-match to remove manga titles from chapter names.

This allows removing manga titles from the metadata title of local EPUB chapters with characters that can't be in the manga directory's name due to filesystem limitations.

* Use more standard way of parsing EPUB dates.

* Use date format compatible with lower Android versions for EPUBs.
2020-04-27 22:49:06 -04:00
90ce89193d Add logo header in more section 2020-04-27 22:48:25 -04:00
2ad3fa1593 Add row dividers in source migration list 2020-04-27 22:22:25 -04:00
4bb9949768 Fix extensions intent 2020-04-27 22:19:13 -04:00
c4f1d2f153 Revert column FlowPreference
Made loading janky
2020-04-27 22:19:06 -04:00
ed6f82af0f Only apply downloaded only to chapter lists in library 2020-04-27 20:06:47 -04:00
3ba8cff60f Edge fade for compact genre chips when scrolling 2020-04-27 19:50:35 -04:00
7307ddd1b8 Restore landscape manga info layout 2020-04-27 19:48:54 -04:00
0601bedb0b Revert removal of last chapter/updated from manga info 2020-04-27 19:37:09 -04:00
0c988d95ee Fix crash when tab isn't available 2020-04-27 19:22:22 -04:00
d593362ba8 Merge sources and extensions into one view 2020-04-27 19:16:46 -04:00
f97f4c68ba Hide titles in restore notification based on preference 2020-04-27 18:21:12 -04:00
6d60d14f4a Translated using Weblate (Finnish) (#2977)
Translations broke again
2020-04-27 16:47:35 -04:00
d13bc9d420 Translated using Weblate (Finnish) (#2909)
Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Greek)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/el/

Translated using Weblate (Turkish)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Romanian)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (German)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (French)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (French)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (French)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (French)

Currently translated at 99.4% (513 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (French)

Currently translated at 99.4% (513 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (French)

Currently translated at 97.6% (504 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (Serbian)

Currently translated at 71.5% (370 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sr/

Translated using Weblate (Swedish)

Currently translated at 100.0% (517 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

Translated using Weblate (Romanian)

Currently translated at 99.8% (516 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Finnish)

Currently translated at 100.0% (517 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Sardinian)

Currently translated at 99.4% (514 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Serbian)

Currently translated at 66.7% (345 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sr/

Translated using Weblate (Greek)

Currently translated at 100.0% (517 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/el/

Translated using Weblate (Turkish)

Currently translated at 100.0% (517 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Hindi)

Currently translated at 100.0% (517 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (Sardinian)

Currently translated at 99.4% (514 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Catalan)

Currently translated at 100.0% (517 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Greek)

Currently translated at 99.8% (516 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/el/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (517 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (German)

Currently translated at 100.0% (517 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (Greek)

Currently translated at 75.2% (389 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/el/

Translated using Weblate (Portuguese)

Currently translated at 100.0% (517 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

Translated using Weblate (Finnish)

Currently translated at 100.0% (517 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Catalan)

Currently translated at 100.0% (517 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Turkish)

Currently translated at 100.0% (517 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Romanian)

Currently translated at 100.0% (517 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Portuguese)

Currently translated at 100.0% (517 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

Translated using Weblate (Portuguese)

Currently translated at 100.0% (517 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (517 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (German)

Currently translated at 100.0% (517 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Portuguese)

Currently translated at 96.5% (499 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

Translated using Weblate (Portuguese)

Currently translated at 96.5% (499 of 517 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

Translated using Weblate (Turkish)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Malay)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (Hungarian)

Currently translated at 31.2% (161 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hu/

Translated using Weblate (Urdu (Pakistan))

Currently translated at 9.4% (49 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ur_PK/

Translated using Weblate (Urdu (Pakistan))

Currently translated at 7.9% (41 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ur_PK/

Translated using Weblate (Finnish)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Sardinian)

Currently translated at 99.4% (513 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Hindi)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (German)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Finnish)

Currently translated at 100.0% (515 of 515 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Turkish)

Currently translated at 100.0% (515 of 515 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (German)

Currently translated at 100.0% (515 of 515 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (Finnish)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Catalan)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Italian)

Currently translated at 99.8% (515 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

Translated using Weblate (German)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Malay)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (French)

Currently translated at 98.8% (510 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (French)

Currently translated at 98.8% (510 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (Finnish)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Catalan)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.0% (511 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.0% (511 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Turkish)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Romanian)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Hindi)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (French)

Currently translated at 97.8% (505 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (French)

Currently translated at 97.8% (505 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (French)

Currently translated at 97.8% (505 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (German)

Currently translated at 100.0% (516 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Norwegian Bokmål)

Currently translated at 90.1% (465 of 516 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nb_NO/

Translated using Weblate (Finnish)

Currently translated at 96.8% (497 of 513 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Finnish)

Currently translated at 96.8% (497 of 513 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Catalan)

Currently translated at 100.0% (513 of 513 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (513 of 513 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Hindi)

Currently translated at 100.0% (513 of 513 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (Spanish)

Currently translated at 100.0% (513 of 513 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (German)

Currently translated at 100.0% (513 of 513 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Finnish)

Currently translated at 95.5% (490 of 513 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Finnish)

Currently translated at 95.5% (490 of 513 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (Catalan)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Turkish)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Romanian)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.4% (508 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Indonesian)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

Translated using Weblate (Indonesian)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

Translated using Weblate (Hindi)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (German)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (Catalan)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Spanish)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (Catalan)

Currently translated at 100.0% (512 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (512 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

Translated using Weblate (Hindi)

Currently translated at 100.0% (512 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (Spanish)

Currently translated at 100.0% (512 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (512 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (512 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (512 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (512 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (512 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

Translated using Weblate (Turkish)

Currently translated at 100.0% (512 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Russian)

Currently translated at 100.0% (512 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (512 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Spanish)

Currently translated at 99.8% (511 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Sardinian)

Currently translated at 99.0% (507 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (512 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Russian)

Currently translated at 97.8% (501 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Spanish)

Currently translated at 99.6% (510 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (512 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (512 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Sardinian)

Currently translated at 99.2% (508 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.6% (510 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.6% (510 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Spanish)

Currently translated at 99.8% (511 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (German)

Currently translated at 100.0% (512 of 512 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Co-authored-by: Hosted Weblate <hosted@weblate.org>
2020-04-27 16:22:02 -04:00
2a41e4ce68 Fix BrowseSourceController losing scroll position when navigating back 2020-04-27 16:21:23 -04:00
850654dccc Hide EmptyView when retrying source request 2020-04-27 16:14:56 -04:00
2f9dfed073 Fix typo (#2973)
Fix MAL api updating wrong data on read chapters change (#2971)
2020-04-27 10:34:41 -04:00
57911c42d1 Copy debug info when tapping version 2020-04-26 22:55:13 -04:00
6064eda68f Remove unnecessary dialog padding dimens 2020-04-26 20:07:03 -04:00
fe803a4588 Add bottom padding to library for ActionToolbar 2020-04-26 20:04:05 -04:00
2787116171 Fix ActionToolbar background color 2020-04-26 18:00:56 -04:00
0a509cb382 Remove usage of alpha color selectors (fixes #2957)
Doesn't work properly in API < 23
2020-04-26 17:24:31 -04:00
b25ab941ba Include viewer and chapter filter preferences when migrating manga (closes #2866) 2020-04-26 16:50:00 -04:00
6ef59a5949 Remove redundant DB transaction function 2020-04-26 16:45:23 -04:00
17fc8deb19 Migrate column preference to FlowPreference 2020-04-26 16:35:54 -04:00
45b5c1c262 Set preference visibility immediately (fixes #2965) 2020-04-26 16:26:42 -04:00
7fd547a2d6 Fix categories button not working after adding manga (closes #2966) 2020-04-26 16:08:23 -04:00
d19d787f6e Refactor backup service 2020-04-26 16:07:07 -04:00
52474e39d9 Placeholder link to next release changelog 2020-04-26 12:38:53 -04:00
d243ee4b4c Remove TextDrawable 2020-04-26 11:59:15 -04:00
2c2f8f5853 Improvements to EPUB support. (#2409)
* Fix EPUBs containing relative file paths and/or alternate path separators.

* Support calibre-generated EPUB covers.

* Store EPUB pathSeparator in a field.

* Process both types of image tags in EPUBs.

* Process all EPUB image tags in order.
2020-04-25 22:27:43 -04:00
64ba127e7d Added Local Source icon (#2961) 2020-04-25 22:27:20 -04:00
9d22a9e664 Move some restore notification logic into service 2020-04-25 18:59:12 -04:00
96c55db7ca Consider individual manga as transactions rather than entire restore job (closes #2482) 2020-04-25 18:50:44 -04:00
0f48563e29 Some restore code refactoring 2020-04-25 16:00:08 -04:00
7c014292d2 Localize some restore strings 2020-04-25 15:55:49 -04:00
19507d1837 Return success/failure result for backup job 2020-04-25 14:55:55 -04:00
81b2dfd9d0 Update top level project build scripts 2020-04-25 14:30:14 -04:00
3f63b320c4 Linting fixes 2020-04-25 14:24:45 -04:00
4da760d614 Simplify outlined button style name 2020-04-25 12:02:14 -04:00
a95ac8ad83 Add links to local source guide (closes #2896) 2020-04-25 11:56:24 -04:00
f841d3d259 Remove vector drawable support library flag
Not needed since our min SDK is >= 21
2020-04-25 11:26:08 -04:00
902700e1f4 Minor edits 2020-04-25 11:05:29 -04:00
bbf456a4aa Tweak ActionToolbar styling 2020-04-25 11:01:08 -04:00
134dbd2f1d Revert some seekbar event listener changes 2020-04-25 09:58:45 -04:00
d371b093d8 Enable Gradle caching 2020-04-25 09:58:29 -04:00
979c49b99a Minor cleanup 2020-04-24 19:37:42 -04:00
dad010a891 Replace some listeners with flowbindings 2020-04-24 19:37:34 -04:00
9f974c9401 Refactor library sheet into tabs 2020-04-24 18:15:37 -04:00
fba3ed2244 Show scrollable single line of genres when compacted 2020-04-24 16:05:43 -04:00
aa1d927da6 More FlowPreference migration 2020-04-24 11:58:16 -04:00
292655cbdc Adjust sources section heading padding 2020-04-24 11:00:07 -04:00
Jay
a088c9ca7c Added Last Used header to browse 2020-04-24 10:53:22 -04:00
8c1ec43500 Remove option to turn off app update checks, check every 3 days 2020-04-24 10:39:55 -04:00
1ac1c6dc9e Link to GitHub commits for preview build changelog 2020-04-24 10:29:35 -04:00
87ffd6eef2 Reduce size of history card titles 2020-04-24 10:22:05 -04:00
41139cea76 Revert Material Dialogs to v3.1.1 due to weird UI blinking/cutoff issues 2020-04-24 10:08:54 -04:00
d98b7275d1 More FlowPreference migration 2020-04-23 23:21:44 -04:00
77cca1ce84 Change favorite icon to heart 2020-04-23 23:08:25 -04:00
c0bbbdb7ee Separate categories picker from long pressing manga favorite button 2020-04-23 23:03:20 -04:00
8e6b7aaec0 More subdued chapter page progress text 2020-04-23 22:58:35 -04:00
aae6820fdc Replace Track Reading Dates date picker with MaterialDialog's one (#2935)
* Replaced datepicker with MaterialDialog's one

* Removed max date due to library bug (afollestad/material-dialogs#1973)

* Removed old date picker view.
2020-04-23 18:28:41 -04:00
2a4f35959b Hide reader cutout setting if no cutout detected 2020-04-22 23:22:03 -04:00
f71708e5c5 Group version info at top 2020-04-22 23:12:18 -04:00
6de00b1f21 Make restore a foreground service 2020-04-22 23:09:24 -04:00
2b27b40142 Fix round text icons (closes #2934) 2020-04-22 22:30:40 -04:00
55101b1a4a Update nucleus library (#2932) 2020-04-22 22:27:30 -04:00
c014fd7f6d Update README.md 2020-04-22 22:27:01 -04:00
53a3be0703 Migrate more preferences 2020-04-22 22:19:21 -04:00
04a178e7da Move common view configs to parent class 2020-04-22 21:46:02 -04:00
6d5b6b2ff7 Specify Stable vs Preview in version 2020-04-22 21:24:43 -04:00
ab97de2763 Set default textInputStyle (fixes #2926) 2020-04-22 21:24:43 -04:00
34f7e4d448 Replace TextDrawable with a Kotlin fork (#2929)
* Replace old TextDrawable with Kotlin fork

* Update androidx preferences library
2020-04-22 21:23:44 -04:00
f7c139030f Add Start/Finish date support for MAL (#2672)
* Started working on MAL support

* Added date picker UI

* Replaced Date with Calendar

* Added MAL remote update functionality

* Join url methods listEntryUrl and editUrl

* Removed unused methods

* Renamed mangaEditPayload to mangaEditPostBody

* Moved code to separate method

* Uniformed code to project conventions

* Removed wildcard import

* Moved MyAnimeListTrack to private class

* Improved MyAnimeListTrack name

* Removed redundant code

* Add start/finish date in local database

* Fixed format and improved codestyle

* Fixed typo and fixed TrackHolder's format

* Improved code style

* Ran linter

* Add database updating methods

* Change date format to fit new layout

* Review Commits

* Improve SetTrackReadingDatesDialog readability

* Move private methods after public ones

* Fixed SQL error

* Fixed remove date button

* Updated MaterialDesign methods to latest version

* Replaced dismissDialog() with dialog.Dismiss()

* Fixed wrong string resource usage.
2020-04-22 21:23:23 -04:00
c967308859 Replace deprecated adapterPosition with bindingAdapterPosition 2020-04-22 09:17:23 -04:00
02207f6cfd Make entire history item card clickable 2020-04-22 09:14:30 -04:00
badddcf0de Use existing paddings when allocating space for source RecyclerView for FAB (fixes #2917) 2020-04-22 09:10:09 -04:00
b6f1c516e2 Fix extended fab height, make text bolder (fixes #2900) 2020-04-22 09:07:40 -04:00
932a47a8a7 Update Material Dialogs 2020-04-21 23:33:01 -04:00
f69f78db34 Move restore progress dialog to notification 2020-04-21 21:53:15 -04:00
fc2c465bac Prevent multiple concurrent backups/restores 2020-04-21 21:34:22 -04:00
f2a7f8efda Move restore completed/error dialogs to notifications 2020-04-21 20:46:24 -04:00
e6c172ac22 Fully move backup progress/created dialog logic to notifications 2020-04-21 20:10:53 -04:00
d8e7481118 Fix backup/restore notification channel 2020-04-21 19:17:55 -04:00
2485ef8547 Remove migrating progress dialog 2020-04-21 19:01:01 -04:00
b17762f8d9 Remove source name from history cards, slightly compacter 2020-04-21 18:41:05 -04:00
b3611eef9d Bug/2894 covers not updating (#2908)
* Use a wrapper around Manga to supply glide with proper equals() and hashCode() impl. for caching

* reload image if url has changed

* ignore case for http scheme comparison

* more ignore case for http scheme comparison

* fix indenting

* use data class for MangaThumbnail
2020-04-21 09:13:23 -04:00
a68c1adba6 Use lifecycle scope for flows in activities 2020-04-21 09:12:53 -04:00
42b536e40b Replace backup progress dialog with notification 2020-04-20 23:11:02 -04:00
d6e49be268 Remove some progress dialogs 2020-04-20 23:10:10 -04:00
3d10dad780 Complete RxBindings to FlowBinding migration 2020-04-20 18:13:45 -04:00
c9a727594e Fix manga info expansion toggling again after refreshing 2020-04-19 23:23:36 -04:00
cd25e1283a Fix extension update badge again 2020-04-19 23:10:28 -04:00
6675de1a26 Fix extension update badge in bottom nav not updating 2020-04-19 21:05:45 -04:00
96618e9517 [CI SKIP] More consistent "WebView" wording 2020-04-19 20:53:31 -04:00
dff239141d Force close app if Webview isn't available 2020-04-19 16:10:49 -04:00
abbb329ba6 Rename offline mode to downloaded only 2020-04-19 16:02:33 -04:00
5bc77fc6e8 Add offline mode (forced download filters; closes #2902) 2020-04-19 15:30:55 -04:00
9c820fcca1 Default skip filtered to true 2020-04-19 15:29:10 -04:00
bb064a1ba7 Change restore error log extension to txt 2020-04-19 15:13:02 -04:00
a5d9fb518a Minor edits 2020-04-19 15:12:46 -04:00
01dd46c5ed Remove unused widget styles and animations 2020-04-19 12:23:37 -04:00
ed51989796 Use non-deprecated Kotlin experimental flag 2020-04-19 12:04:08 -04:00
bd20977ebc Remove custom preference flow implementation 2020-04-19 12:03:51 -04:00
11e10f6eff Replace some old color attribute usages 2020-04-19 12:02:08 -04:00
c88265ac04 Translated using Weblate (Portuguese (Brazil)) (#2899)
Missed translation
2020-04-19 08:41:46 -04:00
3f655ca50a Translated using Weblate (Swedish) (#2856)
Currently translated at 100.0% (508 of 508 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (Sardinian)

Currently translated at 99.8% (513 of 514 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (514 of 514 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

Translated using Weblate (Turkish)

Currently translated at 100.0% (514 of 514 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Hindi)

Currently translated at 100.0% (514 of 514 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (German)

Currently translated at 100.0% (514 of 514 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (German)

Currently translated at 99.8% (513 of 514 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Norwegian Bokmål)

Currently translated at 89.6% (461 of 514 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nb_NO/

Translated using Weblate (Swedish)

Currently translated at 100.0% (514 of 514 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (514 of 514 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Sardinian)

Currently translated at 99.8% (510 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Swedish)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

Translated using Weblate (French)

Currently translated at 99.8% (510 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (Catalan)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Swedish)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

Translated using Weblate (Norwegian Bokmål)

Currently translated at 88.4% (452 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nb_NO/

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

Translated using Weblate (Turkish)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Romanian)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Italian)

Currently translated at 99.8% (510 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

Translated using Weblate (Hindi)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (Spanish)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (Sardinian)

Currently translated at 99.6% (509 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Spanish)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (German)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (French)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (French)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

Translated using Weblate (Romanian)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Spanish)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Sardinian)

Currently translated at 99.6% (509 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Catalan)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Turkish)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Russian)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Hindi)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (German)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Romanian)

Currently translated at 98.6% (503 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Sardinian)

Currently translated at 99.8% (509 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Catalan)

Currently translated at 98.4% (502 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Romanian)

Currently translated at 100.0% (510 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Portuguese)

Currently translated at 99.2% (506 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (510 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Hindi)

Currently translated at 100.0% (510 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (510 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Turkish)

Currently translated at 100.0% (510 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Russian)

Currently translated at 100.0% (510 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (510 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Malay)

Currently translated at 98.2% (501 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (Spanish)

Currently translated at 100.0% (510 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (German)

Currently translated at 100.0% (510 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Sardinian)

Currently translated at 99.8% (506 of 507 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Turkish)

Currently translated at 100.0% (507 of 507 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Russian)

Currently translated at 100.0% (507 of 507 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (507 of 507 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Polish)

Currently translated at 95.4% (484 of 507 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pl/

Translated using Weblate (French)

Currently translated at 99.6% (505 of 507 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (French)

Currently translated at 99.6% (505 of 507 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (Spanish)

Currently translated at 100.0% (507 of 507 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Spanish)

Currently translated at 100.0% (507 of 507 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (Russian)

Currently translated at 100.0% (509 of 509 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (509 of 509 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

Translated using Weblate (Russian)

Currently translated at 100.0% (509 of 509 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (509 of 509 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Spanish)

Currently translated at 99.2% (505 of 509 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (German)

Currently translated at 100.0% (509 of 509 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Malay)

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (Czech)

Currently translated at 83.6% (421 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/cs/

Co-authored-by: Hosted Weblate <hosted@weblate.org>
2020-04-18 22:53:16 -04:00
359d4dc1b2 Show locale name in system default locale 2020-04-18 22:48:52 -04:00
ca47446b46 Add link to website and open source licenses 2020-04-18 22:27:54 -04:00
cffb2db7ae Translated using Weblate (Swedish)
Currently translated at 100.0% (508 of 508 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (Sardinian)

Currently translated at 99.8% (513 of 514 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (514 of 514 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

Translated using Weblate (Turkish)

Currently translated at 100.0% (514 of 514 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Hindi)

Currently translated at 100.0% (514 of 514 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (German)

Currently translated at 100.0% (514 of 514 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (German)

Currently translated at 99.8% (513 of 514 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Norwegian Bokmål)

Currently translated at 89.6% (461 of 514 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nb_NO/

Translated using Weblate (Swedish)

Currently translated at 100.0% (514 of 514 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (514 of 514 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Sardinian)

Currently translated at 99.8% (510 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Swedish)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

Translated using Weblate (French)

Currently translated at 99.8% (510 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (Catalan)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Swedish)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

Translated using Weblate (Norwegian Bokmål)

Currently translated at 88.4% (452 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nb_NO/

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

Translated using Weblate (Turkish)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Romanian)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Italian)

Currently translated at 99.8% (510 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

Translated using Weblate (Hindi)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (Spanish)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (Sardinian)

Currently translated at 99.6% (509 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Spanish)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (German)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (French)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (French)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

Translated using Weblate (Romanian)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Spanish)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Sardinian)

Currently translated at 99.6% (509 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Catalan)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Turkish)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Russian)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Hindi)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (German)

Currently translated at 100.0% (511 of 511 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Romanian)

Currently translated at 98.6% (503 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Sardinian)

Currently translated at 99.8% (509 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Catalan)

Currently translated at 98.4% (502 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Romanian)

Currently translated at 100.0% (510 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Portuguese)

Currently translated at 99.2% (506 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (510 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Hindi)

Currently translated at 100.0% (510 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (510 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Turkish)

Currently translated at 100.0% (510 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Russian)

Currently translated at 100.0% (510 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (510 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Malay)

Currently translated at 98.2% (501 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (Spanish)

Currently translated at 100.0% (510 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (German)

Currently translated at 100.0% (510 of 510 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Sardinian)

Currently translated at 99.8% (506 of 507 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Turkish)

Currently translated at 100.0% (507 of 507 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Russian)

Currently translated at 100.0% (507 of 507 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (507 of 507 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Polish)

Currently translated at 95.4% (484 of 507 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pl/

Translated using Weblate (French)

Currently translated at 99.6% (505 of 507 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (French)

Currently translated at 99.6% (505 of 507 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (Spanish)

Currently translated at 100.0% (507 of 507 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Spanish)

Currently translated at 100.0% (507 of 507 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (Russian)

Currently translated at 100.0% (509 of 509 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (509 of 509 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

Translated using Weblate (Russian)

Currently translated at 100.0% (509 of 509 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (509 of 509 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Spanish)

Currently translated at 99.2% (505 of 509 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (German)

Currently translated at 100.0% (509 of 509 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Malay)

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (Czech)

Currently translated at 83.6% (421 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/cs/
2020-04-19 02:53:28 +02:00
0272907596 Avoid multiple reader instances (closes #1851) 2020-04-18 20:07:48 -04:00
321a4b24b9 Add confirm exist setting (closes #2615) 2020-04-18 20:05:31 -04:00
8a243ffb57 Include bookmark state when migrating chapters (closes #2729) 2020-04-18 19:40:50 -04:00
c2330fe3af Fix extension setting dialogs not handling duplicate keys (fixes #2876) 2020-04-18 19:32:52 -04:00
9876732875 Genre search from updates/history (closes #2893) 2020-04-18 19:11:47 -04:00
29e453c201 Minor style tweaks 2020-04-18 19:05:19 -04:00
6c14402992 Remove manga homescreen shortcuts 2020-04-18 16:06:31 -04:00
bdee525336 Lint fixes 2020-04-18 15:28:44 -04:00
fbf13efe74 Bump minimum extension lib and WebView versions 2020-04-18 14:51:20 -04:00
415df2357c JDK8, lint fixing (#2888)
* Use Kotlin JDK8

* Satisfy a ton of lints

* Run res/layout files (and manifest) through reformatter
2020-04-18 14:47:22 -04:00
4fc8800a37 Webtoon zoom out (#2892)
* Increased added support for zoom out on webtoons to help with horizontal layout reading

* Renamed var
2020-04-18 14:43:54 -04:00
6a532b836d Refactor databinding fields to parent abstract classes 2020-04-18 14:40:18 -04:00
31b94fd3ff Fix string key typo 2020-04-18 14:25:29 -04:00
fd733e819d More consistent card radii 2020-04-18 14:18:51 -04:00
7b6d52c613 Tweak outlined library icon more 2020-04-18 14:12:33 -04:00
df69559b39 Collapsable manga summary/genre section 2020-04-18 12:40:47 -04:00
e388f0d563 Round manga info cover 2020-04-18 11:59:22 -04:00
85e7b78b21 Fix for library tags not triggering search 2020-04-18 11:53:25 -04:00
42a97f8c40 Add function in interface to get list of genres 2020-04-18 11:36:05 -04:00
5cff247aa4 Tweak library icon (closes #2754) 2020-04-18 11:20:09 -04:00
f115691365 Revert attempted WebView process fix 2020-04-17 22:42:14 -04:00
deb66436cb Remove redundant call to set extension badge in bottom nav 2020-04-17 20:22:46 -04:00
b8152dd7f9 More FlowPreferences migrations 2020-04-17 20:15:33 -04:00
678c004a64 Add parent class for view configs 2020-04-17 20:10:29 -04:00
d9f44c1f7d Extension function instead of redefining uiScope everywhere 2020-04-17 20:06:33 -04:00
088160ed32 Extra genre chip text trimming 2020-04-17 19:51:57 -04:00
8de004d281 toggle reader menu if transition by tapping are disabled (#2887)
Co-authored-by: raslmenea.rm@gmail.com <xpuf4MQNzDtnaqR>
2020-04-17 18:35:04 -04:00
bcde4337ac Replace colorPrimaryDark with colorPrimaryVariant 2020-04-17 18:32:27 -04:00
401210da44 More FlowPreferences migrations 2020-04-17 18:30:05 -04:00
beb81b657e Migrate some RxSharedPreferences to FlowSharedPreferences 2020-04-17 09:28:58 -04:00
f7b3450d65 More rxbindings migration 2020-04-17 09:28:26 -04:00
29776c739a Use HTTPS for crash reports 2020-04-17 09:27:36 -04:00
bdf322ceb0 Mostly migrate rxbinding to Kotlin Flow version 2020-04-16 23:04:00 -04:00
fae763dbb0 Manga info action buttons 2020-04-16 22:16:15 -04:00
c0792522a4 Scrolling manga info view 2020-04-16 22:16:15 -04:00
c67e62bac3 Remove some relayed chapter info from main manga info view 2020-04-16 22:16:15 -04:00
9dc184adff Make immersive mode slightly more reliable on rotation 2020-04-16 22:00:10 -04:00
7118817df7 Move bitmap images to nodpi 2020-04-16 19:09:05 -04:00
287b83b6c6 Gradle and travis updates (#2881)
* Update gradle wrapper

* Update buildtools, kotlin, and a plugin

* Replace old NDK in travis
2020-04-16 17:23:02 -04:00
5d03eef051 Prevented overzealous preloading (#2882) 2020-04-16 17:22:44 -04:00
48f7b06549 Minor edits 2020-04-16 17:21:58 -04:00
4e111cebbe Update Acra 2020-04-15 22:57:34 -04:00
fe32332e2a Rename "Local manga" -> "Local source" 2020-04-14 17:48:06 -04:00
0bb6e1cdc2 Crash fixes 2020-04-14 17:13:45 -04:00
e67bb64311 Rounded library covers 2020-04-12 22:29:15 -04:00
9058536406 Use native fontFamily support for library titles 2020-04-12 22:22:26 -04:00
5bc9e1632a Remove unnecessary reader sheet backgrounds 2020-04-12 22:10:49 -04:00
a0a8899801 Tweak tracking card UI 2020-04-12 22:00:19 -04:00
Jay
aedb4749a2 Controllers now properly remove their toolbar items on pop (fixes #2864) 2020-04-12 12:34:56 -04:00
f52d49ad00 Replace some icons 2020-04-12 12:34:06 -04:00
a1e7592bd8 Rename catalogue classes/layouts -> source 2020-04-12 12:21:47 -04:00
c784d24fa6 Default reader theme to black 2020-04-12 11:32:02 -04:00
0375c0b2c5 Prioritize pinned sources in global search (closes #1739) 2020-04-11 11:46:05 -04:00
135e55fe27 Fix switch style in reader settings sheet (fixes #2784) 2020-04-11 11:29:55 -04:00
1ed291086a Hide filter FAB in source latest 2020-04-11 11:02:32 -04:00
f6e25627de Temporary workaround for chapter FAB being invisible 2020-04-10 23:55:18 -04:00
8fe79a1fb5 Add source pinning (closes #2322) 2020-04-10 18:38:24 -04:00
a1df78517f use explicit file url instead of download manager's content url (#2859) 2020-04-10 18:11:24 -04:00
92fa8d683a Remove maxWidth logic from SimpleNavigationView since it's not a sidebar anymore 2020-04-10 18:11:04 -04:00
df27138401 Fix webview back/forward button color 2020-04-10 18:07:23 -04:00
7c7d40ea44 Fix status/navigation bar colors (fixes #2858) 2020-04-10 18:07:09 -04:00
aa70be525d Add text to chapter FAB, shrink extended FABs on scroll 2020-04-10 15:39:28 -04:00
f7ac969a4a Fix for Filter.Select labels jumping on filter sheet reloading 2020-04-10 15:23:29 -04:00
4f5e52fdd4 Move search filter sheet actions to the top 2020-04-10 15:15:31 -04:00
5183848250 Add padding for catalogue filter FAB 2020-04-10 15:00:56 -04:00
69af1baf7a Use LinearLayout as root of main_activity
Was causing issues within catalogues when search was invoked
2020-04-10 14:49:21 -04:00
9a28cbc1e4 Use FAB for catalogue filter 2020-04-10 14:43:13 -04:00
c38b457ba0 Show open in webview menu icon if room 2020-04-10 14:41:24 -04:00
1a50f7062a Migrate to ViewBinding in ReaderActivity 2020-04-10 14:23:38 -04:00
8cfd80ba84 Move catalogue filters to bottom sheet 2020-04-10 14:23:27 -04:00
e5e14e1f9e Fix invisible back/forward webview icons in white them 2020-04-10 14:09:08 -04:00
6611464f73 Minor updates 2020-04-10 12:04:24 -04:00
51d93f0217 Open decode error pages in webview instead of browser 2020-04-10 11:49:51 -04:00
fdc7981d18 Tweak webtoon margin setting 2020-04-10 11:45:30 -04:00
a63d165dd3 Merge branch 'jleehey-feature/webtoon-margins' into pr/2349 2020-04-10 11:15:04 -04:00
145a744ce0 Merge branch 'feature/webtoon-margins' of git://github.com/jleehey/tachiyomi into jleehey-feature/webtoon-margins
# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderSettingsSheet.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonPageHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/util/preference/PreferenceDSL.kt
#	app/src/main/res/values/strings.xml
2020-04-10 11:14:09 -04:00
df625a998f Use colorSecondary for text field cursor (fixes #2853) 2020-04-10 10:43:39 -04:00
21c1a499ac Migrate to ViewBinding in WebviewActivity 2020-04-10 10:02:51 -04:00
9a81cabece Update Gradle 2020-04-10 09:57:46 -04:00
b50dc206eb Translated using Weblate (Turkish) (#2834)
Translations (Continuous)
2020-04-10 08:39:59 -04:00
9044760a10 Change color of 'last page read' in chapter description (#2855)
Change color of 'last page read' in chapter description
2020-04-10 08:37:58 -04:00
0b811773e1 Fix zh-rCN plural strings (#2847)
Fix zh-rCN plural strings
2020-04-10 08:34:37 -04:00
627a720d4b Migrate to ViewBinding from Kotlin synthetics in controllers 2020-04-08 23:06:28 -04:00
89d45e7775 [CI SKIP] Update issue_closer.yml 2020-04-08 19:39:41 -04:00
c0e6e03dc6 Create issue_closer.yml 2020-04-08 19:36:36 -04:00
05fd8e2a38 Add continuous vertical to default reader options 2020-04-07 22:51:39 -04:00
dd59748bf0 Minor cleanup 2020-04-07 22:44:37 -04:00
38ceaf5253 Add Continuous vertical reading mode (#2833)
* Add Continuous Vertical reader mode

* Remove separate webtoon padding option

(cherry picked from commit 3e7d15e51856297210e46e9f5bb0b8394067ce1a)

* Continuas vertical Lowercase v

(cherry picked from commit 515cca7d6704343eb9acb1a38a2bdcda01e7395a)
2020-04-07 22:35:43 -04:00
b2fba5083b Duplicate Hebrew strings on build for legacy locale code 2020-04-07 22:32:27 -04:00
be6a209fe9 Sort languages, add Hebrew 2020-04-07 22:15:47 -04:00
0f0305c602 Translated using Weblate (Turkish) (#2801)
Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Russian)

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Spanish)

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Romanian)

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Catalan)

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Vietnamese)

Currently translated at 98.6% (496 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/vi/

Translated using Weblate (Russian)

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Indonesian)

Currently translated at 98.6% (496 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

Translated using Weblate (German)

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Spanish)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Chinese (Traditional))

Currently translated at 78.4% (394 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hant/

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Russian)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Italian)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

Translated using Weblate (Italian)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

Translated using Weblate (Hindi)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (Spanish)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Sardinian)

Currently translated at 99.6% (500 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Catalan)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Tagalog)

Currently translated at 80.0% (402 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tl/

Translated using Weblate (Hebrew)

Currently translated at 90.6% (455 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/he/

Translated using Weblate (Swedish)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Spanish)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Arabic)

Currently translated at 93.6% (470 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ar/

Added translation using Weblate (Hebrew)

Translated using Weblate (Turkish)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Russian)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Romanian)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (German)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Arabic)

Currently translated at 89.2% (448 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ar/

Translated using Weblate (Arabic)

Currently translated at 85.6% (430 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ar/

Translated using Weblate (Arabic)

Currently translated at 85.6% (430 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ar/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (Catalan)

Currently translated at 100.0% (500 of 500 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Swedish)

Currently translated at 100.0% (500 of 500 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

Translated using Weblate (Russian)

Currently translated at 100.0% (500 of 500 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Romanian)

Currently translated at 100.0% (500 of 500 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (500 of 500 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (500 of 500 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Dutch)

Currently translated at 93.0% (465 of 500 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nl/

Translated using Weblate (French)

Currently translated at 100.0% (500 of 500 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (Spanish)

Currently translated at 100.0% (500 of 500 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (500 of 500 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (500 of 500 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Co-authored-by: Hosted Weblate <hosted@weblate.org>
2020-04-07 22:15:13 -04:00
d5350fd719 Tweak string comparison to account for length (fixes #2831) 2020-04-07 21:40:36 -04:00
ea75f63dfb Update library shortcut icon 2020-04-07 17:01:42 -04:00
de8e530b37 Update tracker icons 2020-04-07 16:58:08 -04:00
bff927c6eb close response before proceeding chain (#2832) 2020-04-07 06:41:05 -04:00
985bb44559 Add select inverse action 2020-04-05 15:55:35 -04:00
9c44cae5b8 Tweak dark theme snackbar (closes #2699) 2020-04-05 13:55:42 -04:00
6872455922 Perform catalogue search when genre tag is tapped 2020-04-04 12:10:00 -04:00
ce13a5152b Update issue templates 2020-04-04 10:21:19 -04:00
d7c13cc291 Perform local search when source is tapped from manga info 2020-04-04 10:10:00 -04:00
022c0746c0 Show error toast when extensions list fails to load 2020-04-03 22:54:52 -04:00
06c3f57f62 Cache source package icons 2020-04-03 21:39:55 -04:00
9da27cc56e Show extension icons in source filtering view (closes #2814) 2020-04-02 19:52:09 -04:00
92c5497eab Fix shortcuts popping up library sheet or duplicating controllers in backstack 2020-04-02 19:46:44 -04:00
Jay
f115fe47fe Using extension icon instead of letter for catalogues (closes #2261) 2020-04-01 23:03:20 -04:00
224f08279b Reword "Catalogues" to "Sources" for user-facing consistency 2020-04-01 22:42:08 -04:00
a3b660a2c9 Respect chapter list filtering when reading (closes #2810) 2020-04-01 22:37:28 -04:00
89df50da4e Update jsoup 2020-03-31 22:43:11 -04:00
cce3b3a559 Make migration manga-centric rather than source-centric (#2786) 2020-03-31 22:36:23 -04:00
f53cc10338 Translated using Weblate (Sardinian) (#2725)
Currently translated at 99.6% (499 of 501 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Catalan)

Currently translated at 100.0% (501 of 501 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Turkish)

Currently translated at 100.0% (501 of 501 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Russian)

Currently translated at 100.0% (501 of 501 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (German)

Currently translated at 100.0% (501 of 501 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Russian)

Currently translated at 98.6% (494 of 501 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (501 of 501 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Italian)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

Translated using Weblate (Hindi)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (Italian)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (Sardinian)

Currently translated at 99.6% (501 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Romanian)

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (French)

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.8% (502 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.8% (502 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.8% (502 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Malay)

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

Translated using Weblate (German)

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Turkish)

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Turkish)

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Turkish)

Currently translated at 99.8% (502 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Turkish)

Currently translated at 99.8% (502 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Turkish)

Currently translated at 99.4% (500 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Turkish)

Currently translated at 99.4% (500 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Sardinian)

Currently translated at 99.8% (502 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Marathi)

Currently translated at 4.9% (25 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/mr/

Translated using Weblate (Catalan)

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (German)

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (503 of 503 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Sardinian)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Finnish)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

Translated using Weblate (Hindi)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (Catalan)

Currently translated at 100.0% (502 of 502 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Slovak)

Currently translated at 88.5% (442 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sk/

Translated using Weblate (French)

Currently translated at 99.7% (498 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (Indonesian)

Currently translated at 100.0% (499 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

Translated using Weblate (Indonesian)

Currently translated at 100.0% (499 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

Translated using Weblate (French)

Currently translated at 99.7% (498 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (French)

Currently translated at 99.1% (495 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

Translated using Weblate (Indonesian)

Currently translated at 93.5% (467 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

Translated using Weblate (Indonesian)

Currently translated at 93.5% (467 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

Translated using Weblate (Indonesian)

Currently translated at 90.3% (451 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

Translated using Weblate (Indonesian)

Currently translated at 90.3% (451 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Translated using Weblate (Indonesian)

Currently translated at 85.5% (427 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

Translated using Weblate (Indonesian)

Currently translated at 85.5% (427 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

Translated using Weblate (Portuguese)

Currently translated at 100.0% (499 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

Translated using Weblate (Portuguese)

Currently translated at 100.0% (499 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

Translated using Weblate (Romanian)

Currently translated at 100.0% (499 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (499 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Spanish)

Currently translated at 100.0% (499 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (German)

Currently translated at 100.0% (499 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Spanish)

Currently translated at 100.0% (499 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Sardinian)

Currently translated at 100.0% (499 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

Translated using Weblate (Spanish)

Currently translated at 99.1% (495 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Turkish)

Currently translated at 100.0% (499 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

Translated using Weblate (Czech)

Currently translated at 85.9% (429 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/cs/

Co-authored-by: Hosted Weblate <hosted@weblate.org>
2020-03-31 09:28:05 -04:00
61fb4d584c Replace genre tags on refresh (fixes #2787) 2020-03-30 22:17:07 -04:00
b93e2ca4cf Remove unused string 2020-03-30 11:31:43 -04:00
325b3c6271 Fix multiple chapters notification grammar 2020-03-30 09:31:33 -04:00
859e9ca653 Add update library menu item 2020-03-29 16:43:00 -04:00
441e2a69d8 Minor edits 2020-03-29 16:41:14 -04:00
af937f2e31 Hide catalogue empty view properly (fixes #2783) 2020-03-29 16:20:48 -04:00
912629c2dc Replace TagGroup library with Material chips 2020-03-29 14:11:13 -04:00
879fa484f6 Remove dead code from DownloadQueue 2020-03-29 12:44:17 -04:00
e86103fdcc Tweak error button appearance 2020-03-29 12:10:36 -04:00
920ffa8c24 Add fast scroller to library 2020-03-28 17:17:28 -04:00
488f81ef74 Use bottom sheet for library settings 2020-03-28 17:17:21 -04:00
0a5461cbea Use pill icon instead of text for sheet pull up indicator 2020-03-28 16:32:34 -04:00
40c934c544 Revert "Move library display settings out of filter sidebar"
This reverts commit a0a077eaaa
2020-03-28 16:12:42 -04:00
bb43e2aa03 Show empty catalogue error view with actions 2020-03-28 15:57:50 -04:00
ed277357cf Bookmark via reader (closes #1413) 2020-03-28 14:38:47 -04:00
bf1fb8b7bd Limit foreground extension checks to once a day 2020-03-28 13:40:23 -04:00
e615cba9a5 Consistent "WebView" wording 2020-03-28 13:37:33 -04:00
8adabe1f74 Minor dependency updates 2020-03-28 13:37:25 -04:00
896b34d1a2 Prompt user to open WebView on HTTP errors 2020-03-24 18:19:15 -04:00
5fd1865504 Remove elevation overlay 2020-03-24 18:18:10 -04:00
0b318a19c6 Fix spacing in chapters notification 2020-03-24 13:14:36 -04:00
622d6c0cab Fix bottom nav background color (closes #2704) 2020-03-24 13:14:28 -04:00
3f4140900d Tweak button styles 2020-03-22 18:43:16 -04:00
b434bc93a3 Add fast scroller in catalogues/extensions lists 2020-03-22 12:43:53 -04:00
11529f2795 Add end pending for catalogues/extensions group header for RTL names 2020-03-22 12:43:42 -04:00
d86b030796 Add icon for mark previous as read 2020-03-22 12:22:47 -04:00
a7e4657752 Rename "Last updated" sort to "Last checked" 2020-03-21 14:41:46 -04:00
2f28fcba05 Update WorkManager 2020-03-20 23:01:03 -04:00
6da350aee6 Minor extension update cleanup, default to on 2020-03-20 22:59:59 -04:00
9585f9a1a6 Option to auto check for extension updates (#2680)
* Option to auto check for extension updates

* Addressing comments

* Added foreground check for extensions

* Added Extension Preference widget
2020-03-20 22:22:39 -04:00
fd4876be24 Tint chapter filter icon if filters are enabled 2020-03-18 18:15:53 -04:00
31e2fe6a4c Faulty preload fix (#2731)
* Condition for preload

* Added preload fix for webtoon viewer. Replaced incorrect last-page logic

* Requested refactoring

* Requested changes

* Requested changes
2020-03-18 09:45:22 -04:00
aa51968603 Manually fix zh-rCN plural strings (closes #2714) 2020-03-16 17:58:11 -04:00
a3336368e5 Use solid/outline check icon for mark as read/unread (closes #2719) 2020-03-16 17:55:53 -04:00
33c0c6ff3b Mostly revert back to old filled icons (#2723) 2020-03-16 17:55:53 -04:00
eaf37c828b Translated using Weblate (Hindi) (#2710)
Currently translated at 100.0% (499 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

Translated using Weblate (Catalan)

Currently translated at 100.0% (499 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Catalan)

Currently translated at 100.0% (499 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.7% (498 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.5% (491 of 493 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

Translated using Weblate (Spanish)

Currently translated at 100.0% (493 of 493 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Spanish)

Currently translated at 100.0% (493 of 493 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

Translated using Weblate (Malay)

Currently translated at 100.0% (499 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (Malay)

Currently translated at 100.0% (493 of 493 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Translated using Weblate (German)

Currently translated at 100.0% (499 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (German)

Currently translated at 100.0% (493 of 493 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

Translated using Weblate (Swedish)

Currently translated at 100.0% (499 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

Translated using Weblate (Swedish)

Currently translated at 100.0% (493 of 493 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (499 of 499 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (493 of 493 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

Translated using Weblate (Czech)

Currently translated at 86.8% (428 of 493 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/cs/

Co-authored-by: Hosted Weblate <hosted@weblate.org>
2020-03-16 17:54:54 -04:00
d65a8e84f0 Always recreate activity on light theme change (fixes #2720) 2020-03-16 17:27:55 -04:00
b000d96dd6 Fix catalogue display mode icon tint (fixes #2724) 2020-03-16 17:24:50 -04:00
cd867f800e Fix for perpetually loading chapters (#2718)
* Fix for perpetually loading chapters

* Removed page count check
2020-03-16 12:20:35 -04:00
124f0e7093 Minor dependency updates 2020-03-15 22:54:10 -04:00
fb897e37d1 Add download queue features from J2K fork 2020-03-15 22:42:40 -04:00
3e5a48e5e4 Use actual dialog title for tracker login dialogs 2020-03-15 17:31:36 -04:00
3f88a67865 Fix webview close button tinting 2020-03-15 16:52:27 -04:00
ef0b546d4c Replace more icons 2020-03-15 16:46:38 -04:00
088f8b8b54 Changed default pager zoom style to ZOOM_FOCUS_CENTER (#2713)
Changed default pager zoom style to ZOOM_FOCUS_CENTER
2020-03-15 16:02:40 -04:00
1ebcafb25d Fix focused text input stroke color (fixes #2703) 2020-03-15 12:58:48 -04:00
90396153f4 Tweak tab indicator style 2020-03-15 12:56:00 -04:00
0fa93cf615 Left-over batch of translations (#2709)
* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (490 of 490 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (490 of 490 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

* Translated using Weblate (German)

Currently translated at 100.0% (490 of 490 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Malay)

Currently translated at 100.0% (490 of 490 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

* Translated using Weblate (Hindi)

Currently translated at 100.0% (490 of 490 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (493 of 493 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

Co-authored-by: Alessandro Jean <alessandrojean@gmail.com>
Co-authored-by: Eduard Ereza Martínez <eduard@ereza.cat>
Co-authored-by: Yassin El Aoud <yassinelaoud@gmail.com>
Co-authored-by: DarKCroX <darkcrox.2020@outlook.com>
Co-authored-by: darkbeast13 <nikhil15mps@gmail.com>
2020-03-15 12:54:47 -04:00
15a7a2b0ea Translations (Continuous) (#2679)
* Translated using Weblate (Czech)

Currently translated at 87.4% (426 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/cs/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (487 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (487 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

* Translated using Weblate (Malay)

Currently translated at 100.0% (487 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (487 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

* Translated using Weblate (Sardinian)

Currently translated at 100.0% (487 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (487 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (487 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (488 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

* Translated using Weblate (Malay)

Currently translated at 100.0% (488 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (488 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

* Translated using Weblate (German)

Currently translated at 100.0% (488 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (488 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

* Translated using Weblate (Sardinian)

Currently translated at 100.0% (488 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

* Translated using Weblate (Hindi)

Currently translated at 100.0% (488 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (488 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (488 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

* Translated using Weblate (German)

Currently translated at 100.0% (488 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (488 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

* Translated using Weblate (German)

Currently translated at 100.0% (488 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (488 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

* Translated using Weblate (German)

Currently translated at 100.0% (488 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Chinese (Traditional))

Currently translated at 82.1% (401 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hant/

* Translated using Weblate (Chinese (Traditional))

Currently translated at 82.1% (401 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hant/

* Translated using Weblate (Malay)

Currently translated at 99.7% (487 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

* Translated using Weblate (Swedish)

Currently translated at 100.0% (488 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (488 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

* Translated using Weblate (Malay)

Currently translated at 100.0% (488 of 488 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Co-authored-by: Alessandro Jean <alessandrojean@gmail.com>
Co-authored-by: anonymous <noreply@weblate.org>
Co-authored-by: DarKCroX <darkcrox.2020@outlook.com>
Co-authored-by: monolifed <monolifed@protonmail.com>
Co-authored-by: Ajeje Brazorf <lmelonimamo@yahoo.it>
Co-authored-by: Rostyslav <info@ubilling.net.ua>
Co-authored-by: Eduard Ereza Martínez <eduard@ereza.cat>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Yassin El Aoud <yassinelaoud@gmail.com>
Co-authored-by: darkbeast13 <nikhil15mps@gmail.com>
Co-authored-by: Xiang Xu <spice2wolf@gmail.com>
Co-authored-by: Wenlin Shen <extended.wl@gmail.com>
Co-authored-by: Simon Mattila <simon.mattila@protonmail.com>
Co-authored-by: Lyaiya <hipsnafoha@outlook.com>
2020-03-15 12:10:51 -04:00
446c254bc8 Use immersive sticky flag when hiding reader UI (closes #2705) 2020-03-15 11:56:55 -04:00
e41edc1fb7 Pure white light theme 2020-03-15 11:36:38 -04:00
738f776d36 Filled icons in bottom nav when selected 2020-03-15 11:13:24 -04:00
e77db309b8 Move filter icon tint color to resources 2020-03-15 11:05:11 -04:00
a6c1de1cb2 Replace more icons 2020-03-14 16:04:14 -04:00
ace54f8175 Use outlined icons in settings 2020-03-14 15:46:36 -04:00
d7043bcaeb Use outlined icons in bottom nav and more controller 2020-03-14 14:00:07 -04:00
04bbc764a0 Match status/nav bar color with toolbar 2020-03-14 13:42:41 -04:00
91f7056767 Bump updates/history limit to 3 months (closes #2702) 2020-03-14 13:33:45 -04:00
8299093bf8 Add dev notice about background jobs, move dialog titles for localization 2020-03-13 18:27:49 -04:00
a0dffcf51f Address some build warnings 2020-03-13 18:23:07 -04:00
b3daf7d760 Replace deprecated Gson JsonParser usages 2020-03-13 18:16:38 -04:00
724e1d33b6 Ensure background jobs are recreated after next stable update 2020-03-13 17:29:51 -04:00
9deaff9181 Dark snackbar in dark themes (fixes #2699) 2020-03-12 20:12:48 -04:00
b9ea6e8d96 Fix common toolbar popup menu text color (fixes #2695) 2020-03-12 19:14:43 -04:00
231771e16c Prune inherited/add missing base theme attributes 2020-03-12 18:59:42 -04:00
5b8308b3d2 Fix list divider color in dark themes 2020-03-12 18:59:13 -04:00
f91f9c4862 Remove letter spacing from buttons (fixes #2696) 2020-03-12 18:58:21 -04:00
24b848faac Fix reader background color (fixes #2694) 2020-03-12 18:27:19 -04:00
7d0ea614da Migrate to MaterialComponents themes 2020-03-11 22:59:37 -04:00
2615b067e2 Flip mark as (un)read icons back 2020-03-11 19:53:58 -04:00
cd1abb60d7 Fix overlapping shadow in history controller 2020-03-11 18:27:54 -04:00
436ec0ced7 Remove unused colors 2020-03-10 22:53:59 -04:00
937fb85376 Use accent color for refresh circle 2020-03-10 22:53:49 -04:00
a405324907 Simplify track item layout to use LinearLayout instead of nested ConstraintLayouts 2020-03-10 21:17:39 -04:00
fba55711f2 Flip bookmark icons to match manga favoriting 2020-03-10 21:14:13 -04:00
208552f0b4 Tweak compact tracker card design 2020-03-10 21:13:55 -04:00
c7cdb950ce Simplify viewer check 2020-03-10 18:23:14 -04:00
921169b3ad Fix sheet pager setting visibility when default is webtoon 2020-03-09 19:51:38 -04:00
d7d3731567 Random kaomoji for empty view 2020-03-09 19:47:12 -04:00
d5ff5fd6f8 More consistent usage of visibility extensions 2020-03-09 18:42:41 -04:00
e195257d2a Update visible pager settings on change (fixes #2143) 2020-03-09 17:07:08 -04:00
466ec7b962 Compact tracker card 2020-03-09 16:27:23 -04:00
8bfe59c8a8 Change new chapters string key (closes #2686) 2020-03-09 16:03:57 -04:00
de512216c4 Start preloading next chapter if within last 3 pages instead of last page 2020-03-09 15:09:17 -04:00
9936b402a6 Added config to hide transition page when not needed (#2682)
* Added config to hide transition page when not needed

* Moved always_show_chapter_transition setting to General group
2020-03-09 14:36:29 -04:00
bd2dfaad2e Add an UserAgent Interceptor to Cloudflare Client (#2685) 2020-03-09 14:10:10 -04:00
8e539bebea Add (disabled) dependency on LeakCanary for debugging memory leaks 2020-03-09 14:04:16 -04:00
022cde2c00 Fix secure screen option subscription memory leak 2020-03-09 14:03:47 -04:00
572f58a3a4 Update Kotlin and coroutines 2020-03-09 13:51:14 -04:00
07e2bdac81 Fix bug where status cannot be updated when all chapters have been read. (#2683)
Minor cleanup.
2020-03-09 11:32:59 -04:00
fb00929ee9 Minor cleanup 2020-03-08 22:38:38 -04:00
fb5da15746 Fix Cloudflare Interceptor when User-Agent is Empty (#2677) 2020-03-08 22:34:57 -04:00
48363aa3b0 Fix library empty view alignment 2020-03-08 20:48:44 -04:00
090a7794b5 Hide download/delete actions when sensible, make bookmark/read toggle actions 2020-03-08 17:42:50 -04:00
c63d8e7a30 Bottom action menu in chapters list 2020-03-08 17:37:42 -04:00
d6ea69a115 Action toolbar code cleanup 2020-03-08 17:23:26 -04:00
4358f9fd2a Translations (Continuous) (#2644)
* Translated using Weblate (Czech)

Currently translated at 89.7% (429 of 478 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/cs/

* Translated using Weblate (German)

Currently translated at 99.3% (475 of 478 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Malay)

Currently translated at 100.0% (478 of 478 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

* Translated using Weblate (Swedish)

Currently translated at 99.1% (474 of 478 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (478 of 478 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (478 of 478 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

* Translated using Weblate (Dutch)

Currently translated at 99.7% (477 of 478 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nl/

* Translated using Weblate (Hindi)

Currently translated at 100.0% (478 of 478 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

* Translated using Weblate (Finnish)

Currently translated at 98.5% (471 of 478 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

* Translated using Weblate (German)

Currently translated at 100.0% (478 of 478 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Italian)

Currently translated at 100.0% (478 of 478 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 98.5% (471 of 478 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (478 of 478 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

* Translated using Weblate (German)

Currently translated at 100.0% (478 of 478 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (478 of 478 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (German)

Currently translated at 100.0% (478 of 478 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Swedish)

Currently translated at 100.0% (478 of 478 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

* Translated using Weblate (Sardinian)

Currently translated at 100.0% (478 of 478 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

* Translated using Weblate (Portuguese)

Currently translated at 100.0% (478 of 478 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (481 of 481 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (482 of 482 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (482 of 482 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

* Translated using Weblate (Malay)

Currently translated at 100.0% (482 of 482 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

* Translated using Weblate (Sardinian)

Currently translated at 100.0% (482 of 482 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

* Added translation using Weblate (Urdu (Pakistan))

* Translated using Weblate (Urdu (Pakistan))

Currently translated at 8.9% (43 of 482 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ur_PK/

* Translated using Weblate (German)

Currently translated at 100.0% (482 of 482 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Japanese)

Currently translated at 95.0% (458 of 482 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ja/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (482 of 482 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (482 of 482 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (482 of 482 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

* Translated using Weblate (German)

Currently translated at 100.0% (482 of 482 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (484 of 484 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

* Translated using Weblate (German)

Currently translated at 100.0% (484 of 484 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Sardinian)

Currently translated at 100.0% (484 of 484 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (484 of 484 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (484 of 484 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (484 of 484 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (484 of 484 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (484 of 484 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (484 of 484 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (Malay)

Currently translated at 100.0% (484 of 484 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 96.9% (469 of 484 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

* Translated using Weblate (Finnish)

Currently translated at 98.9% (479 of 484 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

* Translated using Weblate (French)

Currently translated at 100.0% (484 of 484 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

* Translated using Weblate (Arabic)

Currently translated at 88.0% (426 of 484 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ar/

* Translated using Weblate (Arabic)

Currently translated at 88.0% (426 of 484 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ar/

* Translated using Weblate (Tagalog)

Currently translated at 84.5% (409 of 484 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tl/

* Translated using Weblate (Romanian)

Currently translated at 93.8% (454 of 484 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

* Translated using Weblate (German)

Currently translated at 100.0% (487 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (487 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

* Translated using Weblate (Hindi)

Currently translated at 100.0% (487 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

* Translated using Weblate (French)

Currently translated at 100.0% (487 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 91.7% (447 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nb_NO/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (487 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

* Translated using Weblate (Swedish)

Currently translated at 100.0% (487 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

* Translated using Weblate (Finnish)

Currently translated at 99.7% (486 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

* Translated using Weblate (German)

Currently translated at 100.0% (487 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (French)

Currently translated at 100.0% (487 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (487 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

* Translated using Weblate (Serbian)

Currently translated at 75.3% (367 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sr/

* Translated using Weblate (Finnish)

Currently translated at 100.0% (487 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

* Translated using Weblate (Malay)

Currently translated at 100.0% (487 of 487 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

Co-authored-by: Michael Fleischer <michaelfleischer81@gmail.com>
Co-authored-by: DarKCroX <darkcrox.2020@outlook.com>
Co-authored-by: Simon Mattila <simon.mattila@protonmail.com>
Co-authored-by: Alessandro Jean <alessandrojean@gmail.com>
Co-authored-by: Eduard Ereza Martínez <eduard@ereza.cat>
Co-authored-by: Niko Strijbol <strijbol.niko@gmail.com>
Co-authored-by: darkbeast13 <nikhil15mps@gmail.com>
Co-authored-by: Topi <topi@harjunpaa.fi>
Co-authored-by: Cioccolata#8582 <yassinelaoud@gmail.com>
Co-authored-by: Manuel Tassi <manueltassi91@gmail.com>
Co-authored-by: Lyaiya <hipsnafoha@outlook.com>
Co-authored-by: monolifed <monolifed@protonmail.com>
Co-authored-by: Credits125Cre <credits125@gmail.com>
Co-authored-by: Ajeje Brazorf <lmelonimamo@yahoo.it>
Co-authored-by: Rafael Oliveira <rafaeljo.14@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Sillysack Bottowski <sillysack69@gmail.com>
Co-authored-by: Ken Swenson <flat@esoteric.moe>
Co-authored-by: Rostyslav <info@ubilling.net.ua>
Co-authored-by: anonymous <noreply@weblate.org>
Co-authored-by: Olivier Pagnier <olivier.charpolles@gmail.com>
Co-authored-by: Maisara Ahmad <mailomaysara@gmail.com>
Co-authored-by: Danzel James Viana <jamesviana99@gmail.com>
Co-authored-by: Dobre Iulian <dragos_dobre2002@yahoo.com>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Tasa <mladenovicatanasije@gmail.com>
2020-03-08 15:55:09 -04:00
af2ef36d68 Bottom action menu in library 2020-03-08 15:50:07 -04:00
316211372c Tweak how bottom action menu is configured 2020-03-08 15:38:42 -04:00
29a2d41331 Fix chapter list item end padding 2020-03-08 15:21:16 -04:00
9f8046324d Abstract bottom action menu code to main activity 2020-03-08 13:57:50 -04:00
af05c34da3 Bottom action menu for updates 2020-03-08 12:16:17 -04:00
a4410f3a02 Remove unnecessary lint suppression 2020-03-07 23:01:49 -05:00
4503199d25 Shorten "Remove bookmark" to "Unbookmark" 2020-03-07 23:01:15 -05:00
c275adbb91 Remove chapter item popup menu 2020-03-07 23:00:29 -05:00
4061232fe3 Remove chapter updates popup menu 2020-03-07 22:46:13 -05:00
507471e318 Label Kitsu login field as email address instead of username 2020-03-07 22:19:45 -05:00
f0f613e2cf Reorder start screen options to match bottom nav 2020-03-07 18:01:37 -05:00
0ec8def0d8 Avoid passing max chapter number from tracker (fixes #2131) 2020-03-07 18:01:26 -05:00
fbaaed1516 Match status/nav bar to reader toolbar color 2020-03-07 17:08:11 -05:00
152c196c65 Fix some changelog wording 2020-03-07 17:02:03 -05:00
e4dc84a5d8 Minor lint fixes 2020-03-07 17:01:53 -05:00
5fb3b0e0e3 Show page number only when toolbar is hidden (#2601)
* Show pagenumber only when toolbar is hidden

* Fix fullscreen issue

* Remove unneeded dependency

* Fix menubar padding

* Revert ReaderSeekBar height

* Refine code

Co-authored-by: arkon <arkon@users.noreply.github.com>
2020-03-07 16:57:14 -05:00
2854fb5f6c Add shortcut to disabling battery optimization 2020-03-07 15:51:46 -05:00
a9adb2f1a2 Page # before scanlator in chapters list 2020-03-07 15:42:55 -05:00
51383afd50 Revert DialogController syncing change 2020-03-07 15:37:16 -05:00
10bdde4459 Document changes to date for stable changelog
cmd: git log v0.8.4..HEAD --reverse --oneline --format=format:%s | pbcopy
2020-03-07 15:36:58 -05:00
4b02ecd6e8 Fix activity UI state when activity is killed (closes #2547) 2020-03-07 13:40:43 -05:00
b84638ac5a Fix chapter description and download badge overlap 2020-03-07 13:28:27 -05:00
79f2882aaf Remove unused layout 2020-03-07 13:28:02 -05:00
1c978f64b1 Tweak saved filename byte size limiting logic
Based on comment from 6940ad3fd9
2020-03-07 13:15:35 -05:00
5e9496ef36 Enable app auto update by default 2020-03-07 13:11:02 -05:00
8b6268966e Pass context to get WorkManager instance 2020-03-07 13:06:06 -05:00
52434819c3 Add history date section headers 2020-03-06 23:14:30 -05:00
29eb87b7ef Rename recently read / recent updates classes/layouts to match new names 2020-03-06 22:55:44 -05:00
c38026886a Combine chapter date/scanlator lines 2020-03-06 22:46:21 -05:00
63e330b83d Use recognized chapter number boolean field for filter 2020-03-06 22:44:55 -05:00
164da0fd9f Hide bottom nav on non-root controllers 2020-03-06 22:14:24 -05:00
e30b1de100 Linting fixes: extend AppCompat classes 2020-03-04 22:37:15 -05:00
6940ad3fd9 Limit saved page filenames to 127 characters (fixes #2638) 2020-03-04 22:33:16 -05:00
8ae15141f6 Move security settings to separate section 2020-03-04 22:32:45 -05:00
89007923c7 Update Firebase 2020-03-04 22:32:28 -05:00
4c10b9844b Change catalogue hiding dialog to accommodate more options in the future 2020-03-04 19:06:24 -05:00
f3d69599aa Add setting to hide manga content from update/download notifications 2020-03-04 18:55:19 -05:00
fc8f91baec Update WorkManager 2020-03-04 18:43:54 -05:00
853bf3065a Minor code cleanup 2020-03-03 19:40:57 -05:00
8d712c81d4 Tweak manga favoriting logic
Fixes #2192 and #2489
2020-03-03 19:34:17 -05:00
aa0597da2a Use proper AndroidX WorkManager dependencies 2020-03-03 18:42:10 -05:00
a29f33020d Basic implementation of hiding catalogue by long pressing 2020-03-02 22:49:48 -05:00
9eb441ac44 Update versions plugin 2020-03-02 22:21:54 -05:00
10e7c96379 Revert "Remove unused Google Play Services plugin"
This reverts commit 5bc0dfd616.
2020-03-02 22:17:54 -05:00
6c474daacd Update Proguard rules
- Keep everything in Tachiyomi package (for extensions)
- Remove SnakeYaml
2020-03-02 21:45:16 -05:00
bb7ed73743 Reenable Proguard 2020-03-02 21:44:35 -05:00
ea749d69a3 Bump up max JVM heap size for project 2020-03-02 21:26:28 -05:00
5bc0dfd616 Remove unused Google Play Services plugin 2020-03-02 21:25:55 -05:00
fef34dfe82 Tweak new chapters notification wording 2020-03-02 20:20:01 -05:00
a3dd5c1e92 Tweak WorkManager task cancellation, add flex times 2020-03-02 19:04:57 -05:00
d873d653d0 Migrate to WorkManager 2020-03-01 13:22:16 -05:00
d9934ad8db Minor wording tweaks 2020-03-01 10:35:15 -05:00
26e5364aea Spelling: Log in, out, marked noun, small versals (#2621)
* Spelling: Log in, out, marked noun, small versals

* Spelling: Reverted changes, consistency
2020-03-01 10:34:16 -05:00
91451111a2 Update android-job library 2020-03-01 10:33:39 -05:00
b104bec49d Translations (Continuous) (#2575)
* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

* Translated using Weblate (Czech)

Currently translated at 95.6% (435 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/cs/

* Translated using Weblate (Spanish)

Currently translated at 98.5% (448 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (455 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

* Translated using Weblate (Sardinian)

Currently translated at 99.6% (453 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (455 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 97.8% (445 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

* Translated using Weblate (German)

Currently translated at 100.0% (455 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Czech)

Currently translated at 96.3% (438 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/cs/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (455 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

* Translated using Weblate (German)

Currently translated at 100.0% (455 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (German)

Currently translated at 100.0% (455 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Polish)

Currently translated at 100.0% (455 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pl/

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (455 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/bg/

* Translated using Weblate (Swedish)

Currently translated at 96.4% (439 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

* Translated using Weblate (French)

Currently translated at 91.6% (417 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

* Translated using Weblate (Japanese)

Currently translated at 98.4% (448 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ja/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 99.7% (454 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (455 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

* Translated using Weblate (Russian)

Currently translated at 100.0% (455 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 99.7% (454 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (455 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

* Translated using Weblate (Malay)

Currently translated at 100.0% (455 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

* Translated using Weblate (Spanish)

Currently translated at 99.1% (451 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (Finnish)

Currently translated at 100.0% (455 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

* Translated using Weblate (Czech)

Currently translated at 96.4% (439 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/cs/

* Translated using Weblate (German)

Currently translated at 100.0% (455 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 97.1% (442 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nb_NO/

* Translated using Weblate (French)

Currently translated at 95.8% (436 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

* Translated using Weblate (German)

Currently translated at 100.0% (455 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Tagalog)

Currently translated at 90.7% (413 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tl/

* Translated using Weblate (Romanian)

Currently translated at 100.0% (455 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

* Translated using Weblate (Swedish)

Currently translated at 99.7% (454 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

* Translated using Weblate (German)

Currently translated at 100.0% (455 of 455 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

* Translated using Weblate (Swedish)

Currently translated at 100.0% (476 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (476 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

* Translated using Weblate (Sardinian)

Currently translated at 99.3% (473 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

* Translated using Weblate (Finnish)

Currently translated at 97.8% (466 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

* Translated using Weblate (German)

Currently translated at 100.0% (476 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Hindi)

Currently translated at 100.0% (476 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (476 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

* Translated using Weblate (Swedish)

Currently translated at 100.0% (476 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

* Translated using Weblate (Turkish)

Currently translated at 99.5% (474 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

* Translated using Weblate (Russian)

Currently translated at 100.0% (476 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (476 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

* Translated using Weblate (German)

Currently translated at 100.0% (476 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Malay)

Currently translated at 100.0% (476 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (476 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (Italian)

Currently translated at 81.9% (390 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

* Translated using Weblate (German)

Currently translated at 100.0% (476 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Malay)

Currently translated at 100.0% (476 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (476 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Added translation using Weblate (Marathi)

* Translated using Weblate (Marathi)

Currently translated at 1.8% (9 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/mr/

* Translated using Weblate (German)

Currently translated at 100.0% (476 of 476 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

Co-authored-by: Weblate (bot) <hosted@weblate.org>
Co-authored-by: Edgar Mejía <edgar13155@gmail.com>
Co-authored-by: monolifed <6624464+monolifed@users.noreply.github.com>
Co-authored-by: asereze <asereze@users.noreply.github.com>
Co-authored-by: Alessandro Jean <alessandrojean@gmail.com>
Co-authored-by: Sak94664 <hdudhhhdh@gmail.com>
Co-authored-by: hiyajou <45209212+hiyajou@users.noreply.github.com>
Co-authored-by: M4sy <37509263+M4sy@users.noreply.github.com>
Co-authored-by: Eduard Ereza Martínez <eduard@ereza.cat>
Co-authored-by: Jendrej <ejjendrej@gmail.com>
Co-authored-by: Matey Krastev <matey_krastev2@abv.bg>
Co-authored-by: Simon M. <simon.mattila@protonmail.com>
Co-authored-by: Uzuki Shimamura <1733849+UShimamura@users.noreply.github.com>
Co-authored-by: DarKCroX <darkcrox.2020@outlook.com>
Co-authored-by: nik xx <52054436+nicoxyz@users.noreply.github.com>
Co-authored-by: Topi Harjunpää <topi@harjunpaa.fi>
Co-authored-by: ifox11 <55803449+ifox11@users.noreply.github.com>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Samuel <kazuhiro47@yahoo.fr>
Co-authored-by: mr26th <39794898+mr26th@users.noreply.github.com>
Co-authored-by: f0roots <41129381+f0roots@users.noreply.github.com>
Co-authored-by: darkbeast13 <32981566+darkbeast13@users.noreply.github.com>
Co-authored-by: Pavka <pavel-mosein@yandex.ru>
Co-authored-by: Credits125 <48494748+Credits125@users.noreply.github.com>
Co-authored-by: Prachi Joshi <josprachi@yahoo.com>
Co-authored-by: Ankit Singh <as280093@gmail.com>
2020-02-29 17:58:03 -05:00
0ac33b64b1 Merge branch '0.8.x'
# Conflicts:
#	app/build.gradle
#	app/src/main/java/eu/kanade/tachiyomi/data/backup/models/Backup.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/database/queries/TrackQueries.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/track/TrackManager.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/track/TrackService.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistInterceptor.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/OAuth.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/OAuth.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/OAuth.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/OAuth.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/Shikimori.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdaterJob.kt
#	app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubApi.kt
#	app/src/main/java/eu/kanade/tachiyomi/network/AndroidCookieJar.kt
#	app/src/main/java/eu/kanade/tachiyomi/network/CloudflareInterceptor.kt
#	app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt
#	app/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt
#	app/src/main/java/eu/kanade/tachiyomi/network/ProgressListener.kt
#	app/src/main/java/eu/kanade/tachiyomi/network/ProgressResponseBody.kt
#	app/src/main/java/eu/kanade/tachiyomi/network/Requests.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/CatalogueSource.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/Source.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/model/Filter.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/model/FilterList.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/model/MangasPage.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/model/Page.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/model/SChapter.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/model/SChapterImpl.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/model/SManga.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/model/SMangaImpl.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/online/HttpSource.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/online/HttpSourceFetcher.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/online/LoginSource.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/online/ParsedHttpSource.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/base/controller/NucleusController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/base/presenter/NucleusConductorDelegate.java
#	app/src/main/java/eu/kanade/tachiyomi/ui/base/presenter/NucleusConductorLifecycleListener.java
#	app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/filter/SortGroup.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchCardAdapter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchCardHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/global_search/CatalogueSearchCardItem.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/ChangeMangaCategoriesDialog.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/DeleteLibraryMangasDialog.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryAdapter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryAdapter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryGridHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryItem.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryListHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryNavigationView.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySort.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/main/ChangelogDialogController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChapterItem.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersAdapter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersPresenter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/DeleteChaptersDialog.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/DeletingChaptersDialog.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/DownloadChaptersDialog.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/SetDisplayModeDialog.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/SetSortingDialog.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoPresenter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/SetTrackChaptersDialog.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/SetTrackScoreDialog.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/SetTrackStatusDialog.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackAdapter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackPresenter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSearchAdapter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackSearchDialog.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/more/AboutController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/HttpPageLoader.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChaptersController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsGeneralController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsMainController.kt
#	app/src/main/java/eu/kanade/tachiyomi/widget/ExtendedNavigationView.kt
#	app/src/main/res/drawable/ic_book_white_24dp.xml
#	app/src/main/res/layout/categories_controller.xml
#	app/src/main/res/layout/chapters_controller.xml
#	app/src/main/res/layout/navigation_view_checkbox.xml
#	app/src/main/res/layout/navigation_view_group.xml
#	app/src/main/res/layout/pref_item_source.xml
#	app/src/main/res/layout/reader_activity.xml
#	app/src/main/res/layout/track_item.xml
#	app/src/main/res/values/strings.xml
#	build.gradle
2020-02-29 17:52:49 -05:00
82141cec6e Release 0.8.5 2020-02-29 16:42:11 -05:00
218313428f Add warning on update check for Android 4.x users 2020-02-29 16:30:40 -05:00
44b47b49bc Hide null file path on backup creation (closes #1515)
(cherry picked from commit 48d9ad00e1)
2020-02-29 16:24:19 -05:00
2f69317f5d Enforce maximum extension lib version of 1.2 2020-02-29 13:35:07 -05:00
e1eff7b744 Remove FAB animation files left over from bad cherry picking 2020-02-29 13:23:42 -05:00
3aa12281c3 Avoid crash on loading invalid extension
(cherry picked from commit 460fbb18c7)
2020-02-29 13:19:50 -05:00
72920130c0 CloudflareInterceptor update (#2537) dcd3c709 Mike <51273546+SnakeDoc83@users.noreply.github.com> Jan 25, 2020 at 16:37 2020-02-29 13:17:12 -05:00
0fd00331e1 Directly pass read chapter when updating tracker
(cherry picked from commit b642e019e8)
2020-02-29 13:13:49 -05:00
7a4763ee68 minor reader bugs: (#2491)
- fix preload on last page for R2L reader
 - page 3 bug

(cherry picked from commit 8b0458cdf6)
2020-02-29 13:12:31 -05:00
Jay
647a78b791 Build time now opens changelog
(cherry picked from commit 22bb3463593c060405694da39a0eb1f5ca1d6ba1)
(cherry picked from commit d1db9fb659)
2020-02-29 13:12:21 -05:00
82faa91ce3 Tweak reader seekbar height for Android 5 UI bug (closes #2487)
(cherry picked from commit 81418a7712)
2020-02-29 13:12:04 -05:00
ad664dfb9f Remove clickable attributes from unclickable text in reader
(cherry picked from commit d4c25359bd)
2020-02-29 13:11:58 -05:00
005ac9e732 fix bangumi track will override record to 0 after every track search(bind) (#2486)
* fix bangumi track : the update status api must be called before update chapter api

* fix bangumi track will override record to 0 after every track search(bind)

(cherry picked from commit 427d2fed8c)
2020-02-29 13:11:50 -05:00
d8e3fe542d Remove unused FAB animations
(cherry picked from commit ab2bdfc508)
2020-02-29 13:11:43 -05:00
c40e4f6c5a Provide more human readable error when downloading to invalid directory (#2462)
(cherry picked from commit 13a2d3dfdd)
2020-02-29 13:10:55 -05:00
9bb3195bca Remove up/down animation for FAB, add list padding (#2456) e411f542 arkon <arkon@users.noreply.github.com> Jan 8, 2020 at 21:33 2020-02-29 13:10:25 -05:00
eee0bc4985 Remove unused color resource
(cherry picked from commit ea226a1697)
2020-02-29 13:09:06 -05:00
a24d670f54 Made 'Default' category selectable in global update settings (#2318)
(cherry picked from commit b55814a1c0)
2020-02-29 13:08:51 -05:00
51e049ab78 fix bangumi tracker crash in searching english manga title (#2452) eb5382e0 mutsumi <4182301+mutsumi63@users.noreply.github.com> Jan 6, 2020 at 20:02 2020-02-29 13:08:41 -05:00
01e37dfab8 Remove repository for Conductor snapshot (#2441)
(cherry picked from commit 39d509a756)
2020-02-29 13:07:47 -05:00
74087edebb match transition text used by other readers (#2439) 708525ef Carlos <cargo8005@gmail.com> Jan 5, 2020 at 17:59 2020-02-29 13:07:35 -05:00
db58c9b77f fix DOWNLOADED text showing after chapters are marked as read (#2434) df14e6d4 Carlos <cargo8005@gmail.com> Jan 5, 2020 at 16:36 2020-02-29 13:06:41 -05:00
c4dad1c20b Unix line endings 2020-02-29 13:03:29 -05:00
cae04656b9 Improve Loading Speed When Skipping Pages in a Chapter (#2426)
* cancel queued loads when the page that requested the queue is destroyed

* use page.status for optimizing removal

(cherry picked from commit dd1e6402c9)
2020-02-29 12:59:37 -05:00
6586c4e387 Remove unused icon 2020-02-27 22:50:50 -05:00
4e60a81b36 Remove unused LoginSource 2020-02-27 22:43:48 -05:00
464b4b18a4 Reword unlock string 2020-02-27 22:34:57 -05:00
e5c0969047 Change system dark mode check
User on Discord reported setting wasn't working on his devices.
2020-02-27 19:56:04 -05:00
ab0d144300 Remove unused navigation header dimens 2020-02-27 19:51:27 -05:00
ac3823e10a Add ripple to menu icons
Supersedes https://github.com/inorichi/tachiyomi/pull/2612
2020-02-27 18:58:36 -05:00
d3a4126e27 Tweak more screen to remove top padding 2020-02-27 18:34:28 -05:00
3a62acc54d More preference grouping 2020-02-27 18:34:14 -05:00
bf8268adc4 Always show bottom nav labels 2020-02-27 18:30:51 -05:00
7d4f25b354 Add description for secure screen setting 2020-02-26 18:58:13 -05:00
0f2d480036 More linting fixes 2020-02-26 18:12:44 -05:00
043e3784e8 Run linter 2020-02-26 18:03:34 -05:00
58ab06b4f8 add ktlint (#2633) 2020-02-26 18:00:51 -05:00
11544fe8ef Migrate to bottom navigation 2020-02-25 22:31:54 -05:00
8776a45ee9 Add shortcut to manage app notifications 2020-02-25 18:32:49 -05:00
a7bb059096 Update lifecycle library 2020-02-25 18:32:11 -05:00
ba8977b47f Update Gradle 2020-02-25 18:31:41 -05:00
032a6adaab Rename/new icons for updates/history sections 2020-02-23 22:03:34 -05:00
460fbb18c7 Avoid crash on loading invalid extension 2020-02-23 21:51:55 -05:00
978ac50015 Move crash reports setting to advanced 2020-02-23 16:23:21 -05:00
b323b9c843 Refresh webtoon adapter on image property changed 2020-02-23 14:58:51 -05:00
1afcf34829 Set webtoon page padding on page bind 2020-02-23 14:48:53 -05:00
48d9ad00e1 Hide null file path on backup creation (closes #1515) 2020-02-23 13:05:39 -05:00
ca10356fd9 Added Webtoon with Padding viewer (#2618)
* Added Webtoon with Padding viewer

* Change webtoon padding to be a config option

* Removed obselete padded_webtoon

* Switch ambiguous padding to vertical padding
2020-02-23 12:44:50 -05:00
275bd44e15 Reword "Clear" to "Cancel all" in download queue 2020-02-23 11:46:47 -05:00
beb2d880ea Move color filter behind reader toolbars (fixes #2619) 2020-02-23 00:07:34 -05:00
61d2107e9c Add secure screen setting 2020-02-22 13:32:05 -05:00
b06f1c81bc Remove usages of incorrect platform yes/no strings 2020-02-22 12:38:06 -05:00
8bb83782c7 Biometrics lock (closes #1686) 2020-02-21 23:04:37 -05:00
aa05458f1d Run formatter on layout files 2020-02-21 18:43:50 -05:00
c694160c9c Minor layout tweaks for better RTL support 2020-02-21 18:41:37 -05:00
5b24a8f21d Revert usage of AndroidX Webkit library (closes #2611) 2020-02-21 18:36:05 -05:00
2c23c42c98 Default to light theme prior to Oreo 2020-02-19 18:38:40 -05:00
edcadb7dd1 Change default theme to System Default (#2608)
* Change default theme to System Default

Hopefully this was the only string that dictated the default setting.

* Update PreferencesHelper.kt
2020-02-19 18:34:21 -05:00
3bce3502d2 Dark mode splash screen (closes #2540) 2020-02-18 22:13:45 -05:00
9942227c6c Minor system theme tweaks 2020-02-18 22:05:54 -05:00
02b5c3da71 Support follow system theme[Android 10] (#2603)
* Support follow system theme

* Show [follow system theme] only on Oreo and newer

* Update preference values of theme

* Refine theme preference
2020-02-18 21:58:52 -05:00
ef533b4c87 Run default Android Studio formatter on resources 2020-02-17 17:26:20 -05:00
3ecc883944 Run default Android Studio formatter on code 2020-02-17 17:23:37 -05:00
a1fadce7c6 Change chapter update notification to show chapter numbers 2020-02-17 16:23:48 -05:00
79bc1290ae Perform mark as read action in IO coroutine scope to avoid freezing app 2020-02-17 16:20:12 -05:00
10272ef395 Refactor notification manga cover logic, decrease size 2020-02-17 16:14:15 -05:00
f03c49850b Separate group for extensions with updates 2020-02-17 15:29:03 -05:00
6677c10173 Simplify Tachiyomi vector icon 2020-02-17 15:25:56 -05:00
3223a3ac54 More notification code cleanup 2020-02-17 12:25:20 -05:00
497fe1e68a Minor cleanup 2020-02-17 12:19:42 -05:00
3b334c4230 Simplify "and n more" string 2020-02-17 11:29:11 -05:00
7f115f2e83 Group notifcations for Library updates (#2582) 2020-02-17 10:56:23 -05:00
12aa04be93 Fix fullscreen reader for notch device (#2595)
* Fix fullscreen reader for notch device

* Make cutout mode configurable

* Rename cutout option
2020-02-17 10:40:49 -05:00
a7ece4fdf3 Add bookmarking to chapter selection menu (closes #1065) 2020-02-16 17:46:31 -05:00
57d1ed1073 Hide share icon for manga info if not from online source 2020-02-16 17:41:21 -05:00
b04ebb1782 Allow selecting default category for auto download 2020-02-16 17:17:23 -05:00
958dbfdfa5 Compare recent updates by both date and chapter number 2020-02-16 17:08:07 -05:00
eb724336f5 Additionally sort by chapter number in recent updates (fixes #2586) 2020-02-16 16:30:39 -05:00
9cdd4bee97 Simplify selected count to just show the number 2020-02-16 16:00:41 -05:00
74cc77400c Merge pull request #2596 from FlaminSarge/migrate
Move empty-chapterlist manga to end of Latest Chapter sort in Library view
2020-02-16 15:18:14 -05:00
247a39c0a9 Move empty-chapterlist manga to end of Latest Chapter sort in Library view 2020-02-16 07:19:38 -07:00
1b0c13a417 Show URL in Webview subtitle 2020-02-15 17:44:35 -05:00
abb2e231f6 Switch to AndroidX Webkit library 2020-02-15 17:30:30 -05:00
50ef4cc5da Slightly increase chapter cache size (closes #2091) 2020-02-14 09:27:42 -05:00
34bf9b729e More coroutine network call fixes 2020-02-14 09:23:54 -05:00
Jay
0a6f607e22 Fixed extensions call running on main thread
(cherry picked from commit 2b85bb5fb816c531982a1878e55fd88814452a2c)
2020-02-14 09:21:33 -05:00
9e4c61c139 Remove library sort by source 2020-02-11 19:05:16 -05:00
144418434b Library search for source 2020-02-11 19:02:04 -05:00
a20ad68fe3 Library View: Add latest chapter sorting and revert last updated sorting changes (#2563)
* Library View: Add latest chapter sorting and revert last updated sorting changes

Latest chapter is as it sounds
Last update is now any changes to the chapter list (addition, removal, rename, etc.)

* Change latest chapter sort string to "Latest chapter" instead of "Last chapter"
2020-02-11 18:41:31 -05:00
a50a3df716 Only show Webview update prompt if CF bypass fails 2020-02-11 18:36:51 -05:00
f29124773b Lower minimum Webview version warning 2020-02-10 22:45:23 -05:00
c1235897df Remove unused RxJavaCallAdapterFactory for app updater 2020-02-10 22:28:48 -05:00
4a52869d23 Change latest chapter sort string to "Latest chapter" instead of "Last chapter" 2020-02-10 05:06:22 -08:00
f9098b5379 Restrict translucent reader UI to API 26+ (fixes #2580) 2020-02-09 22:59:03 -05:00
6a95ff56df Use coroutines for updater 2020-02-09 22:36:44 -05:00
340829bb71 Remove star icon option 2020-02-09 17:32:41 -05:00
8aa48effaa Refactor notification builder extension 2020-02-09 17:28:09 -05:00
a5fadcda15 Translucent reader UI 2020-02-09 17:10:35 -05:00
f515674dff Show message if WebView version is too low 2020-02-09 11:03:17 -05:00
72ef5d8f8d Translations (Continuous) (#2485)
Translations (Continuous)
2020-02-06 14:43:15 -05:00
a0a077eaaa Move library display settings out of filter sidebar 2020-02-05 22:58:20 -05:00
8feb4365dd Minor edit to onOptionsItemSelected fallthrough logic 2020-02-05 22:53:49 -05:00
94b2dd74de Minor section name edits 2020-02-05 22:41:14 -05:00
678597cc96 Remove unused layout 2020-02-05 22:39:02 -05:00
417d82de58 Remove round icon asset 2020-02-04 22:24:16 -05:00
f3adff1da1 Move PreferenceDSL 2020-02-04 22:19:17 -05:00
0473c36c6f Restore setting controller fade
Removes help button in each section, which is jumpy. Fade is nicer though.
2020-02-04 22:16:31 -05:00
c9cb75aee1 Group tracking setting activities 2020-02-04 22:14:49 -05:00
36011e124a Reword "directory" to "location" 2020-02-04 21:23:35 -05:00
b9420040f5 Move help into settings menu 2020-02-04 21:23:16 -05:00
59b925a028 Include commit SHA in dev version info 2020-02-03 19:15:23 -05:00
7af075633b Explicitly switch between IO/UI dispatchers when updating list of extensions
Potentially fixes #2566
2020-02-03 19:11:18 -05:00
09891bb0ad Throw exception in okhttp coroutine if response isn't successful 2020-02-03 18:56:24 -05:00
160ebe01d9 Update to Material Design library 1.1.0 2020-02-03 18:54:24 -05:00
a096e6b337 Library View: Add latest chapter sorting and revert last updated sorting changes
Latest chapter is as it sounds
Last update is now any changes to the chapter list (addition, removal, rename, etc.)
2020-02-02 23:16:42 -08:00
3c41a5e910 Move JsoupExtensions back (fixes #2562) 2020-02-02 23:45:13 -05:00
a3e39987d4 Migrate extension list fetch to coroutine 2020-02-02 22:57:15 -05:00
47f5ea881f Reorganize other util files 2020-02-02 22:22:54 -05:00
faf8f1fbbc Remove unused SharedData object 2020-02-02 22:04:20 -05:00
9f9de27a57 Reorganize some util files 2020-02-02 22:04:11 -05:00
9a3ec56eb4 Move edit categories to library settings 2020-02-02 18:13:13 -05:00
4f03ee814a Categorize library settings 2020-02-02 18:04:50 -05:00
6f84815801 Filter out tmp directories for download badge 2020-02-02 18:01:08 -05:00
9588a582ce Use coroutines for async loading of modules 2020-02-02 17:06:51 -05:00
ed8e549ecb Update AndroidX SQLite dependency 2020-02-02 17:06:25 -05:00
c79ebd4eeb fix NPE in dateFormat (#2549)
Bug #2548 fix NPE in dateFormat pref
2020-01-29 07:23:26 -05:00
2a85bb28b9 Convert root level Gradle files to Kotlin DSL 2020-01-28 22:48:02 -05:00
13ea1342fb Optimize imports 2020-01-28 22:47:57 -05:00
c707d4bfd8 Minor date format code cleanup 2020-01-28 22:32:56 -05:00
aeacdad484 Allow setting a preferred date format (#2175) 2020-01-28 22:23:41 -05:00
6d9bec3e0b reroute all deep links through DeepLinkActivity to provide more control (#2546)
over launch behavior/intent flags
2020-01-28 22:15:15 -05:00
1b5554eeda fr using $s instead of $d (#2545)
Fix a string formatter
2020-01-26 22:34:26 -05:00
bf140be75e Rename sources settings to filter 2020-01-26 17:39:06 -05:00
eb4c7c6841 Remove display/sorting mode dialogs 2020-01-26 17:35:48 -05:00
dcd3c709fe CloudflareInterceptor update (#2537)
* CloudflareInterceptor update

* Changes

* Max-Age

* Tweaks
2020-01-25 16:37:59 -05:00
f966187ea4 Add ability to explicitly remove tracking from track search dialog (closes #2532) 2020-01-24 14:27:53 -05:00
a288c0f280 Vector tracker icons (except Bangumi) 2020-01-24 14:17:54 -05:00
a746d4cc3a Tweak initial tracker card appearance 2020-01-24 12:18:55 -05:00
f1cca207fc Minor formatting 2020-01-23 20:51:37 -05:00
f4bb9b604a Fix sources/extension filters toggles being indented 2020-01-23 20:50:55 -05:00
7be6ee9a68 Remove fast scroller from library
Interferes with filter sidebar too much currently.
2020-01-22 18:32:32 -05:00
a22c79c58a Tweak manga last updated time based on chapter upload instead of fetch time 2020-01-22 18:28:33 -05:00
b642e019e8 Directly pass read chapter when updating tracker 2020-01-20 21:59:36 -05:00
578bab5fdd Use black background for AMOLED theme cards, dialogs (#2422) 2020-01-20 21:34:47 -05:00
b48f08e65c Minor dependency updates 2020-01-20 19:09:17 -05:00
Jay
81c14ba610 Download dialog in chapters removed, now using submenu
(cherry picked from commit a253c255e8e1ee0cc0e158c3bf61f5352b06e656)
2020-01-20 18:53:56 -05:00
Jay
4b84fb5ac5 Tracker status naming edits
Cherry picked from ad8c69aa15e7c27879c2a528a45b0744f7e45197
2020-01-20 18:50:39 -05:00
7f5e650796 Bug/2513 edit text preference crash (#2522)
* use themedContext for preference

* use inflater with themed context
remove icon space

* v14 preferenceThemes are deprecated
2020-01-20 18:37:42 -05:00
c22e2e8159 Do not suppress a type system error (#2524)
This code was sort of fine when it used raw Java types, but the Kotlin
equivalent technically calls a method that takes a Nothing-typed
argument with a value that is not of type Nothing. Whether that works
depends on how lenient kotlinc is about inserting casts in bytecode.

The solution is to give the unknown type represented by a star an
explicit name by capturing it in a type variable, then cast to that type
instead of Nothing. This is guaranteed to be an unchecked, but valid,
cast.
2020-01-20 18:34:59 -05:00
Jay
ee8a53188c Set manga last update field based on chapter fetch time (closes #2217)
Based on 3c81f60041 (diff-7e5179d048c3dfaf75b444b7277fc840)
2020-01-19 22:21:49 -05:00
98f86a44ef Add tracker logout dialog (closes #2475) 2020-01-19 17:03:11 -05:00
Jay
1b3169e0d0 Update tracking controller after logging in to Bangumi 2020-01-19 16:42:59 -05:00
8273a396c8 Anilist: rename "On hold" to "Paused" 2020-01-19 16:29:43 -05:00
5bad914411 Remove reflection to show tracking checkmark
Icon now shows up on the left, but code is less fragile.
2020-01-19 16:26:38 -05:00
879d260202 Remove unused drawables 2020-01-18 21:04:29 -05:00
ce4d75f62a Replace raster icons 2020-01-18 20:58:07 -05:00
f30622424a Add select all menu option for library category
Based on ae5ad2a9a6
2020-01-18 20:33:43 -05:00
09e7d56ff2 Move "Open in browser" option to webview only 2020-01-16 22:13:34 -05:00
5ca23b5363 Use smaller CustomTarget for shortcut creation
Same thing as Neko/Jay's fork
2020-01-16 22:13:02 -05:00
f7e70d25ea Minor cleanup 2020-01-16 21:47:46 -05:00
4338c41112 Filter library items by artist as well 2020-01-16 21:46:45 -05:00
01f9b25be2 Local genre tag searching (#2423)
Using the search bar in My Library, you can search tags for manga (ie. "Romance") or exclude (ie. "-Comedy") You can also search multiple by seperating by commas (ie. "Romance, -Comedy")

Clicking the tag in manga info from the library also performs a local serach
2020-01-16 21:45:37 -05:00
8b0458cdf6 minor reader bugs: (#2491)
- fix preload on last page for R2L reader
 - page 3 bug
2020-01-16 21:45:06 -05:00
bed978a26a force menu invalidation when expanding actionView from user interaction to properly layout menu items (#2503) 2020-01-16 21:44:22 -05:00
73fbc81067 Webview enhancements
- Pull to refresh
- Loading progress
- Share page
2020-01-16 21:43:10 -05:00
0d7f84857c Remove unused string (closes #2508) 2020-01-16 17:52:25 -05:00
42d6815ece Update Firebase 2020-01-16 09:01:03 -05:00
Jay
d1db9fb659 Build time now opens changelog
(cherry picked from commit 22bb3463593c060405694da39a0eb1f5ca1d6ba1)
2020-01-16 08:57:46 -05:00
Jay
b74fb2ef5e Fixed extensions showing as obsolete when call fails
(cherry picked from commit a44e9a19b0cfceeaeecd8ad378f14ccd47c8683c)
2020-01-16 08:57:37 -05:00
f3e228e8a4 Indicate obsolete extensions (#2494)
* Indicate obsolete extensions

* Make obsolete indicators red

* Move obsolete extensions up the list

* Add base button theme for holder

* Use red button color state instead of explicit text color
2020-01-12 18:27:04 -05:00
6b5742c1ff Fix catalogue search focus automatically being removed (#2396)
Fix catalogue search focus automatically being removed
2020-01-12 15:02:21 -05:00
57595988f5 Restore transparent status bars, allow WebView app bar to scroll away 2020-01-12 11:47:26 -05:00
81418a7712 Tweak reader seekbar height for Android 5 UI bug (closes #2487) 2020-01-11 22:29:31 -05:00
885c7bbb10 Add descriptions to reader prev/next buttons for a11y 2020-01-11 22:14:02 -05:00
d4c25359bd Remove clickable attributes from unclickable text in reader 2020-01-11 22:13:46 -05:00
44f406b4b9 Fix Bangumi class formatting 2020-01-11 22:06:23 -05:00
427d2fed8c fix bangumi track will override record to 0 after every track search(bind) (#2486)
* fix bangumi track : the update status api must be called before update chapter api

* fix bangumi track will override record to 0 after every track search(bind)
2020-01-11 22:05:03 -05:00
51d454cded Run formatting on test package 2020-01-11 22:04:23 -05:00
ab2bdfc508 Remove unused FAB animations 2020-01-11 22:03:39 -05:00
3892b93bca Rename tracker icon images 2020-01-11 22:01:26 -05:00
Jay
83c2e907c7 Fixed file permissions for Android 10
(cherry picked from commit 4e1952ffafa5b64988b0cff533fe497fabce86a6)
2020-01-11 21:55:33 -05:00
32b7cc68b9 Translations (Continuous) (#2484)
* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (439 of 439 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

* Translated using Weblate (Malay)

Currently translated at 99.5% (437 of 439 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (439 of 439 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

* Translated using Weblate (Romanian)

Currently translated at 100.0% (439 of 439 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

* Translated using Weblate (Japanese)

Currently translated at 44.2% (194 of 439 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ja/

* Translated using Weblate (Hindi)

Currently translated at 100.0% (439 of 439 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (439 of 439 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ar/

* Translated using Weblate (French)

Currently translated at 100.0% (439 of 439 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

* Translated using Weblate (Thai)

Currently translated at 22.1% (97 of 439 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/th/

* Translated using Weblate (German)

Currently translated at 100.0% (439 of 439 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Chinese (Traditional))

Currently translated at 89.1% (391 of 439 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hant/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (439 of 439 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (Sardinian)

Currently translated at 100.0% (439 of 439 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 98.6% (433 of 439 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nb_NO/

* Translated using Weblate (Bengali)

Currently translated at 100.0% (439 of 439 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/bn/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 99.8% (438 of 439 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nb_NO/

* Translated using Weblate (Hungarian)

Currently translated at 41.7% (183 of 439 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hu/

* Translated using Weblate (Chinese (Traditional))

Currently translated at 98.6% (433 of 439 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hant/

* Added translation using Weblate (Slovak)

* Translated using Weblate (Hindi)

Currently translated at 100.0% (444 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

* Translated using Weblate (Slovak)

Currently translated at 34.9% (155 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sk/

* Translated using Weblate (Slovak)

Currently translated at 36.3% (161 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sk/

* Translated using Weblate (Polish)

Currently translated at 99.3% (441 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pl/

* Translated using Weblate (Finnish)

Currently translated at 100.0% (444 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fi/

* Translated using Weblate (Slovak)

Currently translated at 54.5% (242 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sk/

* Translated using Weblate (Catalan)

Currently translated at 100.0% (444 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

* Translated using Weblate (Dutch)

Currently translated at 98.6% (438 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nl/

* Translated using Weblate (Sardinian)

Currently translated at 100.0% (444 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

* Translated using Weblate (German)

Currently translated at 100.0% (444 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Italian)

Currently translated at 100.0% (444 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (444 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (French)

Currently translated at 100.0% (444 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (444 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (444 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

* Translated using Weblate (Vietnamese)

Currently translated at 98.6% (438 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/vi/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (444 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (444 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (Malay)

Currently translated at 99.5% (442 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

* Translated using Weblate (Thai)

Currently translated at 78.8% (350 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/th/

* Translated using Weblate (Thai)

Currently translated at 100.0% (444 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/th/

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 99.3% (441 of 444 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nb_NO/

Co-authored-by: Weblate (bot) <hosted@weblate.org>
Co-authored-by: Eduard Ereza Martínez <eduard@ereza.cat>
Co-authored-by: DarKCroX <darkcrox.2020@outlook.com>
Co-authored-by: sr093906 <sr093906@users.noreply.github.com>
Co-authored-by: f0roots <41129381+f0roots@users.noreply.github.com>
Co-authored-by: Mark Acosta <maraco@udel.edu>
Co-authored-by: darkbeast13 <32981566+darkbeast13@users.noreply.github.com>
Co-authored-by: petetae <pete.taecha@gmail.com>
Co-authored-by: Lzmxya <lzmxya@gmail.com>
Co-authored-by: Credits125 <48494748+Credits125@users.noreply.github.com>
Co-authored-by: asereze <asereze@users.noreply.github.com>
Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
Co-authored-by: Rezaul Rabbi <rezaulrabbi5@gmail.com>
Co-authored-by: Rolf Vidar Hoksaas <32819373+mazunki@users.noreply.github.com>
Co-authored-by: Tóth Béla <tbela@inf.u-szeged.hu>
Co-authored-by: KaHsun <58354107+KaHsun@users.noreply.github.com>
Co-authored-by: roguesoulboss <DPELECH1@GMAil.com>
Co-authored-by: Jendrej <ejjendrej@gmail.com>
Co-authored-by: Topi Harjunpää <topi@harjunpaa.fi>
Co-authored-by: mirfire <1897695+mirfire@users.noreply.github.com>
Co-authored-by: Luigi Gandossi <gandossi.luigi@gmail.com>
Co-authored-by: monolifed <6624464+monolifed@users.noreply.github.com>
Co-authored-by: Le Cong Hau <hau.lc151277@sis.hust.edu.vn>
Co-authored-by: muhajaya <36522453+Muhajaya@users.noreply.github.com>
Co-authored-by: Tanpahol <zotix@users.noreply.github.com>
2020-01-11 16:39:27 -05:00
a61e3cd689 Mark JAR as binary too 2020-01-11 16:13:08 -05:00
f922598127 Revert "Renormalize files"
This reverts commit e11c289150.
2020-01-11 16:12:12 -05:00
e11c289150 Renormalize files 2020-01-11 16:06:16 -05:00
1b37c61b5a JSON metadata for local manga (#1658)
* JSON metadata for local manga

* Simplification

* Lazy load local data
2020-01-11 15:59:43 -05:00
Jay
2d3bfa9a89 Implement long hold selection for Manga Chapters and library
Co-Authored-By: zhuoyang <zhuoyang@users.noreply.github.com>

Co-Authored-By: Jays2Kings <Jays2Kings@users.noreply.github.com>
2020-01-11 15:40:00 -05:00
e414b9edf1 Minor extension filter cleanup 2020-01-11 15:13:51 -05:00
62d3fc65e0 Filter Extensions By Language (#2275)
* add options menu item to filer extensions by languages

* resolve merge conflicts
changes per pr comments

Co-authored-by: arkon <arkon@users.noreply.github.com>
2020-01-11 15:06:54 -05:00
Jay
262ad45b79 Update BackupTest.kt
(cherry picked from commit 00b1b097a7ae744f69f47436f4d764ce8cf4b111)
2020-01-11 10:41:55 -05:00
cd90702fe5 Fix splash screen status bar color 2020-01-11 10:41:16 -05:00
012b1b56aa Minor grammar fixes 2020-01-11 10:11:39 -05:00
ff999a6dda Show selected preference for "Library update order" 2020-01-11 10:11:30 -05:00
797553ce16 Convert webview into an activity (#2470)
Based on 65804ebb3a
2020-01-10 22:22:12 -05:00
8f82c8ad3d Allow user to retain app data on uninstall for Android 10 2020-01-10 18:46:02 -05:00
7a2c132b8e Mark webp as binary files for git 2020-01-10 18:34:17 -05:00
ba9f6fef99 Tweak splash screen color, set nav bar to match (#2476)
Tweak splash screen color, set nav bar to match
2020-01-10 08:11:10 -05:00
6633a96245 Fix filter_mock (#2471)
Fix filter_mock
2020-01-10 06:59:16 -05:00
745f8d32b5 Use OutlineSpan approach from CarlosEsco/Neko to avoid infinite redraws
Based on work by @arsonistAnt: 1876f850f6
2020-01-09 22:13:25 -05:00
f715478070 Revert "Remove reflection to get TextView color field (closes #2469)"
This reverts commit 5f2aaeac57.
2020-01-09 21:51:34 -05:00
5f2aaeac57 Remove reflection to get TextView color field (closes #2469) 2020-01-09 21:32:30 -05:00
044a4f7575 Split general settings into general and library 2020-01-09 21:22:58 -05:00
83d5e458ca Update to SDK 29 (Android 10) (#2468) 2020-01-09 20:31:27 -05:00
f7669b6797 Replace left/right layout attributes with start/end 2020-01-09 19:10:55 -05:00
eb56567812 Convert filter mock image to webp 2020-01-09 18:55:53 -05:00
489f981e40 Convert tracker icons to webp 2020-01-09 18:54:07 -05:00
19adbeebd5 Convert nav drawer icon to webp 2020-01-09 18:49:14 -05:00
dc93368e03 Fix stretched splash screen icon on older versions of Android 2020-01-09 18:44:20 -05:00
8d3166c5fe Add larger minimalistic splash screen icon 2020-01-09 18:30:55 -05:00
07caea8b4e Clean up splash screen code 2020-01-09 18:29:36 -05:00
141b7ac554 Added a app loading splash Screen (#2185)
* Added a app loading splash Screen. Just a theme that plays on start up before loading the actual app theme

* Added a app loading splash Screen. Just a theme that plays on start up before loading the actual app theme

* Update splash_background.xml
2020-01-09 18:09:52 -05:00
4bc5f1401f Don't enforce line endings on binary files 2020-01-09 18:09:38 -05:00
13a2d3dfdd Provide more human readable error when downloading to invalid directory (#2462) 2020-01-09 08:39:40 -05:00
d62f0de862 Tweaks based on PR comments, simplify some more strings 2020-01-08 21:53:08 -05:00
0073ddf237 Spelling: Language rework (#1367)
* Language rework

* Libre software, F-Droid, app

* Reverted to "free and open source"

Co-authored-by: arkon <arkon@users.noreply.github.com>
2020-01-08 21:35:41 -05:00
e411f54236 Remove up/down animation for FAB, add list padding (#2456) 2020-01-08 21:33:10 -05:00
6025b44e5b Add fast scroller to library (#2459) 2020-01-08 21:32:07 -05:00
f4f427dd2a Restore equals/hashCode in ChapterTransition (closes #2461) 2020-01-08 21:31:32 -05:00
ea226a1697 Remove unused color resource 2020-01-07 22:55:14 -05:00
26c5c9c839 Replace usage of deprecated Glide SimpleTarget 2020-01-07 20:24:12 -05:00
5cddb269d6 Minor code cleanup 2020-01-07 20:17:07 -05:00
0d5099f230 Drop support for Android 4.x (#2440)
* Bump minSdkVersion

* Remove Android 4.x specific logic

* Consolidate res assets

* Add note about minimum Android version to README

* Restore incorrectly removed method, remove unneeded Lollipop TargetApi annotations
2020-01-07 18:46:31 -05:00
b55814a1c0 Made 'Default' category selectable in global update settings (#2318) 2020-01-07 18:46:08 -05:00
eb5382e0de fix bangumi tracker crash in searching english manga title (#2452)
fix bangumi tracker crash in searching english manga title
2020-01-06 20:02:28 -05:00
b20c028566 skip double upstream androidx migration 2020-01-06 10:57:37 -05:00
9b883b1a09 androidx migration
I DID THIS ONE MYSELF WITHOUT TAKING IT FROM THE OTHER FORKS
YEEEEEEEEEEET
2020-01-06 03:26:31 -05:00
39d509a756 Remove repository for Conductor snapshot (#2441) 2020-01-05 20:42:58 -05:00
b3f1714ba9 Convert remaining Java files (#2435) 2020-01-05 19:39:25 -05:00
708525ef9d match transition text used by other readers (#2439) 2020-01-05 17:59:05 -05:00
df14e6d43e fix DOWNLOADED text showing after chapters are marked as read (#2434)
* fix DOWNLOADED text showing after chapters are marked as read
2020-01-05 16:36:23 -05:00
faedd325be Remove unnecessary legacy-support-v4 dependency 2020-01-05 15:53:17 -05:00
600fbb2ef8 Update files to use unix line endings
cmd: `find . -type f -print0 | xargs -0 dos2unix`
2020-01-05 14:43:07 -05:00
b4aedb5f84 Enforce unix line endings 2020-01-05 14:38:38 -05:00
53402459f2 library tag searching and reordering downloads 2020-01-05 12:33:28 -05:00
ed7ebf2da1 Update conductor-support-preference for AndroidX preference v1.1.0 compat (fixes #2431) 2020-01-05 12:26:36 -05:00
dd1e6402c9 Improve Loading Speed When Skipping Pages in a Chapter (#2426)
* cancel queued loads when the page that requested the queue is destroyed

* use page.status for optimizing removal
2020-01-05 12:18:02 -05:00
78689e7443 Migrate to AndroidX (#2424)
* Migrate to AndroidX (automatic conversion by Android Studio)

* AndroidX dependency code updates

* Fix source preference reparenting

* fixes the androidx prefererences icon spacing issue

(cherry picked from commit b76a15d960ec2cdf771be16377db0348b66b3179)

* Fix source preference screen heading size/list padding

Co-authored-by: Carlos <cargo8005@gmail.com>
2020-01-05 11:29:27 -05:00
bc6a1a1da6 add tristate library filters, update to dev 2020-01-04 15:16:49 -05:00
aa57b1bc77 adjust so downloader doesnt autostart when queue was paused (#2413)
adjust so downloader doesnt autostart when queue was paused
2020-01-03 15:33:17 -05:00
491d476cac auto attempt a login refresh once if MAL returns http 400 (#32) (#2403) 2019-12-29 17:45:58 -05:00
f0053a2f78 add width and height to listview for browseCatalogueController (#2406)
* add width and height to listview for browseCatalogueController

* readd recycler has fixed size
add width and height to list view
2019-12-28 14:57:44 -05:00
10e7a3b35b Update JSoup (#2400) 2019-12-28 14:11:18 -05:00
4147fd6b19 recycler is not fixed size (#2402) 2019-12-28 14:10:34 -05:00
2bb903088e Tweak FAB sizing method (fixes #2398)
Ref: https://stackoverflow.com/questions/56945314/floating-action-button-fab-icon-size-problems-after-migrating-to-sdk-28
2019-12-27 20:53:04 -05:00
c90f985fcc Add REQUEST_DELETE_PACKAGES permission for uninstalling extensions 2019-12-27 07:24:19 -05:00
2ebaacfc89 Replace dependency for case insensitive natural sorting (#2389)
Replace dependency for case insensitive natural sorting
2019-12-27 07:18:30 -05:00
c339bd49d0 Address minor Kotlin compiler warnings 2019-12-26 17:48:39 -05:00
c349fb0e37 Enable Java 8 language feature support 2019-12-26 16:47:33 -05:00
bc825bdefa Minor dependency updates 2019-12-26 16:47:01 -05:00
ed49ce8e1d Update project-level dependencies 2019-12-26 16:06:37 -05:00
ad2ecd538d Allow cleartext traffic
Certain catalogues (e.g. Mangakakalot) do not use HTTPS
2019-12-26 16:06:28 -05:00
ff8e3f0af4 Update to SDK 28 (#2394) 2019-12-26 16:01:16 -05:00
698e17178a Increase default text size of the transition chapter page (#2285) 2019-12-26 12:40:56 -05:00
ebeee70931 Allow back button to navigate to previous URL in WebView, add Forward, Refresh, and Close menu options (#2176) 2019-12-26 12:40:11 -05:00
b8b118bdeb Add .nomedia file in each chapter download folder (#2199)
* Move .nomedia creation to directory fetch

* Add .nomedia file to all chapter download directories
2019-12-26 12:39:20 -05:00
5ddd7d1b14 Remove minSdkVersion 21 for dev builds (no longer needed for multidex) 2019-12-23 22:23:05 -05:00
450b23436f Update DB architecture component
Needs to eventually be replaced by androidx.sqlite.db
2019-12-23 22:20:59 -05:00
89793ac338 Update to Kotlin 1.3.61 2019-12-23 22:18:11 -05:00
c456812a46 Update coroutines 2019-12-23 22:14:20 -05:00
6f8f6e9233 Update Gradle 2019-12-23 22:03:07 -05:00
5770d00f81 Upgrade Kotlin (to 1.3), Coroutines, Gradle, and Android Gradle… (#2239)
Upgrade Kotlin (to 1.3), Coroutines, Gradle, and Android Gradle plugin
2019-12-23 22:02:07 -05:00
a0fb1eff4a Merge branch 'master' into update-kotlin-coroutines-gradle 2019-12-23 09:49:53 -05:00
89dc240a22 Clean up Anilist GraphQL query formatting 2019-12-22 22:19:15 -05:00
ee4f069341 fix: Don't send newlines and whitespace in API calls (#2348) 2019-12-22 22:13:27 -05:00
011bb9f5b1 Update to build tools v29.0.2 (#2385) 2019-12-22 16:14:09 -05:00
08b06e1b4e Update to latest version of Android support libraries
Should make migration to AndroidX a bit smoother
2019-12-22 15:56:25 -05:00
0416a2ff15 Extract some hardcoded strings (closes #1989) 2019-12-22 15:48:36 -05:00
3a7cdfcaa4 Update README.md (#2372)
changed  Chat to support server
fixed grammar mistake
2019-12-21 10:45:43 -05:00
c36a47576d Update README.md (#2351)
Update README.md
2019-12-03 09:34:58 -05:00
f14af7cf83 Bind the margin ratio as a float preference and rename variables
- Fixed the floatListPreference that was used in the SettingsReaderController
- Created new extension for binding float preferences in the ReaderSettingsSheet
- Renamed the ratio variables to include the `webtoon` naming
2019-12-02 14:19:22 -08:00
4014c48c62 Revert "Remove no-longer-needed FloatListPreference"
This reverts commit 19993199db.
2019-12-02 13:38:33 -08:00
6c9135c093 Improve Issue reporting experience (#2189)
* Improve issue reporting workflow.

* Add meta request template

* Remove old template

* Fix label for bug

* Add template text.

* Remove meta request

As per [review](https://github.com/inorichi/tachiyomi/pull/2189#discussion_r321668645)

* Remove Acceptance Criteria

As per [review](https://github.com/inorichi/tachiyomi/pull/2189#discussion_r321665449)

* Requested changes from arkon

All except the default template.

* Revert "Remove old template"

This reverts commit b9ef01f655e13e2582af68d3a454bd2db4723534.
2019-12-01 13:49:47 -05:00
19993199db Remove no-longer-needed FloatListPreference 2019-11-30 18:41:52 -08:00
5b9f362925 Add support for margins in Webtoon view
On larger tablets, matching the page width to the screen width in
webtoon mode causes eye strain due to the image looking so magnified.
Adding a page margin to the image can resolve this by effectively
scaling the image down.
2019-11-30 18:37:52 -08:00
690d2fb15b fixed tsumino for real this time really 2019-11-29 01:18:21 -05:00
7ac188709b tsumino half fixed. mostly usable 2019-11-28 22:52:44 -05:00
93c8773e91 Update Tsumino.kt 2019-11-28 18:46:19 -05:00
eefe95c2ee Update TsuminoSearchMetadata.kt 2019-11-28 18:45:04 -05:00
af9825d369 Update TsuminoSearchMetadata.kt 2019-11-28 18:17:04 -05:00
59f38cb343 Update Tsumino.kt 2019-11-28 17:37:24 -05:00
810d2d4776 fix tsumino for real this time 2019-11-28 17:33:55 -05:00
027cb10d0f fix tsumino 2019-11-28 16:35:58 -05:00
24a6eba94e match upstream 2019-11-28 16:24:51 -05:00
80ea9001b3 Allow 'Default' category as the default for adding manga (#2292) 2019-11-03 13:52:33 +01:00
24bb94ceac Implemented extension search functionality. (#2211) 2019-10-14 11:15:00 +02:00
0f16351f5f Set glide to use the gif loop count (#2263) 2019-10-14 11:11:11 +02:00
b60b26bbd0 fix jitpack cause it's shitting out (#2274)
fix jitpack shitting out
2019-10-13 01:09:58 -04:00
86e53e08de Group available extensions by language (#2210) 2019-10-11 19:07:55 +02:00
d3cb10a74e Merge pull request #2271 from mezzode/patch-1
Update link in FAQ
2019-10-10 14:17:32 -04:00
7d6cfff719 Update link in FAQ
Wiki has been replaced by website.
2019-10-10 11:10:48 -07:00
cc0fe0a1a9 Change "Help" link from Github Wiki to Website (#2265)
Change "Help" link from Github Wiki to Website
2019-10-04 11:44:52 -04:00
25327342fb Changed README's app screenshot (#2229)
* Delete old screenshot

* Add new screenshots
2019-09-21 11:01:26 -04:00
e02cf67f85 Update translation files (#2238)
Updated by "Cleanup translation files" hook in Weblate.

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/
2019-09-21 11:00:45 -04:00
bf4bef6d62 Translations (#2011)
Translations
2019-09-21 09:50:38 -04:00
76645bce6e Remove redundant "publishNonDefault" setting
I think I've seen the following message from just about every single
gradle run throughout the upgrade process:

publishNonDefault is deprecated and has no effect anymore. All variants are now published.
2019-09-20 12:42:41 -04:00
9276c491bc Upgrade Kotlin (to 1.3), Coroutines, Gradle and Android gradle plugin.
Kotlin:                1.2.71 -> 1.3.50
Coroutines:            0.30.2 -> 1.3.1
Gradle:                4.6    -> 5.4.1
Android gradle plugin: 3.2.1  -> 3.5.0

This brings us down to *one* experimental coroutine API, and we've
opted in to using it in just *one* place.

(The fact that the API to opt-in to using an experimental API in a
specific place is *also* experimental surely will not come back to
bite us later.)
2019-09-18 22:45:54 -04:00
fa59b4f8a7 Fix coroutine deprecations again 2019-09-18 17:41:09 -04:00
934a37c36b Update to kotlinx.coroutines 0.30.2
Almost done, honest!
2019-09-18 13:37:57 -04:00
5362f62078 Update deprecated coroutines code 2019-09-18 13:32:42 -04:00
ccd360687e Update to kotlinx.coroutines 0.26.0 2019-09-18 13:20:39 -04:00
5a2e8a838c Update to kotlinx.coroutines 0.23.4 2019-09-18 01:31:15 -04:00
c1c43bb6fb Add minimum/maximum pages filter to E-Hentai/ExHentai source 2019-08-31 17:45:40 -04:00
0804550539 Fix strange behavior when using text filters 2019-08-31 17:44:47 -04:00
3156482334 Upgrade Gradle, Kotlin and KotlinX Coroutines 2019-08-31 00:07:26 -04:00
052317b38a Fix HBrowse namespace correction
Fix HBrowse maleBody and femaleBody namespaces
2019-08-31 00:06:58 -04:00
6ff684f638 Migrate old update jobs 2019-08-13 01:43:07 -04:00
6857c8c1fe Use better job ids for EHentai updater 2019-08-13 01:41:31 -04:00
44d563e689 Use better job ids for EHentai updater 2019-08-13 01:39:01 -04:00
6ce2809450 Use better job ids for EHentai updater 2019-08-13 01:38:49 -04:00
0759036536 Use correct HBrowse source id 2019-08-13 01:31:44 -04:00
6f6490b7ac Bump version number and add changelog 2019-08-13 01:16:33 -04:00
da12a4b17f Speed up migration cancellation
Allow migrating an entire source of manga
2019-08-13 01:10:31 -04:00
1302bc84dd Fix auto-migration UI in dark theme 2019-08-13 00:19:26 -04:00
1c4a8046d0 Allow saving of HBrowse queries 2019-08-13 00:13:04 -04:00
141edac99b Fix EHentai reading progress not carrying over 2019-08-13 00:04:02 -04:00
b64ecfb836 Init notifyLockSecurity when idle
Increase idle-until-urgent delay
2019-08-12 21:16:45 -04:00
d5f4db5eb7 Re-schedule EHentai updater job on app boot
Idle-until-urgent some stuff in app init
Close debug menu onStop
2019-08-12 21:09:39 -04:00
7a3f6e9f63 Fix HBrowse pagination 2019-08-12 19:39:35 -04:00
b3ecc91be9 Fix HBrowse tag search 2019-08-12 19:27:11 -04:00
2a27eacf5e Bump version number and add changelog 2019-08-11 16:23:36 -04:00
e747686ad8 Upgrade realm
Update proguard file so we could potentially enable proguard in the future
Update dependencies
Downgrade duktape to fix MangaPlus
Remove useless dependencies
Remove useless tabGravity
Fix debug version crashing in background
2019-08-11 14:40:01 -04:00
282af20146 Upgrade firebase + glide 2019-08-11 11:38:17 -04:00
f25cd9fdbf Add changelog 2019-08-11 03:41:29 -04:00
2369547d59 Version number bump 2019-08-11 02:24:52 -04:00
d86b8cc78c Remove sidebar help button 2019-08-10 20:30:10 -04:00
b4c1e6a44c Add HBrowse 2019-08-10 20:23:43 -04:00
45fc2f2e0e Optimize SmartSearch system 2019-08-10 20:19:59 -04:00
9cfcacf45e Fix smart search algorithm not using smart queries 2019-08-09 14:07:08 -04:00
801fd83649 Hide MergedSource from source selector screen 2019-08-09 10:14:59 -04:00
16f1dcd922 Fix background updater not updating all galleries 2019-08-09 10:04:06 -04:00
8f36d698cf Fix EHentai gallery update notifications for real 2019-08-09 09:48:31 -04:00
a89a36fd4c Version number bump 2019-08-09 05:21:43 -04:00
8a7f8c4068 Fix incorrect label in auto-migration 2019-08-09 05:20:11 -04:00
9c70e69300 Fix select-all button selecting wrong category 2019-08-09 05:11:25 -04:00
a0b490b10f Fix EH gallery updater crashing 2019-08-09 04:40:44 -04:00
d69dc375a3 Add 8muses 2019-08-09 04:40:30 -04:00
ac6dbbcd89 Add update notifications for EH/EXH galleries 2019-08-08 20:04:31 -04:00
14879c4466 Isolate EH and EXH manga redirects 2019-08-08 14:45:40 -04:00
dce08d4922 Fix false update notifications for lewd sources 2019-08-08 13:49:27 -04:00
5195cb8eda Delegate Pururin.io 2019-08-08 13:31:47 -04:00
68de7b516e Transfer commit 2019-08-08 09:40:41 -04:00
10095205d8 Transfer commit 2019-08-07 20:51:44 -04:00
c4c988f7a4 Add Android 7 broken SSL workaround 2019-08-07 15:47:43 -04:00
333dfbc642 Add nhentai search-by-id 2019-08-07 10:48:17 -04:00
e915fd28cb Migrate to new URL import system 2019-08-07 10:21:18 -04:00
46636b537c Add update frequency restriction debug toggle 2019-08-04 22:55:38 -04:00
cd5545284e Fix reading position not being saved when opening multi-versioned EH manga 2019-08-04 21:27:59 -04:00
3dac6366ff Fix uninstall button 2019-08-04 10:55:09 -04:00
054a26cf65 Fix more button always visible 2019-08-04 01:28:00 -04:00
024c76d480 Fix EH version/chapter sorting shenanigans 2019-08-04 00:15:17 -04:00
9abdfeac77 Hide ability to create merged manga 2019-08-03 22:54:22 -04:00
0f12ae0cf7 Revert "Hide ability to create merged manga"
This reverts commit 7fc6d53c
2019-08-03 22:53:26 -04:00
71182e664a Revert "Open all E-Hentai galleries in ExHentai"
This reverts commit 9ff8235d
2019-08-03 22:47:02 -04:00
7fc6d53cae Hide ability to create merged manga 2019-08-03 22:26:53 -04:00
4f2985469c Finish auto-migration feature 2019-08-03 02:23:21 -04:00
9cc24a3be3 Merge branch 'transfer' of https://github.com/NerdNumber9/TachiyomiEH 2019-08-02 22:54:19 -04:00
7ec18861bf Use semaphores instead of channels where possible
Use correct starting title in auto-migrator
2019-08-02 22:54:06 -04:00
3d1c02136a Transfer commit 2019-08-02 22:32:50 -04:00
aca34155b9 Hide "accept migration" button when migration is not offered 2019-08-01 06:50:03 -04:00
d04ffb7ea9 Fix auto-migration target manga opening wrong manga when clicked 2019-07-31 13:24:05 -04:00
5b3e72db54 Completed most of auto-migration UI 2019-07-31 03:39:51 -04:00
f811cc5c87 Initial work on auto-migrate 2019-07-30 19:29:12 -04:00
e7abe27bb6 Hide internal sources from UI
Change wording on migration button in smartsearch
2019-07-30 10:22:46 -04:00
126d875547 Include language when displaying source-specific chapters in MergedManga 2019-07-30 02:08:27 -04:00
a2b7228e95 Fix infinite reloading after merging manga 2019-07-30 01:49:54 -04:00
10d6b3a6ca Initial MergedSource creation UI 2019-07-30 01:41:30 -04:00
4c9be5557d Initial work on merged sources 2019-07-29 19:36:16 -04:00
37e0ac0895 SmartSearch architecture improvements 2019-07-29 13:27:33 -04:00
8934d251d9 Initial work on SmartSearch 2019-07-29 02:12:30 -04:00
b5263a6968 Do not crash if source provides bad prefs 2019-07-28 03:45:50 -04:00
15bd8e964d Dependency updates 2019-07-28 02:53:25 -04:00
d931027067 Catch and ignore reader page sheet launch exception to prevent it from crashing the app
I have no idea why it happens so often but at this point I will just ignore the error
2019-07-28 02:35:53 -04:00
39ffd3c3bc Fix update worker crashing application 2019-07-28 02:32:10 -04:00
9ff8235de4 Open all E-Hentai galleries in ExHentai 2019-07-27 19:30:25 -04:00
54075733b7 Fix crashes when opening Tsumino captcha 2019-07-27 19:04:25 -04:00
2ea0538825 Remove useless long-press-to-change-category setting as it is now enabled by default 2019-07-27 19:03:35 -04:00
275e20eabd Merge branch 'master' of https://github.com/NerdNumber9/TachiyomiEH 2019-07-27 17:58:27 -04:00
7fe742e6ed Upstream merge 2019-07-27 17:56:31 -04:00
3abae1cc75 Add chinese track website "bangumi" (#2032)
* copy from shikimori and change parmater

* add login activity

* fix

* login sucess

* search

* add...

* auth fix

* save status

* revert shikimori

* fix oauth error

* add bangumi info

* update read chapter index

* refersh token

* remove outdate file

* drop comment

* change icon

* drop search result which type not comic

* fix bind logic

* set status

* add ep status

* format code

* disable cache for `collection` api
2019-07-23 12:35:38 +02:00
b68ef8c983 Update info about auto updates in README (#2132) 2019-07-23 12:29:01 +02:00
d5f5ba95bb Add automatic updates for dev builds (#2128) 2019-07-13 19:36:30 +02:00
e8638cb0b3 Hide Empty Search Results in Catalogues (#2066)
* test2

* remove nothing_found view and associated resources
2019-07-01 13:06:19 +02:00
62f9071adc Avoid infinite loading in global search if a single catalogue fails (#2097) 2019-06-29 22:27:58 +02:00
1d079dd9a4 use dist: trusty (#2085) 2019-06-18 13:53:47 +02:00
cccb56bda1 Change default update priorization 2019-06-09 14:35:24 +02:00
5d8dc241d8 Update ranking (#1772)
* Add LibraryUpdateRanker

This class provides various functions to generate Comparators that can 
be used to order the manga to update.

One such ordering is by relevance:
It prioritises manga that were updated more recently.

Another Ordering is by lexicographic order:
This is the default behaviour.

* Use relevanceRanking scheme

Instead of default(noRanking/lex ranking) now mangaList is sorted with 
relevanceRanking.

* Add UI and associated variables & strings for Update Ranking.

* Use user preferences to determine update ranking scheme.

* Refactor relevanceRanking to latestFirstranking.

This name seems to better reflect the ranking scheme and frees up the 
name relevanceRanking for future use.

* Set latestFirst scheme as default.

(Changing over from lexicographic scheme)

* Fix 1

[Convert LibraryUpdateRanker to a object.](./files/82f263749f0ae775385b23dd919f1865360db969#r287513539)

[Nitpick: Add lines](./files/82f263749f0ae775385b23dd919f1865360db969#r287540256)

[Replace Java comparator](./files/82f263749f0ae775385b23dd919f1865360db969#r287539976)

[Nitpick: Add local variable](./files/82f263749f0ae775385b23dd919f1865360db969#r287514805)

* Fix 2

[Weird import](./files/82f263749f0ae775385b23dd919f1865360db969#r287513709)

[Default value](./files/82f263749f0ae775385b23dd919f1865360db969#r287540064)

[Use existing Strings](./files/82f263749f0ae775385b23dd919f1865360db969#r287514476)

[Use Library update order](./files/82f263749f0ae775385b23dd919f1865360db969#r287540204)
2019-06-09 14:32:12 +02:00
9ba7312caf Make MAL Tracking Slightly Less Shitty (#2042)
* * fix cookieManager not clearing cookies properly
* manually clear tracking prefs when !isLogged (e.g. cookies were cleared)

* use full url for removing cookies

* add interceptor for all non-login network calls
* attempt auto login if cookies are missing
* move handling of csrf token to interceptor

* * move methods around to improve readability
* fix TrackSearchAdapter not updating other fields if cover_url is missing
* revert accidental removal of feature in https://github.com/inorichi/tachiyomi/issues/65
* avoid login if credentials are missing

* fix eol

* *separate login flow from rxjava for reuse in sync

* *use less expensive method of finding manga

* *move variable declaration

* formatting

* set total chapters in remote track
2019-06-09 14:31:19 +02:00
8ebda219c4 Fix the category selection bug (#2052)
Fixes #2051
2019-05-26 11:37:47 +02:00
47f14e8555 Long click to manage categories (#2045) 2019-05-25 13:47:53 +02:00
974a24d03b Add help link to nav drawer (#2049) 2019-05-25 13:46:42 +02:00
15f225537e Update tracking sites after finishing chapter (#2044)
* Added second updateTrackLastChapterRead() called whenever a chapter has been read in the reader

* Removed old updateTrackLastChapterRead() so that it's not called twice.
2019-05-25 13:46:20 +02:00
a32572fc96 Ignore case while sorting Library (#2048)
* Ignore case while sorting Library

* Simplify code

As suggested by @arkon
2019-05-24 09:57:05 +02:00
be3ed9b6af Create FUNDING.yml 2019-05-24 09:56:31 +02:00
a0939e1c48 Update Shikimori (#2038)
Domain name change due to blocking by local authorities.
2019-05-16 18:21:54 +02:00
003dca9d45 Bugfix. Sharing images with very long name (#1999)
* Fix sharing with very long images name

* Fix dropLast to take
2019-05-07 11:06:38 +02:00
5c1770247c Update README.md
mangafox has been broken for months
2019-05-03 15:51:27 -04:00
021dde66eb Add color filter blend modes (#2013)
* Add color filter blend modes

* Only show modes supported by currently used API level.

* Fix arrays.xml for API level <=27.
2019-04-29 19:32:49 +02:00
5840a3e1e2 Shikomori -> Shikimori. Fix update chapters (#1996)
* Shikomori -> Shikimori. Fix update chapters

* Removed logs and format code
2019-04-29 18:40:26 +02:00
7c6478fe6b Force Migration to display titles from source rather than from local DB, and update local titles when migrated (#1670) 2019-04-29 18:38:59 +02:00
9a6bb69df8 Mark previous as unread now works when 'force ascending sort on gallery versions' is enabled 2019-04-22 09:24:57 -04:00
4c93ca6914 Merge pull request #82 from CarlosEsco/patch-1
update readme to new discord channel
2019-04-22 09:00:43 -04:00
51939ea652 update readme to new discord channel 2019-04-22 06:47:12 -04:00
256a4a2e7f Hide sorting options on EH manga when 'force ascending sort on gallery versions' is enabled 2019-04-22 00:34:43 -04:00
c217cab5db Fix reading progress being lost in some rare cases in galleries opened before v8.4.0 2019-04-22 00:16:38 -04:00
c93b6deaf8 Fix changelog sometimes not showing after update 2019-04-22 00:02:48 -04:00
55196b86b3 Fix chapters not being marked as read when transition pages are hidden 2019-04-21 23:52:40 -04:00
c5ab79f618 Improvements to accuracy of universal captcha detection 2019-04-21 23:01:41 -04:00
59fcfbe9d2 Fix universal captcha detection 2019-04-21 20:46:29 -04:00
6ce70296a6 Fix solve captcha activity not appearing (change that caused this was not released) 2019-04-21 17:28:07 -04:00
fdef687f0c Fix advanced login options for users on old devices
Fix ExHentai login and solve-captcha-window not working for users on old devices
Speed up ExHentai login significantly
2019-04-20 17:48:21 -04:00
cdd7f42532 Show warning when enabling applock on phones that cannot launch the grant-usage-stats-window. 2019-04-20 16:41:23 -04:00
65955fd7dc Remove used variable 2019-04-20 16:21:14 -04:00
b785f68154 Fix captcha solve activity sometimes never appearing 2019-04-20 14:07:52 -04:00
895191814e Fix favorites sync and backup/restore crashing on older devices 2019-04-20 14:01:18 -04:00
b06f253f83 Another attempt to fix autoscroll crashing the reader 2019-04-20 13:59:19 -04:00
0814439886 Include async stacktraces even on errors 2019-04-20 13:52:30 -04:00
a978cb90e8 Bump version and update changelog 2019-04-19 23:03:51 -04:00
39e0d434ad Add throttling when restoring E-Hentai/ExHentai galleries. 2019-04-19 22:59:24 -04:00
6ada3cbf59 Slow down favorites sync even more to prevent bands 2019-04-19 19:15:21 -04:00
4aff768b8e Fix multi-select operations crashing when selection is too large 2019-04-19 17:53:41 -04:00
e08e569135 Fix app crashing on startup for some users 2019-04-19 17:46:04 -04:00
8cac0fca67 Fix autoscroll crashing reader when sometimes 2019-04-19 17:40:05 -04:00
f447b06eff Fix incorrect rendering of seekbar on Android 4/5 2019-04-19 14:36:08 -04:00
78b2045b14 Various crash fixes on older Android versions 2019-04-19 14:26:37 -04:00
a427401d66 Fix EHentai and many other sources breaking 2019-04-19 13:14:41 -04:00
6da6ca710e Fix app crashing when updating library 2019-04-19 13:12:01 -04:00
f46c42f522 Add option to force ascending sort on gallery versions 2019-04-19 04:40:13 -04:00
c4df7b496b More optimizations to library search 2019-04-19 04:19:07 -04:00
6c4332f5c2 Disable aggressive page loading by default 2019-04-19 03:41:20 -04:00
86076d890a Fix wrong version number in new changelog 2019-04-19 03:38:33 -04:00
76a041f504 Add changelog for next release 2019-04-19 03:35:17 -04:00
c9bdc72d5d Upstream merge 2019-04-19 03:35:01 -04:00
f6a8b23498 Allow choosing hitomi.la thumbnail quality 2019-04-19 03:16:09 -04:00
2a60c828d7 Add aggressive page loading 2019-04-19 03:02:30 -04:00
ea7ff432b2 Add MangaDex login 2019-04-19 02:46:34 -04:00
5c2fbec80a Add universal captcha detection 2019-04-18 22:08:09 -04:00
f0109aa796 Fix manga info screen completely breaking on some sources 2019-04-18 21:04:20 -04:00
66b92f3eb7 Only auto-update old format galleries 2019-04-18 20:39:34 -04:00
ec4af65c36 Add universal captcha solver 2019-04-18 20:38:04 -04:00
852c1a423d Auto-update galleries in old format 2019-04-18 17:59:39 -04:00
1904be277d Fix auto-updater job never running 2019-04-18 17:59:17 -04:00
ebb1022100 Backup database in next release 2019-04-18 17:47:13 -04:00
8d85ec3cd9 Update gradle 2019-04-18 17:40:22 -04:00
1d36c3269e Add automatic gallery updating 2019-04-18 17:40:13 -04:00
a218f4a48b Gradle version upgrade 2019-04-16 12:25:53 -04:00
68aca55e6f Add options to open catalogue in browser/webview (#1979) 2019-04-16 17:34:52 +02:00
b14c3cc49f Logging tweak in ExtensionManager 2019-04-14 21:43:19 -04:00
cbc4a0f3ab Fix rating search 2019-04-14 21:00:42 -04:00
70a024d3de Minor tweak to debug overlay 2019-04-14 20:59:21 -04:00
28d43bbecc Allow searching by title for lewd galleries with missing metadata 2019-04-14 20:04:53 -04:00
55a3b2f3a1 Use different log filenames for different build types 2019-04-14 19:35:02 -04:00
2545b22ab1 Verify library state before syncing 2019-04-14 19:30:41 -04:00
77c07d13c0 Ignore non-existent galleries during favorites sync 2019-04-14 18:53:34 -04:00
98ac8a69c2 Minor type fix 2019-04-14 18:21:11 -04:00
0e22af7ba0 Hide view hierarchy captures from git 2019-04-14 18:21:00 -04:00
6951ce34c7 Fix deadlocks in gallery adder, favorites sync and backup/restore 2019-04-14 18:20:22 -04:00
24e10d6037 Add Discord link in README 2019-04-14 15:25:19 -04:00
f1b08bf56e Never backup log files 2019-04-14 13:57:14 -04:00
3cc3799ebb Ignore debug mode when choosing logger level 2019-04-14 13:54:31 -04:00
aed20a790e Remove extra line in debug overlay 2019-04-14 13:52:27 -04:00
81b20a23bf Add debug overlay
Disable crash workaround, not worth it
2019-04-14 13:51:20 -04:00
bd27cb74a7 Add extension/source blacklist 2019-04-14 12:48:59 -04:00
07fd3575c5 Better debug menu 2019-04-14 12:12:58 -04:00
6da504c999 Fix crash introduced when upgrading support library 2019-04-14 12:12:46 -04:00
23c1827838 Better importing of backups from Tachiyomi containing E-Hentai/ExHentai/nhentai/PervEden 2019-04-14 12:12:26 -04:00
49833fcc48 Migrate HentaiCafe IDs and nhentai URLs in backups 2019-04-14 11:17:21 -04:00
0e4c0fba5c Fix hitomi.la 2019-04-14 10:52:18 -04:00
bfe67f1cdf Add network inspection logging mode 2019-04-14 10:46:06 -04:00
863e349711 Improve logging 2019-04-14 10:09:43 -04:00
5e13df9bd8 Initialize manga when importing them 2019-04-14 09:30:48 -04:00
65abb8fa6c Fix read positions not being preserved 2019-04-14 09:30:29 -04:00
fe5c0295c3 Allow filter menu to be opened even if no filters to allow for search saving 2019-04-14 09:30:07 -04:00
4d15ac2fa3 Insert metadata in sync and when importing galleries 2019-04-14 09:09:24 -04:00
5e4b9fb15b Fix a crash that could occur in the incognito browser 2019-04-14 00:34:49 -04:00
8a70dffae8 Preserve async stack traces of http requests 2019-04-14 00:27:44 -04:00
8119eb4b34 Fix Tsumino source crashing app in some rare cases when network is unreliable 2019-04-14 00:09:19 -04:00
1bae7ba8f5 Fix app crash in some rare cases in reader 2019-04-13 23:56:40 -04:00
d4f1014df6 Improve logging infrastructure 2019-04-13 23:47:57 -04:00
dce685e711 Use app name as image save location 2019-04-13 23:03:20 -04:00
c4e6668c22 Get new URL on retry on EXH sources 2019-04-13 22:35:23 -04:00
9b5608c86d Fix build 2019-04-13 22:35:06 -04:00
2485a00d34 Upstream merge 2019-04-13 12:36:28 -04:00
8abe2d76b0 Support nhentai aliased tags
Better source ID detection
2019-04-13 12:18:42 -04:00
ba674935f4 Release 0.8.4 2019-04-13 15:10:44 +02:00
a053d55fbc Disable proguard 2019-04-13 14:57:58 +02:00
38ba8852a3 Release 0.8.3 2019-04-13 14:18:10 +02:00
3533359fae Use single task activity 2019-04-13 13:09:01 +02:00
8e9087226f Add ability to hide transition page between chapters 2019-04-12 22:59:49 -04:00
8ccc3c8b0c Upgrade Kotlin coroutines library version 2019-04-12 18:38:13 -04:00
0a988d1c69 Enable new translations 2019-04-12 19:19:35 +02:00
5f9e65cc9b Fix lint issues on new strings 2019-04-12 19:07:41 +02:00
026188268d Translations (#1886)
* Translated using Weblate (Czech)

Currently translated at 99.8% (426 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/cs/

* Translated using Weblate (Hindi)

Currently translated at 99.8% (426 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

* Translated using Weblate (Korean)

Currently translated at 79.2% (338 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ko/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (427 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (Korean)

Currently translated at 81.5% (348 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ko/

Translated using Weblate (Korean)

Currently translated at 81.5% (348 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ko/

* Translated using Weblate (Korean)

Currently translated at 94.1% (402 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ko/

* Translated using Weblate (French)

Currently translated at 100.0% (427 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

* Translated using Weblate (Hindi)

Currently translated at 99.8% (426 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

* Translated using Weblate (Korean)

Currently translated at 95.3% (407 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ko/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (427 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nl/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.8% (426 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

* Added translation using Weblate (Sardinian)

* Translated using Weblate (Sardinian)

Currently translated at 52.7% (225 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

* Added translation using Weblate (Filipino)

* Translated using Weblate (Filipino)

Currently translated at 5.2% (22 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fil/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (427 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (Filipino)

Currently translated at 11.2% (48 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fil/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (427 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (427 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

* Translated using Weblate (Sardinian)

Currently translated at 56.4% (241 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

* Translated using Weblate (Portuguese)

Currently translated at 81.5% (348 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

* Translated using Weblate (Portuguese)

Currently translated at 81.5% (348 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

* Translated using Weblate (Serbian)

Currently translated at 77.5% (331 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sr/

* Translated using Weblate (Sardinian)

Currently translated at 71.7% (306 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (427 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

* Translated using Weblate (Russian)

Currently translated at 100.0% (427 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (427 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

* Translated using Weblate (Sardinian)

Currently translated at 100.0% (427 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sc/

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (427 of 427 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/bg/
(cherry picked from commit ab854420b5e52f145146da9df5f2f4ff2ee283f1)
2019-04-12 19:04:44 +02:00
0e3464457c Remove internal sources 2019-04-12 19:05:18 +02:00
56195434e7 Add intent filter for external queries 2019-04-12 18:40:04 +02:00
9b3579acf6 Decrease debounce time for library search
Async library search code cleanup
Rename LoadingTools -> LoaderManager
2019-04-12 12:16:52 -04:00
ba2194f435 Load urls inside webview 2019-04-12 17:29:02 +02:00
6f2ff6a77e Hide library progress bar by default 2019-04-12 07:14:42 -04:00
f772501159 Library search is now asynchronous
Library will now display progress bar while loading
More optimizations to library search
2019-04-12 06:50:24 -04:00
cadd389658 Remove unused metadata objects and misc code cleanup 2019-04-12 04:18:57 -04:00
6f36331818 Upgrade Kotlin version 2019-04-12 03:41:10 -04:00
d684eb5147 Misc code cleanup 2019-04-12 03:12:16 -04:00
349546cf87 Build speed improvements 2019-04-12 03:07:29 -04:00
352593ebc6 README update 2019-04-11 03:40:20 -04:00
c6b28cbcaf Upgrade dependencies
Remove Firebase Perf for better build speeds
2019-04-09 21:43:47 -04:00
c5e69d2080 Merge pull request #62 from Scrxtchy/image_path
Update Save Image path
2019-04-09 14:22:31 -04:00
cd4964d086 Update Save Image path 2019-04-09 23:57:07 +10:00
e7df172da1 Provide default web view client so that redirections work 2019-04-08 10:13:58 +02:00
e7606e6dca Add option to open manga details in a WebView 2019-04-08 02:08:40 +02:00
8d4c0f505c Fix shared files not deleted from internal cache 2019-04-07 14:58:40 +02:00
ac3967e997 Decrease favorites sync max throttle by 500ms (should be safe) 2019-04-07 05:32:59 -04:00
5df18f2558 Consider EHentai == ExHentai when performing local deletions while syncing 2019-04-07 05:16:34 -04:00
0b054126bc Attempt to fix strange crash occurring on older Android versions 2019-04-07 05:15:40 -04:00
d4740c57be Fix crash when app is closed while migrating metadata 2019-04-07 04:43:10 -04:00
739fc9f95d Sort saved searches in UI 2019-04-06 17:59:18 -04:00
96b1340aec Revert README update 2019-04-06 09:54:04 -04:00
57d83e3d1b Use TachiWeb filter serializer for saving filters 2019-04-06 09:45:28 -04:00
4e2c9dc083 Various fixes to search presets 2019-04-06 09:05:32 -04:00
fa6f60d454 Fix hentai cafe url import 2019-04-06 08:16:48 -04:00
71fe2bda97 Add release changelog 2019-04-06 07:53:27 -04:00
f24c5e944e Fix various proguard issues 2019-04-06 07:40:27 -04:00
603fd84753 Rewrite tag searching to use SQL
Fix EHentai/ExHentai
Fix hitomi.la
Fix hitomi.la crashing application
Rewrite hitomi.la search engine to be faster, use less CPU and require no preloading
Fix nhentai
Add additional filters to nhentai
Fix PervEden
Introduce delegated sources
Rewrite HentaiCafe to be a delegated source
Introduce ability to save/load search presets
Temporarily disable misbehaving native Tachiyomi migrations
Fix tap-to-search-tag breaking on aliased tags
Add debug menu
Add experimental automatic captcha solver
Add app name to wakelock names
Add ability to interrupt metadata migrator
Fix incognito open-in-browser being zoomed in immediately when it's opened
2019-04-06 07:35:36 -04:00
8f2878a841 Added search intent handler and Google Search Action, for the global search (#1787)
* Added search intent handler

* Added support for Google Search actions
2019-04-03 10:25:52 +02:00
77296348a0 add option to skip chapters marked read (#1791) 2019-04-03 10:22:32 +02:00
a62a7d5330 Feature/shikomori track (#1905)
* Add shikomori track

* Fix char 'M'

* Fix date in search
2019-04-03 10:14:37 +02:00
bf60aae9d8 Fix crashes below L 2019-04-03 09:47:07 +02:00
ecc1520100 Use OkHttp to solve the challenge 2019-04-02 00:26:03 +02:00
f1f6a2b341 Test solving Cloudflare's challenge with WebView 2019-04-01 17:20:13 +02:00
55bf1c31a6 Set explicit autobackup rules 2019-04-01 17:14:37 +02:00
5fbe1a8614 Upstream merge 2019-03-31 00:23:44 -04:00
e47dd3d587 Add 32-bit color mode to reader settings (#1941)
* add ARGB_8888 mode to reader settings

* Only show option on Oreo or later.
Only show option in settings screen.
2019-03-30 14:21:35 +01:00
af0e3a278f Fix discord link (#1951)
Fix discord link
2019-03-30 06:39:10 -04:00
493ad93957 Release 0.8.2 2019-03-27 13:21:44 +01:00
dbe8f3cfbe Fix bug with update lib and parse chapters (#1927)
* Fix bug with update lib and parse chapters

* Fix else condition
2019-03-25 14:53:17 +01:00
08cdac968d Fix strings and add new languages 2019-03-25 14:52:07 +01:00
f12d5ba689 Storio imported from Jitpack. Also fix an issue with the progress bar animation on the reader 2019-03-22 23:06:05 +01:00
0afd77d110 Update ISSUE_TEMPLATE.md 2019-03-22 19:26:04 +01:00
7551941ef2 [Cloudflare] Fix recent CF JS Challenge error that calls DOM (#1919)
* [Cloudflare] Fix recent CF JS Challenge error that calls DOM

* Replace `atob` to pure js version. (was node.js API which invalid)

* Use `atob` as native function `Base64.decode()``

* Use okio Base64 decoder instead of Android one.
2019-03-22 19:25:21 +01:00
9ca0307e1c [Cloudflare] Fix 503 due to missing value in js challenge. (#1913)
Related issues: inorichi/tachiyomi-extensions#951
2019-03-21 08:48:03 +01:00
9a6f8be28c Remove F-Droid on README.md (#1891)
* Remove F-Droid on README.md

Seems F-Droid is not updated anymore.

* Remove unnecessary whitespace
2019-03-18 14:58:50 +01:00
9baf3b5a09 Release 0.8.1 2019-03-15 16:50:13 +01:00
ca3f0873f3 Extract hardcoded strings from layouts 2019-03-15 08:48:12 +01:00
adb0201449 Translations (#1750)
* Translated using Weblate (Indonesian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

* Added translation using Weblate (Czech)

* Translated using Weblate (Czech)

Currently translated at 45.6% (194 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/cs/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Added translation using Weblate (Greek)

* Translated using Weblate (Greek)

Currently translated at 99.8% (424 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/el/

* Translated using Weblate (Italian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

* Translated using Weblate (Romanian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

* Added translation using Weblate (Swedish)

* Translated using Weblate (Swedish)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sv/

* Translated using Weblate (Czech)

Currently translated at 45.6% (194 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/cs/

* Translated using Weblate (Italian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

* Translated using Weblate (Romanian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ro/

* Translated using Weblate (German)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/de/

* Translated using Weblate (Russian)

Currently translated at 98.1% (417 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Russian)

Currently translated at 98.4% (418 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Russian)

Currently translated at 98.4% (418 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Italian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/bg/

* Translated using Weblate (Portuguese)

Currently translated at 80.5% (342 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

* Translated using Weblate (Portuguese)

Currently translated at 80.5% (342 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

* Translated using Weblate (Portuguese)

Currently translated at 80.5% (342 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

* Translated using Weblate (Russian)

Currently translated at 98.8% (420 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Russian)

Currently translated at 98.8% (420 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Hindi)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

* Translated using Weblate (Russian)

Currently translated at 99.3% (422 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/bg/

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/bg/

* Translated using Weblate (Bulgarian)

Currently translated at 97.9% (416 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/bg/

* Translated using Weblate (Bengali)

Currently translated at 99.5% (423 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/bn/

* Translated using Weblate (Czech)

Currently translated at 80.7% (343 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/cs/

* Translated using Weblate (Russian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Russian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Russian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Russian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Russian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Russian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Russian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Czech)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/cs/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (Vietnamese)

Currently translated at 86.8% (369 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/vi/

* Translated using Weblate (Russian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Japanese)

Currently translated at 43.1% (183 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ja/

* Translated using Weblate (Bulgarian)

Currently translated at 99.8% (424 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/bg/

* Translated using Weblate (Greek)

Currently translated at 99.8% (424 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/el/

* Translated using Weblate (Bengali)

Currently translated at 99.8% (424 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/bn/

* Translated using Weblate (Vietnamese)

Currently translated at 88.0% (374 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/vi/

* Translated using Weblate (English)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/en/

* Added translation using Weblate (Norwegian Bokmål)

* Translated using Weblate (Norwegian Bokmål)

Currently translated at 31.8% (135 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nb_NO/

* Translated using Weblate (Hindi)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

* Translated using Weblate (Vietnamese)

Currently translated at 90.8% (386 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/vi/

* Added translation using Weblate (Thai)

* Translated using Weblate (Thai)

Currently translated at 2.4% (10 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/th/

* Translated using Weblate (Arabic)

Currently translated at 99.8% (424 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ar/

* Translated using Weblate (Czech)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/cs/

* Translated using Weblate (Polish)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pl/

* Added translation using Weblate (Catalan)

* Translated using Weblate (Catalan)

Currently translated at 19.1% (81 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

* Translated using Weblate (Polish)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pl/

* Translated using Weblate (Catalan)

Currently translated at 32.9% (140 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/bg/

* Translated using Weblate (Catalan)

Currently translated at 45.9% (195 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ca/

* Translated using Weblate (French)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

* Translated using Weblate (Portuguese)

Currently translated at 81.2% (345 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

* Translated using Weblate (Hungarian)

Currently translated at 39.8% (169 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hu/

* Added translation using Weblate (Serbian)

* Translated using Weblate (Serbian)

Currently translated at 57.2% (243 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sr/

* Translated using Weblate (Serbian)

Currently translated at 75.1% (319 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/sr/

* Translated using Weblate (Dutch)

Currently translated at 87.3% (371 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nl/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/
2019-03-15 08:41:10 +01:00
cf293642fb Fix Glide exceptions 2019-03-14 21:44:20 +01:00
10e1106760 [Cloudflare] Fix SyntaxError due to recent js challenge changes. (#1876)
From Anorov/cloudflare-scrape#193
Related issues: inorichi/tachiyomi-extensions#894
2019-03-14 17:45:21 +01:00
3f2d375a53 Reduce priority of jcenter repository 2019-03-14 17:32:08 +01:00
f8e121ee06 [Anilist] Fix date parsing error (#1805)
fix #1804
2019-01-28 09:03:03 +01:00
0ee005579b [Anilist] Fix tracking for re-reading status (#1795) 2019-01-12 17:08:13 +01:00
6ecd7fced8 Fix Amoled navigation bar colour on OxygenOS (#1762) 2018-12-07 07:25:06 +01:00
aeaf4d78f8 Bundle SQLite. Fixes tachiyomi not working on KitKat. Making a backup before using this version is recommended, but everything should work. 2018-11-26 13:05:42 +01:00
7baf0ddcc2 Translations (#1747)
* Translated using Weblate (Italian)

Currently translated at 100.0% (417 of 417 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

* Translated using Weblate (Italian)

Currently translated at 100.0% (417 of 417 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

* Translated using Weblate (Italian)

Currently translated at 100.0% (417 of 417 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

* Translated using Weblate (Polish)

Currently translated at 100.0% (417 of 417 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pl/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (417 of 417 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (417 of 417 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/id/

* Translated using Weblate (Spanish)

Currently translated at 90.8% (379 of 417 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (French)

Currently translated at 97.3% (406 of 417 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.0% (409 of 417 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

* Translated using Weblate (Russian)

Currently translated at 97.6% (407 of 417 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (417 of 417 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

* Translated using Weblate (Hindi)

Currently translated at 100.0% (417 of 417 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

* Translated using Weblate (Polish)

Currently translated at 100.0% (417 of 417 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pl/

* Translated using Weblate (Italian)

Currently translated at 100.0% (417 of 417 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (417 of 417 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ar/

* Added translation using Weblate (Turkish)

* Translated using Weblate (Turkish)

Currently translated at 100.0% (417 of 417 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

* Translated using Weblate (Portuguese)

Currently translated at 67.6% (282 of 417 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

* Update translation files

Updated by Clean-up translation files hook in Weblate.

* Translated using Weblate (Turkish)

Currently translated at 100.0% (424 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

* Translated using Weblate (French)

Currently translated at 100.0% (424 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

* Translated using Weblate (Bengali)

Currently translated at 97.4% (413 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/bn/

* Translated using Weblate (Bulgarian)

Currently translated at 98.5% (418 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/bg/

* Translated using Weblate (Hindi)

Currently translated at 100.0% (424 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

* Translated using Weblate (Arabic)

Currently translated at 98.1% (416 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ar/

* Added translation using Weblate (Chinese (Simplified))

* Translated using Weblate (Chinese (Simplified))

Currently translated at 17.4% (74 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

* Added translation using Weblate (Thai)

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (424 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

* Translated using Weblate (Russian)

Currently translated at 99.0% (420 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Malay)

Currently translated at 86.5% (367 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ms/

* Translated using Weblate (Italian)

Currently translated at 100.0% (424 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

* Translated using Weblate (Dutch)

Currently translated at 87.5% (371 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/nl/

* Translated using Weblate (Spanish)

Currently translated at 93.3% (396 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (Portuguese)

Currently translated at 75.2% (319 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

* Translated using Weblate (Japanese)

Currently translated at 8.9% (38 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ja/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (424 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Translated using Weblate (Spanish)

Currently translated at 100.0% (424 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/es/

* Deleted translation using Weblate (Thai)

* Translated using Weblate (Polish)

Currently translated at 100.0% (424 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pl/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 19.8% (84 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (424 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (424 of 424 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/zh_Hans/

* Translated using Weblate (Hindi)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hi/

* Translated using Weblate (Turkish)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/tr/

* Translated using Weblate (Italian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/it/

* Added translation using Weblate (Ukrainian)

* Translated using Weblate (Ukrainian)

Currently translated at 50.4% (214 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

* Translated using Weblate (Arabic)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ar/

* Translated using Weblate (Portuguese)

Currently translated at 75.3% (320 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

* Translated using Weblate (Portuguese)

Currently translated at 75.3% (320 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/pt_BR/

* Translated using Weblate (Russian)

Currently translated at 97.6% (415 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/ru/

* Translated using Weblate (Ukrainian)

Currently translated at 54.6% (232 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/bg/

* Translated using Weblate (French)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/fr/

* Translated using Weblate (Hungarian)

Currently translated at 39.3% (167 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/hu/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (425 of 425 strings)

Translation: Tachiyomi/Strings
Translate-URL: https://hosted.weblate.org/projects/tachiyomi/strings/uk/
2018-11-23 21:47:00 +01:00
d79e141fe5 Fix issue with center zoom position 2018-11-17 16:23:03 +01:00
030071e659 Changed repository order for gradle (#1728) 2018-11-17 10:15:03 +01:00
9cbf226cfd MAL API Workaround (#1647)
* Mal API workaround

* remove unused import

* Reuse existing token preference

* Minor code format
2018-11-11 14:00:47 +01:00
36aabf23e1 Optimize library query 2018-11-09 11:59:17 +01:00
8b67255186 kitsu search fix (#1681) 2018-10-27 19:34:05 +02:00
3186661420 Filter local manga as downloaded (#1674)
* Filter local manga as downloaded

* Filter local manga chapters as downloaded
2018-10-27 19:33:43 +02:00
46896d9e86 Fix potential NPE at cover image selector (#1665) 2018-10-27 19:17:35 +02:00
2c4fd340c8 Restore dark blue theme. Closes #1302 2018-10-27 19:10:11 +02:00
ae6d052978 Update Anilist API search to return 50 results (#1657)
* Update Anilist API search to return 50 results

This will help alleviate not being able to find manga with generic names
such as Monster

* Add description to Anilist search dialogue
2018-10-27 19:02:10 +02:00
974891a085 Allow pausing downloads from progress notification (#1637) 2018-10-27 19:01:56 +02:00
42169783e1 Merge branch 'master' of https://github.com/inorichi/tachiyomi 2018-08-27 12:43:45 -04:00
90574937df README update 2018-08-27 12:42:43 -04:00
ec0fe2210d Add ability to ask for category on long press 2018-08-04 10:49:29 -04:00
450fcccaa6 Log result in Tsumino and minor code cleanup 2018-08-03 22:03:51 -04:00
72504ca53f Minor typo fix and code cleanup 2018-08-03 21:34:31 -04:00
6bfddb3ece Bump Kotlin version 2018-08-03 21:34:12 -04:00
b62fcbc2ec Update changelog 2018-07-21 23:26:00 -04:00
411dda0e75 Introduce incognito open-in-browser support 2018-07-21 23:16:10 -04:00
d9d71c8745 Various dependency updates 2018-07-21 15:26:14 -04:00
35239af039 Allow preserving reading position even when manga is read 2018-07-18 22:46:47 -04:00
840e571917 Do not retry loading pages
GIF support in non-vertical pagers
Fix cache being double-opened
2018-07-18 22:17:46 -04:00
2fd4204db8 Reader cache + retry improvements 2018-07-17 22:29:49 -04:00
1fd105ac56 Bump version to next release 2018-07-08 19:49:33 -04:00
6ae90e0a7d Add ability to reverse search result order
Actually activate hath perks
2018-07-08 19:44:49 -04:00
43dc12a0f3 Fix hitomi browse/latest 2018-07-08 18:34:22 -04:00
28d05b629f Add additional advanced options to login screen
Add "more" button into global search results
Retry-all button is now more explicit on what was retried
Minor performance fix in hitomi search
2018-07-08 17:53:03 -04:00
30c12fc9de Get rid of outdated changelog 2018-07-08 15:53:59 -04:00
cdb62f502c Bump Realm version 2018-07-08 15:53:36 -04:00
5cfdbbce7a Merge branch 'master' of https://github.com/inorichi/tachiyomi
# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt
2018-07-08 15:51:26 -04:00
e2af1af656 Bump version to v7.4.1
Fix changelog
2018-06-10 12:19:53 -04:00
a96c25c37c Add retry all and boost page 2018-06-10 12:15:15 -04:00
c1abec3b4c Fix autoscroll scrolling right on right-to-left reader 2018-06-10 10:46:49 -04:00
c5a488ca3f Move ExHentai login to HTTPS 2018-06-10 01:47:17 -04:00
dd4a18a0b2 Prepare for release 2018-06-10 01:26:18 -04:00
34df0759f3 Improved autoscroll 2018-06-10 01:26:01 -04:00
b6a3f6ebd2 Add autoscroll support 2018-06-10 00:50:17 -04:00
ad2819a3bc Various dependency updates 2018-06-09 23:50:51 -04:00
0f2be86d5a Add ability to tune reader threads and instant retry 2018-06-09 23:12:53 -04:00
4342584c32 Minor code cleanup 2018-06-09 19:54:26 -04:00
71c10df270 Merge branch 'master' of https://github.com/inorichi/tachiyomi
# Conflicts:
#	README.md
#	app/.gitignore
#	app/build.gradle
#	app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAboutController.kt
#	app/src/main/res/raw/changelog_release.xml
2018-06-09 19:52:02 -04:00
db90b5d2cb Minor typo fix in Hitomi.la settings 2018-06-09 19:37:12 -04:00
5cc38c1369 Release v7.2.3 2018-04-18 21:15:11 -04:00
e7c48a98df Fix app locking even if app lock is disabled
Hide fingerprint view if fingerprint is disabled
2018-04-18 10:18:32 -04:00
d03c49db58 Fix app lock crashing app on older devices 2018-04-18 10:11:47 -04:00
b69af710ad Release v7.2.2
Fix SimpleDateFormat crashing application on older Android OSes
Rename preference key (typo)
2018-04-17 15:58:49 -04:00
4d3b469c48 Upgrade realm version 2018-04-16 11:50:46 -04:00
8cc6c0171b Increment realm schema version 2018-04-16 09:53:18 -04:00
8be5be4720 Fix possible crash-on-start from getToolbarNavigationItem 2018-04-16 09:50:57 -04:00
995a1155e4 Update changelogs and add hitomi.la URL importing 2018-04-15 14:35:00 -04:00
234c3bb72a Merge branch 'master' of https://github.com/inorichi/tachiyomi
# Conflicts:
#	README.md
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryAdapter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt
2018-04-15 13:39:29 -04:00
aafe863774 Add hitomi.la preferences screen
Add hitomi.la early refresh
Fix some typos in comments
2018-04-15 13:35:38 -04:00
fb1db914aa Fix Tsumino page offset (fixes #27) 2018-04-14 23:37:17 -04:00
7aa8abdd98 Add A-B swapping for hitomi.la search database 2018-04-14 23:23:55 -04:00
4bd965a795 Merge branch 'master' of https://github.com/NerdNumber9/TachiyomiEH 2018-04-14 21:17:50 -04:00
df2a4779bf Merge branch 'master' of https://github.com/inorichi/tachiyomi
# Conflicts:
#	.travis.yml
#	README.md
#	app/build.gradle
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt
#	app/src/main/res/layout/manga_info_controller.xml
#	app/src/main/res/raw/changelog_release.xml
2018-04-14 21:11:29 -04:00
d2dc063c8e More work on Hitomi.la 2018-04-14 15:50:05 -04:00
45f4c63941 Merge branch 'master' of https://github.com/inorichi/tachiyomi 2018-03-15 17:22:49 -04:00
5e968e5651 Fix broken back button in search 2018-03-15 17:04:33 -04:00
3e3c0a1f14 Add option to expand search filters by default 2018-03-15 16:57:16 -04:00
c48bebe0b2 Add option to disable auto lock and add manual locking 2018-03-14 18:39:01 -04:00
0dd9e9e015 Repackage captcha solve activity to UI package 2018-03-14 13:17:55 -04:00
d2a2e17e91 Re-theme lock view to actually match current theme 2018-03-14 13:13:57 -04:00
09dbd723e4 Fix Tsumino captcha appearing multiple times 2018-03-14 12:22:28 -04:00
eb965542cc Update changelog
Code cleanup
2018-03-13 20:49:17 -04:00
615fa05a75 Merge branch 'master' of https://github.com/inorichi/tachiyomi
# Conflicts:
#	README.md
#	app/build.gradle
#	app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoController.kt
#	app/src/main/res/layout/manga_info_controller.xml
#	app/src/main/res/raw/changelog_release.xml
2018-03-13 15:58:47 -04:00
87a2ac7887 Attempt to add hitomi.la source (still broken) and code cleanup 2018-03-13 15:21:31 -04:00
07ce90ab8c Add Tsumino captcha display and merge branch 'master' of upstream
# Conflicts:
#	.github/readme-images/app-icon.png
#	.github/readme-images/screens.png
#	.travis.yml
#	README.md
#	app/build.gradle
#	app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/online/YamlHttpSource.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/online/YamlHttpSourceMappings.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt
#	app/src/main/java/eu/kanade/tachiyomi/util/DynamicConcurrentMergeOperator.java
2018-02-25 15:34:19 -05:00
a71ae29c98 Add Tsumino captcha display and merge branch 'master' of upstream
# Conflicts:
#	.github/readme-images/app-icon.png
#	.github/readme-images/screens.png
#	.travis.yml
#	README.md
#	app/build.gradle
#	app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/online/YamlHttpSource.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/online/YamlHttpSourceMappings.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt
#	app/src/main/java/eu/kanade/tachiyomi/util/DynamicConcurrentMergeOperator.java
2018-02-24 11:13:43 -05:00
117214c671 Implement lenient sync 2018-02-23 18:57:19 -05:00
c54d26d6ba Fix broken favorites sync
Release v6.8.2
2018-02-15 17:21:33 -05:00
5447bd098b Release v6.8.1 2018-02-14 17:21:29 -05:00
2b7c0e8e80 Fix gallery browsing 2018-02-12 16:22:54 -05:00
47966d89f2 Fix typo in sync throttle message 2018-02-03 11:22:59 -05:00
b28a2c3bd4 Fix sync sometimes crashing when ran multiple times without reopening the app 2018-02-02 12:48:09 -05:00
8f51abfc97 Sync is now essentially fully atomic on the client side
Sync now aborts on most errors instead of continuing
Sync now holds screen, CPU and WIFI locks
2018-02-02 12:11:09 -05:00
e9bea8ed47 Fix minor issue in sync intro screen 2018-02-01 14:39:21 -05:00
c2c1b6d2e8 Update changelog 2018-02-01 14:11:47 -05:00
ded22f1717 Finish favorites sync 2018-02-01 13:46:33 -05:00
126da3979c Merge branch 'master' of https://github.com/inorichi/tachiyomi 2018-01-31 22:40:17 -05:00
d892f2f7f4 Initial implementation of favorites syncing
General code cleanup
Fix some cases of duplicate galleries (not completely fixed)
2018-01-31 22:39:55 -05:00
f18b32626a Rewrite link intercept activity
Fix compatibility issues between lewd sources and manga info screen
2018-01-29 15:39:34 -05:00
8c8f2585aa Merge remote-tracking branch 'upstream/master'
# Conflicts:
#	README.md
#	app/build.gradle
#	app/src/main/java/eu/kanade/tachiyomi/App.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/updater/UpdateDownloaderReceiver.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoPresenter.kt
#	app/src/main/res/menu/library.xml
#	app/src/main/res/values/strings.xml
#	app/src/test/java/eu/kanade/tachiyomi/data/database/ChapterRecognitionTest.kt
2018-01-29 12:16:32 -05:00
1a811d0917 Code cleanup
Release v6.6.0
Cleanup changelog
2017-12-08 18:21:26 -05:00
9af552c15a Merge branch 'master' of https://github.com/inorichi/tachiyomi
# Conflicts:
#	README.md
#	app/build.gradle
#	app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/NoResultsException.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/latest_updates/LatestUpdatesPresenter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt
2017-12-07 23:20:27 -05:00
263cc1d97c See CHANGELOG.md for this commit 2017-12-07 22:25:27 -05:00
dec4471871 Second attempt to update changelog
Fix wording in metadata fetch dialog
2017-11-30 21:07:26 -05:00
c8122ebd68 Update changelog 2017-11-29 22:14:02 -05:00
b766ddea54 Merge branch 'master' of https://github.com/inorichi/tachiyomi
Fix back button in library search
2017-11-29 21:41:05 -05:00
5cb219d83e Various changes 2017-11-29 21:44:35 -05:00
908128b55d Merge upstream changes 2017-11-29 21:53:02 -05:00
b240960a8a Update dependencies
Remove travis config as we don't use travis
2017-11-29 21:55:56 -05:00
b91d8e4c19 Release 0.6.5 2017-11-29 18:49:22 +01:00
4853ff7eee Resubscribe to library when a change of type enter occurs. Resolves #1093 2017-11-29 10:05:33 +01:00
e1582bd73a Minor changes to download cache. Also keep the library view, as recreation is expensive 2017-11-28 23:58:37 +01:00
ac17335dbe Fix automatic backups (#1074)
* Fix automatic backups

* Small fixes

* small fixes
2017-11-28 22:55:50 +01:00
7053777997 Release version v6.1.4
Offload metadata check to background thread
Add search cache
2017-08-28 03:20:35 -04:00
1107b95ebd Remove leftover code 2017-08-26 03:52:52 -04:00
36003fd622 Remove leftover TODO 2017-08-26 03:48:12 -04:00
84121ff901 Release v6.1.3
Make search engine synchronous
Offload some search engine tasks to background threads
Minor search engine speedups
2017-08-26 03:40:59 -04:00
bcc2ec1668 Fix migration dialog showing on startup even with no manga 2017-08-25 22:26:57 -04:00
08dffda2a1 Fix NHentai and PervEden sources
Version bump to v6.1.2
2017-08-25 19:08:33 -04:00
9f4540a4f1 Fallback to normal library searching when metadata is not available 2017-08-25 18:52:32 -04:00
f19ef9aa01 Fix proguard rules 2017-08-25 18:51:25 -04:00
f10a06341b More changelog entries 2017-08-25 18:50:57 -04:00
67ac95f15f Merge branch 'master' of https://github.com/inorichi/tachiyomi 2017-08-25 17:39:22 -04:00
cd291f0a27 Migrate to realm for metadata 2017-08-25 17:31:38 -04:00
bb6b88a703 Make drawerArrow private again (as it was in upstream) 2017-08-24 18:31:45 -04:00
239b36c31a Add nhentai URL importing
Allow fast importing of single URLs by inputting the URL into the source's search bar
2017-08-24 18:31:08 -04:00
dcb6ae44dd Fix intercept activity 2017-08-24 17:33:03 -04:00
5ed365cf0d Remove outdated declarations from AndroidManifest 2017-08-24 17:13:09 -04:00
b20b3d6f5c Add fingerprint to lock UI
Migrate login UI to conductor
Fix batch add controller not saving EditText content onResume
Prevent double-locking of lock UI
Remove back button from lock UI
Fix login preference not updating
2017-08-24 17:11:43 -04:00
32d02f9329 Migrate to Tachiyomi 6.1
Rewrite batch add UI
Rewrite lock UI
2017-08-24 12:28:54 -04:00
3da7c47bf5 Merge branch 'master' of https://github.com/inorichi/tachiyomi
# Conflicts:
#	app/build.gradle
#	app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/base/activity/ActivityMixin.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/base/activity/BaseActivity.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/base/adapter/FlexibleViewHolder.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/base/adapter/SmartFragmentStatePagerAdapter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/base/fragment/BaseFragment.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/base/fragment/BaseRxFragment.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/base/fragment/FragmentMixin.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/category/CategoryActivity.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/latest_updates/LatestUpdatesFragment.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryAdapter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryFragment.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/main/ChangelogDialogFragment.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaActivity.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaEvent.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersFragment.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/ChapterCountEvent.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaFavoriteEvent.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoFragment.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/info/MangaInfoPresenter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackFragment.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/recently_read/RecentlyReadFragment.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAboutFragment.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsActivity.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedFragment.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadsFragment.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsFragment.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsGeneralFragment.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsTrackingFragment.kt
#	app/src/main/java/eu/kanade/tachiyomi/util/AndroidComponentUtil.java
#	app/src/main/java/eu/kanade/tachiyomi/widget/preference/LibraryColumnsDialog.kt
#	app/src/main/java/eu/kanade/tachiyomi/widget/preference/SimpleDialogPreference.kt
#	app/src/main/res/layout/activity_download_manager.xml
#	app/src/main/res/layout/activity_edit_categories.xml
#	app/src/main/res/layout/activity_manga.xml
#	app/src/main/res/layout/activity_preferences.xml
#	app/src/main/res/layout/fragment_backup.xml
#	app/src/main/res/layout/fragment_download_queue.xml
#	app/src/main/res/layout/fragment_library.xml
#	app/src/main/res/layout/fragment_library_category.xml
#	app/src/main/res/layout/item_chapter.xml
#	app/src/main/res/layout/item_recent_chapters.xml
#	app/src/main/res/layout/toolbar.xml
#	app/src/main/res/raw/changelog_release.xml
#	app/src/main/res/values/arrays.xml
#	app/src/main/res/xml/pref_about.xml
#	app/src/main/res/xml/pref_advanced.xml
#	app/src/main/res/xml/pref_downloads.xml
#	app/src/main/res/xml/pref_general.xml
#	app/src/main/res/xml/pref_reader.xml
#	app/src/main/res/xml/pref_sources.xml
#	app/src/main/res/xml/pref_tracking.xml

Migrate to Tachiyomi 6.1
Rewrite batch add UI
2017-08-24 11:24:23 -04:00
029f159aea Add the ability to import galleries by specifying the URL of one of it's pages 2017-05-08 20:03:20 -04:00
0a300822a4 Fix NoClassDefFoundError in E-Hentai/ExHentai source. 2017-05-05 00:41:10 -04:00
8d48e0289a Merge origin branch (I messed up the repo) 2017-05-04 23:54:18 -04:00
9dbb59f337 Upstream merge
Internal permission change
Fix url adder
2017-05-04 23:38:17 -04:00
a243aeafba Release v5.0.2. 2017-03-16 23:12:38 -04:00
5c671de29e Fix NHentai source only showing first page. 2017-03-16 22:54:55 -04:00
e161e5d30d Release version 5.0.1. 2017-03-15 15:03:36 -04:00
2fd64d0ca7 Fix download notifier breaking on some weird titles. 2017-03-15 14:56:34 -04:00
d981c75600 Add favorites downloader. 2017-03-15 14:39:09 -04:00
492adb7035 Release version 5.0.0. 2017-03-09 20:53:28 -05:00
811bca18d9 Yolo 2017-03-09 20:47:06 -05:00
3222e0646d Various bug fixes. 2017-03-09 20:46:24 -05:00
fa6790856d Fixed SourceManager creating sources multiple times on app launch. 2017-03-09 18:49:52 -05:00
38a15d4158 Fix lock preference observing on wrong thread. 2017-03-09 18:23:45 -05:00
77cd459c51 Retry button now uses a different H@H server. 2017-03-09 18:18:53 -05:00
fa115ed9a0 Fix null scanlator text.
Fix nhentai "Open in Browser" and "Share" buttons.
2017-03-09 17:31:17 -05:00
30a2b572ab Enable text selection in manga info window. 2017-03-09 17:21:11 -05:00
b1ab77188d Add apk files to gitignore. 2017-03-09 17:17:30 -05:00
e212e4581d Fix user being asked for lock permissions when lock is not enabled. 2017-03-09 17:17:18 -05:00
1b8daa7e09 Another attempt to fix proguard config. 2017-03-09 16:53:13 -05:00
99d126fd3a Fix typo in proguard config. 2017-03-09 16:50:31 -05:00
9fee7c6b19 Fix proguard rules. 2017-03-09 16:47:55 -05:00
1b5a83563f Hopefully fix stackoverflow crash. 2017-03-09 16:31:28 -05:00
c8a8eb0a4d Add nhentai source. 2017-03-09 16:01:34 -05:00
0a7812bb2c Remove old debugging code and useless comments. 2017-03-08 18:58:56 -05:00
061b434687 Fix crashes when opening invalid manga. 2017-03-08 17:14:12 -05:00
f3be1a6d09 Fix crash due to empty page list. 2017-03-07 23:03:07 -05:00
1e797bfe8a Add PIN feature to README.
Remove hint from PIN setup dialog.
2017-03-07 22:50:40 -05:00
97435dbe0f Fix readme. 2017-03-07 22:48:27 -05:00
3fdbb95b15 More documentation. 2017-03-07 22:44:22 -05:00
961a6c0b4f Code cleanup. 2017-03-07 22:44:08 -05:00
c42f011a05 Implement Perv Eden source. 2017-03-07 22:02:16 -05:00
957c50088d Add cancel button to lock preference. 2017-03-05 12:49:56 -05:00
3b129176d6 Code cleanup. 2017-03-05 12:41:34 -05:00
f36327ecc9 Add application lock functionality. 2017-03-05 12:36:52 -05:00
5f48bb8e7d Merge branch 'master' of https://github.com/inorichi/tachiyomi
# Conflicts:
#	README.md
#	app/build.gradle
#	app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/source/SourceManager.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/model/Page.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/backup/BackupPresenter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/main/ChangelogDialogFragment.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt
#	app/src/main/res/raw/changelog_release.xml
#	app/src/main/res/values/arrays.xml
#	app/src/main/res/values/strings.xml
2017-03-04 22:54:00 -05:00
aba8d01818 Merge branch 'master' of https://github.com/inorichi/tachiyomi 2017-03-04 22:46:56 -05:00
03cb7062f2 Merge branch 'master' of https://github.com/inorichi/tachiyomi
# Conflicts:
#	README.md
#	app/build.gradle
#	app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
#	app/src/main/java/eu/kanade/tachiyomi/data/source/SourceManager.kt
#	app/src/main/java/eu/kanade/tachiyomi/source/model/Page.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/backup/BackupPresenter.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/main/ChangelogDialogFragment.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt
#	app/src/main/res/raw/changelog_release.xml
#	app/src/main/res/values/arrays.xml
#	app/src/main/res/values/strings.xml
2017-03-04 22:43:06 -05:00
d4b35736c0 Gallery chapter metadata will now be automatically downloaded when importing galleries. 2017-02-28 17:37:51 -05:00
c30aa710f3 Change baseUrl from g.e-hentai.org -> e-hentai.org 2017-02-28 17:21:00 -05:00
0adac4217e Fix share button adding extra "/" onto end of URL
Fixed by removing "/" from end of baseUrl.
2017-02-28 17:09:13 -05:00
7e102edd0a Increase memory allocated to gradle 2017-02-28 16:57:09 -05:00
adefe87129 Minor code cleanup 2017-02-28 16:56:47 -05:00
8a05fc8966 Add local namespace searching. 2017-02-28 16:56:29 -05:00
8fa798cf63 Update README. 2017-01-09 18:11:51 -05:00
01b20b2acb Add some branding. 2017-01-09 18:10:06 -05:00
a8d72dd6f8 Whoops missed the changelog. 2017-01-09 17:37:38 -05:00
84042c61e0 Release 4.0.1. 2017-01-09 17:33:47 -05:00
407ba6c628 Fix duplicate galleries. 2017-01-09 17:27:58 -05:00
16a3c676ef Update README.md 2017-01-07 12:08:32 -05:00
9b3a99432b Update README.md 2017-01-07 12:07:17 -05:00
036f757086 Update README.md 2017-01-07 12:06:47 -05:00
a391529b32 Fix updater. 2017-01-07 11:55:16 -05:00
d10b782308 Merge remote-tracking branch 'origin/master' 2017-01-07 10:47:53 -05:00
a58f780452 Remove ACRA. 2017-01-07 10:07:37 -05:00
606de03c7c Various bug fixes. 2017-01-06 20:57:50 -05:00
2b988c51ad Add migration system. 2017-01-06 18:01:40 -05:00
cb73e55db1 Deduplicate some code.
Change package name.
2017-01-05 18:26:32 -05:00
8fb4093dc6 Various bug fixes and code cleanup. 2017-01-04 23:34:47 -05:00
f5c4535cb0 Add migration ability.
Various bug fixes and code cleanup.
2017-01-04 22:56:24 -05:00
e4f2bffbc2 Various bug fixes and code cleanup. 2017-01-04 20:19:44 -05:00
5c942460f9 Various bug fixes. 2017-01-04 16:24:21 -05:00
cce1f2c20d Finish batch add screen. 2017-01-04 14:37:28 -05:00
516a3bd017 Integrate tag searching into library. 2017-01-04 11:17:12 -05:00
63d58c7a4f Add uploader faux-namespace to search engine. 2017-01-04 10:30:44 -05:00
c49b865ee7 Regexes are now compiled only once by search engine. 2017-01-04 00:06:53 -05:00
097a83e3ba Fix some bugs in the search engine. 2017-01-03 23:45:44 -05:00
02c70d868d Implement search engine. 2017-01-03 16:57:51 -05:00
c836f52460 Implement most gallery settings. 2017-01-03 11:27:10 -05:00
caa1e1ef09 Add EH code. 2017-01-02 18:02:10 -05:00
5c63531066 Add logged in property reporting. 2016-10-18 22:13:43 -04:00
15b2bbc6d1 Merge changes.
Various changes.
2016-10-18 21:58:00 -04:00
3cafbd9141 Merge changes.
Various changes.
2016-10-18 21:50:48 -04:00
dc0405a373 More build fixes. 2016-08-05 20:25:48 -04:00
f84832716a Remove unused classes and clean up build. 2016-08-05 20:19:27 -04:00
200aa4042f Fix table in README. 2016-08-05 20:08:35 -04:00
f44c5adcc0 Update README with correct data. 2016-08-05 20:05:20 -04:00
3c43bebe64 Integrate TachiyomiEH changes. 2016-08-05 19:42:36 -04:00
1242 changed files with 70988 additions and 27588 deletions

24
.gitattributes vendored Normal file
View File

@ -0,0 +1,24 @@
* text=auto
* text eol=lf
# Windows forced line-endings
/.idea/* text eol=crlf
# Gradle wrapper
*.jar binary
# Images
*.webp binary
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.ico binary
*.gz binary
*.zip binary
*.7z binary
*.ttf binary
*.eot binary
*.woff binary
*.pyc binary
*.swp binary

6
.github/CONTRIBUTING.md vendored Normal file → Executable file
View File

@ -1,10 +1,10 @@
1. **Before reporting a new issue, take a look at the [FAQ](https://github.com/inorichi/tachiyomi/wiki/FAQ), the [changelog](https://github.com/inorichi/tachiyomi/releases) and the already opened [issues](https://github.com/inorichi/tachiyomi/issues).**
1. **Before reporting a new issue, take a look at the [FAQ](https://tachiyomi.org/help/faq/), the [changelog](https://github.com/inorichi/tachiyomi/releases) and the already opened [issues](https://github.com/inorichi/tachiyomi/issues).**
2. If you are unsure, ask here: [![Discord](https://img.shields.io/discord/349436576037732353.svg)](https://discord.gg/tachiyomi)
3. What is your type of issue?
* [Catalogue request](#catalogue-requests)
* [Bugs](#bugs)
* [Feature requests](#feature-requests)
* [Translations](https://github.com/inorichi/tachiyomi/wiki/Translation)
* [Translations](https://tachiyomi.org/help/contribution/#translation)
4. After following 1. and 3. you can [open your issue](https://github.com/inorichi/tachiyomi/issues/new)
***
@ -29,5 +29,5 @@ DON'T: https://github.com/inorichi/tachiyomi/issues/75
# Feature requests
* Write a detailed issue, explaning what it should do or how. Avoid writing just "like X app does"
* Write a detailed issue, explaining what it should do or how. Avoid writing just "like X app does"
* Include screenshot (if needed)

2
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1,2 @@
github: inorichi
ko_fi: inorichi

29
.github/ISSUE_TEMPLATE.md vendored Normal file → Executable file
View File

@ -1,15 +1,26 @@
**DO NOT OPEN ISSUES/REQUESTS RELATING TO EXTENSIONS/CATALOGUES IN THIS REPOSITORY. Open them at the following repository https://github.com/inorichi/tachiyomi-extensions/**
**PLEASE READ THIS**
**For all other requests Please fill out the form below and remove the first 3 lines of this template**
I acknowledge that:
**App version:**
- I have updated to the latest version of the app (stable is v0.9.2)
- I have updated all extensions
- If this is an issue with an extension, that I should be opening an issue in https://github.com/inorichi/tachiyomi-extensions
**Issue/Request:**
**DELETE THIS SECTION IF YOU HAVE READ AND ACKNOWLEDGED IT**
**Steps to reproduce (if applicable)**
---
1.
2.
3.
### Device information
* Tachiyomi version: ?
* Android version: ?
* Device: ?
**Other details:**
## Steps to reproduce
1. First step
2. Second step
## Issue/Request
?
## Other details
Additional details and attachments.

36
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@ -0,0 +1,36 @@
---
name: "🐞 Bug report"
about: Report a bug
title: "[Bug] Write short description here"
labels: "bug"
---
**PLEASE READ THIS**
I acknowledge that:
- I have updated to the latest version of the app (stable is v0.9.2)
- I have updated all extensions
- If this is an issue with an extension, that I should be opening an issue in https://github.com/inorichi/tachiyomi-extensions
**DELETE THIS SECTION IF YOU HAVE READ AND ACKNOWLEDGED IT**
---
### Device information
* Tachiyomi version: ?
* Android version: ?
* Device: ?
## Steps to reproduce
1. First step
2. Second step
### Expected behavior
This should happen.
### Actual behavior
This happened instead.
### Other details
Additional details and attachments.

View File

@ -0,0 +1,24 @@
---
name: "🌟 Feature request"
about: Suggest a feature to improve Tachiyomi
title: "[Feature Request] Write short description here"
labels: "feature"
---
**PLEASE READ THIS**
I acknowledge that:
- I have updated to the latest version of the app (stable is v0.9.2)
- I have updated all extensions
- If this is an issue with an extension, that I should be opening an issue in https://github.com/inorichi/tachiyomi-extensions
**DELETE THIS SECTION IF YOU HAVE READ AND ACKNOWLEDGED IT**
---
### Why/User Benefit/User Problem
(explain why this feature should be added)
### What/Requirements
(explain how this feature would behave)

View File

@ -0,0 +1,8 @@
---
name: "Extension/source/catalogue issue"
about: "Do not open an issue here. See https://github.com/inorichi/tachiyomi-extensions"
title: "THIS ISSUE IS IN THE WRONG REPO; SEE https://github.com/inorichi/tachiyomi-extensions"
labels: "catalog"
---
DO NOT OPEN AN ISSUE IN THIS REPO. SEE https://github.com/inorichi/tachiyomi-extensions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 730 KiB

After

Width:  |  Height:  |  Size: 1.0 MiB

25
.github/workflows/PullRequestTester.yml vendored Normal file
View File

@ -0,0 +1,25 @@
name: Pull Request Checker
on:
pull_request:
jobs:
apk:
name: Generate APK
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- name: set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Get NDK
run: sudo ${ANDROID_HOME}/tools/bin/sdkmanager --install "ndk;20.0.5594570"
- name: Build Release APK
run: bash ./gradlew assembleDebug --stacktrace
- name: Upload APK
uses: actions/upload-artifact@v2
with:
name: TachiyomiSY-${{ github.sha }}.apk
path: app/build/outputs/apk/dev/debug/app-dev-debug.apk

View File

@ -0,0 +1,31 @@
name: Remote Dispatch Action Initiator
on:
push:
repository_dispatch:
jobs:
ping-pong:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
with:
fetch-depth: '0'
- name: TAG - Bump version and push tag
uses: anothrNick/github-tag-action@1.17.2
if: github.event.action != 'pong'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
WITH_V: true
RELEASE_BRANCHES: master
- name: PING - Dispatch initiating repository event
if: github.event.action != 'pong'
run: |
curl -X POST https://api.github.com/repos/jobobby04/TachiyomiSYPreview/dispatches \
-H 'Accept: application/vnd.github.everest-preview+json' \
-u ${{ secrets.ACCESS_TOKEN }} \
--data '{"event_type": "ping", "client_payload": { "repository": "'"$GITHUB_REPOSITORY"'" }}'
- name: ACK - Acknowledge pong from remote repository
if: github.event.action == 'pong'
run: |
echo "PONG received from '${{ github.event.client_payload.repository }}'"

13
.github/workflows/issue_closer.yml vendored Normal file
View File

@ -0,0 +1,13 @@
name: Issue closer
on: [issues]
jobs:
autoclose:
runs-on: ubuntu-latest
steps:
- name: Autoclose issue
uses: arkon/issue-closer-action@v1.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
issue-close-message: "@${issue.user.login} this issue was automatically closed because it was not filled in correctly or the acknowledgment section was not removed."
issue-title-pattern: ".*THIS ISSUE IS IN THE WRONG REPO.*"
issue-body-pattern: ".*DELETE THIS SECTION IF YOU HAVE READ AND ACKNOWLEDGED IT.*"

18
.gitignore vendored Normal file → Executable file
View File

@ -2,8 +2,22 @@
/local.properties
/.idea/workspace.xml
.DS_Store
/build
.idea/
*iml
*.iml
*/build
/mainframer
/.mainframer
# Built files
*/build
/build
*.apk
app/**/output.json
# Hebrew assets are copied on build
app/src/main/res/values-iw/
TODO.md
CHANGELOG.md
/captures
build.sh

View File

@ -1,58 +1,81 @@
dist: trusty
language: android
android:
components:
- build-tools-28.0.3
- android-27
- extra-android-m2repository
- extra-google-m2repository
- extra-android-support
- extra-google-google_play_services
- tools
- platform-tools
- build-tools-29.0.3
- android-29
- extra-android-m2repository
- extra-google-m2repository
- extra-android-support
- extra-google-google_play_services
licenses:
- android-sdk-license-.+
- 'android-sdk-license-.+'
- 'android-sdk-preview-license-.+'
before_install:
- yes | sdkmanager "platforms;android-27" # workaround for accepting the license
- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then
- yes | sdkmanager "platforms;android-29" # workaround for accepting the license
- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then
openssl aes-256-cbc -K $encrypted_e56be693d4fd_key -iv $encrypted_e56be693d4fd_iv -in "$PWD/.travis/secrets.tar.enc" -out secrets.tar -d;
tar xf secrets.tar;
mv debug.keystore "$HOME/.android";
fi
- git clone https://github.com/urho3d/android-ndk.git $HOME/android-ndk-root
- export ANDROID_NDK_HOME=$HOME/android-ndk-root
- mkdir "$ANDROID_HOME/licenses" || true
- echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_HOME/licenses/android-sdk-license"
- echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "$ANDROID_HOME/licenses/android-sdk-preview-license"
fi
- mkdir "$ANDROID_HOME/licenses" || true
- echo -e "\n24333f8a63b6825ea9c5514f83c2829b004d1fee" > "$ANDROID_HOME/licenses/android-sdk-license"
- echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "$ANDROID_HOME/licenses/android-sdk-preview-license"
install:
- echo y | sdkmanager "ndk-bundle"
before_script:
- export ANDROID_NDK_HOME=$ANDROID_HOME/ndk-bundle
script: ".travis/build.sh"
before_cache:
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
- rm -fr $HOME/.gradle/caches/*/plugin-resolution/
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
- rm -fr $HOME/.gradle/caches/*/plugin-resolution/
cache:
directories:
- "$HOME/.gradle/caches/"
- "$HOME/.gradle/wrapper/"
- "$HOME/.android/build-cache"
- "$HOME/.gradle/caches/"
- "$HOME/.gradle/wrapper/"
- "$HOME/.android/build-cache"
deploy:
- provider: releases
api_key:
secure: qmS9SyMq8xPDqaY83rvAFyZcvic24lGBj3MFt22RhVJzIXAAN/vqL1R70PnNiCF7CE+R7PaDlBpwjxDMBiuh0QQNc1oX6cgepUbro4/Nt7NFFfCvKXaFdR1cSgYouhuHmy0SS0/alrcfhQ2bPwcm1/vAOiSa8Wu7hsXhCcxbFyEbXZVD11QZmiffEM0py+OeuqOFo2JxZaGRu2z04E/u5TWep1ZEuhFRCC87PGgFqABgg6jYYebQOUZADG/0G8581HTGU0mdwueYsiA35ncRzpV2V8DajEEBd5wOe5d8SyMtE+6Qs5PD9KcXAqGGe4QRmrJMX5EcLQaLZf/Qd5s9SFZVHb1aJIw/y05w4L5dlVpsjx5WuUAYAVg7Ol5UawofFo/hYkYCNmfub67wJQdHSIxPif7V6YeON6RQQMpc5GBYY9eA6ZxhrdA2m7eyoOT3jcbdaVJwC0jMGhn26hkgJfTo1LfAUs85Cs3BrK8w6Poqc/Jb+4Y0NhdGIKgO5tS3vY54cTJVVrQTq4/XmME4ZnzOX3HaOqzfyt/6M4gEQMvaeFksxwoFhocV7wfaCq9ps/Kdq2dl4KwoqRV2WqVaauqzCP4XPSlVLaJqztsw0wboupcaZepWJ2a/6j9IrKo1pEnyeHF5y+k0SUAxL0X8iKZ0uPxsgoVrlNtqXJWNGvA=
file: tachiyomi-v*.apk
file_glob: true
skip_cleanup: true
on:
tags: true
repo: inorichi/tachiyomi
- provider: script
script: ".travis/deploy.sh"
skip_cleanup: true
on:
branch: master
condition: "-z $TRAVIS_TAG"
repo: inorichi/tachiyomi
- provider: releases
api_key:
secure: qmS9SyMq8xPDqaY83rvAFyZcvic24lGBj3MFt22RhVJzIXAAN/vqL1R70PnNiCF7CE+R7PaDlBpwjxDMBiuh0QQNc1oX6cgepUbro4/Nt7NFFfCvKXaFdR1cSgYouhuHmy0SS0/alrcfhQ2bPwcm1/vAOiSa8Wu7hsXhCcxbFyEbXZVD11QZmiffEM0py+OeuqOFo2JxZaGRu2z04E/u5TWep1ZEuhFRCC87PGgFqABgg6jYYebQOUZADG/0G8581HTGU0mdwueYsiA35ncRzpV2V8DajEEBd5wOe5d8SyMtE+6Qs5PD9KcXAqGGe4QRmrJMX5EcLQaLZf/Qd5s9SFZVHb1aJIw/y05w4L5dlVpsjx5WuUAYAVg7Ol5UawofFo/hYkYCNmfub67wJQdHSIxPif7V6YeON6RQQMpc5GBYY9eA6ZxhrdA2m7eyoOT3jcbdaVJwC0jMGhn26hkgJfTo1LfAUs85Cs3BrK8w6Poqc/Jb+4Y0NhdGIKgO5tS3vY54cTJVVrQTq4/XmME4ZnzOX3HaOqzfyt/6M4gEQMvaeFksxwoFhocV7wfaCq9ps/Kdq2dl4KwoqRV2WqVaauqzCP4XPSlVLaJqztsw0wboupcaZepWJ2a/6j9IrKo1pEnyeHF5y+k0SUAxL0X8iKZ0uPxsgoVrlNtqXJWNGvA=
file: tachiyomi-v*.apk
file_glob: true
skip_cleanup: true
on:
tags: true
repo: inorichi/tachiyomi
- provider: script
script: ".travis/deploy.sh"
skip_cleanup: true
on:
branch: master
condition: "-z $TRAVIS_TAG"
repo: inorichi/tachiyomi
- provider: script
script: ".travis/deploy.sh"
skip_cleanup: true
on:
branch: dev
condition: "-z $TRAVIS_TAG"
repo: inorichi/tachiyomi
env:
global:
- secure: Ita1+tzo7P5IC2yqU3KgRcXt+5DTpP0103Hx/ECYi42/7rLt+TC7PMjl2yH3Z189+tGwLq0Ol1KJ2Z5Rn3q7EaQgD0+WRkH/ijtrjKoVh7dyItIBp7yowZpA0TJHQ4EZpGSxZakKbIP4di8XMxJ2+5VzEivYUt04LCUpzugemL6b6XOfUmOZykVxV2UDAlPPggklITYBXkHUa0mwJhjS1aPPeeR3PhVXomkqfuOJOKejPXXXJope9fhAnmopHA7ISfjIrTuwDVQJqNSuco+O9kQShmlu0C8pob1vFGPEDvafaDS8SZ9A6gKT1ZfgSUqVmvDbx0WLX8XugBLrQedtZv63esOa1WUyGhgFVpeJjexlszXlhyfP1gH5QbzRr+EiSaagCyjf9II2veLAtU5cFY+nj6KBdKQsazIMRHf8SAQlWASyJYMED/N9RnUFxSf1rnLGqiY2ezjycx4ieFj7vhlbTgyao1GHjjR9cwNuntdMYWhY8+Vc7Fctmzm46xOyyz9oJGdyim76Y4w4MZvQNKeZOBAjdEgX6cXBk15scoM2Vj9ENox+MKZLaKRawXg2U1ujK+bWAQkXiVvPriv05/JtYsNUft8qAsm+69vtohDsUW7Wu0bBIKDL+v0W30ty1PpyNehBB2OquUE7fp53gitOmYl7TyuxktkMY8PXKKU=
- secure: NABCfigMUVM/9TLALYBpQLp/p3rG6MbH5y34/oqCSej/oh2u0nyhFSi8veS0lFpDIcv0TZvxHJXoSA0zeZijb1fUU8jYVNT2azuPWE6Gu7sf0TfBeCvulqbgLMoaA6JuWbEbZwHcxpKHg4vLSMjNk+ZP4v2dffI6A620fxLltxxhTpsYkYYsfKG857CpQtdgN/HqcOaxyvzXFmWWyVWHala1uMcMeXZCwgnlVAqau9o0bsU092txSmHqoesHoAinidSCTCmTlEqp/1AFaYQTbxmnfNC1yLgzxWAlJcS3NWzNo3ellMvKjsiIGn3JJpAjTGcyf3yPsvhs1cY3MZbmJYVyKH5HbnkA5ms6mx0DDJ2UOs5H2dmED82m14+hu62Xb8XN8zAdq+bySNSwgsGzvr1PT74pT4BW1T+D7L1xvUe6k1enZ38GIMJbJPhBybRQazhjKPmXRB30Thxoqe5VqU8UeiXHAEps7JYAWUR1PLZvEYQb6MWurmTxs9be/OTwrUT1LDiqeJZg6XkDGgQwuR2YBaQJHJD17Piq6q1BUX8abhK6wzAAYVqyGvpmUCmQCtHZgenE6ulwcKChzBv4n97OjE21LGWnbNF5ViUhfAbGcKOVufd1chZsfbkJ7a3tHYCfLnxHUIhKvHk26f5Em8h68D0wQkPnkcVVkfh7XpI=
- secure: C93UADV5aR0zhLCLwR6tCyz+fwUYslZbhjBl3PHQp+0boIGS/Be2UQTFHp/NB9mQmhWqbwqHoAVFENZFytV04ePgOuNtMFcjAIfnzm19Am7iRAMFixD45pF/CuYYfLupElkAcSequtAzN0g4G0sQ5KR1hibaDIoz9kfA2YcUAMaZ4T5bhCr8os/xA2nOlmvPDWsRWCFBYkSpnmbsSsgYAhulA/V5bSNAWnp9LPw3CBLibW3WsVP4wuhZAkXznKwn/mHT31kfQlpMH3qNhXpsN9huUkZ/k8QWeakcHJKugung0Z2T1StK8rlI8OrJstVcwueHTa2ses4f5VbhWog/Z8HDkdll9W9RM/QqXjNDtOVBt/SPuhCp4k2rvJixFUxzvSqgSWQvQnbHwjWxIUVVyHtnb0/zc/S9ONZG14TOwB/+Lkgacb85PNszurZ2f3mH0O6slIh1mH+5d9J4+L976ot4nTPlK1OtothagVyKGOrn9HycrPk/MjftIJuElHzo7NEJd/wRPqIb5y12iZN1RSPriU+itg1uSAVP891/o3peJyuqY9WSB7dYwgDJos6dDvbr19emtdyxkQR+eAb5duyH6s4R58wh1kJ1d4zu0X6uSnF4AIc+6teKkN24rSXcqB/hrcojS49jgLy5P0/CVsUbYZPI/tx8E/IJfr8m36E=
- secure: mawwBvllvESc/mp+JHvncq1iUhiC7nyokPgXmOehffc0K3byMLs2L25HjNsU6EnXG9Lcae1cfP8S9bWLquU2C3kpAkLBUpjEbdx7K0654uvs7Rrvb5hcTRHwjzaEVmVaBFX4ROcjUhBYny/Wjj/YENCkSWpkfcMd1esFbVsO+fOLyaAPvrb6auKY7H+pUSqlEwaEnrkYeBBZIHa7KqwL4g5DHbq6K368tjmval/wBzwMB0V8V3dt/ik8RMVDtKPrik4Bu0V9UmXZUIo/a06ii/CM82ekFRh3eUb0DKkdkmYbdH6MBMoLTfQtMa6A4luXaA0oycAnTX3OGB5MWIjK39KhWRavh6ybSIt4aHKoolxzH8Zgmk7xMhFSot/laX5q5IzjZu5KU6F2SmdV0kcQugM8oAjANFySetPvY1q7nZ8pM+NO1xKS/mH0w4vChhdJFD1mw7aCoh8FdeUf0Eym2+pp5Q9uAisWMmNn5XN8/fL5q6PzAxkXmkedfrr1N61FmIL6EKx8qiWpOUNlRRTIMJ4GMhCyckCF6cNxDkBItp52c+Hmkbn+ZEInEyX6gpjYVm3xyEi0Z5kLCi/fMX2nBNczc5BuGLzzmJnITv4ovpeYn2/vPvHbaPgPC4LqDK3AjlpVadMZk/M5Egn+hWY7Mni57CmpZD+SpxUbbsItI0c=
- secure: PJPDkUg1zc57brxUvNpSh+Q3ZEaGpBqZzwDavqslkn0WmjBTLrE6/OG7TFHKNmO+P56qFl+pMEKqThxqR3+4bWEeEx8ykkixDVzxNJMmws+7A7ImJ75iQyB6giMW/4tykVMMHgIPNAdcnI8VOWn0LGHnpFWUd70yoyAGX8s6cspHCKgcuWMA3GS410KJfHpyd0B9/QS7ZyWzSETW7zSPyLPa81SBO95EhOF3TOGZYLt/mBhdtU3YGFs4k9fZ8jDDcm9XmBfqVlUhb8HiZcxJiZDdRvxODERfNnwc47uaJk6+kxGDzIW2uAxrMXXVKkG04GeMOokXoR9kW1Hl2JmoyySLKLZmB7I/XEtVWdzZw16mWi+4zmhjLhfB0phSW+/5I+0VtZZ6jO031J5FL/JqVrcq1ws/aw4QlaOdPUco/x2u4LNHyYYgOi5arD9xSyu6IRy0jCC4Xa1zuqM5adGJX+rZyVfKZ0TxOW661HTxlo8COtkB2i0WR2deZGVN75ooCAEO8DauQoUcFH1OelahmPtzVs1/6ZczuxGdp9ED7ZQq9NHEOsOdUGCj/D79Dm1hWFQsIsslnnGYWitAycNCgEwmlt2Q6fbrv2CJrmLqZ9a9r3AhzxoHn9Qx1GyuyfhZJzm/6Ff2kcOjma2kcz13KUwTxdW+2G5dDCotK3f7aiI=
- secure: FIIZfEEYfjNMKODs33Czh603CYVn6LRrzpFNIiPHYTb8iQWv9qAYhsg4FpHfOjDikokTwb5X/h8G7AX93Z0xKyyDi75ACT11oPeTNTArDdcmdDVlOYBvYHc2Ci7pMW5r8LGejB7Y3mWM8uKyA3oKvneEFutB65vO3JVZvFWrm03Lmqqe7+mA4qNqNqTbN7R7fmk5b7zt7A3DHvDu0JPTbSSUwpso/p2I5WJYjrf71I7YMQwIFLoMfplC1onVA3EFS3lZsF65zE+xVRy34AKa41iZAMbhVDyqUHEnx6L0dwEdn2Z5XLlK0ov1+qLTLlQsBE4Knre6TNkWMfktk7MKA+ch8RYxvEYLODhQkIrOkLSNWhZPhdaT+xD4fr0RCKSHo6uWRC4aofsJx8wSqb8ZL4j2zopUp9VisMOI202UEnvFDBtOkVGJSxxYbFjifIB7NCJBn788w+3k+k4IbOg537VdyoK2PMBR8/TDdjImWhWHY1i7+345ejwmzHL7ZPfb6GTNnQTWkajT77/n6Yk41twR5vvegOSTKuuO++WN/pUks4PGqtcQe9fnSfx2OcOq1ofLiG+JDorJ7z8kHSG13wHLq+QYMDayQbyJEYpDzmn/w3Ou1s2o0a7A41+cIkRzAgH9y3v4lgjp9GcMP2S74ZPA7OecWbFSexM7tL/dYxY=
- secure: DKCGc4E9PKeTX68r9pbbNg5qITsN0bApQ1m0x8xdEoi8GLRKVMYNn6ahoAxvy1YsBXC9Zlt5++gLmUV1I1JyDMyJXMr/lZrp4oarW0xWpTBmn3HzOph/K2W4i/fTGgMFieumPEbQIFOnU3JSjK6UJB8qVGEXD2OqS7A//EdrGDbAYVDL3ZTKE6JUlTNHgaKaNHhn+Dq4aBLTSYPwlLyqo+WNBVUUCKCHOq62ULF8MpX5YGaPFNxKYzircV7HpF1hCbV31dmpkeYT9xztra5V0SIBM27jAcQqGmtHH2mhx1sLu+gjhFJbbtY6cggA9EedzYYLDx/NPmgfyuOJfyVbSwTF3vhDUYfskqc1THWpwOSKO0Ry+8/xYb9crxg+FSwuI5hnfkIFk9woBvRGBhjto3/1buMNY9dSFiWtEbN6Let8e747l0wIGJCpJxSeh7vn7F1mWjixhf9GX1+V9BrUvGTd3XJDNb9cVnafYa1RTj8BLteA4HBza7Z9R3dvG4YWp16L/94UuaTzgAQfERLTZGopQth/hsaVTlYesJmJLF70lGM+W83y3YuNkSaX1zQ5FAIvp7oH0O16t7ISm6GprUFwN2Uox7AAbPZdWHxJbly+D+yCFNcqS3Bz9mV3YCLo690Sy1ePNHr+nCseVfBMo7OYyavSS/EjPWfEy65Wq04=
- secure: Ita1+tzo7P5IC2yqU3KgRcXt+5DTpP0103Hx/ECYi42/7rLt+TC7PMjl2yH3Z189+tGwLq0Ol1KJ2Z5Rn3q7EaQgD0+WRkH/ijtrjKoVh7dyItIBp7yowZpA0TJHQ4EZpGSxZakKbIP4di8XMxJ2+5VzEivYUt04LCUpzugemL6b6XOfUmOZykVxV2UDAlPPggklITYBXkHUa0mwJhjS1aPPeeR3PhVXomkqfuOJOKejPXXXJope9fhAnmopHA7ISfjIrTuwDVQJqNSuco+O9kQShmlu0C8pob1vFGPEDvafaDS8SZ9A6gKT1ZfgSUqVmvDbx0WLX8XugBLrQedtZv63esOa1WUyGhgFVpeJjexlszXlhyfP1gH5QbzRr+EiSaagCyjf9II2veLAtU5cFY+nj6KBdKQsazIMRHf8SAQlWASyJYMED/N9RnUFxSf1rnLGqiY2ezjycx4ieFj7vhlbTgyao1GHjjR9cwNuntdMYWhY8+Vc7Fctmzm46xOyyz9oJGdyim76Y4w4MZvQNKeZOBAjdEgX6cXBk15scoM2Vj9ENox+MKZLaKRawXg2U1ujK+bWAQkXiVvPriv05/JtYsNUft8qAsm+69vtohDsUW7Wu0bBIKDL+v0W30ty1PpyNehBB2OquUE7fp53gitOmYl7TyuxktkMY8PXKKU=
- secure: NABCfigMUVM/9TLALYBpQLp/p3rG6MbH5y34/oqCSej/oh2u0nyhFSi8veS0lFpDIcv0TZvxHJXoSA0zeZijb1fUU8jYVNT2azuPWE6Gu7sf0TfBeCvulqbgLMoaA6JuWbEbZwHcxpKHg4vLSMjNk+ZP4v2dffI6A620fxLltxxhTpsYkYYsfKG857CpQtdgN/HqcOaxyvzXFmWWyVWHala1uMcMeXZCwgnlVAqau9o0bsU092txSmHqoesHoAinidSCTCmTlEqp/1AFaYQTbxmnfNC1yLgzxWAlJcS3NWzNo3ellMvKjsiIGn3JJpAjTGcyf3yPsvhs1cY3MZbmJYVyKH5HbnkA5ms6mx0DDJ2UOs5H2dmED82m14+hu62Xb8XN8zAdq+bySNSwgsGzvr1PT74pT4BW1T+D7L1xvUe6k1enZ38GIMJbJPhBybRQazhjKPmXRB30Thxoqe5VqU8UeiXHAEps7JYAWUR1PLZvEYQb6MWurmTxs9be/OTwrUT1LDiqeJZg6XkDGgQwuR2YBaQJHJD17Piq6q1BUX8abhK6wzAAYVqyGvpmUCmQCtHZgenE6ulwcKChzBv4n97OjE21LGWnbNF5ViUhfAbGcKOVufd1chZsfbkJ7a3tHYCfLnxHUIhKvHk26f5Em8h68D0wQkPnkcVVkfh7XpI=
- secure: C93UADV5aR0zhLCLwR6tCyz+fwUYslZbhjBl3PHQp+0boIGS/Be2UQTFHp/NB9mQmhWqbwqHoAVFENZFytV04ePgOuNtMFcjAIfnzm19Am7iRAMFixD45pF/CuYYfLupElkAcSequtAzN0g4G0sQ5KR1hibaDIoz9kfA2YcUAMaZ4T5bhCr8os/xA2nOlmvPDWsRWCFBYkSpnmbsSsgYAhulA/V5bSNAWnp9LPw3CBLibW3WsVP4wuhZAkXznKwn/mHT31kfQlpMH3qNhXpsN9huUkZ/k8QWeakcHJKugung0Z2T1StK8rlI8OrJstVcwueHTa2ses4f5VbhWog/Z8HDkdll9W9RM/QqXjNDtOVBt/SPuhCp4k2rvJixFUxzvSqgSWQvQnbHwjWxIUVVyHtnb0/zc/S9ONZG14TOwB/+Lkgacb85PNszurZ2f3mH0O6slIh1mH+5d9J4+L976ot4nTPlK1OtothagVyKGOrn9HycrPk/MjftIJuElHzo7NEJd/wRPqIb5y12iZN1RSPriU+itg1uSAVP891/o3peJyuqY9WSB7dYwgDJos6dDvbr19emtdyxkQR+eAb5duyH6s4R58wh1kJ1d4zu0X6uSnF4AIc+6teKkN24rSXcqB/hrcojS49jgLy5P0/CVsUbYZPI/tx8E/IJfr8m36E=
- secure: mawwBvllvESc/mp+JHvncq1iUhiC7nyokPgXmOehffc0K3byMLs2L25HjNsU6EnXG9Lcae1cfP8S9bWLquU2C3kpAkLBUpjEbdx7K0654uvs7Rrvb5hcTRHwjzaEVmVaBFX4ROcjUhBYny/Wjj/YENCkSWpkfcMd1esFbVsO+fOLyaAPvrb6auKY7H+pUSqlEwaEnrkYeBBZIHa7KqwL4g5DHbq6K368tjmval/wBzwMB0V8V3dt/ik8RMVDtKPrik4Bu0V9UmXZUIo/a06ii/CM82ekFRh3eUb0DKkdkmYbdH6MBMoLTfQtMa6A4luXaA0oycAnTX3OGB5MWIjK39KhWRavh6ybSIt4aHKoolxzH8Zgmk7xMhFSot/laX5q5IzjZu5KU6F2SmdV0kcQugM8oAjANFySetPvY1q7nZ8pM+NO1xKS/mH0w4vChhdJFD1mw7aCoh8FdeUf0Eym2+pp5Q9uAisWMmNn5XN8/fL5q6PzAxkXmkedfrr1N61FmIL6EKx8qiWpOUNlRRTIMJ4GMhCyckCF6cNxDkBItp52c+Hmkbn+ZEInEyX6gpjYVm3xyEi0Z5kLCi/fMX2nBNczc5BuGLzzmJnITv4ovpeYn2/vPvHbaPgPC4LqDK3AjlpVadMZk/M5Egn+hWY7Mni57CmpZD+SpxUbbsItI0c=
- secure: PJPDkUg1zc57brxUvNpSh+Q3ZEaGpBqZzwDavqslkn0WmjBTLrE6/OG7TFHKNmO+P56qFl+pMEKqThxqR3+4bWEeEx8ykkixDVzxNJMmws+7A7ImJ75iQyB6giMW/4tykVMMHgIPNAdcnI8VOWn0LGHnpFWUd70yoyAGX8s6cspHCKgcuWMA3GS410KJfHpyd0B9/QS7ZyWzSETW7zSPyLPa81SBO95EhOF3TOGZYLt/mBhdtU3YGFs4k9fZ8jDDcm9XmBfqVlUhb8HiZcxJiZDdRvxODERfNnwc47uaJk6+kxGDzIW2uAxrMXXVKkG04GeMOokXoR9kW1Hl2JmoyySLKLZmB7I/XEtVWdzZw16mWi+4zmhjLhfB0phSW+/5I+0VtZZ6jO031J5FL/JqVrcq1ws/aw4QlaOdPUco/x2u4LNHyYYgOi5arD9xSyu6IRy0jCC4Xa1zuqM5adGJX+rZyVfKZ0TxOW661HTxlo8COtkB2i0WR2deZGVN75ooCAEO8DauQoUcFH1OelahmPtzVs1/6ZczuxGdp9ED7ZQq9NHEOsOdUGCj/D79Dm1hWFQsIsslnnGYWitAycNCgEwmlt2Q6fbrv2CJrmLqZ9a9r3AhzxoHn9Qx1GyuyfhZJzm/6Ff2kcOjma2kcz13KUwTxdW+2G5dDCotK3f7aiI=
- secure: FIIZfEEYfjNMKODs33Czh603CYVn6LRrzpFNIiPHYTb8iQWv9qAYhsg4FpHfOjDikokTwb5X/h8G7AX93Z0xKyyDi75ACT11oPeTNTArDdcmdDVlOYBvYHc2Ci7pMW5r8LGejB7Y3mWM8uKyA3oKvneEFutB65vO3JVZvFWrm03Lmqqe7+mA4qNqNqTbN7R7fmk5b7zt7A3DHvDu0JPTbSSUwpso/p2I5WJYjrf71I7YMQwIFLoMfplC1onVA3EFS3lZsF65zE+xVRy34AKa41iZAMbhVDyqUHEnx6L0dwEdn2Z5XLlK0ov1+qLTLlQsBE4Knre6TNkWMfktk7MKA+ch8RYxvEYLODhQkIrOkLSNWhZPhdaT+xD4fr0RCKSHo6uWRC4aofsJx8wSqb8ZL4j2zopUp9VisMOI202UEnvFDBtOkVGJSxxYbFjifIB7NCJBn788w+3k+k4IbOg537VdyoK2PMBR8/TDdjImWhWHY1i7+345ejwmzHL7ZPfb6GTNnQTWkajT77/n6Yk41twR5vvegOSTKuuO++WN/pUks4PGqtcQe9fnSfx2OcOq1ofLiG+JDorJ7z8kHSG13wHLq+QYMDayQbyJEYpDzmn/w3Ou1s2o0a7A41+cIkRzAgH9y3v4lgjp9GcMP2S74ZPA7OecWbFSexM7tL/dYxY=
- secure: DKCGc4E9PKeTX68r9pbbNg5qITsN0bApQ1m0x8xdEoi8GLRKVMYNn6ahoAxvy1YsBXC9Zlt5++gLmUV1I1JyDMyJXMr/lZrp4oarW0xWpTBmn3HzOph/K2W4i/fTGgMFieumPEbQIFOnU3JSjK6UJB8qVGEXD2OqS7A//EdrGDbAYVDL3ZTKE6JUlTNHgaKaNHhn+Dq4aBLTSYPwlLyqo+WNBVUUCKCHOq62ULF8MpX5YGaPFNxKYzircV7HpF1hCbV31dmpkeYT9xztra5V0SIBM27jAcQqGmtHH2mhx1sLu+gjhFJbbtY6cggA9EedzYYLDx/NPmgfyuOJfyVbSwTF3vhDUYfskqc1THWpwOSKO0Ry+8/xYb9crxg+FSwuI5hnfkIFk9woBvRGBhjto3/1buMNY9dSFiWtEbN6Let8e747l0wIGJCpJxSeh7vn7F1mWjixhf9GX1+V9BrUvGTd3XJDNb9cVnafYa1RTj8BLteA4HBza7Z9R3dvG4YWp16L/94UuaTzgAQfERLTZGopQth/hsaVTlYesJmJLF70lGM+W83y3YuNkSaX1zQ5FAIvp7oH0O16t7ISm6GprUFwN2Uox7AAbPZdWHxJbly+D+yCFNcqS3Bz9mV3YCLo690Sy1ePNHr+nCseVfBMo7OYyavSS/EjPWfEy65Wq04=

View File

@ -1,22 +0,0 @@
#!/bin/bash
git fetch --unshallow #required for commit count
cp .travis/google-services.json app/
if [ -z "$TRAVIS_TAG" ]; then
./gradlew clean assembleStandardDebug
COMMIT_COUNT=$(git rev-list --count HEAD)
export ARTIFACT="tachiyomi-r${COMMIT_COUNT}.apk"
mv app/build/outputs/apk/standard/debug/app-standard-debug.apk $ARTIFACT
else
./gradlew clean assembleStandardRelease
TOOLS="$(ls -d ${ANDROID_HOME}/build-tools/* | tail -1)"
export ARTIFACT="tachiyomi-${TRAVIS_TAG}.apk"
${TOOLS}/zipalign -v -p 4 app/build/outputs/apk/standard/release/app-standard-release-unsigned.apk app-aligned.apk
${TOOLS}/apksigner sign --ks $STORE_PATH --ks-key-alias $STORE_ALIAS --ks-pass env:STORE_PASS --key-pass env:KEY_PASS --out $ARTIFACT app-aligned.apk
fi

View File

@ -1,15 +0,0 @@
#!/bin/bash
pattern="tachiyomi-r*"
files=( $pattern )
export ARTIFACT="${files[0]}"
if [ -z "$ARTIFACT" ]; then
echo "Artifact not found"
exit 1
fi
export SSHOPTIONS="-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i ${DEPLOY_KEY}"
scp $SSHOPTIONS $ARTIFACT $DEPLOY_USER@$DEPLOY_HOST:builds/
ssh $SSHOPTIONS $DEPLOY_USER@$DEPLOY_HOST ln -sf $ARTIFACT builds/latest

View File

@ -1,73 +0,0 @@
{
"project_info": {
"project_number": "777921915939",
"firebase_url": "https://tachiyomi-47364.firebaseio.com",
"project_id": "tachiyomi-47364",
"storage_bucket": "tachiyomi-47364.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:777921915939:android:36544cd2d96c50c7",
"android_client_info": {
"package_name": "eu.kanade.tachiyomi"
}
},
"oauth_client": [
{
"client_id": "777921915939-9q25jvgbdtpk91daqlk7sa1cbdcg77o6.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyAHr8RxyeiSPC_MxJTnivz-hmdo5oX0QQQ"
}
],
"services": {
"analytics_service": {
"status": 1
},
"appinvite_service": {
"status": 1,
"other_platform_oauth_client": []
},
"ads_service": {
"status": 2
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:777921915939:android:564fdc1d62efd1de",
"android_client_info": {
"package_name": "eu.kanade.tachiyomi.debug"
}
},
"oauth_client": [
{
"client_id": "777921915939-9q25jvgbdtpk91daqlk7sa1cbdcg77o6.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyAHr8RxyeiSPC_MxJTnivz-hmdo5oX0QQQ"
}
],
"services": {
"analytics_service": {
"status": 1
},
"appinvite_service": {
"status": 1,
"other_platform_oauth_client": []
},
"ads_service": {
"status": 2
}
}
}
],
"configuration_version": "1"
}

Binary file not shown.

0
LICENSE Normal file → Executable file
View File

View File

@ -1,87 +1,3 @@
| Build | Stable | Dev | Contribute | Contact |
|-------|----------|---------|------------|---------|
| [![Travis](https://img.shields.io/travis/inorichi/tachiyomi.svg)](https://travis-ci.org/inorichi/tachiyomi) | [![stable release](https://img.shields.io/github/release/inorichi/tachiyomi.svg?maxAge=3600&label=download%20(autoupdate%20included))](https://github.com/inorichi/tachiyomi/releases) | [![latest dev build](https://img.shields.io/badge/download-latest%20build-blue.svg)](http://tachiyomi.kanade.eu/latest) [![fdroid dev](https://img.shields.io/badge/autoupdate-wiki-blue.svg)](//github.com/inorichi/tachiyomi/wiki/F-Droid-for-dev-versions) | [![Translation status](https://hosted.weblate.org/widgets/tachiyomi/-/svg-badge.svg)](https://hosted.weblate.org/engage/tachiyomi/?utm_source=widget) | [![Discord](https://img.shields.io/discord/349436576037732353.svg)](https://discord.gg/tachiyomi) |
I haven't started a readme
# ![app icon](./.github/readme-images/app-icon.png)Tachiyomi
Tachiyomi is a free and open source manga reader for Android.
![screenshots of app](./.github/readme-images/screens.png)
## Features
Features include:
* Online reading from sources such as KissManga, MangaFox, [and more](https://github.com/inorichi/tachiyomi-extensions)
* Local reading of downloaded manga
* Configurable reader with multiple viewers, reading directions and other settings
* [MyAnimeList](https://myanimelist.net/), [AniList](https://anilist.co/), and [Kitsu](https://kitsu.io/explore/anime) support
* Categories to organize your library
* Light and dark themes
* Schedule updating your library for new chapters
* Create backups locally to read offline or to your desired cloud service
## Download
Get the app from our [releases page](https://github.com/inorichi/tachiyomi/releases).
If you want to try new features before they get to the stable release, you can download the dev version [here](http://tachiyomi.kanade.eu/latest) (auto-updates not included), or add our [F-Droid repo](https://github.com/inorichi/tachiyomi/wiki/F-Droid-for-dev-versions).
## Issues, Feature Requests and Contributing
Please make sure to read the full guidelines. Your issue may be closed without warning if you do not.
<details><summary>Issues</summary>
1. **Before reporting a new issue, take a look at the [FAQ](https://github.com/inorichi/tachiyomi/wiki/FAQ), the [changelog](https://github.com/inorichi/tachiyomi/releases) and the already opened [issues](https://github.com/inorichi/tachiyomi/issues).**
2. If you are unsure, ask here: [![Discord](https://img.shields.io/discord/349436576037732353.svg)](https://discord.gg/tachiyomi)
</details>
<details><summary>Bugs</summary>
* Include version (Setting > About > Version)
* If not latest, try updating, it may have already been solved
* Dev version is equal to the number of commits as seen in the main page
* Include steps to reproduce (if not obvious from description)
* Include screenshot (if needed)
* If it could be device-dependent, try reproducing on another device (if possible)
* For large logs use http://pastebin.com/ (or similar)
* Don't group unrelated requests into one issue
DO: https://github.com/inorichi/tachiyomi/issues/24 https://github.com/inorichi/tachiyomi/issues/71
DON'T: https://github.com/inorichi/tachiyomi/issues/75
</details>
<details><summary>Feature Requests</summary>
* Write a detailed issue, explaning what it should do or how. Avoid writing just "like X app does"
* Include screenshot (if needed)
Catalogue requests should be created at https://github.com/inorichi/tachiyomi-extensions, they do not belong in this repository.
</details>
## FAQ
[See our wiki.](https://github.com/inorichi/tachiyomi/wiki/FAQ)
You can also reach out to us on [Discord](https://discord.gg/WrBkRk4).
## License
Copyright 2015 Javier Tomás
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
## Disclaimer
The developer of this application does not have any affiliation with the content providers available.
Automated Preview Builds(with updater): https://github.com/jobobby04/TachiyomiSYPreview/releases

1
app/.gitignore vendored Normal file → Executable file
View File

@ -3,3 +3,4 @@
*.iml
custom.gradle
google-services.json
output.json

260
app/build.gradle Normal file → Executable file
View File

@ -1,10 +1,15 @@
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
//noinspection GradleDependency
import java.text.SimpleDateFormat
apply plugin: 'com.android.application'
apply plugin: 'com.google.android.gms.oss-licenses-plugin'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'com.github.zellius.shortcut-helper'
// Realm (EH)
apply plugin: 'realm-android'
shortcutHelper.filePath = './shortcuts.xml'
@ -29,40 +34,51 @@ ext {
}
android {
compileSdkVersion 27
buildToolsVersion '28.0.3'
compileSdkVersion 29
buildToolsVersion '29.0.3'
publishNonDefault true
defaultConfig {
applicationId "eu.kanade.tachiyomi"
minSdkVersion 16
targetSdkVersion 27
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
versionCode 38
versionName "0.8.0"
applicationId "eu.kanade.tachiyomi.sy"
minSdkVersion 21
targetSdkVersion 29
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
versionCode 1
versionName "0.9.2.7"
buildConfigField "String", "COMMIT_COUNT", "\"${getCommitCount()}\""
buildConfigField "String", "COMMIT_SHA", "\"${getGitSha()}\""
buildConfigField "String", "BUILD_TIME", "\"${getBuildTime()}\""
buildConfigField "boolean", "INCLUDE_UPDATER", "false"
buildConfigField "boolean", "INCLUDE_UPDATER", "true"
vectorDrawables.useSupportLibrary = true
multiDexEnabled true
ndk {
abiFilters "armeabi-v7a", "arm64-v8a", "x86"
}
}
viewBinding {
enabled = true
}
buildTypes {
debug {
versionNameSuffix "-${getCommitCount()}"
applicationIdSuffix ".debug"
multiDexEnabled true
ext.enableCrashlytics = false
}
releaseTest {
applicationIdSuffix ".rt"
// minifyEnabled true
// shrinkResources true
zipAlignEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled true
shrinkResources true
multiDexEnabled false
zipAlignEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
@ -74,22 +90,27 @@ android {
buildConfigField "boolean", "INCLUDE_UPDATER", "true"
dimension "default"
}
fdroid {
dimension "default"
}
dev {
minSdkVersion 21
resConfigs "en", "xxhdpi"
dimension "default"
}
}
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'LICENSE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/*.kotlin_module'
// Compatibility for two RxJava versions (EXH)
exclude 'META-INF/rxjava.properties'
}
lintOptions {
@ -97,6 +118,18 @@ android {
checkReleaseBuilds false
}
compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
androidExtensions {
experimental = true
}
dependencies {
@ -106,62 +139,78 @@ dependencies {
implementation 'com.github.inorichi:junrar-android:634c1f5'
// Android support library
final support_library_version = '27.0.2'
implementation "com.android.support:support-v4:$support_library_version"
implementation "com.android.support:appcompat-v7:$support_library_version"
implementation "com.android.support:cardview-v7:$support_library_version"
implementation "com.android.support:design:$support_library_version"
implementation "com.android.support:recyclerview-v7:$support_library_version"
implementation "com.android.support:preference-v7:$support_library_version"
implementation "com.android.support:support-annotations:$support_library_version"
implementation "com.android.support:customtabs:$support_library_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.preference:preference:1.1.1'
implementation 'androidx.annotation:annotation:1.1.0'
implementation 'androidx.browser:browser:1.2.0'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.biometric:biometric:1.0.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
final lifecycle_version = '2.2.0'
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
implementation 'com.android.support:multidex:1.0.2'
// UI library
implementation 'com.google.android.material:material:1.1.0'
standardImplementation 'com.google.firebase:firebase-core:11.8.0'
standardImplementation 'com.google.firebase:firebase-core:17.4.1'
// ReactiveX
implementation 'io.reactivex:rxandroid:1.2.1'
implementation 'io.reactivex:rxjava:1.3.6'
implementation 'io.reactivex:rxjava:1.3.8'
implementation 'com.jakewharton.rxrelay:rxrelay:1.2.0'
implementation 'com.f2prateek.rx.preferences:rx-preferences:1.0.2'
implementation 'com.github.pwittchen:reactivenetwork:0.7.0'
implementation 'com.github.pwittchen:reactivenetwork:0.13.0'
// Network client
implementation "com.squareup.okhttp3:okhttp:3.10.0"
implementation 'com.squareup.okio:okio:1.14.0'
final okhttp_version = '4.7.2'
implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version"
implementation 'com.squareup.okio:okio:2.6.0'
// REST
final retrofit_version = '2.3.0'
final retrofit_version = '2.9.0'
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"
implementation "com.squareup.retrofit2:adapter-rxjava:$retrofit_version"
// JSON
implementation 'com.google.code.gson:gson:2.8.2'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.github.salomonbrys.kotson:kotson:2.5.0'
// JavaScript engine
implementation 'com.squareup.duktape:duktape-android:1.2.0'
implementation 'com.squareup.duktape:duktape-android:1.2.0' // Stuck on 1.2.0 to fix MangaPlus extension
// Disk
implementation 'com.jakewharton:disklrucache:2.0.2'
implementation 'com.github.inorichi:unifile:e9ee588'
// HTML parser
implementation 'org.jsoup:jsoup:1.10.2'
implementation 'org.jsoup:jsoup:1.13.1'
// Job scheduling
implementation 'com.evernote:android-job:1.2.5'
implementation 'com.google.android.gms:play-services-gcm:11.8.0'
final work_version = '2.3.4'
implementation "androidx.work:work-runtime:$work_version"
implementation "androidx.work:work-runtime-ktx:$work_version"
// [EXH] Android 7 SSL Workaround
implementation 'com.google.android.gms:play-services-safetynet:17.0.0'
// Changelog
implementation 'com.github.gabrielemariotti.changeloglib:changelog:2.1.0'
// Database
implementation "com.pushtorefresh.storio:sqlite:1.13.0"
implementation 'androidx.sqlite:sqlite:2.1.0'
implementation 'com.github.inorichi.storio:storio-common:8be19de@aar'
implementation 'com.github.inorichi.storio:storio-sqlite:8be19de@aar'
implementation 'io.requery:sqlite-android:3.31.0'
// Preferences
implementation 'com.f2prateek.rx.preferences:rx-preferences:1.0.2'
implementation 'com.github.tfcporciuncula:flow-preferences:1.1.1'
// Model View Presenter
final nucleus_version = '3.0.0'
@ -172,19 +221,17 @@ dependencies {
implementation "com.github.inorichi.injekt:injekt-core:65b0440"
// Image library
final glide_version = '4.6.1'
final glide_version = '4.10.0'
implementation "com.github.bumptech.glide:glide:$glide_version"
implementation "com.github.bumptech.glide:okhttp3-integration:$glide_version"
kapt "com.github.bumptech.glide:compiler:$glide_version"
// Transformations
implementation 'jp.wasabeef:glide-transformations:3.1.1'
// Logging
implementation 'com.jakewharton.timber:timber:4.6.1'
implementation 'com.jakewharton.timber:timber:4.7.1'
// Crash reports
implementation 'ch.acra:acra:4.9.2'
final acra_version = '5.5.0'
implementation "ch.acra:acra-http:$acra_version"
// Sort
implementation 'com.github.gpanther:java-nat-sort:natural-comparator-1.1'
@ -192,35 +239,38 @@ dependencies {
// UI
implementation 'com.dmitrymalkovich.android:material-design-dimens:1.4'
implementation 'com.github.dmytrodanylyk.android-process-button:library:1.0.4'
implementation 'eu.davidea:flexible-adapter:5.0.0-rc4'
implementation 'eu.davidea:flexible-adapter-ui:1.0.0-b1'
implementation 'eu.davidea:flexible-adapter:5.1.0'
implementation 'eu.davidea:flexible-adapter-ui:1.0.0'
implementation 'com.nononsenseapps:filepicker:2.5.2'
implementation 'com.github.amulyakhare:TextDrawable:558677e'
implementation 'com.afollestad.material-dialogs:core:0.9.6.0'
implementation 'me.zhanghai.android.systemuihelper:library:1.0.0'
implementation 'com.nightlynexus.viewstatepageradapter:viewstatepageradapter:1.0.4'
implementation 'com.github.mthli:Slice:v1.2'
implementation 'me.gujun.android.taggroup:library:1.4@aar'
implementation 'com.github.chrisbanes:PhotoView:2.1.3'
implementation 'com.github.inorichi:DirectionalViewPager:3acc51a'
implementation 'com.nightlynexus.viewstatepageradapter:viewstatepageradapter:1.1.0'
implementation 'com.github.mthli:Slice:v1.3'
implementation 'com.github.chrisbanes:PhotoView:2.3.0'
implementation 'com.github.carlosesco:DirectionalViewPager:a844dbca0a'
// 3.2.0+ introduces weird UI blinking or cut off issues on some devices
final material_dialogs_version = '3.1.1'
implementation "com.afollestad.material-dialogs:core:$material_dialogs_version"
implementation "com.afollestad.material-dialogs:input:$material_dialogs_version"
implementation "com.afollestad.material-dialogs:datetime:$material_dialogs_version"
// Conductor
implementation 'com.bluelinelabs:conductor:2.1.5'
implementation ("com.bluelinelabs:conductor-support:2.1.5") {
implementation("com.bluelinelabs:conductor-support:2.1.5") {
exclude group: "com.android.support"
}
implementation 'com.github.inorichi:conductor-support-preference:27.0.2'
implementation 'com.github.inorichi:conductor-support-preference:a32c357'
// RxBindings
final rxbindings_version = '1.0.1'
implementation "com.jakewharton.rxbinding:rxbinding-kotlin:$rxbindings_version"
implementation "com.jakewharton.rxbinding:rxbinding-appcompat-v7-kotlin:$rxbindings_version"
implementation "com.jakewharton.rxbinding:rxbinding-support-v4-kotlin:$rxbindings_version"
implementation "com.jakewharton.rxbinding:rxbinding-recyclerview-v7-kotlin:$rxbindings_version"
// FlowBinding
final flowbinding_version = '0.11.1'
implementation "io.github.reactivecircus.flowbinding:flowbinding-android:$flowbinding_version"
implementation "io.github.reactivecircus.flowbinding:flowbinding-appcompat:$flowbinding_version"
implementation "io.github.reactivecircus.flowbinding:flowbinding-recyclerview:$flowbinding_version"
implementation "io.github.reactivecircus.flowbinding:flowbinding-swiperefreshlayout:$flowbinding_version"
implementation "io.github.reactivecircus.flowbinding:flowbinding-viewpager:$flowbinding_version"
// Tests
testImplementation 'junit:junit:4.12'
testImplementation 'org.assertj:assertj-core:1.7.1'
testImplementation 'junit:junit:4.13'
testImplementation 'org.assertj:assertj-core:3.12.2'
testImplementation 'org.mockito:mockito-core:1.10.19'
final robolectric_version = '3.1.4'
@ -228,15 +278,69 @@ dependencies {
testImplementation "org.robolectric:shadows-multidex:$robolectric_version"
testImplementation "org.robolectric:shadows-play-services:$robolectric_version"
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
final coroutines_version = '0.22.2'
final coroutines_version = '1.3.7'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-reactive:$coroutines_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-rx2:$coroutines_version"
implementation 'com.google.android.gms:play-services-oss-licenses:17.0.0'
// Text distance (EH)
implementation 'info.debatty:java-string-similarity:1.2.1'
// Pin lock view (EH)
implementation 'com.github.jawnnypoo:pinlockview:2.2.0'
// Reprint (EH)
implementation 'com.github.ajalt.reprint:core:3.2.1@aar'
implementation 'com.github.ajalt.reprint:rxjava:3.2.1@aar' // optional: the RxJava 1 interface
// Swirl (EH)
implementation 'com.mattprecious.swirl:swirl:1.2.0'
// RxJava 2 interop for Realm (EH)
implementation 'com.github.akarnokd:rxjava2-interop:0.13.7'
// Firebase (EH)
implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'
// Better logging (EH)
implementation 'com.elvishew:xlog:1.6.1'
// Time utils (EH)
def typed_time_version = '1.0.2'
implementation "com.github.kizitonwose.time:time:$typed_time_version"
implementation "com.github.kizitonwose.time:time-android:$typed_time_version"
// Debug utils (EH)
debugImplementation 'com.ms-square:debugoverlay:1.1.3'
releaseTestImplementation 'com.ms-square:debugoverlay:1.1.3'
releaseImplementation 'com.ms-square:debugoverlay-no-op:1.1.3'
testImplementation 'com.ms-square:debugoverlay-no-op:1.1.3'
// Humanize (EH)
implementation 'com.github.mfornos:humanize-slim:1.2.2'
implementation 'androidx.gridlayout:gridlayout:1.0.0'
final def markwon_version = '4.1.0'
implementation "io.noties.markwon:core:$markwon_version"
implementation "io.noties.markwon:ext-strikethrough:$markwon_version"
implementation "io.noties.markwon:ext-tables:$markwon_version"
implementation "io.noties.markwon:html:$markwon_version"
implementation "io.noties.markwon:image:$markwon_version"
implementation "io.noties.markwon:linkify:$markwon_version"
implementation 'com.google.guava:guava:27.0.1-android'
}
buildscript {
ext.kotlin_version = '1.2.71'
ext.kotlin_version = '1.3.72'
repositories {
mavenCentral()
}
@ -249,16 +353,22 @@ repositories {
mavenCentral()
}
kotlin {
experimental {
coroutines 'enable'
}
// See https://kotlinlang.org/docs/reference/experimental.html#experimental-status-of-experimental-api-markers
tasks.withType(AbstractKotlinCompile).all {
kotlinOptions.freeCompilerArgs += ["-Xuse-experimental=kotlin.Experimental"]
}
androidExtensions {
experimental = true
// Duplicating Hebrew string assets due to some locale code issues on different devices
task copyResources(type: Copy) {
from './src/main/res/values-he'
into './src/main/res/values-iw'
include '**/*'
}
preBuild.dependsOn(ktlintFormat, copyResources)
if (getGradle().getStartParameter().getTaskRequests().toString().contains("Standard")) {
apply plugin: 'com.google.gms.google-services'
// Firebase (EH)
apply plugin: 'io.fabric'
}

234
app/proguard-rules.pro vendored
View File

@ -1,35 +1,36 @@
-dontobfuscate
-dontwarn eu.kanade.tachiyomi.**
-keep class eu.kanade.tachiyomi.**
-keep class eu.kanade.tachiyomi.source.model.** { *; }
-keep class com.hippo.image.** { *; }
-keep interface com.hippo.image.** { *; }
-dontwarn nucleus.view.NucleusActionBarActivity
# Extensions may require methods unused in the core app
-dontwarn eu.kanade.tachiyomi.**
-keep class eu.kanade.tachiyomi.** { public protected private *; }
-keep class org.jsoup.** { *; }
-keep class kotlin.** { *; }
-keep class okhttp3.** { *; }
-keep class com.google.gson.** { *; }
-keep class com.github.salomonbrys.kotson.** { *; }
-keep class com.squareup.duktape.** { *; }
# OkHttp
-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn javax.annotation.**
-dontwarn retrofit2.Platform$Java8
# === Keep EH classes
-keep class exh.** { *; }
-keep class xyz.nulldev.** { *; }
# Glide specific rules #
# https://github.com/bumptech/glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
# === Keep RxAndroid, https://github.com/ReactiveX/RxAndroid/issues/350
-keep class rx.android.** { *; }
# Design library
-dontwarn com.google.android.material.**
-keep class com.google.android.material.** { *; }
-keep interface com.google.android.material.** { *; }
-keep public class com.google.android.material.R$* { *; }
-keep class com.hippo.image.** { *; }
-keep interface com.hippo.image.** { *; }
-keepclassmembers class * extends nucleus.presenter.Presenter {
<init>();
}
# RxJava 1.1.0
-dontwarn sun.misc.**
@ -46,37 +47,41 @@
rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
### Support v7, Design
# http://stackoverflow.com/questions/29679177/cardview-shadow-not-appearing-in-lollipop-after-obfuscate-with-proguard/29698051
-keep class android.support.v7.widget.RoundRectDrawable { *; }
-dontnote rx.internal.util.PlatformDependent
-keep public class android.support.v7.widget.** { *; }
-keep public class android.support.v7.internal.widget.** { *; }
-keep public class android.support.v7.internal.view.menu.** { *; }
-keep public class android.support.v7.graphics.drawable.** { *; }
# === Reactive network: https://github.com/pwittchen/ReactiveNetwork/tree/v0.12.4#proguard-configuration
-dontwarn com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork
-dontwarn io.reactivex.functions.Function
-dontwarn rx.internal.util.**
-dontwarn sun.misc.Unsafe
-keep public class * extends android.support.v4.view.ActionProvider {
public <init>(android.content.Context);
}
# === Okhttp: https://github.com/square/okhttp/blob/3637fc56f70f87da696847defd311dbfb28e87b5/okhttp/src/main/resources/META-INF/proguard/okhttp3.pro
# JSR 305 annotations are for embedding nullability information.
-dontwarn javax.annotation.**
# A resource is loaded with a relative path so the package of this class must be preserved.
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java.
-dontwarn org.codehaus.mojo.animal_sniffer.*
# OkHttp platform used only on JVM and when Conscrypt dependency is available.
-dontwarn okhttp3.internal.platform.ConscryptPlatform
-dontwarn android.support.**
-dontwarn android.support.design.**
-keep class android.support.design.** { *; }
-keep interface android.support.design.** { *; }
-keep public class android.support.design.R$* { *; }
# ReactiveNetwork
-dontwarn com.github.pwittchen.reactivenetwork.**
## GSON ##
# === Okio: https://github.com/square/okio/tree/9b8545e7fa267c9d89753283990f24a35cd69cd6#proguard
-dontwarn okio.**
# === GSON: https://raw.githubusercontent.com/google/gson/master/examples/android-proguard-example/proguard.cfg
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# For using GSON @Expose annotation
-keepattributes *Annotation*
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
-dontwarn sun.misc.**
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { <fields>; }
# Prevent proguard from stripping interface information from TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
@ -84,9 +89,144 @@
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
# SnakeYaml
-keep class org.yaml.snakeyaml.** { public protected private *; }
-dontwarn org.yaml.snakeyaml.**
# Prevent R8 from leaving Data object members always null
-keepclassmembers,allowobfuscation class * {
@com.google.gson.annotations.SerializedName <fields>;
}
# Duktape
-keep class com.squareup.duktape.** { *; }
# == Nucleus
-keepclassmembers class * extends nucleus.presenter.Presenter {
<init>();
}
# TODO Changeloglib? Does it need proguard?
# === Injekt
## From original config: "Attempt to fix: java.lang.NoClassDefFoundError: uy.kohesive.injekt.registry.default.DefaultRegistrar$NOKEY$1"
-keep class uy.kohesive.injekt.** { *; }
# === Glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
-dontwarn com.bumptech.glide.load.resource.bitmap.VideoDecoder
# === Glide-transformations: https://github.com/wasabeef/glide-transformations/blob/3aa8e53c6a51b8351d312f802ba1354c5b115168/transformations/proguard-rules.txt
-dontwarn jp.co.cyberagent.android.gpuimage.**
# === Conductor
# This isn't in the consumer proguard rules yet: https://github.com/bluelinelabs/Conductor/pull/550/files
-keepclassmembers public class * extends com.bluelinelabs.conductor.ControllerChangeHandler {
public <init>();
}
# === RxBinding
-dontwarn com.google.auto.value.AutoValue
# === Crashlytics
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable
-keep class com.crashlytics.** { *; }
-dontwarn com.crashlytics.**
# === Humanize + Guava: https://github.com/google/guava/wiki/UsingProGuardWithGuava
-dontwarn javax.lang.model.element.Modifier
-keep class org.ocpsoft.prettytime.i18n.**
# Note: We intentionally don't add the flags we'd need to make Enums work.
# That's because the Proguard configuration required to make it work on
# optimized code would preclude lots of optimization, like converting enums
# into ints.
# Throwables uses internal APIs for lazy stack trace resolution
-dontnote sun.misc.SharedSecrets
-keep class sun.misc.SharedSecrets {
*** getJavaLangAccess(...);
}
-dontnote sun.misc.JavaLangAccess
-keep class sun.misc.JavaLangAccess {
*** getStackTraceElement(...);
*** getStackTraceDepth(...);
}
# FinalizableReferenceQueue calls this reflectively
# Proguard is intelligent enough to spot the use of reflection onto this, so we
# only need to keep the names, and allow it to be stripped out if
# FinalizableReferenceQueue is unused.
-keepnames class com.google.common.base.internal.Finalizer {
*** startFinalizer(...);
}
# However, it cannot "spot" that this method needs to be kept IF the class is.
-keepclassmembers class com.google.common.base.internal.Finalizer {
*** startFinalizer(...);
}
-keepnames class com.google.common.base.FinalizableReference {
void finalizeReferent();
}
-keepclassmembers class com.google.common.base.FinalizableReference {
void finalizeReferent();
}
# Striped64, LittleEndianByteArray, UnsignedBytes, AbstractFuture
-dontwarn sun.misc.Unsafe
# Striped64 appears to make some assumptions about object layout that
# really might not be safe. This should be investigated.
-keepclassmembers class com.google.common.cache.Striped64 {
*** base;
*** busy;
}
-keepclassmembers class com.google.common.cache.Striped64$Cell {
<fields>;
}
-dontwarn java.lang.SafeVarargs
-keep class java.lang.Throwable {
*** addSuppressed(...);
}
# Futures.getChecked, in both of its variants, is incompatible with proguard.
# Used by AtomicReferenceFieldUpdater and sun.misc.Unsafe
-keepclassmembers class com.google.common.util.concurrent.AbstractFuture** {
*** waiters;
*** value;
*** listeners;
*** thread;
*** next;
}
-keepclassmembers class com.google.common.util.concurrent.AtomicDouble {
*** value;
}
-keepclassmembers class com.google.common.util.concurrent.AggregateFutureState {
*** remaining;
*** seenExceptions;
}
# Since Unsafe is using the field offsets of these inner classes, we don't want
# to have class merging or similar tricks applied to these classes and their
# fields. It's safe to allow obfuscation, since the by-name references are
# already preserved in the -keep statement above.
-keep,allowshrinking,allowobfuscation class com.google.common.util.concurrent.AbstractFuture** {
<fields>;
}
# Futures.getChecked (which often won't work with Proguard anyway) uses this. It
# has a fallback, but again, don't use Futures.getChecked on Android regardless.
-dontwarn java.lang.ClassValue
# MoreExecutors references AppEngine
-dontnote com.google.appengine.api.ThreadManager
-keep class com.google.appengine.api.ThreadManager {
static *** currentRequestThreadFactory(...);
}
-dontnote com.google.apphosting.api.ApiProxy
-keep class com.google.apphosting.api.ApiProxy {
static *** getCurrentEnvironment (...);
}

View File

@ -2,7 +2,7 @@
<shortcut
android:enabled="true"
android:icon="@drawable/sc_book_48dp"
android:icon="@drawable/sc_collections_bookmark_48dp"
android:shortcutDisabledMessage="@string/app_not_available"
android:shortcutId="show_library"
android:shortcutLongLabel="@string/label_library"
@ -13,7 +13,7 @@
</shortcut>
<shortcut
android:enabled="true"
android:icon="@drawable/sc_update_48dp"
android:icon="@drawable/sc_new_releases_48dp"
android:shortcutDisabledMessage="@string/app_not_available"
android:shortcutId="show_recently_updated"
android:shortcutLongLabel="@string/label_recent_updates"
@ -24,7 +24,7 @@
</shortcut>
<shortcut
android:enabled="true"
android:icon="@drawable/sc_glasses_48dp"
android:icon="@drawable/sc_history_48dp"
android:shortcutDisabledMessage="@string/app_not_available"
android:shortcutId="show_recently_read"
android:shortcutLongLabel="@string/label_recent_manga"
@ -38,8 +38,8 @@
android:icon="@drawable/sc_explore_48dp"
android:shortcutDisabledMessage="@string/app_not_available"
android:shortcutId="show_catalogues"
android:shortcutLongLabel="@string/label_catalogues"
android:shortcutShortLabel="@string/label_catalogues">
android:shortcutLongLabel="@string/browse"
android:shortcutShortLabel="@string/browse">
<intent
android:action="eu.kanade.tachiyomi.SHOW_CATALOGUES"
android:targetClass="eu.kanade.tachiyomi.ui.main.MainActivity" />

View File

@ -16,19 +16,82 @@
android:fillType="evenOdd"
android:fillColor="#607D8B"/>
<path
android:pathData="M54,54.5m-25.5,0a25.5,25.5 0,1 1,51 0a25.5,25.5 0,1 1,-51 0"
android:fillType="evenOdd"
android:fillColor="#000"/>
android:name="path_3"
android:pathData="M 54 54.5 M 28.5 54.5 C 28.5 47.74 31.188 41.249 35.969 36.469 C 40.749 31.688 47.24 29 54 29 C 60.76 29 67.251 31.688 72.031 36.469 C 76.812 41.249 79.5 47.74 79.5 54.5 C 79.5 61.26 76.812 67.751 72.031 72.531 C 67.251 77.312 60.76 80 54 80 C 47.24 80 40.749 77.312 35.969 72.531 C 31.188 67.751 28.5 61.26 28.5 54.5"
android:fillColor="#000"
android:fillType="evenOdd"/>
<path
android:pathData="M54,54.5m-25.5,0a25.5,25.5 0,1 1,51 0a25.5,25.5 0,1 1,-51 0"
android:fillType="evenOdd"
android:fillColor="#CE2828"/>
android:name="path_4"
android:pathData="M 54 54.5 M 28.5 54.5 C 28.5 47.74 31.188 41.249 35.969 36.469 C 40.749 31.688 47.24 29 54 29 C 60.76 29 67.251 31.688 72.031 36.469 C 76.812 41.249 79.5 47.74 79.5 54.5 C 79.5 61.26 76.812 67.751 72.031 72.531 C 67.251 77.312 60.76 80 54 80 C 47.24 80 40.749 77.312 35.969 72.531 C 31.188 67.751 28.5 61.26 28.5 54.5"
android:fillColor="#CE2828"
android:fillType="evenOdd"/>
<path
android:pathData="M54,54.5m-19.94,0a19.94,19.94 0,1 1,39.87 0a19.94,19.94 0,1 1,-39.87 0"
android:fillType="evenOdd"
android:fillColor="#FFF"/>
android:name="path_5"
android:pathData="M 54 54.5 M 34.06 54.5 C 33.964 50.23 35.243 46.04 37.707 42.551 C 40.171 39.062 43.692 36.455 47.748 35.117 C 51.805 33.779 56.185 33.779 60.242 35.117 C 64.298 36.455 67.819 39.062 70.283 42.551 C 72.747 46.04 74.026 50.23 73.93 54.5 C 74.026 58.77 72.747 62.96 70.283 66.449 C 67.819 69.938 64.298 72.545 60.242 73.883 C 56.185 75.221 51.805 75.221 47.748 73.883 C 43.692 72.545 40.171 69.938 37.707 66.449 C 35.243 62.96 33.964 58.77 34.06 54.5"
android:fillColor="#FFF"
android:fillType="evenOdd"/>
<path
android:pathData="M52.04,46.3L47.42,46.3C46.14,46.3 44.93,46.23 44.2,46.14L44.2,49.76C45,49.65 46.16,49.6 47.42,49.6L60.58,49.6C61.86,49.6 63.02,49.65 63.82,49.76L63.82,46.14C63.09,46.23 61.86,46.3 60.58,46.3L55.69,46.3L55.69,45.07C55.69,44.43 55.73,43.95 55.82,43.45L51.9,43.45C51.99,44 52.04,44.43 52.04,45.07L52.04,46.3ZM46.78,60.68C45.46,60.68 44.29,60.63 43.45,60.52L43.45,64.14C44.34,64.03 45.46,63.98 46.78,63.98L61.29,63.98C62.57,63.98 63.71,64.03 64.57,64.14L64.57,60.52C63.73,60.63 62.57,60.68 61.29,60.68L58.24,60.68C59.33,58.06 59.99,56.23 60.7,53.91C61.34,51.81 61.34,51.81 61.56,51.13L57.58,50.06C57.51,50.93 57.37,51.52 56.89,53.41C56.19,56.14 55.32,58.74 54.5,60.68L46.78,60.68ZM46.48,51.36C47.55,54.02 48.28,56.53 49.03,60.15L52.66,58.9C51.65,54.98 50.92,52.66 49.94,50.11L46.48,51.36Z"
android:fillType="evenOdd"
android:fillColor="#000"/>
android:name="path_6"
android:pathData="M 54.174 36.266 C 64.147 36.266 72.234 44.397 72.234 54.426 C 72.234 64.459 64.147 72.593 54.174 72.593 C 44.197 72.593 36.113 64.459 36.113 54.426 C 36.113 44.397 44.197 36.266 54.174 36.266 Z"
android:fillColor="#ffcc4d"
android:strokeColor="#ffcc4d"
android:strokeWidth="4.628571428571428"
android:strokeLineCap="round"
android:strokeLineJoin="round"/>
<path
android:name="path_7"
android:pathData="M 48.774 45.158 C 49.988 45.158 50.973 46.452 50.973 48.05 C 50.973 49.65 49.988 50.946 48.774 50.946 C 47.559 50.946 46.576 49.65 46.576 48.05 C 46.576 46.452 47.559 45.158 48.774 45.158 Z"
android:fillColor="#674600"
android:strokeColor="#674600"
android:strokeWidth="0.1"
android:strokeLineJoin="round"/>
<path
android:name="path_8"
android:pathData="M 62.02 45.158 C 63.235 45.158 64.219 46.452 64.219 48.05 C 64.219 49.65 63.235 50.946 62.02 50.946 C 60.805 50.946 59.821 49.65 59.821 48.05 C 59.821 46.452 60.805 45.158 62.02 45.158 Z"
android:fillColor="#674600"
android:strokeColor="#674600"
android:strokeWidth="0.1"
android:strokeLineJoin="round"/>
<path
android:name="path_9"
android:pathData="M 44.687 42.102 C 44.687 42.102 48.404 40.049 53.119 42.102"
android:strokeColor="#674600"
android:strokeWidth="2"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:fillType="evenOdd"/>
<path
android:name="path_10"
android:pathData="M 58.035 42.102 C 58.035 42.102 61.751 40.049 66.465 42.102"
android:strokeColor="#674600"
android:strokeWidth="2"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:fillType="evenOdd"/>
<path
android:name="path_11"
android:pathData="M 49.191 56.685 C 49.191 56.685 51.703 59.685 56.992 59.685"
android:strokeColor="#674600"
android:strokeWidth="2"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:fillType="evenOdd"/>
<path
android:name="path_12"
android:pathData="M 34.072 67.511 C 34.072 67.511 34.524 66.248 37.476 63.634 C 37.476 63.634 39.143 61.991 37.876 58.114 C 37.876 58.114 37.534 56.06 39.681 57.255 C 39.681 57.255 44.129 60.46 40.871 65 C 40.871 65 40.241 66.117 41.652 65.78 L 53.939 63.103 C 53.939 63.103 55.275 62.752 55.535 64.163 C 55.535 64.163 55.696 65.372 54.641 65.672 L 47.742 67.378 C 47.742 67.378 50.72 69.597 47.742 70.825 C 47.742 70.825 50.294 72.779 47.336 74.268 C 47.336 74.268 49.276 76.015 46.407 77.019 C 46.407 77.019 42.525 78.474 39.209 77.831 C 35.509 77.103 31.947 72.114 34.072 67.511 Z"
android:fillColor="#f4900c"
android:strokeColor="#f4900c"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="0.1"
android:fillType="evenOdd"/>
<path
android:name="path_13"
android:pathData="M 56.182 67.511 C 56.182 67.511 56.633 66.248 59.585 63.634 C 59.585 63.634 61.253 61.991 59.985 58.114 C 59.985 58.114 59.642 56.06 61.789 57.255 C 61.789 57.255 66.239 60.46 62.98 65 C 62.98 65 62.351 66.117 63.761 65.78 L 76.066 63.103 C 76.066 63.103 77.386 62.752 77.641 64.163 C 77.641 64.163 77.812 65.372 76.746 65.672 L 69.85 67.378 C 69.85 67.378 72.829 69.597 69.85 70.825 C 69.85 70.825 72.404 72.779 69.446 74.268 C 69.446 74.268 71.387 76.015 68.516 77.019 C 68.516 77.019 64.633 78.474 61.317 77.831 C 57.618 77.103 54.057 72.114 56.182 67.511 Z"
android:fillColor="#f4900c"
android:strokeColor="#f4900c"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:strokeWidth="0.1"
android:fillType="evenOdd"/>
</vector>

View File

@ -0,0 +1,6 @@
<vector android:height="100dp"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="100dp" xmlns:android="http://schemas.android.com/apk/res/android"
android:tint="?attr/colorControlNormal">
<path android:fillColor="@android:color/white" android:pathData="M7,10l5,5 -5,5z"/>
</vector>

240
app/src/main/AndroidManifest.xml Normal file → Executable file
View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="eu.kanade.tachiyomi">
<uses-permission android:name="android.permission.INTERNET" />
@ -8,37 +9,85 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />
<!-- Lock vibrate -->
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:name=".App"
android:allowBackup="true"
android:fullBackupContent="@xml/backup_rules"
android:hardwareAccelerated="true"
android:hasFragileUserData="true"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:label="@string/app_name"
android:largeHeap="true"
android:theme="@style/Theme.Tachiyomi">
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:networkSecurityConfig="@xml/network_security_config"
android:theme="@style/Theme.Tachiyomi.Light"
android:usesCleartextTraffic="true">
<activity
android:name=".ui.main.MainActivity"
android:launchMode="singleTop">
android:launchMode="singleTop"
android:theme="@style/Theme.Splash">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!--suppress AndroidDomInspection -->
<meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts"/>
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>
<activity
android:name=".ui.reader.ReaderActivity" />
android:name=".ui.main.ForceCloseActivity"
android:clearTaskOnLaunch="true"
android:noHistory="true"
android:theme="@android:style/Theme.NoDisplay" />
<activity
android:name=".ui.main.DeepLinkActivity"
android:launchMode="singleTask"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
<action android:name="com.google.android.gms.actions.SEARCH_ACTION" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="eu.kanade.tachiyomi.SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
<activity
android:name=".ui.reader.ReaderActivity"
android:launchMode="singleTask" />
<activity
android:name=".ui.security.BiometricUnlockActivity"
android:theme="@style/Theme.Splash" />
<activity
android:name=".ui.webview.WebViewActivity"
android:configChanges="uiMode|orientation|screenSize" />
<activity
android:name=".widget.CustomLayoutPickerActivity"
android:label="@string/app_name"
android:theme="@style/FilePickerTheme" />
<activity
android:name=".ui.setting.AnilistLoginActivity"
android:name=".ui.setting.track.AnilistLoginActivity"
android:label="Anilist">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
@ -51,12 +100,48 @@
android:scheme="tachiyomi" />
</intent-filter>
</activity>
<activity
android:name=".ui.setting.track.ShikimoriLoginActivity"
android:label="Shikimori">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="shikimori-auth"
android:scheme="tachiyomi" />
</intent-filter>
</activity>
<activity
android:name=".ui.setting.track.BangumiLoginActivity"
android:label="Bangumi">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="bangumi-auth"
android:scheme="tachiyomi" />
</intent-filter>
</activity>
<activity
android:name=".extension.util.ExtensionInstallActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<activity
android:name="com.google.android.gms.oss.licenses.OssLicensesMenuActivity"
android:theme="@style/Theme.MaterialComponents" />
<activity
android:name="com.google.android.gms.oss.licenses.OssLicensesActivity"
android:theme="@style/Theme.MaterialComponents" />
<provider
android:name="android.support.v4.content.FileProvider"
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
@ -83,12 +168,145 @@
<service
android:name=".data.backup.BackupCreateService"
android:exported="false"/>
android:exported="false" />
<service
android:name=".data.backup.BackupRestoreService"
android:exported="false"/>
android:exported="false" />
<!-- EH -->
<service
android:name="exh.eh.EHentaiUpdateWorker"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="true" />
<activity
android:name="exh.ui.intercept.InterceptActivity"
android:label="TachiyomiEH"
android:theme="@style/Theme.EHActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- EH -->
<data
android:host="g.e-hentai.org"
android:pathPrefix="/g/"
android:scheme="http" />
<data
android:host="g.e-hentai.org"
android:pathPrefix="/g/"
android:scheme="https" />
<data
android:host="e-hentai.org"
android:pathPrefix="/g/"
android:scheme="http" />
<data
android:host="e-hentai.org"
android:pathPrefix="/g/"
android:scheme="https" />
<!-- EXH -->
<data
android:host="exhentai.org"
android:pathPrefix="/g/"
android:scheme="http" />
<data
android:host="exhentai.org"
android:pathPrefix="/g/"
android:scheme="https" />
<!-- nhentai -->
<data
android:host="nhentai.net"
android:pathPrefix="/g/"
android:scheme="http" />
<data
android:host="nhentai.net"
android:pathPrefix="/g/"
android:scheme="https" />
<!-- Perv Eden -->
<data
android:host="www.perveden.com"
android:pathPattern="/.*/.*-manga/.*"
android:scheme="http" />
<data
android:host="www.perveden.com"
android:pathPattern="/.*/.*-manga/.*"
android:scheme="https" />
<!-- Hentai Cafe -->
<data
android:host="hentai.cafe"
android:pathPattern="/.*/.*"
android:scheme="http" />
<data
android:host="hentai.cafe"
android:pathPattern="/.*/.*"
android:scheme="https" />
<!-- Tsumino -->
<data
android:host="www.tsumino.com"
android:pathPrefix="/Book/Info/"
android:scheme="http" />
<data
android:host="www.tsumino.com"
android:pathPrefix="/Book/Info/"
android:scheme="https" />
<data
android:host="www.tsumino.com"
android:pathPrefix="/Read/View/"
android:scheme="http" />
<data
android:host="www.tsumino.com"
android:pathPrefix="/Read/View/"
android:scheme="https" />
<!-- Hitomi.la -->
<data
android:host="hitomi.la"
android:pathPrefix="/galleries/"
android:scheme="http" />
<data
android:host="hitomi.la"
android:pathPrefix="/reader/"
android:scheme="http" />
<data
android:host="hitomi.la"
android:pathPrefix="/galleries/"
android:scheme="https" />
<data
android:host="hitomi.la"
android:pathPrefix="/reader/"
android:scheme="https" />
<!-- Pururin.io -->
<data
android:host="pururin.io"
android:pathPrefix="/gallery/"
android:scheme="http" />
<data
android:host="pururin.io"
android:pathPrefix="/gallery/"
android:scheme="https" />
<!-- HBrowse -->
<data
android:host="www.hbrowse.com"
android:pathPrefix="/"
android:scheme="http" />
<data
android:host="www.hbrowse.com"
android:pathPrefix="/"
android:scheme="https" />
</intent-filter>
</activity>
<activity
android:name="exh.ui.captcha.BrowserActionActivity"
android:theme="@style/Theme.EHActivity" />
</application>
</manifest>

0
app/src/main/ic_launcher-web.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

204
app/src/main/java/eu/kanade/tachiyomi/App.kt Normal file → Executable file
View File

@ -3,48 +3,88 @@ package eu.kanade.tachiyomi
import android.app.Application
import android.content.Context
import android.content.res.Configuration
import android.support.multidex.MultiDex
import com.evernote.android.job.JobManager
import eu.kanade.tachiyomi.data.backup.BackupCreatorJob
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
import android.graphics.Color
import android.os.Build
import android.os.Environment
import android.widget.Toast
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.multidex.MultiDex
import com.elvishew.xlog.LogConfiguration
import com.elvishew.xlog.LogLevel
import com.elvishew.xlog.XLog
import com.elvishew.xlog.printer.AndroidPrinter
import com.elvishew.xlog.printer.Printer
import com.elvishew.xlog.printer.file.FilePrinter
import com.elvishew.xlog.printer.file.backup.NeverBackupStrategy
import com.elvishew.xlog.printer.file.clean.FileLastModifiedCleanStrategy
import com.elvishew.xlog.printer.file.naming.DateFileNameGenerator
import com.google.android.gms.common.GooglePlayServicesNotAvailableException
import com.google.android.gms.common.GooglePlayServicesRepairableException
import com.google.android.gms.security.ProviderInstaller
import com.kizitonwose.time.days
import com.ms_square.debugoverlay.DebugOverlay
import com.ms_square.debugoverlay.modules.FpsModule
import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.data.updater.UpdaterJob
import eu.kanade.tachiyomi.util.LocaleHelper
import org.acra.ACRA
import org.acra.annotation.ReportsCrashes
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.ui.main.ForceCloseActivity
import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate
import eu.kanade.tachiyomi.util.system.LocaleHelper
import eu.kanade.tachiyomi.util.system.WebViewUtil
import eu.kanade.tachiyomi.util.system.toast
import exh.debug.DebugToggles
import exh.log.CrashlyticsPrinter
import exh.log.EHDebugModeOverlay
import exh.log.EHLogLevel
import io.realm.Realm
import io.realm.RealmConfiguration
import java.io.File
import java.security.NoSuchAlgorithmException
import javax.net.ssl.SSLContext
import kotlin.concurrent.thread
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import timber.log.Timber
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.InjektScope
import uy.kohesive.injekt.injectLazy
import uy.kohesive.injekt.registry.default.DefaultRegistrar
@ReportsCrashes(
formUri = "http://tachiyomi.kanade.eu/crash_report",
reportType = org.acra.sender.HttpSender.Type.JSON,
httpMethod = org.acra.sender.HttpSender.Method.PUT,
buildConfigClass = BuildConfig::class,
excludeMatchingSharedPreferencesKeys = arrayOf(".*username.*", ".*password.*", ".*token.*")
)
open class App : Application() {
open class App : Application(), LifecycleObserver {
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) Timber.plant(Timber.DebugTree())
setupExhLogging() // EXH logging
workaroundAndroid7BrokenSSL()
// Enforce WebView availability
if (!WebViewUtil.supportsWebView(this)) {
toast(R.string.information_webview_required, Toast.LENGTH_LONG)
ForceCloseActivity.closeApp(this)
}
Injekt = InjektScope(DefaultRegistrar())
Injekt.importModule(AppModule(this))
setupAcra()
setupJobManager()
setupNotificationChannels()
GlobalScope.launch { deleteOldMetadataRealm() } // Delete old metadata DB (EH)
// Reprint.initialize(this) //Setup fingerprint (EH)
if ((BuildConfig.DEBUG || BuildConfig.BUILD_TYPE == "releaseTest") && DebugToggles.ENABLE_DEBUG_OVERLAY.enabled) {
setupDebugOverlay()
}
LocaleHelper.updateConfiguration(this, resources.configuration)
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
}
override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
if (BuildConfig.DEBUG) {
MultiDex.install(this)
}
MultiDex.install(this)
}
override fun onConfigurationChanged(newConfig: Configuration) {
@ -52,18 +92,32 @@ open class App : Application() {
LocaleHelper.updateConfiguration(this, newConfig, true)
}
protected open fun setupAcra() {
ACRA.init(this)
private fun workaroundAndroid7BrokenSSL() {
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.N ||
Build.VERSION.SDK_INT == Build.VERSION_CODES.N_MR1
) {
try {
SSLContext.getInstance("TLSv1.2")
} catch (e: NoSuchAlgorithmException) {
XLog.e("Could not install Android 7 broken SSL workaround!", e)
}
try {
ProviderInstaller.installIfNeeded(applicationContext)
} catch (e: GooglePlayServicesRepairableException) {
XLog.e("Could not install Android 7 broken SSL workaround!", e)
} catch (e: GooglePlayServicesNotAvailableException) {
XLog.e("Could not install Android 7 broken SSL workaround!", e)
}
}
}
protected open fun setupJobManager() {
JobManager.create(this).addJobCreator { tag ->
when (tag) {
LibraryUpdateJob.TAG -> LibraryUpdateJob()
UpdaterJob.TAG -> UpdaterJob()
BackupCreatorJob.TAG -> BackupCreatorJob()
else -> null
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
@Suppress("unused")
fun onAppBackgrounded() {
val preferences: PreferencesHelper by injectLazy()
if (preferences.lockAppAfter().get() >= 0) {
SecureActivityDelegate.locked = true
}
}
@ -71,4 +125,92 @@ open class App : Application() {
Notifications.createChannels(this)
}
// EXH
private fun deleteOldMetadataRealm() {
Realm.init(this)
val config = RealmConfiguration.Builder()
.name("gallery-metadata.realm")
.schemaVersion(3)
.deleteRealmIfMigrationNeeded()
.build()
Realm.deleteRealm(config)
// Delete old paper db files
listOf(
File(filesDir, "gallery-ex"),
File(filesDir, "gallery-perveden"),
File(filesDir, "gallery-nhentai")
).forEach {
if (it.exists()) {
thread {
it.deleteRecursively()
}
}
}
}
// EXH
private fun setupExhLogging() {
EHLogLevel.init(this)
val logLevel = if (EHLogLevel.shouldLog(EHLogLevel.EXTRA)) {
LogLevel.ALL
} else {
LogLevel.WARN
}
val logConfig = LogConfiguration.Builder()
.logLevel(logLevel)
.t()
.st(2)
.nb()
.build()
val printers = mutableListOf<Printer>(AndroidPrinter())
val logFolder = File(
Environment.getExternalStorageDirectory().absolutePath + File.separator +
getString(R.string.app_name),
"logs"
)
printers += FilePrinter
.Builder(logFolder.absolutePath)
.fileNameGenerator(object : DateFileNameGenerator() {
override fun generateFileName(logLevel: Int, timestamp: Long): String {
return super.generateFileName(logLevel, timestamp) + "-${BuildConfig.BUILD_TYPE}"
}
})
.cleanStrategy(FileLastModifiedCleanStrategy(7.days.inMilliseconds.longValue))
.backupStrategy(NeverBackupStrategy())
.build()
// Install Crashlytics in prod
if (!BuildConfig.DEBUG) {
printers += CrashlyticsPrinter(LogLevel.ERROR)
}
XLog.init(
logConfig,
*printers.toTypedArray()
)
XLog.d("Application booting...")
}
// EXH
private fun setupDebugOverlay() {
try {
DebugOverlay.Builder(this)
.modules(FpsModule(), EHDebugModeOverlay(this))
.bgColor(Color.parseColor("#7F000000"))
.notification(false)
.allowSystemLayer(false)
.build()
.install()
} catch (e: IllegalStateException) {
// Crashes if app is in background
XLog.e("Failed to initialize debug overlay, app in background?", e)
}
}
}

33
app/src/main/java/eu/kanade/tachiyomi/AppModule.kt Normal file → Executable file
View File

@ -11,14 +11,19 @@ import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.extension.ExtensionManager
import eu.kanade.tachiyomi.network.NetworkHelper
import eu.kanade.tachiyomi.source.SourceManager
import rx.Observable
import rx.schedulers.Schedulers
import uy.kohesive.injekt.api.*
import exh.eh.EHentaiUpdateHelper
import io.noties.markwon.Markwon
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import uy.kohesive.injekt.api.InjektModule
import uy.kohesive.injekt.api.InjektRegistrar
import uy.kohesive.injekt.api.addSingleton
import uy.kohesive.injekt.api.addSingletonFactory
import uy.kohesive.injekt.api.get
class AppModule(val app: Application) : InjektModule {
override fun InjektRegistrar.registerInjectables() {
addSingleton(app)
addSingletonFactory { PreferencesHelper(app) }
@ -41,22 +46,20 @@ class AppModule(val app: Application) : InjektModule {
addSingletonFactory { Gson() }
addSingletonFactory { EHentaiUpdateHelper(app) }
addSingletonFactory { Markwon.create(app) }
// Asynchronously init expensive components for a faster cold start
rxAsync { get<PreferencesHelper>() }
GlobalScope.launch { get<PreferencesHelper>() }
rxAsync { get<NetworkHelper>() }
GlobalScope.launch { get<NetworkHelper>() }
rxAsync { get<SourceManager>() }
GlobalScope.launch { get<SourceManager>() }
rxAsync { get<DatabaseHelper>() }
rxAsync { get<DownloadManager>() }
GlobalScope.launch { get<DatabaseHelper>() }
GlobalScope.launch { get<DownloadManager>() }
}
private fun rxAsync(block: () -> Unit) {
Observable.fromCallable { block() }.subscribeOn(Schedulers.computation()).subscribe()
}
}

View File

@ -1,13 +1,17 @@
package eu.kanade.tachiyomi
import eu.kanade.tachiyomi.data.backup.BackupCreatorJob
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.getOrDefault
import eu.kanade.tachiyomi.data.updater.UpdaterJob
import eu.kanade.tachiyomi.extension.ExtensionUpdateJob
import eu.kanade.tachiyomi.ui.library.LibrarySort
import java.io.File
object Migrations {
// TODO NATIVE TACHIYOMI MIGRATIONS ARE FUCKED UP DUE TO DIFFERING VERSION NUMBERS
/**
* Performs a migration when the application is updated.
*
@ -16,18 +20,33 @@ object Migrations {
*/
fun upgrade(preferences: PreferencesHelper): Boolean {
val context = preferences.context
val oldVersion = preferences.lastVersionCode().getOrDefault()
val oldVersion = preferences.lastVersionCode().get()
// Cancel app updater job for debug builds that don't include it
if (BuildConfig.DEBUG && !BuildConfig.INCLUDE_UPDATER) {
UpdaterJob.cancelTask(context)
}
if (oldVersion < BuildConfig.VERSION_CODE) {
preferences.lastVersionCode().set(BuildConfig.VERSION_CODE)
if (oldVersion == 0) return false
// Fresh install
if (oldVersion == 0) {
// Set up default background tasks
if (BuildConfig.INCLUDE_UPDATER) {
UpdaterJob.setupTask(context)
}
ExtensionUpdateJob.setupTask(context)
LibraryUpdateJob.setupTask(context)
return false
}
if (oldVersion < 14) {
// Restore jobs after upgrading to evernote's job scheduler.
if (BuildConfig.INCLUDE_UPDATER && preferences.automaticUpdates()) {
UpdaterJob.setupTask()
// Restore jobs after upgrading to Evernote's job scheduler.
if (BuildConfig.INCLUDE_UPDATER) {
UpdaterJob.setupTask(context)
}
LibraryUpdateJob.setupTask()
LibraryUpdateJob.setupTask(context)
}
if (oldVersion < 15) {
// Delete internal chapter cache dir.
@ -39,7 +58,7 @@ object Migrations {
if (oldDir.exists()) {
val destDir = context.getExternalFilesDir("covers")
if (destDir != null) {
oldDir.listFiles().forEach {
oldDir.listFiles()?.forEach {
it.renameTo(File(destDir, it.name))
}
}
@ -55,9 +74,25 @@ object Migrations {
}
}
}
if (oldVersion < 43) {
// Restore jobs after migrating from Evernote's job scheduler to WorkManager.
if (BuildConfig.INCLUDE_UPDATER) {
UpdaterJob.setupTask(context)
}
LibraryUpdateJob.setupTask(context)
BackupCreatorJob.setupTask(context)
// New extension update check job
ExtensionUpdateJob.setupTask(context)
}
if (oldVersion < 44) {
// Reset sorting preference if using removed sort by source
if (preferences.librarySortingMode().get() == LibrarySort.SOURCE) {
preferences.librarySortingMode().set(LibrarySort.ALPHA)
}
}
return true
}
return false
}
}
}

View File

@ -1,23 +1,10 @@
package eu.kanade.tachiyomi.data.backup
import eu.kanade.tachiyomi.BuildConfig.APPLICATION_ID as ID
import eu.kanade.tachiyomi.BuildConfig.APPLICATION_ID as ID
object BackupConst {
const val INTENT_FILTER = "SettingsBackupFragment"
const val ACTION_BACKUP_COMPLETED_DIALOG = "$ID.$INTENT_FILTER.ACTION_BACKUP_COMPLETED_DIALOG"
const val ACTION_SET_PROGRESS_DIALOG = "$ID.$INTENT_FILTER.ACTION_SET_PROGRESS_DIALOG"
const val ACTION_ERROR_BACKUP_DIALOG = "$ID.$INTENT_FILTER.ACTION_ERROR_BACKUP_DIALOG"
const val ACTION_ERROR_RESTORE_DIALOG = "$ID.$INTENT_FILTER.ACTION_ERROR_RESTORE_DIALOG"
const val ACTION_RESTORE_COMPLETED_DIALOG = "$ID.$INTENT_FILTER.ACTION_RESTORE_COMPLETED_DIALOG"
const val ACTION = "$ID.$INTENT_FILTER.ACTION"
const val EXTRA_PROGRESS = "$ID.$INTENT_FILTER.EXTRA_PROGRESS"
const val EXTRA_AMOUNT = "$ID.$INTENT_FILTER.EXTRA_AMOUNT"
const val EXTRA_ERRORS = "$ID.$INTENT_FILTER.EXTRA_ERRORS"
const val EXTRA_CONTENT = "$ID.$INTENT_FILTER.EXTRA_CONTENT"
const val EXTRA_ERROR_MESSAGE = "$ID.$INTENT_FILTER.EXTRA_ERROR_MESSAGE"
const val EXTRA_URI = "$ID.$INTENT_FILTER.EXTRA_URI"
const val EXTRA_TIME = "$ID.$INTENT_FILTER.EXTRA_TIME"
const val EXTRA_ERROR_FILE_PATH = "$ID.$INTENT_FILTER.EXTRA_ERROR_FILE_PATH"
const val EXTRA_ERROR_FILE = "$ID.$INTENT_FILTER.EXTRA_ERROR_FILE"
}
private const val NAME = "BackupRestoreServices"
const val EXTRA_URI = "$ID.$NAME.EXTRA_URI"
const val EXTRA_FLAGS = "$ID.$NAME.EXTRA_FLAGS"
}

View File

@ -1,25 +1,23 @@
package eu.kanade.tachiyomi.data.backup
import android.app.IntentService
import android.app.Service
import android.content.Context
import android.content.Intent
import android.net.Uri
import com.google.gson.JsonArray
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.BuildConfig.APPLICATION_ID as ID
import android.os.Build
import android.os.IBinder
import android.os.PowerManager
import com.hippo.unifile.UniFile
import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.util.system.acquireWakeLock
import eu.kanade.tachiyomi.util.system.isServiceRunning
/**
* [IntentService] used to backup [Manga] information to [JsonArray]
* Service for backing up library information to a JSON file.
*/
class BackupCreateService : IntentService(NAME) {
class BackupCreateService : Service() {
companion object {
// Name of class
private const val NAME = "BackupCreateService"
// Options for backup
private const val EXTRA_FLAGS = "$ID.$NAME.EXTRA_FLAGS"
// Filter options
internal const val BACKUP_CATEGORY = 0x1
internal const val BACKUP_CATEGORY_MASK = 0x1
@ -31,6 +29,15 @@ class BackupCreateService : IntentService(NAME) {
internal const val BACKUP_TRACK_MASK = 0x8
internal const val BACKUP_ALL = 0xF
/**
* Returns the status of the service.
*
* @param context the application context.
* @return true if the service is running, false otherwise.
*/
fun isRunning(context: Context): Boolean =
context.isServiceRunning(BackupCreateService::class.java)
/**
* Make a backup from library
*
@ -38,26 +45,75 @@ class BackupCreateService : IntentService(NAME) {
* @param uri path of Uri
* @param flags determines what to backup
*/
fun makeBackup(context: Context, uri: Uri, flags: Int) {
val intent = Intent(context, BackupCreateService::class.java).apply {
putExtra(BackupConst.EXTRA_URI, uri)
putExtra(EXTRA_FLAGS, flags)
fun start(context: Context, uri: Uri, flags: Int) {
if (!isRunning(context)) {
val intent = Intent(context, BackupCreateService::class.java).apply {
putExtra(BackupConst.EXTRA_URI, uri)
putExtra(BackupConst.EXTRA_FLAGS, flags)
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
context.startService(intent)
} else {
context.startForegroundService(intent)
}
}
context.startService(intent)
}
}
/**
* Wake lock that will be held until the service is destroyed.
*/
private lateinit var wakeLock: PowerManager.WakeLock
private lateinit var backupManager: BackupManager
private lateinit var notifier: BackupNotifier
override fun onCreate() {
super.onCreate()
notifier = BackupNotifier(this)
wakeLock = acquireWakeLock(javaClass.name)
startForeground(Notifications.ID_BACKUP_PROGRESS, notifier.showBackupProgress().build())
}
override fun stopService(name: Intent?): Boolean {
destroyJob()
return super.stopService(name)
}
override fun onDestroy() {
destroyJob()
super.onDestroy()
}
private fun destroyJob() {
if (wakeLock.isHeld) {
wakeLock.release()
}
}
/**
* This method needs to be implemented, but it's not used/needed.
*/
override fun onBind(intent: Intent): IBinder? = null
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
if (intent == null) return START_NOT_STICKY
try {
val uri = intent.getParcelableExtra<Uri>(BackupConst.EXTRA_URI)
val backupFlags = intent.getIntExtra(BackupConst.EXTRA_FLAGS, 0)
backupManager = BackupManager(this)
val backupFileUri = Uri.parse(backupManager.createBackup(uri, backupFlags, false))
val unifile = UniFile.fromUri(this, backupFileUri)
notifier.showBackupComplete(unifile)
} catch (e: Exception) {
notifier.showBackupError(e.message)
}
stopSelf(startId)
return START_NOT_STICKY
}
private val backupManager by lazy { BackupManager(this) }
override fun onHandleIntent(intent: Intent?) {
if (intent == null) return
// Get values
val uri = intent.getParcelableExtra<Uri>(BackupConst.EXTRA_URI)
val flags = intent.getIntExtra(EXTRA_FLAGS, 0)
// Create backup
backupManager.createBackup(uri, flags, false)
}
}

View File

@ -1,42 +1,51 @@
package eu.kanade.tachiyomi.data.backup
import android.content.Context
import android.net.Uri
import com.evernote.android.job.Job
import com.evernote.android.job.JobManager
import com.evernote.android.job.JobRequest
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager
import androidx.work.Worker
import androidx.work.WorkerParameters
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.getOrDefault
import java.util.concurrent.TimeUnit
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
class BackupCreatorJob : Job() {
class BackupCreatorJob(private val context: Context, workerParams: WorkerParameters) :
Worker(context, workerParams) {
override fun onRunJob(params: Params): Result {
override fun doWork(): Result {
val preferences = Injekt.get<PreferencesHelper>()
val backupManager = BackupManager(context)
val uri = Uri.parse(preferences.backupsDirectory().getOrDefault())
val uri = Uri.parse(preferences.backupsDirectory().get())
val flags = BackupCreateService.BACKUP_ALL
backupManager.createBackup(uri, flags, true)
return Result.SUCCESS
return try {
backupManager.createBackup(uri, flags, true)
Result.success()
} catch (e: Exception) {
Result.failure()
}
}
companion object {
const val TAG = "BackupCreator"
private const val TAG = "BackupCreator"
fun setupTask(prefInterval: Int? = null) {
fun setupTask(context: Context, prefInterval: Int? = null) {
val preferences = Injekt.get<PreferencesHelper>()
val interval = prefInterval ?: preferences.backupInterval().getOrDefault()
val interval = prefInterval ?: preferences.backupInterval().get()
if (interval > 0) {
JobRequest.Builder(TAG)
.setPeriodic(interval * 60 * 60 * 1000L, 10 * 60 * 1000)
.setUpdateCurrent(true)
.build()
.schedule()
}
}
val request = PeriodicWorkRequestBuilder<BackupCreatorJob>(
interval.toLong(), TimeUnit.HOURS,
10, TimeUnit.MINUTES
)
.addTag(TAG)
.build()
fun cancelTask() {
JobManager.instance().cancelAllForTag(TAG)
WorkManager.getInstance(context).enqueueUniquePeriodicWork(TAG, ExistingPeriodicWorkPolicy.REPLACE, request)
} else {
WorkManager.getInstance(context).cancelAllWorkByTag(TAG)
}
}
}
}

View File

@ -1,10 +1,16 @@
package eu.kanade.tachiyomi.data.backup
import android.content.Context
import android.content.Intent
import android.net.Uri
import com.github.salomonbrys.kotson.*
import com.google.gson.*
import com.github.salomonbrys.kotson.fromJson
import com.github.salomonbrys.kotson.registerTypeAdapter
import com.github.salomonbrys.kotson.registerTypeHierarchyAdapter
import com.github.salomonbrys.kotson.set
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.google.gson.JsonArray
import com.google.gson.JsonElement
import com.google.gson.JsonObject
import com.hippo.unifile.UniFile
import eu.kanade.tachiyomi.data.backup.BackupCreateService.Companion.BACKUP_CATEGORY
import eu.kanade.tachiyomi.data.backup.BackupCreateService.Companion.BACKUP_CATEGORY_MASK
@ -18,40 +24,45 @@ import eu.kanade.tachiyomi.data.backup.models.Backup
import eu.kanade.tachiyomi.data.backup.models.Backup.CATEGORIES
import eu.kanade.tachiyomi.data.backup.models.Backup.CHAPTERS
import eu.kanade.tachiyomi.data.backup.models.Backup.CURRENT_VERSION
import eu.kanade.tachiyomi.data.backup.models.Backup.EXTENSIONS
import eu.kanade.tachiyomi.data.backup.models.Backup.HISTORY
import eu.kanade.tachiyomi.data.backup.models.Backup.MANGA
import eu.kanade.tachiyomi.data.backup.models.Backup.TRACK
import eu.kanade.tachiyomi.data.backup.models.DHistory
import eu.kanade.tachiyomi.data.backup.serializer.*
import eu.kanade.tachiyomi.data.backup.serializer.CategoryTypeAdapter
import eu.kanade.tachiyomi.data.backup.serializer.ChapterTypeAdapter
import eu.kanade.tachiyomi.data.backup.serializer.HistoryTypeAdapter
import eu.kanade.tachiyomi.data.backup.serializer.MangaTypeAdapter
import eu.kanade.tachiyomi.data.backup.serializer.TrackTypeAdapter
import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.*
import eu.kanade.tachiyomi.data.database.models.CategoryImpl
import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.ChapterImpl
import eu.kanade.tachiyomi.data.database.models.History
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.database.models.MangaCategory
import eu.kanade.tachiyomi.data.database.models.MangaImpl
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.database.models.TrackImpl
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.getOrDefault
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.source.LocalSource
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.util.sendLocalBroadcast
import eu.kanade.tachiyomi.util.syncChaptersWithSource
import eu.kanade.tachiyomi.source.online.all.EHentai
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
import exh.eh.EHentaiThrottleManager
import kotlin.math.max
import rx.Observable
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
/**
* Database.
*/
internal val databaseHelper: DatabaseHelper by injectLazy()
/**
* Source manager.
*/
internal val sourceManager: SourceManager by injectLazy()
/**
* Tracking manager
*/
internal val trackManager: TrackManager by injectLazy()
private val preferences: PreferencesHelper by injectLazy()
/**
* Version of parser
@ -64,11 +75,6 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
*/
var parser: Gson = initParser()
/**
* Preferences
*/
private val preferences: PreferencesHelper by injectLazy()
/**
* Set version of parser
*
@ -81,7 +87,8 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
private fun initParser(): Gson = when (version) {
1 -> GsonBuilder().create()
2 -> GsonBuilder()
2 ->
GsonBuilder()
.registerTypeAdapter<MangaImpl>(MangaTypeAdapter.build())
.registerTypeHierarchyAdapter<ChapterImpl>(ChapterTypeAdapter.build())
.registerTypeAdapter<CategoryImpl>(CategoryTypeAdapter.build())
@ -97,7 +104,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
* @param uri path of Uri
* @param isJob backup called from job
*/
fun createBackup(uri: Uri, flags: Int, isJob: Boolean) {
fun createBackup(uri: Uri, flags: Int, isJob: Boolean): String? {
// Create root object
val root = JsonObject()
@ -107,24 +114,40 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
// Create category array
val categoryEntries = JsonArray()
// Create extension ID/name mapping
val extensionEntries = JsonArray()
// Add value's to root
root[Backup.VERSION] = Backup.CURRENT_VERSION
root[Backup.VERSION] = CURRENT_VERSION
root[Backup.MANGAS] = mangaEntries
root[CATEGORIES] = categoryEntries
root[EXTENSIONS] = extensionEntries
databaseHelper.inTransaction {
// Get manga from database
val mangas = getFavoriteManga()
val extensions: MutableSet<String> = mutableSetOf()
// Backup library manga and its dependencies
mangas.forEach { manga ->
mangaEntries.add(backupMangaObject(manga, flags))
// Maintain set of extensions/sources used (excludes local source)
if (manga.source != LocalSource.ID) {
sourceManager.get(manga.source)?.let {
extensions.add("${manga.source}:${it.name}")
}
}
}
// Backup categories
if ((flags and BACKUP_CATEGORY_MASK) == BACKUP_CATEGORY) {
backupCategories(categoryEntries)
}
// Backup extension ID/name mapping
backupExtensionInfo(extensionEntries, extensions)
}
try {
@ -138,42 +161,38 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
val numberOfBackups = numberOfBackups()
val backupRegex = Regex("""tachiyomi_\d+-\d+-\d+_\d+-\d+.json""")
dir.listFiles { _, filename -> backupRegex.matches(filename) }
.orEmpty()
.sortedByDescending { it.name }
.drop(numberOfBackups - 1)
.forEach { it.delete() }
.orEmpty()
.sortedByDescending { it.name }
.drop(numberOfBackups - 1)
.forEach { it.delete() }
// Create new file to place backup
val newFile = dir.createFile(Backup.getDefaultFilename())
?: throw Exception("Couldn't create backup file")
?: throw Exception("Couldn't create backup file")
newFile.openOutputStream().bufferedWriter().use {
parser.toJson(root, it)
}
return newFile.uri.toString()
} else {
val file = UniFile.fromUri(context, uri)
?: throw Exception("Couldn't create backup file")
?: throw Exception("Couldn't create backup file")
file.openOutputStream().bufferedWriter().use {
parser.toJson(root, it)
}
// Show completed dialog
val intent = Intent(BackupConst.INTENT_FILTER).apply {
putExtra(BackupConst.ACTION, BackupConst.ACTION_BACKUP_COMPLETED_DIALOG)
putExtra(BackupConst.EXTRA_URI, file.uri.toString())
}
context.sendLocalBroadcast(intent)
return file.uri.toString()
}
} catch (e: Exception) {
Timber.e(e)
if (!isJob) {
// Show error dialog
val intent = Intent(BackupConst.INTENT_FILTER).apply {
putExtra(BackupConst.ACTION, BackupConst.ACTION_ERROR_BACKUP_DIALOG)
putExtra(BackupConst.EXTRA_ERROR_MESSAGE, e.message)
}
context.sendLocalBroadcast(intent)
}
throw e
}
}
private fun backupExtensionInfo(root: JsonArray, extensions: Set<String>) {
extensions.sorted().forEach {
root.add(it)
}
}
@ -204,7 +223,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
if (options and BACKUP_CHAPTER_MASK == BACKUP_CHAPTER) {
// Backup all the chapters
val chapters = databaseHelper.getChapters(manga).executeAsBlocking()
if (!chapters.isEmpty()) {
if (chapters.isNotEmpty()) {
val chaptersJson = parser.toJsonTree(chapters)
if (chaptersJson.asJsonArray.size() > 0) {
entry[CHAPTERS] = chaptersJson
@ -216,7 +235,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
if (options and BACKUP_CATEGORY_MASK == BACKUP_CATEGORY) {
// Backup categories for this manga
val categoriesForManga = databaseHelper.getCategoriesForManga(manga).executeAsBlocking()
if (!categoriesForManga.isEmpty()) {
if (categoriesForManga.isNotEmpty()) {
val categoriesNames = categoriesForManga.map { it.name }
entry[CATEGORIES] = parser.toJsonTree(categoriesNames)
}
@ -225,7 +244,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
// Check if user wants track information in backup
if (options and BACKUP_TRACK_MASK == BACKUP_TRACK) {
val tracks = databaseHelper.getTracks(manga).executeAsBlocking()
if (!tracks.isEmpty()) {
if (tracks.isNotEmpty()) {
entry[TRACK] = parser.toJsonTree(tracks)
}
}
@ -233,7 +252,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
// Check if user wants history information in backup
if (options and BACKUP_HISTORY_MASK == BACKUP_HISTORY) {
val historyForManga = databaseHelper.getHistoryByMangaId(manga.id!!).executeAsBlocking()
if (!historyForManga.isEmpty()) {
if (historyForManga.isNotEmpty()) {
val historyData = historyForManga.mapNotNull { history ->
val url = databaseHelper.getChapter(history.chapter_id).executeAsBlocking()?.url
url?.let { DHistory(url, history.last_read) }
@ -264,13 +283,13 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
*/
fun restoreMangaFetchObservable(source: Source, manga: Manga): Observable<Manga> {
return source.fetchMangaDetails(manga)
.map { networkManga ->
manga.copyFrom(networkManga)
manga.favorite = true
manga.initialized = true
manga.id = insertManga(manga)
manga
}
.map { networkManga ->
manga.copyFrom(networkManga)
manga.favorite = true
manga.initialized = true
manga.id = insertManga(manga)
manga
}
}
/**
@ -280,15 +299,29 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
* @param manga manga that needs updating
* @return [Observable] that contains manga
*/
fun restoreChapterFetchObservable(source: Source, manga: Manga, chapters: List<Chapter>): Observable<Pair<List<Chapter>, List<Chapter>>> {
return source.fetchChapterList(manga)
.map { syncChaptersWithSource(databaseHelper, it, manga, source) }
.doOnNext {
if (it.first.isNotEmpty()) {
chapters.forEach { it.manga_id = manga.id }
insertChapters(chapters)
}
fun restoreChapterFetchObservable(source: Source, manga: Manga, chapters: List<Chapter>, throttleManager: EHentaiThrottleManager): Observable<Pair<List<Chapter>, List<Chapter>>> {
return (
if (source is EHentai) {
source.fetchChapterList(manga, throttleManager::throttle)
} else {
source.fetchChapterList(manga)
}
).map {
if (it.last().chapter_number == -99F) {
chapters.forEach { chapter ->
chapter.name = "Chapter ${chapter.chapter_number} restored by dummy source"
}
syncChaptersWithSource(databaseHelper, chapters, manga, source)
} else {
syncChaptersWithSource(databaseHelper, it, manga, source)
}
}
.doOnNext { pair ->
if (pair.first.isNotEmpty()) {
chapters.forEach { it.manga_id = manga.id }
insertChapters(chapters)
}
}
}
/**
@ -344,7 +377,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
}
// Update database
if (!mangaCategoriesToUpdate.isEmpty()) {
if (mangaCategoriesToUpdate.isNotEmpty()) {
val mangaAsList = ArrayList<Manga>()
mangaAsList.add(manga)
databaseHelper.deleteOldMangasCategories(mangaAsList).executeAsBlocking()
@ -365,7 +398,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
// Check if history already in database and update
if (dbHistory != null) {
dbHistory.apply {
last_read = Math.max(lastRead, dbHistory.last_read)
last_read = max(lastRead, dbHistory.last_read)
}
historyToBeUpdated.add(dbHistory)
} else {
@ -408,7 +441,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
if (track.library_id != dbTrack.library_id) {
dbTrack.library_id = track.library_id
}
dbTrack.last_chapter_read = Math.max(dbTrack.last_chapter_read, track.last_chapter_read)
dbTrack.last_chapter_read = max(dbTrack.last_chapter_read, track.last_chapter_read)
isInDatabase = true
trackToUpdate.add(dbTrack)
break
@ -422,7 +455,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
}
}
// Update database
if (!trackToUpdate.isEmpty()) {
if (trackToUpdate.isNotEmpty()) {
databaseHelper.insertTracks(trackToUpdate).executeAsBlocking()
}
}
@ -438,8 +471,9 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
val dbChapters = databaseHelper.getChapters(manga).executeAsBlocking()
// Return if fetch is needed
if (dbChapters.isEmpty() || dbChapters.size < chapters.size)
if (dbChapters.isEmpty() || dbChapters.size < chapters.size) {
return false
}
for (chapter in chapters) {
val pos = dbChapters.indexOf(chapter)
@ -464,7 +498,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
* @return [Manga], null if not found
*/
internal fun getMangaFromDatabase(manga: Manga): Manga? =
databaseHelper.getManga(manga.url, manga.source).executeAsBlocking()
databaseHelper.getManga(manga.url, manga.source).executeAsBlocking()
/**
* Returns list containing manga from library
@ -472,7 +506,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
* @return [Manga] from library
*/
internal fun getFavoriteManga(): List<Manga> =
databaseHelper.getFavoriteMangas().executeAsBlocking()
databaseHelper.getFavoriteMangas().executeAsBlocking()
/**
* Inserts manga and returns id
@ -480,7 +514,7 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
* @return id of [Manga], null if not found
*/
internal fun insertManga(manga: Manga): Long? =
databaseHelper.insertManga(manga).executeAsBlocking().insertedId()
databaseHelper.insertManga(manga).executeAsBlocking().insertedId()
/**
* Inserts list of chapters
@ -494,5 +528,5 @@ class BackupManager(val context: Context, version: Int = CURRENT_VERSION) {
*
* @return number of backups selected by user
*/
fun numberOfBackups(): Int = preferences.numberOfBackups().getOrDefault()
fun numberOfBackups(): Int = preferences.numberOfBackups().get()
}

View File

@ -0,0 +1,161 @@
package eu.kanade.tachiyomi.data.backup
import android.content.Context
import android.graphics.BitmapFactory
import androidx.core.app.NotificationCompat
import com.hippo.unifile.UniFile
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.notification.NotificationReceiver
import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.util.storage.getUriCompat
import eu.kanade.tachiyomi.util.system.notificationBuilder
import eu.kanade.tachiyomi.util.system.notificationManager
import java.io.File
import java.util.concurrent.TimeUnit
import uy.kohesive.injekt.injectLazy
internal class BackupNotifier(private val context: Context) {
private val preferences: PreferencesHelper by injectLazy()
private val progressNotificationBuilder = context.notificationBuilder(Notifications.CHANNEL_BACKUP_RESTORE_PROGRESS) {
setLargeIcon(BitmapFactory.decodeResource(context.resources, R.mipmap.ic_launcher))
setSmallIcon(R.drawable.ic_tachi)
setAutoCancel(false)
setOngoing(true)
}
private val completeNotificationBuilder = context.notificationBuilder(Notifications.CHANNEL_BACKUP_RESTORE_COMPLETE) {
setLargeIcon(BitmapFactory.decodeResource(context.resources, R.mipmap.ic_launcher))
setSmallIcon(R.drawable.ic_tachi)
setAutoCancel(false)
}
private fun NotificationCompat.Builder.show(id: Int) {
context.notificationManager.notify(id, build())
}
fun showBackupProgress(): NotificationCompat.Builder {
val builder = with(progressNotificationBuilder) {
setContentTitle(context.getString(R.string.creating_backup))
setProgress(0, 0, true)
setOnlyAlertOnce(true)
}
builder.show(Notifications.ID_BACKUP_PROGRESS)
return builder
}
fun showBackupError(error: String?) {
context.notificationManager.cancel(Notifications.ID_BACKUP_PROGRESS)
with(completeNotificationBuilder) {
setContentTitle(context.getString(R.string.creating_backup_error))
setContentText(error)
show(Notifications.ID_BACKUP_COMPLETE)
}
}
fun showBackupComplete(unifile: UniFile) {
context.notificationManager.cancel(Notifications.ID_BACKUP_PROGRESS)
with(completeNotificationBuilder) {
setContentTitle(context.getString(R.string.backup_created))
if (unifile.filePath != null) {
setContentText(unifile.filePath)
}
// Clear old actions if they exist
if (mActions.isNotEmpty()) {
mActions.clear()
}
addAction(
R.drawable.ic_share_24dp,
context.getString(R.string.action_share),
NotificationReceiver.shareBackupPendingBroadcast(context, unifile.uri, Notifications.ID_BACKUP_COMPLETE)
)
show(Notifications.ID_BACKUP_COMPLETE)
}
}
fun showRestoreProgress(content: String = "", progress: Int = 0, maxAmount: Int = 100): NotificationCompat.Builder {
val builder = with(progressNotificationBuilder) {
setContentTitle(context.getString(R.string.restoring_backup))
if (!preferences.hideNotificationContent()) {
setContentText(content)
}
setProgress(maxAmount, progress, false)
setOnlyAlertOnce(true)
// Clear old actions if they exist
if (mActions.isNotEmpty()) {
mActions.clear()
}
addAction(
R.drawable.ic_close_24dp,
context.getString(R.string.action_stop),
NotificationReceiver.cancelRestorePendingBroadcast(context, Notifications.ID_RESTORE_PROGRESS)
)
}
builder.show(Notifications.ID_RESTORE_PROGRESS)
return builder
}
fun showRestoreError(error: String?) {
context.notificationManager.cancel(Notifications.ID_RESTORE_PROGRESS)
with(completeNotificationBuilder) {
setContentTitle(context.getString(R.string.restoring_backup_error))
setContentText(error)
show(Notifications.ID_RESTORE_COMPLETE)
}
}
fun showRestoreComplete(time: Long, errorCount: Int, path: String?, file: String?) {
context.notificationManager.cancel(Notifications.ID_RESTORE_PROGRESS)
val timeString = context.getString(
R.string.restore_duration,
TimeUnit.MILLISECONDS.toMinutes(time),
TimeUnit.MILLISECONDS.toSeconds(time) - TimeUnit.MINUTES.toSeconds(
TimeUnit.MILLISECONDS.toMinutes(time)
)
)
with(completeNotificationBuilder) {
setContentTitle(context.getString(R.string.restore_completed))
setContentText(context.resources.getQuantityString(R.plurals.restore_completed_message, errorCount, timeString, errorCount))
// Clear old actions if they exist
if (mActions.isNotEmpty()) {
mActions.clear()
}
if (errorCount > 0 && !path.isNullOrEmpty() && !file.isNullOrEmpty()) {
val destFile = File(path, file)
val uri = destFile.getUriCompat(context)
addAction(
R.drawable.nnf_ic_file_folder,
context.getString(R.string.action_open_log),
NotificationReceiver.openErrorLogPendingActivity(context, uri)
)
}
show(Notifications.ID_RESTORE_COMPLETE)
}
}
}

View File

@ -4,10 +4,13 @@ import android.app.Service
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.IBinder
import android.os.PowerManager
import com.github.salomonbrys.kotson.fromJson
import com.google.gson.JsonArray
import com.google.gson.JsonElement
import com.google.gson.JsonObject
import com.google.gson.JsonParser
import com.google.gson.stream.JsonReader
import eu.kanade.tachiyomi.R
@ -20,26 +23,33 @@ import eu.kanade.tachiyomi.data.backup.models.Backup.TRACK
import eu.kanade.tachiyomi.data.backup.models.Backup.VERSION
import eu.kanade.tachiyomi.data.backup.models.DHistory
import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.*
import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.ChapterImpl
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.database.models.MangaImpl
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.database.models.TrackImpl
import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.util.chop
import eu.kanade.tachiyomi.util.isServiceRunning
import eu.kanade.tachiyomi.util.sendLocalBroadcast
import rx.Observable
import rx.Subscription
import rx.schedulers.Schedulers
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
import eu.kanade.tachiyomi.util.system.acquireWakeLock
import eu.kanade.tachiyomi.util.system.isServiceRunning
import exh.EXHMigrations
import exh.eh.EHentaiThrottleManager
import java.io.File
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import rx.Observable
import timber.log.Timber
import uy.kohesive.injekt.injectLazy
/**
* Restores backup from json file
* Restores backup from a JSON file.
*/
class BackupRestoreService : Service() {
@ -51,8 +61,8 @@ class BackupRestoreService : Service() {
* @param context the application context.
* @return true if the service is running, false otherwise.
*/
private fun isRunning(context: Context): Boolean =
context.isServiceRunning(BackupRestoreService::class.java)
fun isRunning(context: Context): Boolean =
context.isServiceRunning(BackupRestoreService::class.java)
/**
* Starts a service to restore a backup from Json
@ -65,7 +75,11 @@ class BackupRestoreService : Service() {
val intent = Intent(context, BackupRestoreService::class.java).apply {
putExtra(BackupConst.EXTRA_URI, uri)
}
context.startService(intent)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
context.startService(intent)
} else {
context.startForegroundService(intent)
}
}
}
@ -76,6 +90,8 @@ class BackupRestoreService : Service() {
*/
fun stop(context: Context) {
context.stopService(Intent(context, BackupRestoreService::class.java))
BackupNotifier(context).showRestoreError(context.getString(R.string.restoring_backup_canceled))
}
}
@ -84,10 +100,9 @@ class BackupRestoreService : Service() {
*/
private lateinit var wakeLock: PowerManager.WakeLock
/**
* Subscription where the update is done.
*/
private var subscription: Subscription? = null
private var job: Job? = null
private val throttleManager = EHentaiThrottleManager()
/**
* The progress of a backup restore
@ -99,51 +114,51 @@ class BackupRestoreService : Service() {
*/
private var restoreAmount = 0
private var skippedAmount = 0
private var totalAmount = 0
/**
* Mapping of source ID to source name from backup data
*/
private var sourceMapping: Map<Long, String> = emptyMap()
/**
* List containing errors
*/
private val errors = mutableListOf<Pair<Date, String>>()
/**
* Backup manager
*/
private lateinit var backupManager: BackupManager
private lateinit var notifier: BackupNotifier
/**
* Database
*/
private val db: DatabaseHelper by injectLazy()
/**
* Tracking manager
*/
internal val trackManager: TrackManager by injectLazy()
private val trackManager: TrackManager by injectLazy()
private lateinit var executor: ExecutorService
/**
* Method called when the service is created. It injects dependencies and acquire the wake lock.
*/
override fun onCreate() {
super.onCreate()
wakeLock = (getSystemService(Context.POWER_SERVICE) as PowerManager).newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK, "BackupRestoreService:WakeLock")
wakeLock.acquire()
executor = Executors.newSingleThreadExecutor()
notifier = BackupNotifier(this)
wakeLock = acquireWakeLock(javaClass.name)
startForeground(Notifications.ID_RESTORE_PROGRESS, notifier.showRestoreProgress().build())
}
override fun stopService(name: Intent?): Boolean {
destroyJob()
return super.stopService(name)
}
/**
* Method called when the service is destroyed. It destroys the running subscription and
* releases the wake lock.
*/
override fun onDestroy() {
subscription?.unsubscribe()
executor.shutdown() // must be called after unsubscribe
destroyJob()
super.onDestroy()
}
private fun destroyJob() {
job?.cancel()
if (wakeLock.isHeld) {
wakeLock.release()
}
super.onDestroy()
}
/**
@ -160,153 +175,175 @@ class BackupRestoreService : Service() {
* @return the start value of the command.
*/
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
if (intent == null) return Service.START_NOT_STICKY
val uri = intent?.getParcelableExtra<Uri>(BackupConst.EXTRA_URI) ?: return START_NOT_STICKY
val uri = intent.getParcelableExtra<Uri>(BackupConst.EXTRA_URI)
throttleManager.resetThrottle()
// Unsubscribe from any previous subscription if needed.
subscription?.unsubscribe()
// Cancel any previous job if needed.
job?.cancel()
val handler = CoroutineExceptionHandler { _, exception ->
Timber.e(exception)
writeErrorLog()
subscription = Observable.using(
{ db.lowLevel().beginTransaction() },
{ getRestoreObservable(uri).doOnNext { db.lowLevel().setTransactionSuccessful() } },
{ executor.execute { db.lowLevel().endTransaction() } })
.doAfterTerminate { stopSelf(startId) }
.subscribeOn(Schedulers.from(executor))
.subscribe()
notifier.showRestoreError(exception.message)
return Service.START_NOT_STICKY
stopSelf(startId)
}
job = GlobalScope.launch(handler) {
if (!restoreBackup(uri)) {
notifier.showRestoreError(getString(R.string.restoring_backup_canceled))
}
}
job?.invokeOnCompletion {
stopSelf(startId)
}
return START_NOT_STICKY
}
/**
* Returns an [Observable] containing restore process.
* Restores data from backup file.
*
* @param uri restore file
* @return [Observable<Manga>]
* @param uri backup file to restore
*/
private fun getRestoreObservable(uri: Uri): Observable<List<Manga>> {
private fun restoreBackup(uri: Uri): Boolean {
val startTime = System.currentTimeMillis()
return Observable.just(Unit)
.map {
val reader = JsonReader(contentResolver.openInputStream(uri).bufferedReader())
val json = JsonParser().parse(reader).asJsonObject
val reader = JsonReader(contentResolver.openInputStream(uri)!!.bufferedReader())
val json = JsonParser.parseReader(reader).asJsonObject
// Get parser version
val version = json.get(VERSION)?.asInt ?: 1
// Get parser version
val version = json.get(VERSION)?.asInt ?: 1
// Initialize manager
backupManager = BackupManager(this, version)
// Initialize manager
backupManager = BackupManager(this, version)
val mangasJson = json.get(MANGAS).asJsonArray
val mangasJson = json.get(MANGAS).asJsonArray
restoreAmount = mangasJson.size() + 1 // +1 for categories
restoreProgress = 0
errors.clear()
val validManga = mangasJson.filter {
var manga = backupManager.parser.fromJson<MangaImpl>(it.asJsonObject.get(MANGA))
// EXH -->
manga = EXHMigrations.migrateBackupEntry(manga)
val sourced = backupManager.sourceManager.get(manga.source) != null
if (!sourced) {
restoreAmount -= 1
}
sourced
}
// Restore categories
json.get(CATEGORIES)?.let {
backupManager.restoreCategories(it.asJsonArray)
restoreProgress += 1
showRestoreProgress(restoreProgress, restoreAmount, "Categories added", errors.size)
}
totalAmount = mangasJson.size()
restoreAmount = validManga.count() + 1 // +1 for categories
skippedAmount = mangasJson.size() - validManga.count()
restoreProgress = 0
errors.clear()
mangasJson
}
.flatMap { Observable.from(it) }
.concatMap {
val obj = it.asJsonObject
val manga = backupManager.parser.fromJson<MangaImpl>(obj.get(MANGA))
val chapters = backupManager.parser.fromJson<List<ChapterImpl>>(obj.get(CHAPTERS) ?: JsonArray())
val categories = backupManager.parser.fromJson<List<String>>(obj.get(CATEGORIES) ?: JsonArray())
val history = backupManager.parser.fromJson<List<DHistory>>(obj.get(HISTORY) ?: JsonArray())
val tracks = backupManager.parser.fromJson<List<TrackImpl>>(obj.get(TRACK) ?: JsonArray())
// Restore categories
restoreCategories(json.get(CATEGORIES))
val observable = getMangaRestoreObservable(manga, chapters, categories, history, tracks)
if (observable != null) {
observable
} else {
errors.add(Date() to "${manga.title} - ${getString(R.string.source_not_found)}")
restoreProgress += 1
val content = getString(R.string.dialog_restoring_source_not_found, manga.title.chop(15))
showRestoreProgress(restoreProgress, restoreAmount, manga.title, errors.size, content)
Observable.just(manga)
}
}
.toList()
.doOnNext {
val endTime = System.currentTimeMillis()
val time = endTime - startTime
val logFile = writeErrorLog()
val completeIntent = Intent(BackupConst.INTENT_FILTER).apply {
putExtra(BackupConst.EXTRA_TIME, time)
putExtra(BackupConst.EXTRA_ERRORS, errors.size)
putExtra(BackupConst.EXTRA_ERROR_FILE_PATH, logFile.parent)
putExtra(BackupConst.EXTRA_ERROR_FILE, logFile.name)
putExtra(BackupConst.ACTION, BackupConst.ACTION_RESTORE_COMPLETED_DIALOG)
}
sendLocalBroadcast(completeIntent)
// Store source mapping for error messages
sourceMapping = BackupRestoreValidator.getSourceMapping(json)
}
.doOnError { error ->
Timber.e(error)
writeErrorLog()
val errorIntent = Intent(BackupConst.INTENT_FILTER).apply {
putExtra(BackupConst.ACTION, BackupConst.ACTION_ERROR_RESTORE_DIALOG)
putExtra(BackupConst.EXTRA_ERROR_MESSAGE, error.message)
}
sendLocalBroadcast(errorIntent)
}
.onErrorReturn { emptyList() }
// Restore individual manga
mangasJson.forEach {
if (job?.isActive != true) {
return false
}
restoreManga(it.asJsonObject)
}
val endTime = System.currentTimeMillis()
val time = endTime - startTime
val logFile = writeErrorLog()
notifier.showRestoreComplete(time, errors.size, logFile.parent, logFile.name)
return true
}
/**
* Write errors to error log
*/
private fun writeErrorLog(): File {
try {
if (errors.isNotEmpty()) {
val destFile = File(externalCacheDir, "tachiyomi_restore.log")
val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.getDefault())
private fun restoreCategories(categoriesJson: JsonElement) {
db.inTransaction {
backupManager.restoreCategories(categoriesJson.asJsonArray)
}
destFile.bufferedWriter().use { out ->
errors.forEach { (date, message) ->
out.write("[${sdf.format(date)}] $message\n")
}
restoreProgress += 1
showRestoreProgress(restoreProgress, restoreAmount, getString(R.string.categories))
}
private fun restoreManga(mangaJson: JsonObject) {
var manga = backupManager.parser.fromJson<MangaImpl>(mangaJson.get(MANGA))
val chapters = backupManager.parser.fromJson<List<ChapterImpl>>(
mangaJson.get(CHAPTERS)
?: JsonArray()
)
val categories = backupManager.parser.fromJson<List<String>>(
mangaJson.get(CATEGORIES)
?: JsonArray()
)
val history = backupManager.parser.fromJson<List<DHistory>>(
mangaJson.get(HISTORY)
?: JsonArray()
)
val tracks = backupManager.parser.fromJson<List<TrackImpl>>(
mangaJson.get(TRACK)
?: JsonArray()
)
// EXH -->
manga = EXHMigrations.migrateBackupEntry(manga)
// <-- EXH
try {
val source = backupManager.sourceManager.get(manga.source)
if (source != null) {
restoreMangaData(manga, source, chapters, categories, history, tracks)
} else {
val message = if (manga.source in sourceMapping) {
getString(R.string.source_not_found_name, sourceMapping[manga.source])
} else {
getString(R.string.source_not_found)
}
return destFile
errors.add(Date() to "${manga.title} - $message")
}
} catch (e: Exception) {
// Empty
errors.add(Date() to "${manga.title} - ${e.message}")
}
return File("")
restoreProgress += 1
showRestoreProgress(restoreProgress, restoreAmount, manga.title)
}
/**
* Returns a manga restore observable
*
* @param manga manga data from json
* @param source source to get manga data from
* @param chapters chapters data from json
* @param categories categories data from json
* @param history history data from json
* @param tracks tracking data from json
* @return [Observable] containing manga restore information
*/
private fun getMangaRestoreObservable(manga: Manga, chapters: List<Chapter>,
categories: List<String>, history: List<DHistory>,
tracks: List<Track>): Observable<Manga>? {
// Get source
val source = backupManager.sourceManager.getOrStub(manga.source)
private fun restoreMangaData(
manga: Manga,
source: Source,
chapters: List<Chapter>,
categories: List<String>,
history: List<DHistory>,
tracks: List<Track>
) {
val dbManga = backupManager.getMangaFromDatabase(manga)
return if (dbManga == null) {
// Manga not in database
mangaFetchObservable(source, manga, chapters, categories, history, tracks)
} else { // Manga in database
// Copy information from manga already in database
backupManager.restoreMangaNoFetch(manga, dbManga)
// Fetch rest of manga information
mangaNoFetchObservable(source, manga, chapters, categories, history, tracks)
db.inTransaction {
if (dbManga == null) {
// Manga not in database
restoreMangaFetch(source, manga, chapters, categories, history, tracks)
} else { // Manga in database
// Copy information from manga already in database
backupManager.restoreMangaNoFetch(manga, dbManga)
// Fetch rest of manga information
restoreMangaNoFetch(source, manga, chapters, categories, history, tracks)
}
}
}
@ -317,59 +354,58 @@ class BackupRestoreService : Service() {
* @param chapters chapters of manga that needs updating
* @param categories categories that need updating
*/
private fun mangaFetchObservable(source: Source, manga: Manga, chapters: List<Chapter>,
categories: List<String>, history: List<DHistory>,
tracks: List<Track>): Observable<Manga> {
return backupManager.restoreMangaFetchObservable(source, manga)
.onErrorReturn {
errors.add(Date() to "${manga.title} - ${it.message}")
manga
}
.filter { it.id != null }
.flatMap {
chapterFetchObservable(source, it, chapters)
// Convert to the manga that contains new chapters.
.map { manga }
}
.doOnNext {
restoreExtraForManga(it, categories, history, tracks)
}
.flatMap {
trackingFetchObservable(it, tracks)
// Convert to the manga that contains new chapters.
.map { manga }
}
.doOnCompleted {
restoreProgress += 1
showRestoreProgress(restoreProgress, restoreAmount, manga.title, errors.size)
}
private fun restoreMangaFetch(
source: Source,
manga: Manga,
chapters: List<Chapter>,
categories: List<String>,
history: List<DHistory>,
tracks: List<Track>
) {
backupManager.restoreMangaFetchObservable(source, manga)
.onErrorReturn {
errors.add(Date() to "${manga.title} - ${it.message}")
manga
}
.filter { it.id != null }
.flatMap {
chapterFetchObservable(source, it, chapters)
// Convert to the manga that contains new chapters.
.map { manga }
}
.doOnNext {
restoreExtraForManga(it, categories, history, tracks)
}
.flatMap {
trackingFetchObservable(it, tracks)
}
.subscribe()
}
private fun mangaNoFetchObservable(source: Source, backupManga: Manga, chapters: List<Chapter>,
categories: List<String>, history: List<DHistory>,
tracks: List<Track>): Observable<Manga> {
return Observable.just(backupManga)
.flatMap { manga ->
if (!backupManager.restoreChaptersForManga(manga, chapters)) {
chapterFetchObservable(source, manga, chapters)
.map { manga }
} else {
Observable.just(manga)
}
}
.doOnNext {
restoreExtraForManga(it, categories, history, tracks)
}
.flatMap { manga ->
trackingFetchObservable(manga, tracks)
// Convert to the manga that contains new chapters.
.map { manga }
}
.doOnCompleted {
restoreProgress += 1
showRestoreProgress(restoreProgress, restoreAmount, backupManga.title, errors.size)
private fun restoreMangaNoFetch(
source: Source,
backupManga: Manga,
chapters: List<Chapter>,
categories: List<String>,
history: List<DHistory>,
tracks: List<Track>
) {
Observable.just(backupManga)
.flatMap { manga ->
if (!backupManager.restoreChaptersForManga(manga, chapters)) {
chapterFetchObservable(source, manga, chapters)
.map { manga }
} else {
Observable.just(manga)
}
}
.doOnNext {
restoreExtraForManga(it, categories, history, tracks)
}
.flatMap { manga ->
trackingFetchObservable(manga, tracks)
}
.subscribe()
}
private fun restoreExtraForManga(manga: Manga, categories: List<String>, history: List<DHistory>, tracks: List<Track>) {
@ -391,12 +427,12 @@ class BackupRestoreService : Service() {
* @return [Observable] that contains manga
*/
private fun chapterFetchObservable(source: Source, manga: Manga, chapters: List<Chapter>): Observable<Pair<List<Chapter>, List<Chapter>>> {
return backupManager.restoreChapterFetchObservable(source, manga, chapters)
// If there's any error, return empty update and continue.
.onErrorReturn {
errors.add(Date() to "${manga.title} - ${it.message}")
Pair(emptyList(), emptyList())
}
return backupManager.restoreChapterFetchObservable(source, manga, chapters, throttleManager)
// If there's any error, return empty update and continue.
.onErrorReturn {
errors.add(Date() to "${manga.title} - ${it.message}")
Pair(emptyList(), emptyList())
}
}
/**
@ -407,20 +443,20 @@ class BackupRestoreService : Service() {
*/
private fun trackingFetchObservable(manga: Manga, tracks: List<Track>): Observable<Track> {
return Observable.from(tracks)
.concatMap { track ->
val service = trackManager.getService(track.sync_id)
if (service != null && service.isLogged) {
service.refresh(track)
.doOnNext { db.insertTrack(it).executeAsBlocking() }
.onErrorReturn {
errors.add(Date() to "${manga.title} - ${it.message}")
track
}
} else {
errors.add(Date() to "${manga.title} - ${service?.name} not logged in")
Observable.empty()
}
.flatMap { track ->
val service = trackManager.getService(track.sync_id)
if (service != null && service.isLogged) {
service.refresh(track)
.doOnNext { db.insertTrack(it).executeAsBlocking() }
.onErrorReturn {
errors.add(Date() to "${manga.title} - ${it.message}")
track
}
} else {
errors.add(Date() to "${manga.title} - ${getString(R.string.tracker_not_logged_in, service?.name)}")
Observable.empty()
}
}
}
/**
@ -430,16 +466,33 @@ class BackupRestoreService : Service() {
* @param amount total restoreAmount of manga
* @param title title of restored manga
*/
private fun showRestoreProgress(progress: Int, amount: Int, title: String, errors: Int,
content: String = getString(R.string.dialog_restoring_backup, title.chop(15))) {
val intent = Intent(BackupConst.INTENT_FILTER).apply {
putExtra(BackupConst.EXTRA_PROGRESS, progress)
putExtra(BackupConst.EXTRA_AMOUNT, amount)
putExtra(BackupConst.EXTRA_CONTENT, content)
putExtra(BackupConst.EXTRA_ERRORS, errors)
putExtra(BackupConst.ACTION, BackupConst.ACTION_SET_PROGRESS_DIALOG)
}
sendLocalBroadcast(intent)
private fun showRestoreProgress(
progress: Int,
amount: Int,
title: String
) {
notifier.showRestoreProgress(title, progress, amount)
}
/**
* Write errors to error log
*/
private fun writeErrorLog(): File {
try {
if (errors.isNotEmpty()) {
val destFile = File(externalCacheDir, "tachiyomi_restore.txt")
val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.getDefault())
destFile.bufferedWriter().use { out ->
errors.forEach { (date, message) ->
out.write("[${sdf.format(date)}] $message\n")
}
}
return destFile
}
} catch (e: Exception) {
// Empty
}
return File("")
}
}

View File

@ -0,0 +1,46 @@
package eu.kanade.tachiyomi.data.backup
import android.content.Context
import android.net.Uri
import com.google.gson.JsonObject
import com.google.gson.JsonParser
import com.google.gson.stream.JsonReader
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.backup.models.Backup
object BackupRestoreValidator {
/**
* Checks for critical backup file data.
*
* @throws Exception if version or manga cannot be found.
* @return List of required sources.
*/
fun validate(context: Context, uri: Uri): Map<Long, String> {
val reader = JsonReader(context.contentResolver.openInputStream(uri)!!.bufferedReader())
val json = JsonParser.parseReader(reader).asJsonObject
val version = json.get(Backup.VERSION)
val mangasJson = json.get(Backup.MANGAS)
if (version == null || mangasJson == null) {
throw Exception(context.getString(R.string.invalid_backup_file_missing_data))
}
if (mangasJson.asJsonArray.size() == 0) {
throw Exception(context.getString(R.string.invalid_backup_file_missing_manga))
}
return getSourceMapping(json)
}
fun getSourceMapping(json: JsonObject): Map<Long, String> {
val extensionsMapping = json.get(Backup.EXTENSIONS) ?: return emptyMap()
return extensionsMapping.asJsonArray
.map {
val items = it.asString.split(":")
items[0].toLong() to items[1]
}
.toMap()
}
}

View File

@ -1,23 +1,25 @@
package eu.kanade.tachiyomi.data.backup.models
import java.text.SimpleDateFormat
import java.util.*
/**
* Json values
*/
object Backup {
const val CURRENT_VERSION = 2
const val MANGA = "manga"
const val MANGAS = "mangas"
const val TRACK = "track"
const val CHAPTERS = "chapters"
const val CATEGORIES = "categories"
const val HISTORY = "history"
const val VERSION = "version"
fun getDefaultFilename(): String {
val date = SimpleDateFormat("yyyy-MM-dd_HH-mm", Locale.getDefault()).format(Date())
return "tachiyomi_$date.json"
}
}
package eu.kanade.tachiyomi.data.backup.models
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
/**
* Json values
*/
object Backup {
const val CURRENT_VERSION = 2
const val MANGA = "manga"
const val MANGAS = "mangas"
const val TRACK = "track"
const val CHAPTERS = "chapters"
const val CATEGORIES = "categories"
const val EXTENSIONS = "extensions"
const val HISTORY = "history"
const val VERSION = "version"
fun getDefaultFilename(): String {
val date = SimpleDateFormat("yyyy-MM-dd_HH-mm", Locale.getDefault()).format(Date())
return "tachiyomi_$date.json"
}
}

View File

@ -1,3 +1,3 @@
package eu.kanade.tachiyomi.data.backup.models
data class DHistory(val url: String,val lastRead: Long)
data class DHistory(val url: String, val lastRead: Long)

View File

@ -28,4 +28,4 @@ object CategoryTypeAdapter {
}
}
}
}
}

View File

@ -43,9 +43,7 @@ object ChapterTypeAdapter {
beginObject()
while (hasNext()) {
if (peek() == JsonToken.NAME) {
val name = nextName()
when (name) {
when (nextName()) {
URL -> chapter.url = nextString()
READ -> chapter.read = nextInt() == 1
BOOKMARK -> chapter.bookmark = nextInt() == 1
@ -58,4 +56,4 @@ object ChapterTypeAdapter {
}
}
}
}
}

View File

@ -29,4 +29,4 @@ object HistoryTypeAdapter {
}
}
}
}
}

View File

@ -34,4 +34,4 @@ object MangaTypeAdapter {
}
}
}
}
}

View File

@ -1,6 +1,5 @@
package eu.kanade.tachiyomi.data.backup.serializer
import android.telecom.DisconnectCause.REMOTE
import com.github.salomonbrys.kotson.typeAdapter
import com.google.gson.TypeAdapter
import com.google.gson.stream.JsonToken
@ -42,9 +41,7 @@ object TrackTypeAdapter {
beginObject()
while (hasNext()) {
if (peek() == JsonToken.NAME) {
val name = nextName()
when (name) {
when (nextName()) {
TITLE -> track.title = nextString()
SYNC -> track.sync_id = nextInt()
MEDIA -> track.media_id = nextInt()
@ -59,4 +56,4 @@ object TrackTypeAdapter {
}
}
}
}
}

83
app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt vendored Normal file → Executable file
View File

@ -6,15 +6,22 @@ import com.github.salomonbrys.kotson.fromJson
import com.google.gson.Gson
import com.jakewharton.disklrucache.DiskLruCache
import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.util.DiskUtil
import eu.kanade.tachiyomi.util.saveTo
import okhttp3.Response
import okio.Okio
import rx.Observable
import uy.kohesive.injekt.injectLazy
import eu.kanade.tachiyomi.util.storage.DiskUtil
import eu.kanade.tachiyomi.util.storage.saveTo
import java.io.File
import java.io.IOException
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import okhttp3.Response
import okio.buffer
import okio.sink
import rx.Observable
import uy.kohesive.injekt.injectLazy
/**
* Class used to create chapter cache
@ -36,19 +43,32 @@ class ChapterCache(private val context: Context) {
/** The number of values per cache entry. Must be positive. */
const val PARAMETER_VALUE_COUNT = 1
/** The maximum number of bytes this cache should use to store. */
const val PARAMETER_CACHE_SIZE = 75L * 1024 * 1024
}
private val scope = CoroutineScope(Job() + Dispatchers.Main)
/** Google Json class used for parsing JSON files. */
private val gson: Gson by injectLazy()
// --> EH
private val prefs: PreferencesHelper by injectLazy()
// <-- EH
/** Cache class used for cache management. */
private val diskCache = DiskLruCache.open(File(context.cacheDir, PARAMETER_CACHE_DIRECTORY),
PARAMETER_APP_VERSION,
PARAMETER_VALUE_COUNT,
PARAMETER_CACHE_SIZE)
// --> EH
private var diskCache = setupDiskCache(prefs.eh_cacheSize().get().toLong())
init {
prefs.eh_cacheSize().asFlow()
.onEach {
// Save old cache for destruction later
val oldCache = diskCache
diskCache = setupDiskCache(it.toLong())
oldCache.close()
}
.launchIn(scope)
}
// <-- EH
/**
* Returns directory of cache.
@ -68,6 +88,18 @@ class ChapterCache(private val context: Context) {
val readableSize: String
get() = Formatter.formatFileSize(context, realSize)
// --> EH
// Cache size is in MB
private fun setupDiskCache(cacheSize: Long): DiskLruCache {
return DiskLruCache.open(
File(context.cacheDir, PARAMETER_CACHE_DIRECTORY),
PARAMETER_APP_VERSION,
PARAMETER_VALUE_COUNT,
cacheSize * 1024 * 1024
)
}
// <-- EH
/**
* Remove file from cache.
*
@ -76,16 +108,17 @@ class ChapterCache(private val context: Context) {
*/
fun removeFileFromCache(file: String): Boolean {
// Make sure we don't delete the journal file (keeps track of cache).
if (file == "journal" || file.startsWith("journal."))
if (file == "journal" || file.startsWith("journal.")) {
return false
}
try {
return try {
// Remove the extension from the file to get the key of the cache
val key = file.substringBeforeLast(".")
// Remove file from cache.
return diskCache.remove(key)
diskCache.remove(key)
} catch (e: Exception) {
return false
false
}
}
@ -126,7 +159,7 @@ class ChapterCache(private val context: Context) {
editor = diskCache.edit(key) ?: return
// Write chapter urls to cache.
Okio.buffer(Okio.sink(editor.newOutputStream(0))).use {
editor.newOutputStream(0).sink().buffer().use {
it.write(cachedValue.toByteArray())
it.flush()
}
@ -134,7 +167,6 @@ class ChapterCache(private val context: Context) {
diskCache.flush()
editor.commit()
editor.abortUnlessCommitted()
} catch (e: Exception) {
// Ignore.
} finally {
@ -149,10 +181,10 @@ class ChapterCache(private val context: Context) {
* @return true if in cache otherwise false.
*/
fun isImageInCache(imageUrl: String): Boolean {
try {
return diskCache.get(DiskUtil.hashKeyForDisk(imageUrl)) != null
return try {
diskCache.get(DiskUtil.hashKeyForDisk(imageUrl)) != null
} catch (e: IOException) {
return false
false
}
}
@ -170,7 +202,7 @@ class ChapterCache(private val context: Context) {
/**
* Add image to cache.
*
*
* @param imageUrl url of image.
* @param response http response from page.
* @throws IOException image error.
@ -186,12 +218,12 @@ class ChapterCache(private val context: Context) {
editor = diskCache.edit(key) ?: throw IOException("Unable to edit key")
// Get OutputStream and write image with Okio.
response.body()!!.source().saveTo(editor.newOutputStream(0))
response.body!!.source().saveTo(editor.newOutputStream(0))
diskCache.flush()
editor.commit()
} finally {
response.body()?.close()
response.body?.close()
editor?.abortUnlessCommitted()
}
}
@ -200,4 +232,3 @@ class ChapterCache(private val context: Context) {
return "${chapter.manga_id}${chapter.url}"
}
}

87
app/src/main/java/eu/kanade/tachiyomi/data/cache/CoverCache.kt vendored Normal file → Executable file
View File

@ -1,7 +1,8 @@
package eu.kanade.tachiyomi.data.cache
import android.content.Context
import eu.kanade.tachiyomi.util.DiskUtil
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.util.storage.DiskUtil
import java.io.File
import java.io.IOException
import java.io.InputStream
@ -17,51 +18,89 @@ import java.io.InputStream
*/
class CoverCache(private val context: Context) {
companion object {
private const val COVERS_DIR = "covers"
private const val CUSTOM_COVERS_DIR = "covers/custom"
}
/**
* Cache directory used for cache management.
*/
private val cacheDir = context.getExternalFilesDir("covers") ?:
File(context.filesDir, "covers").also { it.mkdirs() }
private val cacheDir = getCacheDir(COVERS_DIR)
private val customCoverCacheDir = getCacheDir(CUSTOM_COVERS_DIR)
/**
* Returns the cover from cache.
*
* @param thumbnailUrl the thumbnail url.
* @param manga the manga.
* @return cover image.
*/
fun getCoverFile(thumbnailUrl: String): File {
return File(cacheDir, DiskUtil.hashKeyForDisk(thumbnailUrl))
fun getCoverFile(manga: Manga): File? {
return manga.thumbnail_url?.let {
File(cacheDir, DiskUtil.hashKeyForDisk(it))
}
}
/**
* Copy the given stream to this cache.
* Returns the custom cover from cache.
*
* @param thumbnailUrl url of the thumbnail.
* @param inputStream the stream to copy.
* @param manga the manga.
* @return cover image.
*/
fun getCustomCoverFile(manga: Manga): File {
return File(customCoverCacheDir, DiskUtil.hashKeyForDisk(manga.id.toString()))
}
/**
* Saves the given stream as the manga's custom cover to cache.
*
* @param manga the manga.
* @param inputStream the stream to copy.
* @throws IOException if there's any error.
*/
@Throws(IOException::class)
fun copyToCache(thumbnailUrl: String, inputStream: InputStream) {
// Get destination file.
val destFile = getCoverFile(thumbnailUrl)
destFile.outputStream().use { inputStream.copyTo(it) }
fun setCustomCoverToCache(manga: Manga, inputStream: InputStream) {
getCustomCoverFile(manga).outputStream().use {
inputStream.copyTo(it)
}
}
/**
* Delete the cover file from the cache.
* Delete the cover files of the manga from the cache.
*
* @param thumbnailUrl the thumbnail url.
* @return status of deletion.
* @param manga the manga.
* @param deleteCustomCover whether the custom cover should be deleted.
* @return number of files that were deleted.
*/
fun deleteFromCache(thumbnailUrl: String?): Boolean {
// Check if url is empty.
if (thumbnailUrl.isNullOrEmpty())
return false
fun deleteFromCache(manga: Manga, deleteCustomCover: Boolean = false): Int {
var deleted = 0
// Remove file.
val file = getCoverFile(thumbnailUrl!!)
return file.exists() && file.delete()
getCoverFile(manga)?.let {
if (it.exists() && it.delete()) ++deleted
}
if (deleteCustomCover) {
if (deleteCustomCover(manga)) ++deleted
}
return deleted
}
/**
* Delete custom cover of the manga from the cache
*
* @param manga the manga.
* @return whether the cover was deleted.
*/
fun deleteCustomCover(manga: Manga): Boolean {
return getCustomCoverFile(manga).let {
it.exists() && it.delete()
}
}
private fun getCacheDir(dir: String): File {
return context.getExternalFilesDir(dir)
?: File(context.filesDir, dir).also { it.mkdirs() }
}
}

View File

@ -1,29 +1,64 @@
package eu.kanade.tachiyomi.data.database
import android.content.Context
import androidx.sqlite.db.SupportSQLiteOpenHelper
import com.pushtorefresh.storio.sqlite.impl.DefaultStorIOSQLite
import eu.kanade.tachiyomi.data.database.mappers.*
import eu.kanade.tachiyomi.data.database.models.*
import eu.kanade.tachiyomi.data.database.queries.*
import eu.kanade.tachiyomi.data.database.mappers.CategoryTypeMapping
import eu.kanade.tachiyomi.data.database.mappers.ChapterTypeMapping
import eu.kanade.tachiyomi.data.database.mappers.HistoryTypeMapping
import eu.kanade.tachiyomi.data.database.mappers.MangaCategoryTypeMapping
import eu.kanade.tachiyomi.data.database.mappers.MangaTypeMapping
import eu.kanade.tachiyomi.data.database.mappers.TrackTypeMapping
import eu.kanade.tachiyomi.data.database.models.Category
import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.History
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.database.models.MangaCategory
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.database.queries.CategoryQueries
import eu.kanade.tachiyomi.data.database.queries.ChapterQueries
import eu.kanade.tachiyomi.data.database.queries.HistoryQueries
import eu.kanade.tachiyomi.data.database.queries.MangaCategoryQueries
import eu.kanade.tachiyomi.data.database.queries.MangaQueries
import eu.kanade.tachiyomi.data.database.queries.TrackQueries
import exh.metadata.sql.mappers.SearchMetadataTypeMapping
import exh.metadata.sql.mappers.SearchTagTypeMapping
import exh.metadata.sql.mappers.SearchTitleTypeMapping
import exh.metadata.sql.models.SearchMetadata
import exh.metadata.sql.models.SearchTag
import exh.metadata.sql.models.SearchTitle
import exh.metadata.sql.queries.SearchMetadataQueries
import exh.metadata.sql.queries.SearchTagQueries
import exh.metadata.sql.queries.SearchTitleQueries
import io.requery.android.database.sqlite.RequerySQLiteOpenHelperFactory
/**
* This class provides operations to manage the database through its interfaces.
*/
open class DatabaseHelper(context: Context)
: MangaQueries, ChapterQueries, TrackQueries, CategoryQueries, MangaCategoryQueries, HistoryQueries {
open class DatabaseHelper(context: Context) :
MangaQueries, ChapterQueries, TrackQueries, CategoryQueries, MangaCategoryQueries, HistoryQueries, /* EXH --> */ SearchMetadataQueries, SearchTagQueries, SearchTitleQueries /* EXH <-- */ {
private val configuration = SupportSQLiteOpenHelper.Configuration.builder(context)
.name(DbOpenCallback.DATABASE_NAME)
.callback(DbOpenCallback())
.build()
override val db = DefaultStorIOSQLite.builder()
.sqliteOpenHelper(DbOpenHelper(context))
.addTypeMapping(Manga::class.java, MangaTypeMapping())
.addTypeMapping(Chapter::class.java, ChapterTypeMapping())
.addTypeMapping(Track::class.java, TrackTypeMapping())
.addTypeMapping(Category::class.java, CategoryTypeMapping())
.addTypeMapping(MangaCategory::class.java, MangaCategoryTypeMapping())
.addTypeMapping(History::class.java, HistoryTypeMapping())
.build()
.sqliteOpenHelper(RequerySQLiteOpenHelperFactory().create(configuration))
.addTypeMapping(Manga::class.java, MangaTypeMapping())
.addTypeMapping(Chapter::class.java, ChapterTypeMapping())
.addTypeMapping(Track::class.java, TrackTypeMapping())
.addTypeMapping(Category::class.java, CategoryTypeMapping())
.addTypeMapping(MangaCategory::class.java, MangaCategoryTypeMapping())
.addTypeMapping(History::class.java, HistoryTypeMapping())
// EXH -->
.addTypeMapping(SearchMetadata::class.java, SearchMetadataTypeMapping())
.addTypeMapping(SearchTag::class.java, SearchTagTypeMapping())
.addTypeMapping(SearchTitle::class.java, SearchTitleTypeMapping())
// EXH <--
.build()
inline fun inTransaction(block: () -> Unit) = db.inTransaction(block)
fun lowLevel() = db.lowLevel()
}

View File

@ -22,4 +22,3 @@ inline fun <T> StorIOSQLite.inTransactionReturn(block: () -> T): T {
lowLevel().endTransaction()
}
}

View File

@ -0,0 +1,74 @@
package eu.kanade.tachiyomi.data.database
import androidx.sqlite.db.SupportSQLiteDatabase
import androidx.sqlite.db.SupportSQLiteOpenHelper
import eu.kanade.tachiyomi.data.database.tables.CategoryTable
import eu.kanade.tachiyomi.data.database.tables.ChapterTable
import eu.kanade.tachiyomi.data.database.tables.HistoryTable
import eu.kanade.tachiyomi.data.database.tables.MangaCategoryTable
import eu.kanade.tachiyomi.data.database.tables.MangaTable
import eu.kanade.tachiyomi.data.database.tables.MergedTable
import eu.kanade.tachiyomi.data.database.tables.TrackTable
import exh.metadata.sql.tables.SearchMetadataTable
import exh.metadata.sql.tables.SearchTagTable
import exh.metadata.sql.tables.SearchTitleTable
class DbOpenCallback : SupportSQLiteOpenHelper.Callback(DATABASE_VERSION) {
companion object {
/**
* Name of the database file.
*/
const val DATABASE_NAME = "tachiyomi.db"
/**
* Version of the database.
*/
const val DATABASE_VERSION = 2 // [SY]
}
override fun onCreate(db: SupportSQLiteDatabase) = with(db) {
execSQL(MangaTable.createTableQuery)
execSQL(ChapterTable.createTableQuery)
execSQL(TrackTable.createTableQuery)
execSQL(CategoryTable.createTableQuery)
execSQL(MangaCategoryTable.createTableQuery)
execSQL(HistoryTable.createTableQuery)
// EXH -->
execSQL(SearchMetadataTable.createTableQuery)
execSQL(SearchTagTable.createTableQuery)
execSQL(SearchTitleTable.createTableQuery)
// EXH <--
// AZ -->
execSQL(MergedTable.createTableQuery)
// AZ <--
// DB indexes
execSQL(MangaTable.createUrlIndexQuery)
execSQL(MangaTable.createLibraryIndexQuery)
execSQL(ChapterTable.createMangaIdIndexQuery)
execSQL(ChapterTable.createUnreadChaptersIndexQuery)
execSQL(HistoryTable.createChapterIdIndexQuery)
// EXH -->
db.execSQL(SearchMetadataTable.createUploaderIndexQuery)
db.execSQL(SearchMetadataTable.createIndexedExtraIndexQuery)
db.execSQL(SearchTagTable.createMangaIdIndexQuery)
db.execSQL(SearchTagTable.createNamespaceNameIndexQuery)
db.execSQL(SearchTitleTable.createMangaIdIndexQuery)
db.execSQL(SearchTitleTable.createTitleIndexQuery)
// EXH <--
// AZ -->
execSQL(MergedTable.createIndexQuery)
// AZ <--
}
override fun onUpgrade(db: SupportSQLiteDatabase, oldVersion: Int, newVersion: Int) {
if (oldVersion < 2) {
db.execSQL(MangaTable.addCoverLastModified)
}
}
override fun onConfigure(db: SupportSQLiteDatabase) {
db.setForeignKeyConstraintsEnabled(true)
}
}

View File

@ -1,69 +0,0 @@
package eu.kanade.tachiyomi.data.database
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import eu.kanade.tachiyomi.data.database.tables.*
class DbOpenHelper(context: Context)
: SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
companion object {
/**
* Name of the database file.
*/
const val DATABASE_NAME = "tachiyomi.db"
/**
* Version of the database.
*/
const val DATABASE_VERSION = 7
}
override fun onCreate(db: SQLiteDatabase) = with(db) {
execSQL(MangaTable.createTableQuery)
execSQL(ChapterTable.createTableQuery)
execSQL(TrackTable.createTableQuery)
execSQL(CategoryTable.createTableQuery)
execSQL(MangaCategoryTable.createTableQuery)
execSQL(HistoryTable.createTableQuery)
// DB indexes
execSQL(MangaTable.createUrlIndexQuery)
execSQL(MangaTable.createFavoriteIndexQuery)
execSQL(ChapterTable.createMangaIdIndexQuery)
execSQL(HistoryTable.createChapterIdIndexQuery)
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
if (oldVersion < 2) {
db.execSQL(ChapterTable.sourceOrderUpdateQuery)
// Fix kissmanga covers after supporting cloudflare
db.execSQL("""UPDATE mangas SET thumbnail_url =
REPLACE(thumbnail_url, '93.174.95.110', 'kissmanga.com') WHERE source = 4""")
}
if (oldVersion < 3) {
// Initialize history tables
db.execSQL(HistoryTable.createTableQuery)
db.execSQL(HistoryTable.createChapterIdIndexQuery)
}
if (oldVersion < 4) {
db.execSQL(ChapterTable.bookmarkUpdateQuery)
}
if (oldVersion < 5) {
db.execSQL(ChapterTable.addScanlator)
}
if (oldVersion < 6) {
db.execSQL(TrackTable.addTrackingUrl)
}
if (oldVersion < 7) {
db.execSQL(TrackTable.addLibraryId)
}
}
override fun onConfigure(db: SQLiteDatabase) {
db.setForeignKeyConstraintsEnabled(true)
}
}

View File

@ -5,5 +5,4 @@ import com.pushtorefresh.storio.sqlite.impl.DefaultStorIOSQLite
interface DbProvider {
val db: DefaultStorIOSQLite
}
}

View File

@ -13,33 +13,36 @@ import eu.kanade.tachiyomi.data.database.models.Category
import eu.kanade.tachiyomi.data.database.models.CategoryImpl
import eu.kanade.tachiyomi.data.database.tables.CategoryTable.COL_FLAGS
import eu.kanade.tachiyomi.data.database.tables.CategoryTable.COL_ID
import eu.kanade.tachiyomi.data.database.tables.CategoryTable.COL_MANGA_ORDER
import eu.kanade.tachiyomi.data.database.tables.CategoryTable.COL_NAME
import eu.kanade.tachiyomi.data.database.tables.CategoryTable.COL_ORDER
import eu.kanade.tachiyomi.data.database.tables.CategoryTable.TABLE
class CategoryTypeMapping : SQLiteTypeMapping<Category>(
CategoryPutResolver(),
CategoryGetResolver(),
CategoryDeleteResolver()
CategoryPutResolver(),
CategoryGetResolver(),
CategoryDeleteResolver()
)
class CategoryPutResolver : DefaultPutResolver<Category>() {
override fun mapToInsertQuery(obj: Category) = InsertQuery.builder()
.table(TABLE)
.build()
.table(TABLE)
.build()
override fun mapToUpdateQuery(obj: Category) = UpdateQuery.builder()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
override fun mapToContentValues(obj: Category) = ContentValues(4).apply {
put(COL_ID, obj.id)
put(COL_NAME, obj.name)
put(COL_ORDER, obj.order)
put(COL_FLAGS, obj.flags)
val orderString = obj.mangaOrder.joinToString("/")
put(COL_MANGA_ORDER, orderString)
}
}
@ -50,14 +53,17 @@ class CategoryGetResolver : DefaultGetResolver<Category>() {
name = cursor.getString(cursor.getColumnIndex(COL_NAME))
order = cursor.getInt(cursor.getColumnIndex(COL_ORDER))
flags = cursor.getInt(cursor.getColumnIndex(COL_FLAGS))
val orderString = cursor.getString(cursor.getColumnIndex(COL_MANGA_ORDER))
mangaOrder = orderString?.split("/")?.mapNotNull { it.toLongOrNull() } ?: emptyList()
}
}
class CategoryDeleteResolver : DefaultDeleteResolver<Category>() {
override fun mapToDeleteQuery(obj: Category) = DeleteQuery.builder()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
}

View File

@ -26,22 +26,22 @@ import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_URL
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.TABLE
class ChapterTypeMapping : SQLiteTypeMapping<Chapter>(
ChapterPutResolver(),
ChapterGetResolver(),
ChapterDeleteResolver()
ChapterPutResolver(),
ChapterGetResolver(),
ChapterDeleteResolver()
)
class ChapterPutResolver : DefaultPutResolver<Chapter>() {
override fun mapToInsertQuery(obj: Chapter) = InsertQuery.builder()
.table(TABLE)
.build()
.table(TABLE)
.build()
override fun mapToUpdateQuery(obj: Chapter) = UpdateQuery.builder()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
override fun mapToContentValues(obj: Chapter) = ContentValues(11).apply {
put(COL_ID, obj.id)
@ -80,9 +80,8 @@ class ChapterGetResolver : DefaultGetResolver<Chapter>() {
class ChapterDeleteResolver : DefaultDeleteResolver<Chapter>() {
override fun mapToDeleteQuery(obj: Chapter) = DeleteQuery.builder()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
}

View File

@ -18,22 +18,22 @@ import eu.kanade.tachiyomi.data.database.tables.HistoryTable.COL_TIME_READ
import eu.kanade.tachiyomi.data.database.tables.HistoryTable.TABLE
class HistoryTypeMapping : SQLiteTypeMapping<History>(
HistoryPutResolver(),
HistoryGetResolver(),
HistoryDeleteResolver()
HistoryPutResolver(),
HistoryGetResolver(),
HistoryDeleteResolver()
)
open class HistoryPutResolver : DefaultPutResolver<History>() {
override fun mapToInsertQuery(obj: History) = InsertQuery.builder()
.table(TABLE)
.build()
.table(TABLE)
.build()
override fun mapToUpdateQuery(obj: History) = UpdateQuery.builder()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
override fun mapToContentValues(obj: History) = ContentValues(4).apply {
put(COL_ID, obj.id)
@ -56,8 +56,8 @@ class HistoryGetResolver : DefaultGetResolver<History>() {
class HistoryDeleteResolver : DefaultDeleteResolver<History>() {
override fun mapToDeleteQuery(obj: History) = DeleteQuery.builder()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
}

View File

@ -16,22 +16,22 @@ import eu.kanade.tachiyomi.data.database.tables.MangaCategoryTable.COL_MANGA_ID
import eu.kanade.tachiyomi.data.database.tables.MangaCategoryTable.TABLE
class MangaCategoryTypeMapping : SQLiteTypeMapping<MangaCategory>(
MangaCategoryPutResolver(),
MangaCategoryGetResolver(),
MangaCategoryDeleteResolver()
MangaCategoryPutResolver(),
MangaCategoryGetResolver(),
MangaCategoryDeleteResolver()
)
class MangaCategoryPutResolver : DefaultPutResolver<MangaCategory>() {
override fun mapToInsertQuery(obj: MangaCategory) = InsertQuery.builder()
.table(TABLE)
.build()
.table(TABLE)
.build()
override fun mapToUpdateQuery(obj: MangaCategory) = UpdateQuery.builder()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
override fun mapToContentValues(obj: MangaCategory) = ContentValues(3).apply {
put(COL_ID, obj.id)
@ -52,8 +52,8 @@ class MangaCategoryGetResolver : DefaultGetResolver<MangaCategory>() {
class MangaCategoryDeleteResolver : DefaultDeleteResolver<MangaCategory>() {
override fun mapToDeleteQuery(obj: MangaCategory) = DeleteQuery.builder()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
}

View File

@ -14,6 +14,7 @@ import eu.kanade.tachiyomi.data.database.models.MangaImpl
import eu.kanade.tachiyomi.data.database.tables.MangaTable.COL_ARTIST
import eu.kanade.tachiyomi.data.database.tables.MangaTable.COL_AUTHOR
import eu.kanade.tachiyomi.data.database.tables.MangaTable.COL_CHAPTER_FLAGS
import eu.kanade.tachiyomi.data.database.tables.MangaTable.COL_COVER_LAST_MODIFIED
import eu.kanade.tachiyomi.data.database.tables.MangaTable.COL_DESCRIPTION
import eu.kanade.tachiyomi.data.database.tables.MangaTable.COL_FAVORITE
import eu.kanade.tachiyomi.data.database.tables.MangaTable.COL_GENRE
@ -29,22 +30,22 @@ import eu.kanade.tachiyomi.data.database.tables.MangaTable.COL_VIEWER
import eu.kanade.tachiyomi.data.database.tables.MangaTable.TABLE
class MangaTypeMapping : SQLiteTypeMapping<Manga>(
MangaPutResolver(),
MangaGetResolver(),
MangaDeleteResolver()
MangaPutResolver(),
MangaGetResolver(),
MangaDeleteResolver()
)
class MangaPutResolver : DefaultPutResolver<Manga>() {
override fun mapToInsertQuery(obj: Manga) = InsertQuery.builder()
.table(TABLE)
.build()
.table(TABLE)
.build()
override fun mapToUpdateQuery(obj: Manga) = UpdateQuery.builder()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
override fun mapToContentValues(obj: Manga) = ContentValues(15).apply {
put(COL_ID, obj.id)
@ -62,6 +63,7 @@ class MangaPutResolver : DefaultPutResolver<Manga>() {
put(COL_INITIALIZED, obj.initialized)
put(COL_VIEWER, obj.viewer)
put(COL_CHAPTER_FLAGS, obj.chapter_flags)
put(COL_COVER_LAST_MODIFIED, obj.cover_last_modified)
}
}
@ -82,6 +84,7 @@ interface BaseMangaGetResolver {
initialized = cursor.getInt(cursor.getColumnIndex(COL_INITIALIZED)) == 1
viewer = cursor.getInt(cursor.getColumnIndex(COL_VIEWER))
chapter_flags = cursor.getInt(cursor.getColumnIndex(COL_CHAPTER_FLAGS))
cover_last_modified = cursor.getLong(cursor.getColumnIndex(COL_COVER_LAST_MODIFIED))
}
}
@ -95,8 +98,8 @@ open class MangaGetResolver : DefaultGetResolver<Manga>(), BaseMangaGetResolver
class MangaDeleteResolver : DefaultDeleteResolver<Manga>() {
override fun mapToDeleteQuery(obj: Manga) = DeleteQuery.builder()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
}

View File

@ -11,12 +11,14 @@ import com.pushtorefresh.storio.sqlite.queries.InsertQuery
import com.pushtorefresh.storio.sqlite.queries.UpdateQuery
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.database.models.TrackImpl
import eu.kanade.tachiyomi.data.database.tables.TrackTable.COL_FINISH_DATE
import eu.kanade.tachiyomi.data.database.tables.TrackTable.COL_ID
import eu.kanade.tachiyomi.data.database.tables.TrackTable.COL_LAST_CHAPTER_READ
import eu.kanade.tachiyomi.data.database.tables.TrackTable.COL_LIBRARY_ID
import eu.kanade.tachiyomi.data.database.tables.TrackTable.COL_MANGA_ID
import eu.kanade.tachiyomi.data.database.tables.TrackTable.COL_MEDIA_ID
import eu.kanade.tachiyomi.data.database.tables.TrackTable.COL_SCORE
import eu.kanade.tachiyomi.data.database.tables.TrackTable.COL_START_DATE
import eu.kanade.tachiyomi.data.database.tables.TrackTable.COL_STATUS
import eu.kanade.tachiyomi.data.database.tables.TrackTable.COL_SYNC_ID
import eu.kanade.tachiyomi.data.database.tables.TrackTable.COL_TITLE
@ -25,22 +27,22 @@ import eu.kanade.tachiyomi.data.database.tables.TrackTable.COL_TRACKING_URL
import eu.kanade.tachiyomi.data.database.tables.TrackTable.TABLE
class TrackTypeMapping : SQLiteTypeMapping<Track>(
TrackPutResolver(),
TrackGetResolver(),
TrackDeleteResolver()
TrackPutResolver(),
TrackGetResolver(),
TrackDeleteResolver()
)
class TrackPutResolver : DefaultPutResolver<Track>() {
override fun mapToInsertQuery(obj: Track) = InsertQuery.builder()
.table(TABLE)
.build()
.table(TABLE)
.build()
override fun mapToUpdateQuery(obj: Track) = UpdateQuery.builder()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
override fun mapToContentValues(obj: Track) = ContentValues(10).apply {
put(COL_ID, obj.id)
@ -54,7 +56,8 @@ class TrackPutResolver : DefaultPutResolver<Track>() {
put(COL_STATUS, obj.status)
put(COL_TRACKING_URL, obj.tracking_url)
put(COL_SCORE, obj.score)
put(COL_START_DATE, obj.started_reading_date)
put(COL_FINISH_DATE, obj.finished_reading_date)
}
}
@ -72,14 +75,16 @@ class TrackGetResolver : DefaultGetResolver<Track>() {
status = cursor.getInt(cursor.getColumnIndex(COL_STATUS))
score = cursor.getFloat(cursor.getColumnIndex(COL_SCORE))
tracking_url = cursor.getString(cursor.getColumnIndex(COL_TRACKING_URL))
started_reading_date = cursor.getLong(cursor.getColumnIndex(COL_START_DATE))
finished_reading_date = cursor.getLong(cursor.getColumnIndex(COL_FINISH_DATE))
}
}
class TrackDeleteResolver : DefaultDeleteResolver<Track>() {
override fun mapToDeleteQuery(obj: Track) = DeleteQuery.builder()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
.table(TABLE)
.where("$COL_ID = ?")
.whereArgs(obj.id)
.build()
}

View File

@ -12,6 +12,8 @@ interface Category : Serializable {
var flags: Int
var mangaOrder: List<Long>
val nameLower: String
get() = name.toLowerCase()
@ -23,5 +25,4 @@ interface Category : Serializable {
fun createDefault(): Category = create("Default").apply { id = 0 }
}
}
}

View File

@ -10,6 +10,8 @@ class CategoryImpl : Category {
override var flags: Int = 0
override var mangaOrder: List<Long> = emptyList()
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other == null || javaClass != other.javaClass) return false
@ -22,5 +24,4 @@ class CategoryImpl : Category {
override fun hashCode(): Int {
return name.hashCode()
}
}

View File

View File

@ -37,5 +37,4 @@ class ChapterImpl : Chapter {
override fun hashCode(): Int {
return url.hashCode()
}
}
}

View File

@ -35,7 +35,7 @@ interface History : Serializable {
* @param chapter chapter object
* @return history object
*/
fun create(chapter: Chapter): History = HistoryImpl().apply {
fun create(chapter: Chapter): History = HistoryImpl().apply {
this.chapter_id = chapter.id!!
}
}

View File

@ -5,5 +5,4 @@ class LibraryManga : MangaImpl() {
var unread: Int = 0
var category: Int = 0
}
}

View File

@ -16,6 +16,8 @@ interface Manga : SManga {
var chapter_flags: Int
var cover_last_modified: Long
fun setChapterOrder(order: Int) {
setFlags(order, SORT_MASK)
}
@ -28,6 +30,10 @@ interface Manga : SManga {
return chapter_flags and SORT_MASK == SORT_DESC
}
fun getGenres(): List<String>? {
return genre?.split(", ")?.map { it.trim() }
}
// Used to display the chapter's title one way or another
var displayMode: Int
get() = chapter_flags and DISPLAY_MASK
@ -72,7 +78,8 @@ interface Manga : SManga {
const val SORTING_SOURCE = 0x00000000
const val SORTING_NUMBER = 0x00000100
const val SORTING_MASK = 0x00000100
const val SORTING_UPLOAD_DATE = 0x00000200
const val SORTING_MASK = 0x00000300
const val DISPLAY_NAME = 0x00000000
const val DISPLAY_NUMBER = 0x00100000
@ -88,5 +95,4 @@ interface Manga : SManga {
this.source = source
}
}
}
}

View File

@ -17,5 +17,4 @@ class MangaCategory {
return mc
}
}
}

View File

@ -5,6 +5,6 @@ package eu.kanade.tachiyomi.data.database.models
*
* @param manga object containing manga
* @param chapter object containing chater
* @param history object containing history
* @param history object containing history
*/
data class MangaChapterHistory(val manga: Manga, val chapter: Chapter, val history: History)

View File

@ -8,7 +8,7 @@ open class MangaImpl : Manga {
override lateinit var url: String
override lateinit var title: String
override var title: String = ""
override var artist: String? = null
@ -32,6 +32,8 @@ open class MangaImpl : Manga {
override var chapter_flags: Int = 0
override var cover_last_modified: Long = 0
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other == null || javaClass != other.javaClass) return false
@ -39,11 +41,9 @@ open class MangaImpl : Manga {
val manga = other as Manga
return url == manga.url
}
override fun hashCode(): Int {
return url.hashCode()
}
}

View File

@ -24,12 +24,18 @@ interface Track : Serializable {
var status: Int
var started_reading_date: Long
var finished_reading_date: Long
var tracking_url: String
fun copyPersonalFrom(other: Track) {
last_chapter_read = other.last_chapter_read
score = other.score
status = other.status
started_reading_date = other.started_reading_date
finished_reading_date = other.finished_reading_date
}
companion object {
@ -37,5 +43,4 @@ interface Track : Serializable {
sync_id = serviceId
}
}
}

View File

@ -22,6 +22,10 @@ class TrackImpl : Track {
override var status: Int = 0
override var started_reading_date: Long = 0
override var finished_reading_date: Long = 0
override var tracking_url: String = ""
override fun equals(other: Any?): Boolean {
@ -41,5 +45,4 @@ class TrackImpl : Track {
result = 31 * result + media_id
return result
}
}

View File

@ -10,20 +10,24 @@ import eu.kanade.tachiyomi.data.database.tables.CategoryTable
interface CategoryQueries : DbProvider {
fun getCategories() = db.get()
.listOfObjects(Category::class.java)
.withQuery(Query.builder()
.table(CategoryTable.TABLE)
.orderBy(CategoryTable.COL_ORDER)
.build())
.prepare()
.listOfObjects(Category::class.java)
.withQuery(
Query.builder()
.table(CategoryTable.TABLE)
.orderBy(CategoryTable.COL_ORDER)
.build()
)
.prepare()
fun getCategoriesForManga(manga: Manga) = db.get()
.listOfObjects(Category::class.java)
.withQuery(RawQuery.builder()
.query(getCategoriesForMangaQuery())
.args(manga.id)
.build())
.prepare()
.listOfObjects(Category::class.java)
.withQuery(
RawQuery.builder()
.query(getCategoriesForMangaQuery())
.args(manga.id)
.build()
)
.prepare()
fun insertCategory(category: Category) = db.put().`object`(category).prepare()
@ -32,5 +36,4 @@ interface CategoryQueries : DbProvider {
fun deleteCategory(category: Category) = db.delete().`object`(category).prepare()
fun deleteCategories(categories: List<Category>) = db.delete().objects(categories).prepare()
}
}

View File

@ -11,47 +11,87 @@ import eu.kanade.tachiyomi.data.database.resolvers.ChapterProgressPutResolver
import eu.kanade.tachiyomi.data.database.resolvers.ChapterSourceOrderPutResolver
import eu.kanade.tachiyomi.data.database.resolvers.MangaChapterGetResolver
import eu.kanade.tachiyomi.data.database.tables.ChapterTable
import java.util.*
import java.util.Date
interface ChapterQueries : DbProvider {
fun getChapters(manga: Manga) = db.get()
.listOfObjects(Chapter::class.java)
.withQuery(Query.builder()
.table(ChapterTable.TABLE)
.where("${ChapterTable.COL_MANGA_ID} = ?")
.whereArgs(manga.id)
.build())
.prepare()
fun getChapters(manga: Manga) = getChaptersByMangaId(manga.id)
fun getChaptersByMangaId(mangaId: Long?) = db.get()
.listOfObjects(Chapter::class.java)
.withQuery(
Query.builder()
.table(ChapterTable.TABLE)
.where("${ChapterTable.COL_MANGA_ID} = ?")
.whereArgs(mangaId)
.build()
)
.prepare()
fun getChaptersByMergedMangaId(mangaId: Long) = db.get()
.listOfObjects(Chapter::class.java)
.withQuery(
RawQuery.builder()
.query(getMergedChaptersQuery(mangaId))
.build()
)
.prepare()
fun getRecentChapters(date: Date) = db.get()
.listOfObjects(MangaChapter::class.java)
.withQuery(RawQuery.builder()
.query(getRecentsQuery())
.args(date.time)
.observesTables(ChapterTable.TABLE)
.build())
.withGetResolver(MangaChapterGetResolver.INSTANCE)
.prepare()
.listOfObjects(MangaChapter::class.java)
.withQuery(
RawQuery.builder()
.query(getRecentsQuery())
.args(date.time)
.observesTables(ChapterTable.TABLE)
.build()
)
.withGetResolver(MangaChapterGetResolver.INSTANCE)
.prepare()
fun getChapter(id: Long) = db.get()
.`object`(Chapter::class.java)
.withQuery(Query.builder()
.table(ChapterTable.TABLE)
.where("${ChapterTable.COL_ID} = ?")
.whereArgs(id)
.build())
.prepare()
.`object`(Chapter::class.java)
.withQuery(
Query.builder()
.table(ChapterTable.TABLE)
.where("${ChapterTable.COL_ID} = ?")
.whereArgs(id)
.build()
)
.prepare()
fun getChapter(url: String) = db.get()
.`object`(Chapter::class.java)
.withQuery(Query.builder()
.table(ChapterTable.TABLE)
.where("${ChapterTable.COL_URL} = ?")
.whereArgs(url)
.build())
.prepare()
.`object`(Chapter::class.java)
.withQuery(
Query.builder()
.table(ChapterTable.TABLE)
.where("${ChapterTable.COL_URL} = ?")
.whereArgs(url)
.build()
)
.prepare()
fun getChapter(url: String, mangaId: Long) = db.get()
.`object`(Chapter::class.java)
.withQuery(
Query.builder()
.table(ChapterTable.TABLE)
.where("${ChapterTable.COL_URL} = ? AND ${ChapterTable.COL_MANGA_ID} = ?")
.whereArgs(url, mangaId)
.build()
)
.prepare()
fun getChapters(url: String) = db.get()
.listOfObjects(Chapter::class.java)
.withQuery(
Query.builder()
.table(ChapterTable.TABLE)
.where("${ChapterTable.COL_URL} = ?")
.whereArgs(url)
.build()
)
.prepare()
fun insertChapter(chapter: Chapter) = db.put().`object`(chapter).prepare()
@ -62,23 +102,22 @@ interface ChapterQueries : DbProvider {
fun deleteChapters(chapters: List<Chapter>) = db.delete().objects(chapters).prepare()
fun updateChaptersBackup(chapters: List<Chapter>) = db.put()
.objects(chapters)
.withPutResolver(ChapterBackupPutResolver())
.prepare()
.objects(chapters)
.withPutResolver(ChapterBackupPutResolver())
.prepare()
fun updateChapterProgress(chapter: Chapter) = db.put()
.`object`(chapter)
.withPutResolver(ChapterProgressPutResolver())
.prepare()
.`object`(chapter)
.withPutResolver(ChapterProgressPutResolver())
.prepare()
fun updateChaptersProgress(chapters: List<Chapter>) = db.put()
.objects(chapters)
.withPutResolver(ChapterProgressPutResolver())
.prepare()
.objects(chapters)
.withPutResolver(ChapterProgressPutResolver())
.prepare()
fun fixChaptersSourceOrder(chapters: List<Chapter>) = db.put()
.objects(chapters)
.withPutResolver(ChapterSourceOrderPutResolver())
.prepare()
}
.objects(chapters)
.withPutResolver(ChapterSourceOrderPutResolver())
.prepare()
}

View File

@ -8,7 +8,7 @@ import eu.kanade.tachiyomi.data.database.models.MangaChapterHistory
import eu.kanade.tachiyomi.data.database.resolvers.HistoryLastReadPutResolver
import eu.kanade.tachiyomi.data.database.resolvers.MangaChapterHistoryGetResolver
import eu.kanade.tachiyomi.data.database.tables.HistoryTable
import java.util.*
import java.util.Date
interface HistoryQueries : DbProvider {
@ -22,33 +22,56 @@ interface HistoryQueries : DbProvider {
* Returns history of recent manga containing last read chapter
* @param date recent date range
*/
fun getRecentManga(date: Date) = db.get()
.listOfObjects(MangaChapterHistory::class.java)
.withQuery(RawQuery.builder()
.query(getRecentMangasQuery())
.args(date.time)
.observesTables(HistoryTable.TABLE)
.build())
.withGetResolver(MangaChapterHistoryGetResolver.INSTANCE)
.prepare()
fun getRecentManga(date: Date, offset: Int = 0, search: String = "") = db.get()
.listOfObjects(MangaChapterHistory::class.java)
.withQuery(
RawQuery.builder()
.query(getRecentMangasQuery(offset, search))
.args(date.time)
.observesTables(HistoryTable.TABLE)
.build()
)
.withGetResolver(MangaChapterHistoryGetResolver.INSTANCE)
.prepare()
/**
* Returns history of recent manga containing last read chapter in 25s
* @param date recent date range
* @offset offset the db by
*/
fun getRecentMangaLimit(date: Date, limit: Int = 0, search: String = "") = db.get()
.listOfObjects(MangaChapterHistory::class.java)
.withQuery(
RawQuery.builder()
.query(getRecentMangasLimitQuery(limit, search))
.args(date.time)
.observesTables(HistoryTable.TABLE)
.build()
)
.withGetResolver(MangaChapterHistoryGetResolver.INSTANCE)
.prepare()
fun getHistoryByMangaId(mangaId: Long) = db.get()
.listOfObjects(History::class.java)
.withQuery(RawQuery.builder()
.query(getHistoryByMangaId())
.args(mangaId)
.observesTables(HistoryTable.TABLE)
.build())
.prepare()
.listOfObjects(History::class.java)
.withQuery(
RawQuery.builder()
.query(getHistoryByMangaId())
.args(mangaId)
.observesTables(HistoryTable.TABLE)
.build()
)
.prepare()
fun getHistoryByChapterUrl(chapterUrl: String) = db.get()
.`object`(History::class.java)
.withQuery(RawQuery.builder()
.query(getHistoryByChapterUrl())
.args(chapterUrl)
.observesTables(HistoryTable.TABLE)
.build())
.prepare()
.`object`(History::class.java)
.withQuery(
RawQuery.builder()
.query(getHistoryByChapterUrl())
.args(chapterUrl)
.observesTables(HistoryTable.TABLE)
.build()
)
.prepare()
/**
* Updates the history last read.
@ -56,9 +79,9 @@ interface HistoryQueries : DbProvider {
* @param history history object
*/
fun updateHistoryLastRead(history: History) = db.put()
.`object`(history)
.withPutResolver(HistoryLastReadPutResolver())
.prepare()
.`object`(history)
.withPutResolver(HistoryLastReadPutResolver())
.prepare()
/**
* Updates the history last read.
@ -66,21 +89,25 @@ interface HistoryQueries : DbProvider {
* @param historyList history object list
*/
fun updateHistoryLastRead(historyList: List<History>) = db.put()
.objects(historyList)
.withPutResolver(HistoryLastReadPutResolver())
.prepare()
.objects(historyList)
.withPutResolver(HistoryLastReadPutResolver())
.prepare()
fun deleteHistory() = db.delete()
.byQuery(DeleteQuery.builder()
.table(HistoryTable.TABLE)
.build())
.prepare()
.byQuery(
DeleteQuery.builder()
.table(HistoryTable.TABLE)
.build()
)
.prepare()
fun deleteHistoryNoLastRead() = db.delete()
.byQuery(DeleteQuery.builder()
.table(HistoryTable.TABLE)
.where("${HistoryTable.COL_LAST_READ} = ?")
.whereArgs(0)
.build())
.prepare()
.byQuery(
DeleteQuery.builder()
.table(HistoryTable.TABLE)
.where("${HistoryTable.COL_LAST_READ} = ?")
.whereArgs(0)
.build()
)
.prepare()
}

View File

@ -15,18 +15,23 @@ interface MangaCategoryQueries : DbProvider {
fun insertMangasCategories(mangasCategories: List<MangaCategory>) = db.put().objects(mangasCategories).prepare()
fun deleteOldMangasCategories(mangas: List<Manga>) = db.delete()
.byQuery(DeleteQuery.builder()
.table(MangaCategoryTable.TABLE)
.where("${MangaCategoryTable.COL_MANGA_ID} IN (${Queries.placeholders(mangas.size)})")
.whereArgs(*mangas.map { it.id }.toTypedArray())
.build())
.prepare()
.byQuery(
DeleteQuery.builder()
.table(MangaCategoryTable.TABLE)
.where("${MangaCategoryTable.COL_MANGA_ID} IN (${Queries.placeholders(mangas.size)})")
.whereArgs(*mangas.map { it.id }.toTypedArray())
.build()
)
.prepare()
fun setMangaCategories(mangasCategories: List<MangaCategory>, mangas: List<Manga>) {
db.inTransaction {
deleteOldMangasCategories(mangas).executeAsBlocking()
insertMangasCategories(mangasCategories).executeAsBlocking()
mangas.chunked(100) { chunk ->
deleteOldMangasCategories(chunk).executeAsBlocking()
}
mangasCategories.chunked(100) { chunk ->
insertMangasCategories(chunk).executeAsBlocking()
}
}
}
}
}

View File

@ -6,108 +6,217 @@ import com.pushtorefresh.storio.sqlite.queries.RawQuery
import eu.kanade.tachiyomi.data.database.DbProvider
import eu.kanade.tachiyomi.data.database.models.LibraryManga
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.database.resolvers.*
import eu.kanade.tachiyomi.data.database.resolvers.LibraryMangaGetResolver
import eu.kanade.tachiyomi.data.database.resolvers.MangaCoverLastModifiedPutResolver
import eu.kanade.tachiyomi.data.database.resolvers.MangaFavoritePutResolver
import eu.kanade.tachiyomi.data.database.resolvers.MangaFlagsPutResolver
import eu.kanade.tachiyomi.data.database.resolvers.MangaLastUpdatedPutResolver
import eu.kanade.tachiyomi.data.database.resolvers.MangaTitlePutResolver
import eu.kanade.tachiyomi.data.database.resolvers.MangaViewerPutResolver
import eu.kanade.tachiyomi.data.database.tables.CategoryTable
import eu.kanade.tachiyomi.data.database.tables.ChapterTable
import eu.kanade.tachiyomi.data.database.tables.MangaCategoryTable
import eu.kanade.tachiyomi.data.database.tables.MangaTable
import exh.metadata.sql.tables.SearchMetadataTable
interface MangaQueries : DbProvider {
fun getMangas() = db.get()
.listOfObjects(Manga::class.java)
.withQuery(Query.builder()
.table(MangaTable.TABLE)
.build())
.prepare()
.listOfObjects(Manga::class.java)
.withQuery(
Query.builder()
.table(MangaTable.TABLE)
.build()
)
.prepare()
fun getLibraryMangas() = db.get()
.listOfObjects(LibraryManga::class.java)
.withQuery(RawQuery.builder()
.query(libraryQuery)
.observesTables(MangaTable.TABLE, ChapterTable.TABLE, MangaCategoryTable.TABLE, CategoryTable.TABLE)
.build())
.withGetResolver(LibraryMangaGetResolver.INSTANCE)
.prepare()
.listOfObjects(LibraryManga::class.java)
.withQuery(
RawQuery.builder()
.query(libraryQuery)
.observesTables(MangaTable.TABLE, ChapterTable.TABLE, MangaCategoryTable.TABLE, CategoryTable.TABLE)
.build()
)
.withGetResolver(LibraryMangaGetResolver.INSTANCE)
.prepare()
fun getFavoriteMangas() = db.get()
.listOfObjects(Manga::class.java)
.withQuery(Query.builder()
.table(MangaTable.TABLE)
.where("${MangaTable.COL_FAVORITE} = ?")
.whereArgs(1)
.orderBy(MangaTable.COL_TITLE)
.build())
.prepare()
.listOfObjects(Manga::class.java)
.withQuery(
Query.builder()
.table(MangaTable.TABLE)
.where("${MangaTable.COL_FAVORITE} = ?")
.whereArgs(1)
.orderBy(MangaTable.COL_TITLE)
.build()
)
.prepare()
fun getManga(url: String, sourceId: Long) = db.get()
.`object`(Manga::class.java)
.withQuery(Query.builder()
.table(MangaTable.TABLE)
.where("${MangaTable.COL_URL} = ? AND ${MangaTable.COL_SOURCE} = ?")
.whereArgs(url, sourceId)
.build())
.prepare()
.`object`(Manga::class.java)
.withQuery(
Query.builder()
.table(MangaTable.TABLE)
.where("${MangaTable.COL_URL} = ? AND ${MangaTable.COL_SOURCE} = ?")
.whereArgs(url, sourceId)
.build()
)
.prepare()
fun getManga(id: Long) = db.get()
.`object`(Manga::class.java)
.withQuery(Query.builder()
.table(MangaTable.TABLE)
.where("${MangaTable.COL_ID} = ?")
.whereArgs(id)
.build())
.prepare()
.`object`(Manga::class.java)
.withQuery(
Query.builder()
.table(MangaTable.TABLE)
.where("${MangaTable.COL_ID} = ?")
.whereArgs(id)
.build()
)
.prepare()
fun getMergedMangas(id: Long) = db.get()
.listOfObjects(Manga::class.java)
.withQuery(
RawQuery.builder()
.query(getMergedMangaQuery(id))
.build()
)
.prepare()
fun insertManga(manga: Manga) = db.put().`object`(manga).prepare()
fun insertMangas(mangas: List<Manga>) = db.put().objects(mangas).prepare()
fun updateFlags(manga: Manga) = db.put()
.`object`(manga)
.withPutResolver(MangaFlagsPutResolver())
.prepare()
.`object`(manga)
.withPutResolver(MangaFlagsPutResolver())
.prepare()
fun updateLastUpdated(manga: Manga) = db.put()
.`object`(manga)
.withPutResolver(MangaLastUpdatedPutResolver())
.prepare()
.`object`(manga)
.withPutResolver(MangaLastUpdatedPutResolver())
.prepare()
fun updateMangaFavorite(manga: Manga) = db.put()
.`object`(manga)
.withPutResolver(MangaFavoritePutResolver())
.prepare()
.`object`(manga)
.withPutResolver(MangaFavoritePutResolver())
.prepare()
fun updateMangaViewer(manga: Manga) = db.put()
.`object`(manga)
.withPutResolver(MangaViewerPutResolver())
.prepare()
.`object`(manga)
.withPutResolver(MangaViewerPutResolver())
.prepare()
fun updateMangaTitle(manga: Manga) = db.put()
.`object`(manga)
.withPutResolver(MangaTitlePutResolver())
.prepare()
fun updateMangaCoverLastModified(manga: Manga) = db.put()
.`object`(manga)
.withPutResolver(MangaCoverLastModifiedPutResolver())
.prepare()
fun deleteManga(manga: Manga) = db.delete().`object`(manga).prepare()
fun deleteMangas(mangas: List<Manga>) = db.delete().objects(mangas).prepare()
fun deleteMangasNotInLibrary() = db.delete()
.byQuery(DeleteQuery.builder()
.table(MangaTable.TABLE)
.where("${MangaTable.COL_FAVORITE} = ?")
.whereArgs(0)
.build())
.prepare()
.byQuery(
DeleteQuery.builder()
.table(MangaTable.TABLE)
.where("${MangaTable.COL_FAVORITE} = ?")
.whereArgs(0)
.build()
)
.prepare()
fun deleteMangas() = db.delete()
.byQuery(DeleteQuery.builder()
.table(MangaTable.TABLE)
.build())
.prepare()
.byQuery(
DeleteQuery.builder()
.table(MangaTable.TABLE)
.build()
)
.prepare()
fun getLastReadManga() = db.get()
.listOfObjects(Manga::class.java)
.withQuery(RawQuery.builder()
.query(getLastReadMangaQuery())
.observesTables(MangaTable.TABLE)
.build())
.prepare()
.listOfObjects(Manga::class.java)
.withQuery(
RawQuery.builder()
.query(getLastReadMangaQuery())
.observesTables(MangaTable.TABLE)
.build()
)
.prepare()
fun getTotalChapterManga() = db.get().listOfObjects(Manga::class.java)
.withQuery(RawQuery.builder().query(getTotalChapterMangaQuery()).observesTables(MangaTable.TABLE).build()).prepare();
fun getTotalChapterManga() = db.get()
.listOfObjects(Manga::class.java)
.withQuery(
RawQuery.builder()
.query(getTotalChapterMangaQuery())
.observesTables(MangaTable.TABLE)
.build()
)
.prepare()
fun getLatestChapterManga() = db.get()
.listOfObjects(Manga::class.java)
.withQuery(
RawQuery.builder()
.query(getLatestChapterMangaQuery())
.observesTables(MangaTable.TABLE)
.build()
)
.prepare()
fun getMangaWithMetadata() = db.get()
.listOfObjects(Manga::class.java)
.withQuery(
RawQuery.builder()
.query(
"""
SELECT ${MangaTable.TABLE}.* FROM ${MangaTable.TABLE}
INNER JOIN ${SearchMetadataTable.TABLE}
ON ${MangaTable.TABLE}.${MangaTable.COL_ID} = ${SearchMetadataTable.TABLE}.${SearchMetadataTable.COL_MANGA_ID}
ORDER BY ${MangaTable.TABLE}.${MangaTable.COL_ID}
""".trimIndent()
)
.build()
)
.prepare()
fun getFavoriteMangaWithMetadata() = db.get()
.listOfObjects(Manga::class.java)
.withQuery(
RawQuery.builder()
.query(
"""
SELECT ${MangaTable.TABLE}.* FROM ${MangaTable.TABLE}
INNER JOIN ${SearchMetadataTable.TABLE}
ON ${MangaTable.TABLE}.${MangaTable.COL_ID} = ${SearchMetadataTable.TABLE}.${SearchMetadataTable.COL_MANGA_ID}
WHERE ${MangaTable.TABLE}.${MangaTable.COL_FAVORITE} = 1
ORDER BY ${MangaTable.TABLE}.${MangaTable.COL_ID}
""".trimIndent()
)
.build()
)
.prepare()
fun getIdsOfFavoriteMangaWithMetadata() = db.get()
.cursor()
.withQuery(
RawQuery.builder()
.query(
"""
SELECT ${MangaTable.TABLE}.${MangaTable.COL_ID} FROM ${MangaTable.TABLE}
INNER JOIN ${SearchMetadataTable.TABLE}
ON ${MangaTable.TABLE}.${MangaTable.COL_ID} = ${SearchMetadataTable.TABLE}.${SearchMetadataTable.COL_MANGA_ID}
WHERE ${MangaTable.TABLE}.${MangaTable.COL_FAVORITE} = 1
ORDER BY ${MangaTable.TABLE}.${MangaTable.COL_ID}
""".trimIndent()
)
.build()
)
.prepare()
}

View File

@ -5,11 +5,39 @@ import eu.kanade.tachiyomi.data.database.tables.ChapterTable as Chapter
import eu.kanade.tachiyomi.data.database.tables.HistoryTable as History
import eu.kanade.tachiyomi.data.database.tables.MangaCategoryTable as MangaCategory
import eu.kanade.tachiyomi.data.database.tables.MangaTable as Manga
import eu.kanade.tachiyomi.data.database.tables.MergedTable as Merged
/**
* Query to get the manga merged into a merged manga
*/
fun getMergedMangaQuery(id: Long) =
"""
SELECT ${Manga.TABLE}.*
FROM (
SELECT ${Merged.COL_MANGA_ID} FROM ${Merged.TABLE} WHERE $(Merged.COL_MERGE_ID} = $id
) AS M
JOIN ${Manga.TABLE}
ON ${Manga.TABLE}.${Manga.COL_ID} = M.${Merged.COL_MANGA_ID}
"""
/**
* Query to get the chapters of all manga in a merged manga
*/
fun getMergedChaptersQuery(id: Long) =
"""
SELECT ${Chapter.TABLE}.*
FROM (
SELECT ${Merged.COL_MANGA_ID} FROM ${Merged.TABLE} WHERE $(Merged.COL_MERGE_ID} = $id
) AS M
JOIN ${Chapter.TABLE}
ON ${Chapter.TABLE}.${Chapter.COL_MANGA_ID} = M.${Merged.COL_MANGA_ID}
"""
/**
* Query to get the manga from the library, with their categories and unread count.
*/
val libraryQuery = """
val libraryQuery =
"""
SELECT M.*, COALESCE(MC.${MangaCategory.COL_CATEGORY_ID}, 0) AS ${Manga.COL_CATEGORY}
FROM (
SELECT ${Manga.TABLE}.*, COALESCE(C.unread, 0) AS ${Manga.COL_UNREAD}
@ -33,7 +61,8 @@ val libraryQuery = """
/**
* Query to get the recent chapters of manga from the library up to a date.
*/
fun getRecentsQuery() = """
fun getRecentsQuery() =
"""
SELECT ${Manga.TABLE}.${Manga.COL_URL} as mangaUrl, * FROM ${Manga.TABLE} JOIN ${Chapter.TABLE}
ON ${Manga.TABLE}.${Manga.COL_ID} = ${Chapter.TABLE}.${Chapter.COL_MANGA_ID}
WHERE ${Manga.COL_FAVORITE} = 1 AND ${Chapter.COL_DATE_UPLOAD} > ?
@ -47,7 +76,8 @@ fun getRecentsQuery() = """
* and are read after the given time period
* @return return limit is 25
*/
fun getRecentMangasQuery() = """
fun getRecentMangasQuery(offset: Int = 0, search: String = "") =
"""
SELECT ${Manga.TABLE}.${Manga.COL_URL} as mangaUrl, ${Manga.TABLE}.*, ${Chapter.TABLE}.*, ${History.TABLE}.*
FROM ${Manga.TABLE}
JOIN ${Chapter.TABLE}
@ -61,11 +91,40 @@ fun getRecentMangasQuery() = """
GROUP BY ${Chapter.TABLE}.${Chapter.COL_MANGA_ID}) AS max_last_read
ON ${Chapter.TABLE}.${Chapter.COL_MANGA_ID} = max_last_read.${Chapter.COL_MANGA_ID}
WHERE ${History.TABLE}.${History.COL_LAST_READ} > ? AND max_last_read.${History.COL_CHAPTER_ID} = ${History.TABLE}.${History.COL_CHAPTER_ID}
AND lower(${Manga.TABLE}.${Manga.COL_TITLE}) LIKE '%$search%'
ORDER BY max_last_read.${History.COL_LAST_READ} DESC
LIMIT 25
LIMIT 25 OFFSET $offset
"""
fun getHistoryByMangaId() = """
/**
* Query to get the recently read chapters of manga from the library up to a date.
* The max_last_read table contains the most recent chapters grouped by manga
* The select statement returns all information of chapters that have the same id as the chapter in max_last_read
* and are read after the given time period
*/
fun getRecentMangasLimitQuery(limit: Int = 25, search: String = "") =
"""
SELECT ${Manga.TABLE}.${Manga.COL_URL} as mangaUrl, ${Manga.TABLE}.*, ${Chapter.TABLE}.*, ${History.TABLE}.*
FROM ${Manga.TABLE}
JOIN ${Chapter.TABLE}
ON ${Manga.TABLE}.${Manga.COL_ID} = ${Chapter.TABLE}.${Chapter.COL_MANGA_ID}
JOIN ${History.TABLE}
ON ${Chapter.TABLE}.${Chapter.COL_ID} = ${History.TABLE}.${History.COL_CHAPTER_ID}
JOIN (
SELECT ${Chapter.TABLE}.${Chapter.COL_MANGA_ID},${Chapter.TABLE}.${Chapter.COL_ID} as ${History.COL_CHAPTER_ID}, MAX(${History.TABLE}.${History.COL_LAST_READ}) as ${History.COL_LAST_READ}
FROM ${Chapter.TABLE} JOIN ${History.TABLE}
ON ${Chapter.TABLE}.${Chapter.COL_ID} = ${History.TABLE}.${History.COL_CHAPTER_ID}
GROUP BY ${Chapter.TABLE}.${Chapter.COL_MANGA_ID}) AS max_last_read
ON ${Chapter.TABLE}.${Chapter.COL_MANGA_ID} = max_last_read.${Chapter.COL_MANGA_ID}
WHERE ${History.TABLE}.${History.COL_LAST_READ} > ?
AND max_last_read.${History.COL_CHAPTER_ID} = ${History.TABLE}.${History.COL_CHAPTER_ID}
AND lower(${Manga.TABLE}.${Manga.COL_TITLE}) LIKE '%$search%'
ORDER BY max_last_read.${History.COL_LAST_READ} DESC
LIMIT $limit
"""
fun getHistoryByMangaId() =
"""
SELECT ${History.TABLE}.*
FROM ${History.TABLE}
JOIN ${Chapter.TABLE}
@ -73,7 +132,8 @@ fun getHistoryByMangaId() = """
WHERE ${Chapter.TABLE}.${Chapter.COL_MANGA_ID} = ? AND ${History.TABLE}.${History.COL_CHAPTER_ID} = ${Chapter.TABLE}.${Chapter.COL_ID}
"""
fun getHistoryByChapterUrl() = """
fun getHistoryByChapterUrl() =
"""
SELECT ${History.TABLE}.*
FROM ${History.TABLE}
JOIN ${Chapter.TABLE}
@ -81,7 +141,8 @@ fun getHistoryByChapterUrl() = """
WHERE ${Chapter.TABLE}.${Chapter.COL_URL} = ? AND ${History.TABLE}.${History.COL_CHAPTER_ID} = ${Chapter.TABLE}.${Chapter.COL_ID}
"""
fun getLastReadMangaQuery() = """
fun getLastReadMangaQuery() =
"""
SELECT ${Manga.TABLE}.*, MAX(${History.TABLE}.${History.COL_LAST_READ}) AS max
FROM ${Manga.TABLE}
JOIN ${Chapter.TABLE}
@ -93,7 +154,8 @@ fun getLastReadMangaQuery() = """
ORDER BY max DESC
"""
fun getTotalChapterMangaQuery()= """
fun getTotalChapterMangaQuery() =
"""
SELECT ${Manga.TABLE}.*
FROM ${Manga.TABLE}
JOIN ${Chapter.TABLE}
@ -102,12 +164,23 @@ fun getTotalChapterMangaQuery()= """
ORDER by COUNT(*)
"""
fun getLatestChapterMangaQuery() =
"""
SELECT ${Manga.TABLE}.*, MAX(${Chapter.TABLE}.${Chapter.COL_DATE_UPLOAD}) AS max
FROM ${Manga.TABLE}
JOIN ${Chapter.TABLE}
ON ${Manga.TABLE}.${Manga.COL_ID} = ${Chapter.TABLE}.${Chapter.COL_MANGA_ID}
GROUP BY ${Manga.TABLE}.${Manga.COL_ID}
ORDER by max DESC
"""
/**
* Query to get the categories for a manga.
*/
fun getCategoriesForMangaQuery() = """
fun getCategoriesForMangaQuery() =
"""
SELECT ${Category.TABLE}.* FROM ${Category.TABLE}
JOIN ${MangaCategory.TABLE} ON ${Category.TABLE}.${Category.COL_ID} =
${MangaCategory.TABLE}.${MangaCategory.COL_CATEGORY_ID}
WHERE ${MangaCategory.COL_MANGA_ID} = ?
"""
"""

View File

@ -1,34 +1,37 @@
package eu.kanade.tachiyomi.data.database.queries
import com.pushtorefresh.storio.sqlite.queries.DeleteQuery
import com.pushtorefresh.storio.sqlite.queries.Query
import eu.kanade.tachiyomi.data.database.DbProvider
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.database.tables.TrackTable
import eu.kanade.tachiyomi.data.track.TrackService
interface TrackQueries : DbProvider {
fun getTracks(manga: Manga) = db.get()
.listOfObjects(Track::class.java)
.withQuery(Query.builder()
.table(TrackTable.TABLE)
.where("${TrackTable.COL_MANGA_ID} = ?")
.whereArgs(manga.id)
.build())
.prepare()
fun insertTrack(track: Track) = db.put().`object`(track).prepare()
fun insertTracks(tracks: List<Track>) = db.put().objects(tracks).prepare()
fun deleteTrackForManga(manga: Manga, sync: TrackService) = db.delete()
.byQuery(DeleteQuery.builder()
.table(TrackTable.TABLE)
.where("${TrackTable.COL_MANGA_ID} = ? AND ${TrackTable.COL_SYNC_ID} = ?")
.whereArgs(manga.id, sync.id)
.build())
.prepare()
}
package eu.kanade.tachiyomi.data.database.queries
import com.pushtorefresh.storio.sqlite.queries.DeleteQuery
import com.pushtorefresh.storio.sqlite.queries.Query
import eu.kanade.tachiyomi.data.database.DbProvider
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.database.models.Track
import eu.kanade.tachiyomi.data.database.tables.TrackTable
import eu.kanade.tachiyomi.data.track.TrackService
interface TrackQueries : DbProvider {
fun getTracks(manga: Manga) = db.get()
.listOfObjects(Track::class.java)
.withQuery(
Query.builder()
.table(TrackTable.TABLE)
.where("${TrackTable.COL_MANGA_ID} = ?")
.whereArgs(manga.id)
.build()
)
.prepare()
fun insertTrack(track: Track) = db.put().`object`(track).prepare()
fun insertTracks(tracks: List<Track>) = db.put().objects(tracks).prepare()
fun deleteTrackForManga(manga: Manga, sync: TrackService) = db.delete()
.byQuery(
DeleteQuery.builder()
.table(TrackTable.TABLE)
.where("${TrackTable.COL_MANGA_ID} = ? AND ${TrackTable.COL_SYNC_ID} = ?")
.whereArgs(manga.id, sync.id)
.build()
)
.prepare()
}

View File

@ -20,16 +20,14 @@ class ChapterBackupPutResolver : PutResolver<Chapter>() {
}
fun mapToUpdateQuery(chapter: Chapter) = UpdateQuery.builder()
.table(ChapterTable.TABLE)
.where("${ChapterTable.COL_URL} = ?")
.whereArgs(chapter.url)
.build()
.table(ChapterTable.TABLE)
.where("${ChapterTable.COL_URL} = ?")
.whereArgs(chapter.url)
.build()
fun mapToContentValues(chapter: Chapter) = ContentValues(3).apply {
put(ChapterTable.COL_READ, chapter.read)
put(ChapterTable.COL_BOOKMARK, chapter.bookmark)
put(ChapterTable.COL_LAST_PAGE_READ, chapter.last_page_read)
}
}

View File

@ -20,16 +20,14 @@ class ChapterProgressPutResolver : PutResolver<Chapter>() {
}
fun mapToUpdateQuery(chapter: Chapter) = UpdateQuery.builder()
.table(ChapterTable.TABLE)
.where("${ChapterTable.COL_ID} = ?")
.whereArgs(chapter.id)
.build()
.table(ChapterTable.TABLE)
.where("${ChapterTable.COL_ID} = ?")
.whereArgs(chapter.id)
.build()
fun mapToContentValues(chapter: Chapter) = ContentValues(3).apply {
put(ChapterTable.COL_READ, chapter.read)
put(ChapterTable.COL_BOOKMARK, chapter.bookmark)
put(ChapterTable.COL_LAST_PAGE_READ, chapter.last_page_read)
}
}

View File

@ -20,13 +20,12 @@ class ChapterSourceOrderPutResolver : PutResolver<Chapter>() {
}
fun mapToUpdateQuery(chapter: Chapter) = UpdateQuery.builder()
.table(ChapterTable.TABLE)
.where("${ChapterTable.COL_URL} = ? AND ${ChapterTable.COL_MANGA_ID} = ?")
.whereArgs(chapter.url, chapter.manga_id)
.build()
.table(ChapterTable.TABLE)
.where("${ChapterTable.COL_URL} = ? AND ${ChapterTable.COL_MANGA_ID} = ?")
.whereArgs(chapter.url, chapter.manga_id)
.build()
fun mapToContentValues(chapter: Chapter) = ContentValues(1).apply {
put(ChapterTable.COL_SOURCE_ORDER, chapter.source_order)
}
}
}

View File

@ -1,7 +1,7 @@
package eu.kanade.tachiyomi.data.database.resolvers
import android.content.ContentValues
import android.support.annotation.NonNull
import androidx.annotation.NonNull
import com.pushtorefresh.storio.sqlite.StorIOSQLite
import com.pushtorefresh.storio.sqlite.operations.put.PutResult
import com.pushtorefresh.storio.sqlite.queries.Query
@ -19,25 +19,25 @@ class HistoryLastReadPutResolver : HistoryPutResolver() {
override fun performPut(@NonNull db: StorIOSQLite, @NonNull history: History): PutResult = db.inTransactionReturn {
val updateQuery = mapToUpdateQuery(history)
val cursor = db.lowLevel().query(Query.builder()
val cursor = db.lowLevel().query(
Query.builder()
.table(updateQuery.table())
.where(updateQuery.where())
.whereArgs(updateQuery.whereArgs())
.build())
.build()
)
val putResult: PutResult
try {
if (cursor.count == 0) {
putResult = cursor.use { putCursor ->
if (putCursor.count == 0) {
val insertQuery = mapToInsertQuery(history)
val insertedId = db.lowLevel().insert(insertQuery, mapToContentValues(history))
putResult = PutResult.newInsertResult(insertedId, insertQuery.table())
PutResult.newInsertResult(insertedId, insertQuery.table())
} else {
val numberOfRowsUpdated = db.lowLevel().update(updateQuery, mapToUpdateContentValues(history))
putResult = PutResult.newUpdateResult(numberOfRowsUpdated, updateQuery.table())
PutResult.newUpdateResult(numberOfRowsUpdated, updateQuery.table())
}
} finally {
cursor.close()
}
putResult
@ -48,10 +48,10 @@ class HistoryLastReadPutResolver : HistoryPutResolver() {
* @param obj history object
*/
override fun mapToUpdateQuery(obj: History) = UpdateQuery.builder()
.table(HistoryTable.TABLE)
.where("${HistoryTable.COL_CHAPTER_ID} = ?")
.whereArgs(obj.chapter_id)
.build()
.table(HistoryTable.TABLE)
.where("${HistoryTable.COL_CHAPTER_ID} = ?")
.whereArgs(obj.chapter_id)
.build()
/**
* Create content query
@ -60,5 +60,4 @@ class HistoryLastReadPutResolver : HistoryPutResolver() {
fun mapToUpdateContentValues(history: History) = ContentValues(1).apply {
put(HistoryTable.COL_LAST_READ, history.last_read)
}
}

View File

@ -21,5 +21,4 @@ class LibraryMangaGetResolver : DefaultGetResolver<LibraryManga>(), BaseMangaGet
return manga
}
}

View File

@ -24,5 +24,4 @@ class MangaChapterGetResolver : DefaultGetResolver<MangaChapter>() {
return MangaChapter(manga, chapter)
}
}

View File

@ -0,0 +1,31 @@
package eu.kanade.tachiyomi.data.database.resolvers
import android.content.ContentValues
import com.pushtorefresh.storio.sqlite.StorIOSQLite
import com.pushtorefresh.storio.sqlite.operations.put.PutResolver
import com.pushtorefresh.storio.sqlite.operations.put.PutResult
import com.pushtorefresh.storio.sqlite.queries.UpdateQuery
import eu.kanade.tachiyomi.data.database.inTransactionReturn
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.database.tables.MangaTable
class MangaCoverLastModifiedPutResolver : PutResolver<Manga>() {
override fun performPut(db: StorIOSQLite, manga: Manga) = db.inTransactionReturn {
val updateQuery = mapToUpdateQuery(manga)
val contentValues = mapToContentValues(manga)
val numberOfRowsUpdated = db.lowLevel().update(updateQuery, contentValues)
PutResult.newUpdateResult(numberOfRowsUpdated, updateQuery.table())
}
fun mapToUpdateQuery(manga: Manga) = UpdateQuery.builder()
.table(MangaTable.TABLE)
.where("${MangaTable.COL_ID} = ?")
.whereArgs(manga.id)
.build()
fun mapToContentValues(manga: Manga) = ContentValues(1).apply {
put(MangaTable.COL_COVER_LAST_MODIFIED, manga.cover_last_modified)
}
}

View File

@ -20,14 +20,12 @@ class MangaFavoritePutResolver : PutResolver<Manga>() {
}
fun mapToUpdateQuery(manga: Manga) = UpdateQuery.builder()
.table(MangaTable.TABLE)
.where("${MangaTable.COL_ID} = ?")
.whereArgs(manga.id)
.build()
.table(MangaTable.TABLE)
.where("${MangaTable.COL_ID} = ?")
.whereArgs(manga.id)
.build()
fun mapToContentValues(manga: Manga) = ContentValues(1).apply {
put(MangaTable.COL_FAVORITE, manga.favorite)
}
}

View File

@ -20,14 +20,12 @@ class MangaFlagsPutResolver : PutResolver<Manga>() {
}
fun mapToUpdateQuery(manga: Manga) = UpdateQuery.builder()
.table(MangaTable.TABLE)
.where("${MangaTable.COL_ID} = ?")
.whereArgs(manga.id)
.build()
.table(MangaTable.TABLE)
.where("${MangaTable.COL_ID} = ?")
.whereArgs(manga.id)
.build()
fun mapToContentValues(manga: Manga) = ContentValues(1).apply {
put(MangaTable.COL_CHAPTER_FLAGS, manga.chapter_flags)
}
}

View File

@ -20,14 +20,12 @@ class MangaLastUpdatedPutResolver : PutResolver<Manga>() {
}
fun mapToUpdateQuery(manga: Manga) = UpdateQuery.builder()
.table(MangaTable.TABLE)
.where("${MangaTable.COL_ID} = ?")
.whereArgs(manga.id)
.build()
.table(MangaTable.TABLE)
.where("${MangaTable.COL_ID} = ?")
.whereArgs(manga.id)
.build()
fun mapToContentValues(manga: Manga) = ContentValues(1).apply {
put(MangaTable.COL_LAST_UPDATE, manga.last_update)
}
}

View File

@ -0,0 +1,31 @@
package eu.kanade.tachiyomi.data.database.resolvers
import android.content.ContentValues
import com.pushtorefresh.storio.sqlite.StorIOSQLite
import com.pushtorefresh.storio.sqlite.operations.put.PutResolver
import com.pushtorefresh.storio.sqlite.operations.put.PutResult
import com.pushtorefresh.storio.sqlite.queries.UpdateQuery
import eu.kanade.tachiyomi.data.database.inTransactionReturn
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.database.tables.MangaTable
class MangaTitlePutResolver : PutResolver<Manga>() {
override fun performPut(db: StorIOSQLite, manga: Manga) = db.inTransactionReturn {
val updateQuery = mapToUpdateQuery(manga)
val contentValues = mapToContentValues(manga)
val numberOfRowsUpdated = db.lowLevel().update(updateQuery, contentValues)
PutResult.newUpdateResult(numberOfRowsUpdated, updateQuery.table())
}
fun mapToUpdateQuery(manga: Manga) = UpdateQuery.builder()
.table(MangaTable.TABLE)
.where("${MangaTable.COL_ID} = ?")
.whereArgs(manga.id)
.build()
fun mapToContentValues(manga: Manga) = ContentValues(1).apply {
put(MangaTable.COL_TITLE, manga.title)
}
}

View File

@ -0,0 +1,32 @@
package eu.kanade.tachiyomi.data.database.resolvers
import android.content.ContentValues
import com.pushtorefresh.storio.sqlite.StorIOSQLite
import com.pushtorefresh.storio.sqlite.operations.put.PutResolver
import com.pushtorefresh.storio.sqlite.operations.put.PutResult
import com.pushtorefresh.storio.sqlite.queries.UpdateQuery
import eu.kanade.tachiyomi.data.database.inTransactionReturn
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.database.tables.MangaTable
// [EXH]
class MangaUrlPutResolver : PutResolver<Manga>() {
override fun performPut(db: StorIOSQLite, manga: Manga) = db.inTransactionReturn {
val updateQuery = mapToUpdateQuery(manga)
val contentValues = mapToContentValues(manga)
val numberOfRowsUpdated = db.lowLevel().update(updateQuery, contentValues)
PutResult.newUpdateResult(numberOfRowsUpdated, updateQuery.table())
}
fun mapToUpdateQuery(manga: Manga) = UpdateQuery.builder()
.table(MangaTable.TABLE)
.where("${MangaTable.COL_ID} = ?")
.whereArgs(manga.id)
.build()
fun mapToContentValues(manga: Manga) = ContentValues(1).apply {
put(MangaTable.COL_URL, manga.url)
}
}

View File

@ -28,5 +28,4 @@ class MangaViewerPutResolver : PutResolver<Manga>() {
fun mapToContentValues(manga: Manga) = ContentValues(1).apply {
put(MangaTable.COL_VIEWER, manga.viewer)
}
}

View File

@ -12,12 +12,18 @@ object CategoryTable {
const val COL_FLAGS = "flags"
const val COL_MANGA_ORDER = "manga_order"
val createTableQuery: String
get() = """CREATE TABLE $TABLE(
get() =
"""CREATE TABLE $TABLE(
$COL_ID INTEGER NOT NULL PRIMARY KEY,
$COL_NAME TEXT NOT NULL,
$COL_ORDER INTEGER NOT NULL,
$COL_FLAGS INTEGER NOT NULL
$COL_FLAGS INTEGER NOT NULL,
$COL_MANGA_ORDER TEXT NOT NULL
)"""
val addMangaOrder: String
get() = "ALTER TABLE $TABLE ADD COLUMN $COL_MANGA_ORDER TEXT"
}

View File

@ -29,7 +29,8 @@ object ChapterTable {
const val COL_SOURCE_ORDER = "source_order"
val createTableQuery: String
get() = """CREATE TABLE $TABLE(
get() =
"""CREATE TABLE $TABLE(
$COL_ID INTEGER NOT NULL PRIMARY KEY,
$COL_MANGA_ID INTEGER NOT NULL,
$COL_URL TEXT NOT NULL,
@ -49,6 +50,10 @@ object ChapterTable {
val createMangaIdIndexQuery: String
get() = "CREATE INDEX ${TABLE}_${COL_MANGA_ID}_index ON $TABLE($COL_MANGA_ID)"
val createUnreadChaptersIndexQuery: String
get() = "CREATE INDEX ${TABLE}_unread_by_manga_index ON $TABLE($COL_MANGA_ID, $COL_READ) " +
"WHERE $COL_READ = 0"
val sourceOrderUpdateQuery: String
get() = "ALTER TABLE $TABLE ADD COLUMN $COL_SOURCE_ORDER INTEGER DEFAULT 0"
@ -57,5 +62,4 @@ object ChapterTable {
val addScanlator: String
get() = "ALTER TABLE $TABLE ADD COLUMN $COL_SCANLATOR TEXT DEFAULT NULL"
}

View File

@ -31,7 +31,8 @@ object HistoryTable {
* query to create history table
*/
val createTableQuery: String
get() = """CREATE TABLE $TABLE(
get() =
"""CREATE TABLE $TABLE(
$COL_ID INTEGER NOT NULL PRIMARY KEY,
$COL_CHAPTER_ID INTEGER NOT NULL UNIQUE,
$COL_LAST_READ LONG,

View File

@ -11,7 +11,8 @@ object MangaCategoryTable {
const val COL_CATEGORY_ID = "category_id"
val createTableQuery: String
get() = """CREATE TABLE $TABLE(
get() =
"""CREATE TABLE $TABLE(
$COL_ID INTEGER NOT NULL PRIMARY KEY,
$COL_MANGA_ID INTEGER NOT NULL,
$COL_CATEGORY_ID INTEGER NOT NULL,
@ -20,5 +21,4 @@ object MangaCategoryTable {
FOREIGN KEY($COL_MANGA_ID) REFERENCES ${MangaTable.TABLE} (${MangaTable.COL_ID})
ON DELETE CASCADE
)"""
}

View File

@ -38,8 +38,11 @@ object MangaTable {
const val COL_CATEGORY = "category"
const val COL_COVER_LAST_MODIFIED = "cover_last_modified"
val createTableQuery: String
get() = """CREATE TABLE $TABLE(
get() =
"""CREATE TABLE $TABLE(
$COL_ID INTEGER NOT NULL PRIMARY KEY,
$COL_SOURCE INTEGER NOT NULL,
$COL_URL TEXT NOT NULL,
@ -54,12 +57,17 @@ object MangaTable {
$COL_LAST_UPDATE LONG,
$COL_INITIALIZED BOOLEAN NOT NULL,
$COL_VIEWER INTEGER NOT NULL,
$COL_CHAPTER_FLAGS INTEGER NOT NULL
$COL_CHAPTER_FLAGS INTEGER NOT NULL,
$COL_COVER_LAST_MODIFIED LONG NOT NULL
)"""
val createUrlIndexQuery: String
get() = "CREATE INDEX ${TABLE}_${COL_URL}_index ON $TABLE($COL_URL)"
val createFavoriteIndexQuery: String
get() = "CREATE INDEX ${TABLE}_${COL_FAVORITE}_index ON $TABLE($COL_FAVORITE)"
val createLibraryIndexQuery: String
get() = "CREATE INDEX library_${COL_FAVORITE}_index ON $TABLE($COL_FAVORITE) " +
"WHERE $COL_FAVORITE = 1"
val addCoverLastModified: String
get() = "ALTER TABLE $TABLE ADD COLUMN $COL_COVER_LAST_MODIFIED LONG NOT NULL DEFAULT 0"
}

View File

@ -0,0 +1,20 @@
package eu.kanade.tachiyomi.data.database.tables
object MergedTable {
const val TABLE = "merged"
const val COL_MERGE_ID = "mergeID"
const val COL_MANGA_ID = "mangaID"
val createTableQuery: String
get() =
"""CREATE TABLE $TABLE(
$COL_MERGE_ID INTEGER NOT NULL,
$COL_MANGA_ID INTEGER NOT NULL
)"""
val createIndexQuery: String
get() = "CREATE INDEX ${TABLE}_${COL_MERGE_ID}_index ON $TABLE($COL_MERGE_ID)"
}

View File

@ -26,8 +26,13 @@ object TrackTable {
const val COL_TRACKING_URL = "remote_url"
const val COL_START_DATE = "start_date"
const val COL_FINISH_DATE = "finish_date"
val createTableQuery: String
get() = """CREATE TABLE $TABLE(
get() =
"""CREATE TABLE $TABLE(
$COL_ID INTEGER NOT NULL PRIMARY KEY,
$COL_MANGA_ID INTEGER NOT NULL,
$COL_SYNC_ID INTEGER NOT NULL,
@ -39,6 +44,8 @@ object TrackTable {
$COL_STATUS INTEGER NOT NULL,
$COL_SCORE FLOAT NOT NULL,
$COL_TRACKING_URL TEXT NOT NULL,
$COL_START_DATE LONG NOT NULL,
$COL_FINISH_DATE LONG NOT NULL,
UNIQUE ($COL_MANGA_ID, $COL_SYNC_ID) ON CONFLICT REPLACE,
FOREIGN KEY($COL_MANGA_ID) REFERENCES ${MangaTable.TABLE} (${MangaTable.COL_ID})
ON DELETE CASCADE
@ -49,4 +56,10 @@ object TrackTable {
val addLibraryId: String
get() = "ALTER TABLE $TABLE ADD COLUMN $COL_LIBRARY_ID INTEGER NULL"
val addStartDate: String
get() = "ALTER TABLE $TABLE ADD COLUMN $COL_START_DATE LONG NOT NULL DEFAULT 0"
val addFinishDate: String
get() = "ALTER TABLE $TABLE ADD COLUMN $COL_FINISH_DATE LONG NOT NULL DEFAULT 0"
}

View File

@ -6,11 +6,11 @@ import com.hippo.unifile.UniFile
import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.getOrDefault
import eu.kanade.tachiyomi.source.SourceManager
import java.util.concurrent.TimeUnit
import kotlinx.coroutines.flow.onEach
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.util.concurrent.TimeUnit
/**
* Cache where we dump the downloads directory from the filesystem. This class is needed because
@ -24,10 +24,10 @@ import java.util.concurrent.TimeUnit
* @param preferences the preferences of the app.
*/
class DownloadCache(
private val context: Context,
private val provider: DownloadProvider,
private val sourceManager: SourceManager,
private val preferences: PreferencesHelper = Injekt.get()
private val context: Context,
private val provider: DownloadProvider,
private val sourceManager: SourceManager,
private val preferences: PreferencesHelper = Injekt.get()
) {
/**
@ -47,19 +47,18 @@ class DownloadCache(
private var rootDir = RootDirectory(getDirectoryFromPreference())
init {
preferences.downloadsDirectory().asObservable()
.skip(1)
.subscribe {
lastRenew = 0L // invalidate cache
rootDir = RootDirectory(getDirectoryFromPreference())
}
preferences.downloadsDirectory().asFlow()
.onEach {
lastRenew = 0L // invalidate cache
rootDir = RootDirectory(getDirectoryFromPreference())
}
}
/**
* Returns the downloads directory from the user's preferences.
*/
private fun getDirectoryFromPreference(): UniFile {
val dir = preferences.downloadsDirectory().getOrDefault()
val dir = preferences.downloadsDirectory().get()
return UniFile.fromUri(context, Uri.parse(dir))
}
@ -100,7 +99,9 @@ class DownloadCache(
if (sourceDir != null) {
val mangaDir = sourceDir.files[provider.getMangaDirName(manga)]
if (mangaDir != null) {
return mangaDir.files.size
return mangaDir.files
.filter { !it.endsWith(Downloader.TMP_DIR_SUFFIX) }
.size
}
}
return 0
@ -124,26 +125,26 @@ class DownloadCache(
val onlineSources = sourceManager.getOnlineSources()
val sourceDirs = rootDir.dir.listFiles()
.orEmpty()
.associate { it.name to SourceDirectory(it) }
.mapNotNullKeys { entry ->
onlineSources.find { provider.getSourceDirName(it) == entry.key }?.id
}
.orEmpty()
.associate { it.name to SourceDirectory(it) }
.mapNotNullKeys { entry ->
onlineSources.find { provider.getSourceDirName(it) == entry.key }?.id
}
rootDir.files = sourceDirs
sourceDirs.values.forEach { sourceDir ->
val mangaDirs = sourceDir.dir.listFiles()
.orEmpty()
.associateNotNullKeys { it.name to MangaDirectory(it) }
.orEmpty()
.associateNotNullKeys { it.name to MangaDirectory(it) }
sourceDir.files = mangaDirs
mangaDirs.values.forEach { mangaDir ->
val chapterDirs = mangaDir.dir.listFiles()
.orEmpty()
.mapNotNull { it.name }
.toHashSet()
.orEmpty()
.mapNotNull { it.name }
.toHashSet()
mangaDir.files = chapterDirs
}
@ -231,27 +232,33 @@ class DownloadCache(
/**
* Class to store the files under the root downloads directory.
*/
private class RootDirectory(val dir: UniFile,
var files: Map<Long, SourceDirectory> = hashMapOf())
private class RootDirectory(
val dir: UniFile,
var files: Map<Long, SourceDirectory> = hashMapOf()
)
/**
* Class to store the files under a source directory.
*/
private class SourceDirectory(val dir: UniFile,
var files: Map<String, MangaDirectory> = hashMapOf())
private class SourceDirectory(
val dir: UniFile,
var files: Map<String, MangaDirectory> = hashMapOf()
)
/**
* Class to store the files under a manga directory.
*/
private class MangaDirectory(val dir: UniFile,
var files: Set<String> = hashSetOf())
private class MangaDirectory(
val dir: UniFile,
var files: Set<String> = hashSetOf()
)
/**
* Returns a new map containing only the key entries of [transform] that are not null.
*/
private inline fun <K, V, R> Map<out K, V>.mapNotNullKeys(transform: (Map.Entry<K?, V>) -> R?): Map<R, V> {
val destination = LinkedHashMap<R, V>()
forEach { element -> transform(element)?.let { destination.put(it, element.value) } }
forEach { element -> transform(element)?.let { destination[it] = element.value } }
return destination
}
@ -263,10 +270,9 @@ class DownloadCache(
for (element in this) {
val (key, value) = transform(element)
if (key != null) {
destination.put(key, value)
destination[key] = value
}
}
return destination
}
}

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