~williamvds/taskwarrior-android

2fe7f184605281876d621c2c0013a22b04498073 — williamvds 4 years ago f9b609f
Add AppForm

A utility class for implementing forms. Forms can be launched easily by
passing their required data, specified by a child data class.
These must be serializable, so that forms can be saved & restored when
an activity is recreated.
1 files changed, 72 insertions(+), 0 deletions(-)

A app/src/main/java/kvj/taskw/ui/AppForm.kt
A app/src/main/java/kvj/taskw/ui/AppForm.kt => app/src/main/java/kvj/taskw/ui/AppForm.kt +72 -0
@@ 0,0 1,72 @@
package kvj.taskw.ui

import android.os.Bundle
import android.os.Parcelable
import android.support.v7.app.AlertDialog

import kvj.taskw.App
import kvj.taskw.R
import kvj.taskw.data.Controller

abstract class AppForm<T: FormData>: AppActivity() {
    abstract val layout: Int

    protected lateinit var data: T
    protected var controller: Controller = App.controller()

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

        if (!loadFromBundle(intent.extras))
            loadFromBundle(savedInstanceState)
    }

    override fun onBackPressed() = cancel()

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        saveToBundle(outState)
    }

    private fun loadFromBundle(bundle: Bundle?): Boolean {
        val stored = bundle?.getParcelable<T?>(App.KEY_EDIT_DATA)

        stored?.let {
            data = it
            loadFromForm()
        }

        return stored != null
    }

    private fun saveToBundle(bundle: Bundle) {
        saveToForm()
        bundle.putParcelable(App.KEY_EDIT_DATA, data)
    }

    protected open fun cancel() {
        saveToForm()

        if (hasChanges()) {
            AlertDialog.Builder(this)
                .setMessage(R.string.form_discard_confirm)
                .setPositiveButton(android.R.string.yes) { _, _ -> finish() }
                .setNegativeButton(android.R.string.no, null)
                .show()
        } else
            finish()
    }

    protected open fun submit() {
        saveToForm()
    }

    protected abstract fun loadFromForm()
    protected abstract fun saveToForm()
    protected abstract fun hasChanges(): Boolean

    protected open fun validate() = true
}

interface FormData : Parcelable