# View.kt

    /*
     * The MIT License
     *
     * Original work sponsored and donated by The Danish Health Data Authority (http://www.sundhedsdatastyrelsen.dk)
     *
     * Copyright (C) 2021 The Danish Health Data Authority (http://www.sundhedsdatastyrelsen.dk)
     *
     *
     * Permission is hereby granted, free of charge, to any person obtaining a copy of
     * this software and associated documentation files (the "Software"), to deal in
     * the Software without restriction, including without limitation the rights to
     * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
     * of the Software, and to permit persons to whom the Software is furnished to do
     * so, subject to the following conditions:
     *
     *
     * The above copyright notice and this permission notice shall be included in all
     * copies or substantial portions of the Software.
     *
     *
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     * SOFTWARE.
     */

    package dk.nsp.mingraviditet.extensions

    import android.os.Build
    import android.view.View
    import android.view.ViewGroup
    import android.view.WindowInsets
    import androidx.annotation.DimenRes
    import androidx.annotation.UiThread
    import androidx.core.view.ViewCompat
    import androidx.core.view.children
    import androidx.databinding.BindingAdapter

    //region general Visibility toggles
    @BindingAdapter("goneOnNull")
    fun View.goneOnNull(value: Any?) {
        visibility = when (value) {
            null -> View.GONE
            else -> View.VISIBLE
        }
    }

    @BindingAdapter("goneOnTrue")
    fun View.goneOnTrue(value: Boolean?) {
        visibility = when (value) {
            true -> View.GONE
            else -> View.VISIBLE
        }
    }

    @BindingAdapter("goneOnFalse")
    fun View.goneOnFalse(value: Boolean?) {
        visibility = when (value) {
            true -> View.VISIBLE
            else -> View.GONE
        }
    }

    @BindingAdapter("visibleOnTrue")
    fun View.visibleOnTrue(value: Boolean?) {
        visibility = when (value) {
            true -> View.VISIBLE
            else -> View.GONE
        }
    }

    @BindingAdapter("goneOnBlank")
    fun View.goneOnBlank(text: String?) {
        visibility = when (text?.isNotBlank()) {
            true -> View.VISIBLE
            else -> View.GONE
        }
    }
    //endregion

    /**
     * Disables the view (isEnabled = false, isClickable = false)
     * if it is a ViewGroup, then all children will be disabled as well
     * (From https://github.com/Tvede-dk/CommonsenseAndroidKotlin/blob/master/widgets/src/main/kotlin/com/commonsense/android/kotlin/views/extensions/ViewExtensions.kt)
     * @receiver View
     */
    @UiThread
    fun View.disable() {
        isEnabled = false
        (this as? ViewGroup)?.children?.forEach(View::disable)
    }

    /**
     * Enables this view (isEnabled = true, isClickable = true)
     * if it is a ViewGroup, then all children will be enabled as well
     * (From https://github.com/Tvede-dk/CommonsenseAndroidKotlin/blob/master/widgets/src/main/kotlin/com/commonsense/android/kotlin/views/extensions/ViewExtensions.kt)
     * @receiver View
     */
    @UiThread
    fun View.enable() {
        isEnabled = true
        (this as? ViewGroup)?.children?.forEach(View::enable)
    }

    @UiThread
    fun ViewGroup.enabledOrDisabled(enabled: Boolean) {
        if (enabled) {
            enable()
        } else {
            disable()
        }
    }

    /**
     * Adds the NavigationBar insets to the bottom of the [View]
     * (Useful for Theme with windowTranslucentNavigation=true)
     */
    fun View.adjustForNavigationBarInsets(@DimenRes extraBottom: Int = 0) {
        ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
            val params: ViewGroup.MarginLayoutParams =
                view.layoutParams as ViewGroup.MarginLayoutParams

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                val navInsets = insets.getInsets(WindowInsets.Type.navigationBars())
                params.bottomMargin = navInsets.bottom
            } else {
                params.bottomMargin = insets.systemWindowInsetBottom
            }

            insets
        }
    }