提交 082b600e 编写于 作者: B Ben Weiss 提交者: Ben Weiss

Cleaner continuation creation

Introduce local extensino functions for conditional chaining.
上级 b5224ee3
......@@ -62,12 +62,11 @@ class FilterActivity : AppCompatActivity() {
val applyGrayScale = filterGrayscale.isChecked
val applyBlur = filterBlur.isChecked
val save = save.isChecked
val upload = upload.isChecked
val imageOperations = ImageOperations(
applicationContext, imageUri,
applyWaterColor, applyGrayScale, applyBlur,
save, upload
save
)
viewModel.apply(imageOperations)
......
......@@ -32,8 +32,7 @@ class FilterViewModel(application: Application) : ViewModel() {
private val workManager = WorkManager.getInstance(application)
internal val workInfo =
workManager.getWorkInfosByTagLiveData(Constants.TAG_OUTPUT)
.map { it[0] }
workManager.getWorkInfosByTagLiveData(Constants.TAG_OUTPUT).map { it[0] }
internal fun apply(imageOperations: ImageOperations) {
imageOperations.continuation.enqueue()
......
......@@ -40,52 +40,58 @@ import com.example.background.workers.filters.WaterColorFilterWorker
@SuppressLint("EnqueueWork")
class ImageOperations(
context: Context,
private val imageUri: Uri,
imageUri: Uri,
waterColor: Boolean = false,
grayScale: Boolean = false,
blur: Boolean = false,
save: Boolean = false,
upload: Boolean = false
save: Boolean = false
) {
private lateinit var inputData: Data
private val imageInputData = workDataOf(Constants.KEY_IMAGE_URI to imageUri.toString())
val continuation: WorkContinuation
init {
var tmpContinuation = WorkManager.getInstance(context)
continuation = WorkManager.getInstance(context)
.beginUniqueWork(
Constants.IMAGE_MANIPULATION_WORK_NAME,
ExistingWorkPolicy.REPLACE,
OneTimeWorkRequest.from(CleanupWorker::class.java)
).thenMaybe<WaterColorFilterWorker>(waterColor)
.thenMaybe<GrayScaleFilterWorker>(grayScale)
.thenMaybe<BlurEffectFilterWorker>(blur)
.then(
if (save) {
workRequest<SaveImageToGalleryWorker>(tag = Constants.TAG_OUTPUT)
} else /* upload */ {
workRequest<UploadWorker>(tag = Constants.TAG_OUTPUT)
}
)
}
if (waterColor) {
tmpContinuation = tmpContinuation.then(workRequest<WaterColorFilterWorker>())
}
if (grayScale) {
tmpContinuation = tmpContinuation.then(workRequest<GrayScaleFilterWorker>())
}
if (blur) {
tmpContinuation = tmpContinuation.then(workRequest<BlurEffectFilterWorker>())
}
if (save) {
tmpContinuation = tmpContinuation.then(workRequest<SaveImageToGalleryWorker>(true))
/**
* Applies a [ListenableWorker] to a [WorkContinuation] in case [apply] is `true`.
*/
private inline fun <reified T : ListenableWorker> WorkContinuation.thenMaybe(
apply: Boolean
): WorkContinuation {
return if (apply) {
then(workRequest<T>())
} else {
this
}
if (upload) {
tmpContinuation = tmpContinuation.then(workRequest<UploadWorker>(true))
}
continuation = tmpContinuation
}
private inline fun <reified T : ListenableWorker> workRequest(shouldOutput: Boolean = false) =
/**
* Creates a [OneTimeWorkRequest] with the given inputData and a [tag] if set.
*/
private inline fun <reified T : ListenableWorker> workRequest(
inputData: Data = imageInputData,
tag: String? = null
) =
OneTimeWorkRequestBuilder<T>().apply {
if (!::inputData.isInitialized) {
inputData = workDataOf(Constants.KEY_IMAGE_URI to imageUri.toString())
setInputData(inputData)
}
if (shouldOutput) {
addTag(Constants.TAG_OUTPUT)
setInputData(inputData)
if (!tag.isNullOrEmpty()) {
addTag(tag)
}
}.build()
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册