Cleanup and document DefaultInitialSyncProgressService
This commit is contained in:
parent
242e60fcaa
commit
38da4b9ee5
|
@ -15,6 +15,7 @@
|
||||||
*/
|
*/
|
||||||
package im.vector.matrix.android.internal.session
|
package im.vector.matrix.android.internal.session
|
||||||
|
|
||||||
|
import androidx.annotation.StringRes
|
||||||
import androidx.lifecycle.LiveData
|
import androidx.lifecycle.LiveData
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import im.vector.matrix.android.api.session.InitialSyncProgressService
|
import im.vector.matrix.android.api.session.InitialSyncProgressService
|
||||||
|
@ -25,31 +26,33 @@ import javax.inject.Inject
|
||||||
@SessionScope
|
@SessionScope
|
||||||
class DefaultInitialSyncProgressService @Inject constructor() : InitialSyncProgressService {
|
class DefaultInitialSyncProgressService @Inject constructor() : InitialSyncProgressService {
|
||||||
|
|
||||||
var status = MutableLiveData<InitialSyncProgressService.Status>()
|
private var status = MutableLiveData<InitialSyncProgressService.Status>()
|
||||||
|
|
||||||
var rootTask: TaskInfo? = null
|
private var rootTask: TaskInfo? = null
|
||||||
|
|
||||||
override fun getLiveStatus(): LiveData<InitialSyncProgressService.Status?> {
|
override fun getLiveStatus(): LiveData<InitialSyncProgressService.Status?> {
|
||||||
return status
|
return status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun startTask(@StringRes nameRes: Int, totalProgress: Int, parentWeight: Float = 1f) {
|
||||||
fun startTask(nameRes: Int, totalProgress: Int, parentWeight: Float = 1f) {
|
// Create a rootTask, or add a child to the leaf
|
||||||
if (rootTask == null) {
|
if (rootTask == null) {
|
||||||
rootTask = TaskInfo(nameRes, totalProgress)
|
rootTask = TaskInfo(nameRes, totalProgress)
|
||||||
} else {
|
} else {
|
||||||
val currentLeaf = rootTask!!.leaf()
|
val currentLeaf = rootTask!!.leaf()
|
||||||
val newTask = TaskInfo(nameRes, totalProgress)
|
|
||||||
newTask.parent = currentLeaf
|
val newTask = TaskInfo(nameRes,
|
||||||
newTask.offset = currentLeaf.currentProgress
|
totalProgress,
|
||||||
|
currentLeaf,
|
||||||
|
parentWeight)
|
||||||
|
|
||||||
currentLeaf.child = newTask
|
currentLeaf.child = newTask
|
||||||
newTask.parentWeight = parentWeight
|
|
||||||
}
|
}
|
||||||
reportProgress(0)
|
reportProgress(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun reportProgress(progress: Int) {
|
fun reportProgress(progress: Int) {
|
||||||
rootTask?.leaf()?.incrementProgress(progress)
|
rootTask?.leaf()?.setProgress(progress)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun endTask(nameRes: Int) {
|
fun endTask(nameRes: Int) {
|
||||||
|
@ -58,7 +61,7 @@ class DefaultInitialSyncProgressService @Inject constructor() : InitialSyncProgr
|
||||||
//close it
|
//close it
|
||||||
val parent = endedTask.parent
|
val parent = endedTask.parent
|
||||||
parent?.child = null
|
parent?.child = null
|
||||||
parent?.incrementProgress(endedTask.offset + (endedTask.totalProgress * endedTask.parentWeight).toInt())
|
parent?.setProgress(endedTask.offset + (endedTask.totalProgress * endedTask.parentWeight).toInt())
|
||||||
}
|
}
|
||||||
if (endedTask?.parent == null) {
|
if (endedTask?.parent == null) {
|
||||||
status.postValue(null)
|
status.postValue(null)
|
||||||
|
@ -71,14 +74,17 @@ class DefaultInitialSyncProgressService @Inject constructor() : InitialSyncProgr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inner class TaskInfo(var nameRes: Int,
|
private inner class TaskInfo(@StringRes var nameRes: Int,
|
||||||
var totalProgress: Int) {
|
var totalProgress: Int,
|
||||||
var parent: TaskInfo? = null
|
var parent: TaskInfo? = null,
|
||||||
|
var parentWeight: Float = 1f,
|
||||||
|
var offset: Int = parent?.currentProgress ?: 0) {
|
||||||
var child: TaskInfo? = null
|
var child: TaskInfo? = null
|
||||||
var parentWeight: Float = 1f
|
|
||||||
var currentProgress: Int = 0
|
var currentProgress: Int = 0
|
||||||
var offset: Int = 0
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the further child
|
||||||
|
*/
|
||||||
fun leaf(): TaskInfo {
|
fun leaf(): TaskInfo {
|
||||||
var last = this
|
var last = this
|
||||||
while (last.child != null) {
|
while (last.child != null) {
|
||||||
|
@ -87,26 +93,27 @@ class DefaultInitialSyncProgressService @Inject constructor() : InitialSyncProgr
|
||||||
return last
|
return last
|
||||||
}
|
}
|
||||||
|
|
||||||
fun incrementProgress(progress: Int) {
|
/**
|
||||||
|
* Set progress of the parent if any (which will post value), or post the value
|
||||||
|
*/
|
||||||
|
fun setProgress(progress: Int) {
|
||||||
currentProgress = progress
|
currentProgress = progress
|
||||||
// val newProgress = Math.min(currentProgress + progress, totalProgress)
|
// val newProgress = Math.min(currentProgress + progress, totalProgress)
|
||||||
parent?.let {
|
parent?.let {
|
||||||
val parentProgress = (currentProgress * parentWeight).toInt()
|
val parentProgress = (currentProgress * parentWeight).toInt()
|
||||||
it.incrementProgress(offset + parentProgress)
|
it.setProgress(offset + parentProgress)
|
||||||
}
|
} ?: run {
|
||||||
if (parent == null) {
|
Timber.e("--- ${leaf().nameRes}: $currentProgress")
|
||||||
Timber.e("--- ${leaf().nameRes}: ${currentProgress}")
|
|
||||||
status.postValue(
|
status.postValue(
|
||||||
InitialSyncProgressService.Status(leaf().nameRes, currentProgress)
|
InitialSyncProgressService.Status(leaf().nameRes, currentProgress)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun <T> reportSubtask(reporter: DefaultInitialSyncProgressService?,
|
inline fun <T> reportSubtask(reporter: DefaultInitialSyncProgressService?,
|
||||||
nameRes: Int,
|
@StringRes nameRes: Int,
|
||||||
totalProgress: Int,
|
totalProgress: Int,
|
||||||
parentWeight: Float = 1f,
|
parentWeight: Float = 1f,
|
||||||
block: () -> T): T {
|
block: () -> T): T {
|
||||||
|
|
Loading…
Reference in New Issue