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
This commit is contained in:
NerdNumber9
2018-02-02 12:11:09 -05:00
parent e9bea8ed47
commit 8f51abfc97
9 changed files with 128 additions and 97 deletions

View File

@@ -12,7 +12,6 @@ import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.source.online.LewdSource
import eu.kanade.tachiyomi.util.asJsoup
import exh.metadata.EX_DATE_FORMAT
import exh.metadata.ignore
import exh.metadata.models.ExGalleryMetadata
import exh.metadata.models.Tag
import exh.metadata.nullIfBlank
@@ -20,6 +19,7 @@ import exh.metadata.parseHumanReadableByteCount
import exh.ui.login.LoginController
import exh.util.UriFilter
import exh.util.UriGroup
import exh.util.ignore
import exh.util.urlImportFetchSearchManga
import okhttp3.CacheControl
import okhttp3.Headers

View File

@@ -571,6 +571,8 @@ class LibraryController(
favSyncDialog?.dismiss()
favSyncDialog = null
oldSyncStatus = null
//Clear flags
releaseSyncLocks()
}
private fun buildDialog() = activity?.let {
@@ -586,13 +588,25 @@ class LibraryController(
?.show()
}
private fun takeSyncLocks() {
activity?.window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
private fun releaseSyncLocks() {
activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
}
private fun updateSyncStatus(status: FavoritesSyncStatus) {
when(status) {
is FavoritesSyncStatus.Idle -> {
releaseSyncLocks()
favSyncDialog?.dismiss()
favSyncDialog = null
}
is FavoritesSyncStatus.Error -> {
releaseSyncLocks()
favSyncDialog?.dismiss()
favSyncDialog = buildDialog()
?.title("Favorites sync error")
@@ -606,6 +620,8 @@ class LibraryController(
}
is FavoritesSyncStatus.Processing,
is FavoritesSyncStatus.Initializing -> {
takeSyncLocks()
if(favSyncDialog == null || (oldSyncStatus != null
&& oldSyncStatus !is FavoritesSyncStatus.Initializing
&& oldSyncStatus !is FavoritesSyncStatus.Processing))
@@ -613,24 +629,6 @@ class LibraryController(
favSyncDialog?.setContent(status.message)
}
is FavoritesSyncStatus.Complete -> {
favSyncDialog?.dismiss()
if(status.errors.isNotEmpty()) {
favSyncDialog = buildDialog()
?.title("Favorites sync complete with errors")
?.content("Some errors occurred during the sync process:\n\n"
+ status.errors.joinToString("\n"))
?.cancelable(false)
?.positiveText("Ok")
?.onPositive { _, _ ->
presenter.favoritesSync.status.onNext(FavoritesSyncStatus.Idle())
}
?.show()
} else {
presenter.favoritesSync.status.onNext(FavoritesSyncStatus.Idle())
}
}
}
oldSyncStatus = status
}

View File

@@ -10,6 +10,7 @@ import eu.kanade.tachiyomi.util.toast
import exh.favorites.FavoritesIntroDialog
import exh.favorites.LocalFavoritesStorage
import exh.ui.login.LoginController
import exh.util.trans
import rx.android.schedulers.AndroidSchedulers
import rx.schedulers.Schedulers
@@ -163,7 +164,13 @@ class SettingsEhController : SettingsController() {
.content("Resetting the sync state can cause your next sync to be extremely slow.")
.positiveText("Yes")
.onPositive { _, _ ->
LocalFavoritesStorage().clearSnapshots()
LocalFavoritesStorage().apply {
getRealm().use {
it.trans {
clearSnapshots(it)
}
}
}
it.toast("Sync state reset", Toast.LENGTH_LONG)
}
.negativeText("No")

View File

@@ -10,6 +10,7 @@ import android.content.IntentFilter
import android.content.pm.PackageManager
import android.content.res.Resources
import android.net.ConnectivityManager
import android.net.wifi.WifiManager
import android.os.PowerManager
import android.support.annotation.StringRes
import android.support.v4.app.NotificationCompat
@@ -116,6 +117,12 @@ val Context.connectivityManager: ConnectivityManager
val Context.powerManager: PowerManager
get() = getSystemService(Context.POWER_SERVICE) as PowerManager
/**
* Property to get the wifi manager from the context.
*/
val Context.wifiManager: WifiManager
get() = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
/**
* Function used to send a local broadcast asynchronous
*