Category-specific auto download (#701)

* Category-specific auto download
This commit is contained in:
Bram van de Kerkhof 2017-03-18 13:09:40 -04:00 committed by GitHub
parent 3be9881997
commit 68c4116327
7 changed files with 62 additions and 7 deletions

View file

@ -57,6 +57,9 @@ class LibraryUpdateService : Service() {
*/ */
val preferences: PreferencesHelper by injectLazy() val preferences: PreferencesHelper by injectLazy()
/**
* Download Manager
*/
val downloadManager: DownloadManager by injectLazy() val downloadManager: DownloadManager by injectLazy()
/** /**
@ -216,7 +219,7 @@ class LibraryUpdateService : Service() {
.filter { it.category in categoriesToUpdate } .filter { it.category in categoriesToUpdate }
.distinctBy { it.id } .distinctBy { it.id }
else else
db.getFavoriteMangas().executeAsBlocking().distinctBy { it.id } db.getLibraryMangas().executeAsBlocking().distinctBy { it.id }
} }
if (!intent.getBooleanExtra(UPDATE_DETAILS, false) && preferences.updateOnlyNonCompleted()) { if (!intent.getBooleanExtra(UPDATE_DETAILS, false) && preferences.updateOnlyNonCompleted()) {
@ -238,8 +241,16 @@ class LibraryUpdateService : Service() {
fun updateChapterList(mangaToUpdate: List<Manga>): Observable<Manga> { fun updateChapterList(mangaToUpdate: List<Manga>): Observable<Manga> {
// Initialize the variables holding the progress of the updates. // Initialize the variables holding the progress of the updates.
val count = AtomicInteger(0) val count = AtomicInteger(0)
// List containing new updates
val newUpdates = ArrayList<Manga>() val newUpdates = ArrayList<Manga>()
// list containing failed updates
val failedUpdates = ArrayList<Manga>() val failedUpdates = ArrayList<Manga>()
// List containing categories that get included in downloads.
val categoriesToDownload = preferences.downloadNewCategories().getOrDefault().map(String::toInt)
// Boolean to determine if user wants to automatically download new chapters.
val downloadNew = preferences.downloadNew().getOrDefault()
// Boolean to determine if DownloadManager has downloads
var hasDownloads = false
// Emit each manga and update it sequentially. // Emit each manga and update it sequentially.
return Observable.from(mangaToUpdate) return Observable.from(mangaToUpdate)
@ -254,10 +265,13 @@ class LibraryUpdateService : Service() {
Pair(emptyList<Chapter>(), emptyList<Chapter>()) Pair(emptyList<Chapter>(), emptyList<Chapter>())
} }
// Filter out mangas without new chapters (or failed). // Filter out mangas without new chapters (or failed).
.filter { pair -> pair.first.size > 0 } .filter { pair -> pair.first.isNotEmpty() }
.doOnNext { .doOnNext {
if (preferences.downloadNew()) { if (downloadNew) {
downloadChapters(manga, it.first) if (categoriesToDownload.isEmpty() || manga.category in categoriesToDownload) {
downloadChapters(manga, it.first)
hasDownloads = true
}
} }
} }
// Convert to the manga that contains new chapters. // Convert to the manga that contains new chapters.
@ -277,8 +291,10 @@ class LibraryUpdateService : Service() {
cancelNotification() cancelNotification()
} else { } else {
showResultNotification(newUpdates, failedUpdates) showResultNotification(newUpdates, failedUpdates)
if (preferences.downloadNew()) { if (downloadNew) {
DownloadService.start(this) if (hasDownloads) {
DownloadService.start(this)
}
} }
} }
} }

View file

@ -93,6 +93,8 @@ class PreferenceKeys(context: Context) {
val downloadNew = context.getString(R.string.pref_download_new_key) val downloadNew = context.getString(R.string.pref_download_new_key)
val downloadNewCategories = context.getString(R.string.pref_download_new_categories_key)
fun sourceUsername(sourceId: Long) = "pref_source_username_$sourceId" fun sourceUsername(sourceId: Long) = "pref_source_username_$sourceId"
fun sourcePassword(sourceId: Long) = "pref_source_password_$sourceId" fun sourcePassword(sourceId: Long) = "pref_source_password_$sourceId"

View file

@ -142,7 +142,9 @@ class PreferencesHelper(val context: Context) {
fun hiddenCatalogues() = rxPrefs.getStringSet("hidden_catalogues", emptySet()) fun hiddenCatalogues() = rxPrefs.getStringSet("hidden_catalogues", emptySet())
fun downloadNew() = prefs.getBoolean(keys.downloadNew, false) fun downloadNew() = rxPrefs.getBoolean(keys.downloadNew, false)
fun downloadNewCategories() = rxPrefs.getStringSet(keys.downloadNewCategories, emptySet())
fun lang() = prefs.getString(keys.lang, "") fun lang() = prefs.getString(keys.lang, "")

View file

@ -19,10 +19,12 @@ import com.nononsenseapps.filepicker.FilePickerActivity
import com.nononsenseapps.filepicker.FilePickerFragment import com.nononsenseapps.filepicker.FilePickerFragment
import com.nononsenseapps.filepicker.LogicHandler import com.nononsenseapps.filepicker.LogicHandler
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.getOrDefault import eu.kanade.tachiyomi.data.preference.getOrDefault
import eu.kanade.tachiyomi.util.inflate import eu.kanade.tachiyomi.util.inflate
import eu.kanade.tachiyomi.util.plusAssign import eu.kanade.tachiyomi.util.plusAssign
import net.xpece.android.support.preference.MultiSelectListPreference
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import java.io.File import java.io.File
@ -41,8 +43,12 @@ class SettingsDownloadsFragment : SettingsFragment() {
private val preferences: PreferencesHelper by injectLazy() private val preferences: PreferencesHelper by injectLazy()
private val db: DatabaseHelper by injectLazy()
val downloadDirPref: Preference by bindPref(R.string.pref_download_directory_key) val downloadDirPref: Preference by bindPref(R.string.pref_download_directory_key)
val downloadCategory: MultiSelectListPreference by bindPref(R.string.pref_download_new_categories_key)
override fun onViewCreated(view: View, savedState: Bundle?) { override fun onViewCreated(view: View, savedState: Bundle?) {
super.onViewCreated(view, savedState) super.onViewCreated(view, savedState)
@ -92,6 +98,29 @@ class SettingsDownloadsFragment : SettingsFragment() {
dir.createFile(".nomedia") dir.createFile(".nomedia")
} }
} }
subscriptions += preferences.downloadNew().asObservable()
.subscribe { downloadCategory.isVisible = it }
val dbCategories = db.getCategories().executeAsBlocking()
downloadCategory.apply {
entries = dbCategories.map { it.name }.toTypedArray()
entryValues = dbCategories.map { it.id.toString() }.toTypedArray()
}
subscriptions += preferences.downloadNewCategories().asObservable()
.subscribe {
val selectedCategories = it
.mapNotNull { id -> dbCategories.find { it.id == id.toInt() } }
.sortedBy { it.order }
val summary = if (selectedCategories.isEmpty())
getString(R.string.all)
else
selectedCategories.joinToString { it.name }
downloadCategory.summary = summary
}
} }
fun getExternalFilesDirs(): List<File> { fun getExternalFilesDirs(): List<File> {

View file

@ -68,6 +68,7 @@
<string name="pref_last_catalogue_source_key" translatable="false">last_catalogue_source</string> <string name="pref_last_catalogue_source_key" translatable="false">last_catalogue_source</string>
<string name="pref_download_new_key" translatable="false">download_new</string> <string name="pref_download_new_key" translatable="false">download_new</string>
<string name="pref_download_new_categories_key" translatable="false">download_new_categories</string>
<!-- String Fonts --> <!-- String Fonts -->
<string name="font_roboto_medium" translatable="false">sans-serif</string> <string name="font_roboto_medium" translatable="false">sans-serif</string>

View file

@ -176,6 +176,7 @@
<string name="fourth_to_last">Fourth to last chapter</string> <string name="fourth_to_last">Fourth to last chapter</string>
<string name="fifth_to_last">Fifth to last chapter</string> <string name="fifth_to_last">Fifth to last chapter</string>
<string name="pref_download_new">Download new chapters</string> <string name="pref_download_new">Download new chapters</string>
<string name="pref_download_new_categories">Categories to include in download</string>
<!-- Sync section --> <!-- Sync section -->
<string name="services">Services</string> <string name="services">Services</string>

View file

@ -53,6 +53,10 @@
android:key="@string/pref_download_new_key" android:key="@string/pref_download_new_key"
android:title="@string/pref_download_new"/> android:title="@string/pref_download_new"/>
<MultiSelectListPreference
android:key="@string/pref_download_new_categories_key"
android:title="@string/pref_download_new_categories" />
</PreferenceScreen> </PreferenceScreen>
</PreferenceScreen> </PreferenceScreen>