~williamvds/taskwarrior-android

c11c8de0a040d9b54358d38fd071fb495cdeb890 — williamvds 4 years ago 5bf91c7
Convert TagDialog to an AppForm
M app/src/main/java/kvj/taskw/ui/TagDialog.kt => app/src/main/java/kvj/taskw/ui/TagDialog.kt +45 -33
@@ 2,69 2,81 @@ package kvj.taskw.ui

import java.util.UUID

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.text.TextUtils

import kvj.taskw.App
import kvj.taskw.R
import kvj.taskw.data.Controller
import kvj.taskw.ui.AppActivity.Companion.Style

import kotlinx.android.parcel.Parcelize
import kotlinx.android.synthetic.main.dialog_add_tag.*

class TagDialog : AppActivity() {
class TagDialog : AppForm<TagDialog.Form>() {
    override val style = Style.DIALOG

    internal var controller = App.controller<Controller>()
    private val form = Form()
    override val layout = R.layout.dialog_add_tag

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        form.load(intent.extras)
        if (!form.valid) finish()
        cancel.setOnClickListener { cancel() }
        ok.setOnClickListener { submit() }
    }

        setContentView(R.layout.dialog_add_tag)
    override fun submit() {
        super.submit()

        cancel.setOnClickListener { finish() }
        ok.setOnClickListener { doSave() }
        if (validate())
            SaveTask(this).execute(data.tag)
    }

    override fun onBackPressed() = finish()
    override fun loadFromForm() {
        text.setText(data.tag)
    }

    override fun saveToForm() {
        data.tag = text.text.toString()
    }

    private fun doSave() {
        val text = form.tag
    override fun hasChanges() = !data.tag.isNullOrBlank()

        if (TextUtils.isEmpty(text)) { // Nothing to save
            controller.messageShort("Input is mandatory")
            return
    override fun validate(): Boolean {
        val tag = data.tag
        if (tag.isNullOrBlank()) {
            controller.messageShort(getString(R.string.error_no_input))
            return false
        }
        else if (tag.contains("\\s".toRegex())) {
            controller.messageShort(getString(R.string.error_tag_whitespace))
            return false
        }

        SaveTask(this).execute(text)
        return true
    }

    private inner class Form {
        var account: String? = null
        var uuid: UUID? = null
    @Parcelize
    data class Form @JvmOverloads constructor(
            val account: String,
            val uuid: UUID,
            var tag: String? = null
    ) : FormData

        val tag: String
            get() = text.text.toString()
        val valid: Boolean
            get() = account != null && uuid != null
    companion object {
        @JvmStatic
        fun start(activity: Activity, data: Form) {
            val intent = Intent(activity, TagDialog::class.java).apply {
                putExtra(App.KEY_EDIT_DATA, data)
            }

        fun load(data: Bundle?) {
            data ?: return
            account = data.getString(App.KEY_ACCOUNT)
            uuid    = data.getSerializable(App.KEY_EDIT_UUID) as UUID
            activity.startActivityForResult(intent, App.TAG_REQUEST)
        }
    }

    companion object {
        private class SaveTask(activity: TagDialog)
            : StaticAsyncTask<TagDialog, String, Void, String?>(activity) {
            override fun TagDialog.background(vararg params: String): String? {
                val accountController = controller.accountController(form.account)
                return accountController.taskAddTag(form.uuid!!, params[0])
                val accountController = controller.accountController(data.account)
                return accountController.taskAddTag(data.uuid, params[0])
            }

            override fun TagDialog.finish(result: String?) {

M app/src/main/java/kvj/taskw/ui/TaskActivity.kt => app/src/main/java/kvj/taskw/ui/TaskActivity.kt +4 -5
@@ 75,11 75,10 @@ class TaskActivity : AppActivity() {
        }

        add_tag.setOnClickListener {
            val intent = Intent(this, TagDialog::class.java).apply {
                putExtra(App.KEY_ACCOUNT, task.account.toString())
                putExtra(App.KEY_EDIT_UUID, task.uuid)
            }
            startActivityForResult(intent, App.TAG_REQUEST)
            TagDialog.start(this, TagDialog.Form(
                task.account.toString(),
                task.uuid
            ))
        }

        fun openEditor() {

M app/src/main/res/values/strings.xml => app/src/main/res/values/strings.xml +4 -0
@@ 93,6 93,7 @@

    <!-- Form -->
    <string name="form_discard_confirm">There are some changes, discard them?</string>
    <string name="error_no_input">Input is mandatory</string>

    <!-- Custom command dialog -->
    <string name="command_prompt_hint">Arguments</string>


@@ 107,4 108,7 @@
    <string name="annotation">Annotation</string>
    <string name="add_annotation">Annotate</string>
    <string name="no_annotations">No annotations</string>

    <!-- Tag dialog -->
    <string name="error_tag_whitespace">Tags must not contian whitespace</string>
</resources>