From d1d1d60c30ef02012bb7d189c2e080a88328f013 Mon Sep 17 00:00:00 2001 From: Bram van de Kerkhof Date: Tue, 28 Nov 2017 22:55:50 +0100 Subject: [PATCH 1/4] Fix automatic backups (#1074) * Fix automatic backups * Small fixes * small fixes --- .../data/backup/BackupCreateService.kt | 9 ++++--- .../tachiyomi/data/backup/BackupCreatorJob.kt | 3 +-- .../ui/setting/SettingsBackupController.kt | 25 +++++++++---------- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateService.kt index 9f3d577e7..cf3d2535c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreateService.kt @@ -46,7 +46,7 @@ class BackupCreateService : IntentService(NAME) { * Make a backup from library * * @param context context of application - * @param path path of Uri + * @param uri path of Uri * @param flags determines what to backup * @param isJob backup called from job */ @@ -80,7 +80,7 @@ class BackupCreateService : IntentService(NAME) { * @param uri path of Uri * @param isJob backup called from job */ - fun createBackupFromApp(uri: Uri, flags: Int, isJob: Boolean) { + private fun createBackupFromApp(uri: Uri, flags: Int, isJob: Boolean) { // Create root object val root = JsonObject() @@ -113,8 +113,9 @@ class BackupCreateService : IntentService(NAME) { try { // When BackupCreatorJob if (isJob) { - // Get dir of file - val dir = UniFile.fromUri(this, uri) + // Get dir of file and create + var dir = UniFile.fromUri(this, uri) + dir = dir.createDirectory("automatic") // Delete older backups val numberOfBackups = backupManager.numberOfBackups() diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreatorJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreatorJob.kt index 2e33f642c..49c9aaecf 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreatorJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreatorJob.kt @@ -8,13 +8,12 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.getOrDefault import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -import java.io.File class BackupCreatorJob : Job() { override fun onRunJob(params: Params): Result { val preferences = Injekt.get() - val uri = Uri.fromFile(File(preferences.backupsDirectory().getOrDefault())) + val uri = Uri.parse(preferences.backupsDirectory().getOrDefault()) val flags = BackupCreateService.BACKUP_ALL BackupCreateService.makeBackup(context, uri, flags, true) return Result.SUCCESS diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt index 6c1994835..f8c1c930b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt @@ -1,6 +1,5 @@ package eu.kanade.tachiyomi.ui.setting -import android.Manifest.permission.READ_EXTERNAL_STORAGE import android.Manifest.permission.WRITE_EXTERNAL_STORAGE import android.app.Activity import android.app.Dialog @@ -135,7 +134,7 @@ class SettingsBackupController : SettingsController() { preferences.backupsDirectory().asObservable() .subscribeUntilDestroy { path -> val dir = UniFile.fromUri(context, Uri.parse(path)) - summary = dir.filePath ?: path + summary = dir.filePath + "/automatic" } } val backupNumber = intListPreference { @@ -160,19 +159,19 @@ class SettingsBackupController : SettingsController() { when (requestCode) { CODE_BACKUP_DIR -> if (data != null && resultCode == Activity.RESULT_OK) { val activity = activity ?: return - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - val uri = Uri.fromFile(File(data.data.path)) - preferences.backupsDirectory().set(uri.toString()) - } else { - val uri = data.data + // Get uri of backup folder. + val uri = data.data + + // Get UriPermission so it's possible to write files post kitkat. + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { val flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION activity.contentResolver.takePersistableUriPermission(uri, flags) - - val file = UniFile.fromUri(activity, uri) - preferences.backupsDirectory().set(file.uri.toString()) } + + // Set backup Uri. + preferences.backupsDirectory().set(uri.toString()) } CODE_BACKUP_CREATE -> if (data != null && resultCode == Activity.RESULT_OK) { val activity = activity ?: return @@ -240,7 +239,7 @@ class SettingsBackupController : SettingsController() { .itemsDisabledIndices(0) .itemsCallbackMultiChoice(arrayOf(0, 1, 2, 3, 4), { _, positions, _ -> var flags = 0 - for (i in 1..positions.size - 1) { + for (i in 1 until positions.size) { when (positions[i]) { 1 -> flags = flags or BackupCreateService.BACKUP_CATEGORY 2 -> flags = flags or BackupCreateService.BACKUP_CHAPTER @@ -281,7 +280,7 @@ class SettingsBackupController : SettingsController() { override fun onCreateDialog(savedViewState: Bundle?): Dialog { val activity = activity!! - val unifile = UniFile.fromUri(activity, args.getParcelable(KEY_URI)) + val unifile = UniFile.fromUri(activity, args.getParcelable(KEY_URI)) return MaterialDialog.Builder(activity) .title(R.string.backup_created) .content(activity.getString(R.string.file_saved, unifile.filePath)) @@ -315,7 +314,7 @@ class SettingsBackupController : SettingsController() { val context = applicationContext if (context != null) { RestoringBackupDialog().showDialog(router, TAG_RESTORING_BACKUP_DIALOG) - BackupRestoreService.start(context, args.getParcelable(KEY_URI)) + BackupRestoreService.start(context, args.getParcelable(KEY_URI)) } } .build() From 28a21d0b8fb19dffe8ad1aa86ade2e06e8129769 Mon Sep 17 00:00:00 2001 From: inorichi Date: Tue, 28 Nov 2017 23:58:31 +0100 Subject: [PATCH 2/4] Minor changes to download cache. Also keep the library view, as recreation is expensive --- .../tachiyomi/data/download/DownloadCache.kt | 21 +++++++++---------- .../tachiyomi/ui/library/LibraryController.kt | 2 +- .../main/res/layout/chapters_controller.xml | 10 ++++----- app/src/main/res/layout/manga_controller.xml | 3 ++- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt index 7846ff7ae..d4b80ad65 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt @@ -26,7 +26,7 @@ import java.util.concurrent.TimeUnit class DownloadCache(private val context: Context, private val provider: DownloadProvider, private val sourceManager: SourceManager = Injekt.get(), - preferences: PreferencesHelper = Injekt.get()) { + private val preferences: PreferencesHelper = Injekt.get()) { /** * The interval after which this cache should be invalidated. 1 hour shouldn't cause major @@ -42,24 +42,23 @@ class DownloadCache(private val context: Context, /** * The root directory for downloads. */ - private var rootDir = setRootDir(preferences.downloadsDirectory().getOrDefault()) + private var rootDir = RootDirectory(getDirectoryFromPreference()) init { - setRootDir(preferences.downloadsDirectory().getOrDefault()) preferences.downloadsDirectory().asObservable() .skip(1) - .subscribe { setRootDir(it) } + .subscribe { + lastRenew = 0L // invalidate cache + rootDir = RootDirectory(getDirectoryFromPreference()) + } } /** - * Sets the root downloads directory and invalidates the cache. - * - * @param directory the downloads directory in [Uri] format. + * Returns the downloads directory from the user's preferences. */ - private fun setRootDir(directory: String): RootDirectory { - rootDir = RootDirectory(UniFile.fromUri(context, Uri.parse(directory))) - lastRenew = 0L - return rootDir + private fun getDirectoryFromPreference(): UniFile { + val dir = preferences.downloadsDirectory().getOrDefault() + return UniFile.fromUri(context, Uri.parse(dir)) } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt index a670a54c3..99c4fa897 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt @@ -429,7 +429,7 @@ class LibraryController( presenter.onOpenManga() router.pushController(RouterTransaction.with(MangaController(manga)) - .pushChangeHandler(FadeChangeHandler()) + .pushChangeHandler(FadeChangeHandler(false)) .popChangeHandler(FadeChangeHandler())) } diff --git a/app/src/main/res/layout/chapters_controller.xml b/app/src/main/res/layout/chapters_controller.xml index f3f521de9..2f2d19d56 100644 --- a/app/src/main/res/layout/chapters_controller.xml +++ b/app/src/main/res/layout/chapters_controller.xml @@ -1,11 +1,11 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> \ No newline at end of file + android:layout_height="match_parent" + android:background="?android:attr/colorBackground" /> \ No newline at end of file From 166fb9a8e451713ab165d1f170dc9f6f42492b31 Mon Sep 17 00:00:00 2001 From: inorichi Date: Wed, 29 Nov 2017 10:05:33 +0100 Subject: [PATCH 3/4] Resubscribe to library when a change of type enter occurs. Resolves #1093 --- .../eu/kanade/tachiyomi/ui/library/LibraryController.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt index 99c4fa897..fce944223 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt @@ -167,14 +167,10 @@ class LibraryController( super.onChangeStarted(handler, type) if (type.isEnter) { activity?.tabs?.setupWithViewPager(view?.view_pager) + presenter.subscribeLibrary() } } - override fun onAttach(view: View) { - super.onAttach(view) - presenter.subscribeLibrary() - } - override fun onDestroyView(view: View) { super.onDestroyView(view) adapter = null From d87c8428fece363c73ec519a9ca52abeaee56f81 Mon Sep 17 00:00:00 2001 From: inorichi Date: Wed, 29 Nov 2017 18:49:22 +0100 Subject: [PATCH 4/4] Release 0.6.5 --- app/build.gradle | 4 ++-- app/src/main/res/raw/changelog_release.xml | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b8dbf6ea5..8a54be230 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -38,8 +38,8 @@ android { minSdkVersion 16 targetSdkVersion 26 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - versionCode 27 - versionName "0.6.4" + versionCode 28 + versionName "0.6.5" buildConfigField "String", "COMMIT_COUNT", "\"${getCommitCount()}\"" buildConfigField "String", "COMMIT_SHA", "\"${getGitSha()}\"" diff --git a/app/src/main/res/raw/changelog_release.xml b/app/src/main/res/raw/changelog_release.xml index a7897d3c3..05e14ae52 100644 --- a/app/src/main/res/raw/changelog_release.xml +++ b/app/src/main/res/raw/changelog_release.xml @@ -1,5 +1,15 @@ + + Added a download cache for faster navigation. + + Enabled Cloudflare for Batoto. + + Fixed some issues with automatic backups. + + Fixed a bootloop issue with devices running Cyanogenmod 12 or 13. + + Added a global search feature with a new catalogue screen.