Stash
This commit is contained in:
parent
6afef7662b
commit
40ae8639a4
14 changed files with 166 additions and 23 deletions
|
@ -40,6 +40,7 @@ dependencies {
|
||||||
implementation 'androidx.core:core:1.2.0-alpha02'
|
implementation 'androidx.core:core:1.2.0-alpha02'
|
||||||
implementation 'androidx.fragment:fragment:1.2.0-alpha01'
|
implementation 'androidx.fragment:fragment:1.2.0-alpha01'
|
||||||
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02'
|
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02'
|
||||||
|
implementation 'com.github.Depau:kotlet-android:v0.2.4'
|
||||||
api 'com.google.guava:guava:27.0.1-android'
|
api 'com.google.guava:guava:27.0.1-android'
|
||||||
|
|
||||||
api 'com.github.codekidX:storage-chooser:2.0.4.2'
|
api 'com.github.codekidX:storage-chooser:2.0.4.2'
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
package eu.depau.etchdroid.broadcasts
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
|
import eu.depau.etchdroid.worker.dto.ProgressUpdateDTO
|
||||||
|
|
||||||
|
object JobProgressUpdateBroadcast {
|
||||||
|
val action = "eu.depau.etchdroid.broadcast.JOB_PROGRESS_UPDATE"
|
||||||
|
|
||||||
|
fun getIntent(dto: ProgressUpdateDTO) = Intent().apply {
|
||||||
|
action = this@JobProgressUpdateBroadcast.action
|
||||||
|
putExtra("data", dto)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
package eu.depau.etchdroid.utils.ktexts
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
||||||
|
|
||||||
|
fun Intent.sendBroadcast(context: Context) = context.sendBroadcast(this)
|
||||||
|
fun Intent.sendBroadcast(context: Context, receiverPermission: String) = context.sendBroadcast(this, receiverPermission)
|
||||||
|
|
||||||
|
fun Intent.sendLocalBroadcast(context: Context) = LocalBroadcastManager.getInstance(context).sendBroadcast(this)
|
||||||
|
fun Intent.sendLocalBroadcastSync(context: Context) = LocalBroadcastManager.getInstance(context).sendBroadcastSync(this)
|
|
@ -1,6 +1,6 @@
|
||||||
package eu.depau.etchdroid.worker
|
package eu.depau.etchdroid.worker
|
||||||
|
|
||||||
interface IAsyncWorker: IProgressSender {
|
interface IAsyncWorker: IProgressSender {
|
||||||
suspend fun run()
|
fun run()
|
||||||
suspend fun runStep(): Boolean
|
fun runStep(): Boolean
|
||||||
}
|
}
|
|
@ -1,7 +1,9 @@
|
||||||
package eu.depau.etchdroid.worker
|
package eu.depau.etchdroid.worker.abstractimpl
|
||||||
|
|
||||||
|
import eu.depau.etchdroid.worker.IAsyncWorker
|
||||||
|
|
||||||
abstract class AbstractAsyncWorker : IAsyncWorker, AbstractProgressSender() {
|
abstract class AbstractAsyncWorker : IAsyncWorker, AbstractProgressSender() {
|
||||||
override suspend fun run() {
|
override fun run() {
|
||||||
while (runStep()) {
|
while (runStep()) {
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package eu.depau.etchdroid.worker
|
package eu.depau.etchdroid.worker.abstractimpl
|
||||||
|
|
||||||
import eu.depau.etchdroid.worker.dto.ProgressUpdateDTO
|
import eu.depau.etchdroid.worker.dto.ProgressUpdateDTO
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ abstract class AbstractAutoProgressAsyncWorker(private val totalToDo: Long) : Ab
|
||||||
val timeRemainingMillis: Long = ((totalToDo - doneAccumulator) / speedUnitPerMillis).toLong()
|
val timeRemainingMillis: Long = ((totalToDo - doneAccumulator) / speedUnitPerMillis).toLong()
|
||||||
|
|
||||||
val dto = progressUpdateDTO.copy(
|
val dto = progressUpdateDTO.copy(
|
||||||
operationProgress = progress,
|
jobProgress = progress,
|
||||||
stepProgress = progress,
|
stepProgress = progress,
|
||||||
timeRemaining = timeRemainingMillis,
|
timeRemaining = timeRemainingMillis,
|
||||||
currentRate = speedUnitPerMillis * 1000
|
currentRate = speedUnitPerMillis * 1000
|
|
@ -1,5 +1,7 @@
|
||||||
package eu.depau.etchdroid.worker
|
package eu.depau.etchdroid.worker.abstractimpl
|
||||||
|
|
||||||
|
import eu.depau.etchdroid.worker.IProgressListener
|
||||||
|
import eu.depau.etchdroid.worker.IProgressSender
|
||||||
import eu.depau.etchdroid.worker.dto.ProgressDoneDTO
|
import eu.depau.etchdroid.worker.dto.ProgressDoneDTO
|
||||||
import eu.depau.etchdroid.worker.dto.ProgressStartDTO
|
import eu.depau.etchdroid.worker.dto.ProgressStartDTO
|
||||||
import eu.depau.etchdroid.worker.dto.ProgressUpdateDTO
|
import eu.depau.etchdroid.worker.dto.ProgressUpdateDTO
|
|
@ -1,10 +1,31 @@
|
||||||
package eu.depau.etchdroid.worker.dto
|
package eu.depau.etchdroid.worker.dto
|
||||||
|
|
||||||
|
import android.os.Parcel
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
import eu.depau.etchdroid.worker.enums.ErrorType
|
import eu.depau.etchdroid.worker.enums.ErrorType
|
||||||
|
import eu.depau.kotlet.android.parcelable.*
|
||||||
|
|
||||||
data class ProgressDoneDTO(
|
data class ProgressDoneDTO(
|
||||||
val operationId: Int,
|
val jobId: Long,
|
||||||
val error: ErrorType?,
|
val error: ErrorType?,
|
||||||
val errorData: Parcelable?
|
val errorData: Parcelable?
|
||||||
)
|
) : KotletParcelable {
|
||||||
|
constructor(parcel: Parcel) : this(
|
||||||
|
jobId = parcel.readLong(),
|
||||||
|
error = parcel.readNullable { parcel.readEnum<ErrorType>() },
|
||||||
|
errorData = parcel.readNullable { parcel.readParcelable(Parcelable::class.java.classLoader) }
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun writeToParcel(parcel: Parcel, flags: Int) {
|
||||||
|
parcel.apply {
|
||||||
|
writeLong(jobId)
|
||||||
|
writeNullable(error) { writeEnum(it) }
|
||||||
|
writeNullable(errorData) { writeParcelable(errorData, flags) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
@JvmField
|
||||||
|
val CREATOR = parcelableCreator(::ProgressDoneDTO)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,13 +1,41 @@
|
||||||
package eu.depau.etchdroid.worker.dto
|
package eu.depau.etchdroid.worker.dto
|
||||||
|
|
||||||
import eu.depau.etchdroid.worker.enums.OperationType
|
import android.os.Parcel
|
||||||
|
import eu.depau.etchdroid.worker.enums.JobType
|
||||||
import eu.depau.etchdroid.worker.enums.StepType
|
import eu.depau.etchdroid.worker.enums.StepType
|
||||||
import java.util.*
|
import eu.depau.kotlet.android.parcelable.KotletParcelable
|
||||||
|
import eu.depau.kotlet.android.parcelable.parcelableCreator
|
||||||
|
import eu.depau.kotlet.android.parcelable.readEnum
|
||||||
|
import eu.depau.kotlet.android.parcelable.writeEnum
|
||||||
|
|
||||||
data class ProgressStartDTO(
|
data class ProgressStartDTO(
|
||||||
val operationId: Int,
|
val jobId: Long,
|
||||||
val operationType: OperationType,
|
val jobType: JobType,
|
||||||
val inputName: String,
|
val inputName: String,
|
||||||
val outputName: String,
|
val outputName: String,
|
||||||
val steps: List<Pair<String, StepType>>
|
val stepsNamesResIDs: List<Int>
|
||||||
)
|
) : KotletParcelable {
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
constructor(parcel: Parcel) : this(
|
||||||
|
jobId = parcel.readLong(),
|
||||||
|
jobType = parcel.readEnum<JobType>()!!,
|
||||||
|
inputName = parcel.readString()!!,
|
||||||
|
outputName = parcel.readString()!!,
|
||||||
|
stepsNamesResIDs = (parcel.readSerializable() as Array<Int>).asList()
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun writeToParcel(parcel: Parcel, flags: Int) {
|
||||||
|
parcel.apply {
|
||||||
|
writeLong(jobId)
|
||||||
|
writeEnum(jobType)
|
||||||
|
writeString(inputName)
|
||||||
|
writeString(outputName)
|
||||||
|
writeSerializable(stepsNamesResIDs.toTypedArray())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
@JvmField
|
||||||
|
val CREATOR = parcelableCreator(::ProgressStartDTO)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,13 +1,42 @@
|
||||||
package eu.depau.etchdroid.worker.dto
|
package eu.depau.etchdroid.worker.dto
|
||||||
|
|
||||||
|
import android.os.Parcel
|
||||||
import eu.depau.etchdroid.worker.enums.RateUnit
|
import eu.depau.etchdroid.worker.enums.RateUnit
|
||||||
|
import eu.depau.kotlet.android.parcelable.*
|
||||||
|
|
||||||
data class ProgressUpdateDTO(
|
data class ProgressUpdateDTO(
|
||||||
val operationId: Int,
|
val jobId: Long,
|
||||||
val currentStep: Int,
|
val currentStep: Int,
|
||||||
val operationProgress: Double,
|
val jobProgress: Double,
|
||||||
val stepProgress: Double?,
|
val stepProgress: Double?,
|
||||||
val timeRemaining: Long?,
|
val timeRemaining: Long?,
|
||||||
val currentRate: Double?,
|
val currentRate: Double?,
|
||||||
val rateUnit: RateUnit?
|
val rateUnit: RateUnit?
|
||||||
)
|
) : KotletParcelable {
|
||||||
|
constructor(parcel: Parcel) : this(
|
||||||
|
jobId = parcel.readLong(),
|
||||||
|
currentStep = parcel.readInt(),
|
||||||
|
jobProgress = parcel.readDouble(),
|
||||||
|
stepProgress = parcel.readNullable { parcel.readDouble() },
|
||||||
|
timeRemaining = parcel.readNullable { parcel.readLong() },
|
||||||
|
currentRate = parcel.readNullable { parcel.readDouble() },
|
||||||
|
rateUnit = parcel.readNullable { parcel.readEnum<RateUnit>() }
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun writeToParcel(parcel: Parcel, flags: Int) {
|
||||||
|
parcel.apply {
|
||||||
|
writeLong(jobId)
|
||||||
|
writeInt(currentStep)
|
||||||
|
writeDouble(jobProgress)
|
||||||
|
writeNullable(stepProgress) { writeDouble(it) }
|
||||||
|
writeNullable(timeRemaining) { writeLong(it) }
|
||||||
|
writeNullable(currentRate) { writeDouble(it) }
|
||||||
|
writeNullable(rateUnit) { writeEnum(rateUnit) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
@JvmField
|
||||||
|
val CREATOR = parcelableCreator(::ProgressUpdateDTO)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
package eu.depau.etchdroid.worker.enums
|
package eu.depau.etchdroid.worker.enums
|
||||||
|
|
||||||
enum class OperationType {
|
enum class JobType {
|
||||||
FLASH_RAW_IMAGE,
|
FLASH_RAW_IMAGE,
|
||||||
FLASH_DMG,
|
FLASH_DMG,
|
||||||
FLASH_ELTORITO,
|
FLASH_ELTORITO,
|
|
@ -0,0 +1,29 @@
|
||||||
|
package eu.depau.etchdroid.worker.impl
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import eu.depau.etchdroid.worker.IProgressListener
|
||||||
|
import eu.depau.etchdroid.worker.dto.ProgressDoneDTO
|
||||||
|
import eu.depau.etchdroid.worker.dto.ProgressStartDTO
|
||||||
|
import eu.depau.etchdroid.worker.dto.ProgressUpdateDTO
|
||||||
|
|
||||||
|
class BroadcastProgressForwarder(
|
||||||
|
val jobId: Long,
|
||||||
|
val context: Context
|
||||||
|
|
||||||
|
): IProgressListener {
|
||||||
|
override fun notifyStart(dto: ProgressStartDTO) {
|
||||||
|
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun notifyProgress(dto: ProgressUpdateDTO) {
|
||||||
|
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun notifyDone(dto: ProgressDoneDTO) {
|
||||||
|
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
fun stopForwarding() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,13 @@
|
||||||
package eu.depau.etchdroid.worker.impl
|
package eu.depau.etchdroid.worker.impl
|
||||||
|
|
||||||
import eu.depau.etchdroid.worker.AbstractAutoProgressAsyncWorker
|
import eu.depau.etchdroid.worker.abstractimpl.AbstractAutoProgressAsyncWorker
|
||||||
|
import eu.depau.etchdroid.worker.dto.ProgressUpdateDTO
|
||||||
|
|
||||||
class Dmg2OutputStreamConvertAsyncService: AbstractAutoProgressAsyncWorker() {
|
class Dmg2OutputStreamConvertAsyncService(private val totalToDo: Long): AbstractAutoProgressAsyncWorker(totalToDo) {
|
||||||
|
override val progressUpdateDTO: ProgressUpdateDTO
|
||||||
|
get() = TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates.
|
||||||
|
|
||||||
|
override fun runStep(): Boolean {
|
||||||
|
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
package eu.depau.etchdroid.worker.impl
|
package eu.depau.etchdroid.worker.impl
|
||||||
|
|
||||||
import eu.depau.etchdroid.worker.AbstractAutoProgressAsyncWorker
|
import eu.depau.etchdroid.worker.abstractimpl.AbstractAutoProgressAsyncWorker
|
||||||
import eu.depau.etchdroid.worker.dto.ProgressUpdateDTO
|
import eu.depau.etchdroid.worker.dto.ProgressUpdateDTO
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
import java.io.OutputStream
|
import java.io.OutputStream
|
||||||
|
@ -16,7 +16,7 @@ open class Input2OutputStreamCopyAsyncWorker(
|
||||||
|
|
||||||
private val buffer = ByteArray(chunkSize)
|
private val buffer = ByteArray(chunkSize)
|
||||||
|
|
||||||
override suspend fun runStep(): Boolean {
|
override fun runStep(): Boolean {
|
||||||
val readBytes = source.read(buffer)
|
val readBytes = source.read(buffer)
|
||||||
|
|
||||||
if (readBytes < 0)
|
if (readBytes < 0)
|
||||||
|
|
Loading…
Reference in a new issue