Add fragmentviewbindingdelegate-kt library
This commit is contained in:
parent
6eaf402dfa
commit
9efc706116
4 changed files with 6 additions and 76 deletions
|
@ -212,6 +212,7 @@ dependencies {
|
||||||
implementation(ApplicationLibs.bigImageViewer)
|
implementation(ApplicationLibs.bigImageViewer)
|
||||||
implementation(ApplicationLibs.conscryptAndroid)
|
implementation(ApplicationLibs.conscryptAndroid)
|
||||||
implementation(ApplicationLibs.filemojiCompat)
|
implementation(ApplicationLibs.filemojiCompat)
|
||||||
|
implementation(ApplicationLibs.fragmentviewbindingdelegateKt)
|
||||||
implementation(ApplicationLibs.glideImage)
|
implementation(ApplicationLibs.glideImage)
|
||||||
implementation(ApplicationLibs.glideImageViewFactory)
|
implementation(ApplicationLibs.glideImageViewFactory)
|
||||||
implementation(ApplicationLibs.markdownEdit)
|
implementation(ApplicationLibs.markdownEdit)
|
||||||
|
|
|
@ -22,7 +22,7 @@ package com.keylesspalace.tusky.core.extensions
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.viewbinding.ViewBinding
|
import androidx.viewbinding.ViewBinding
|
||||||
import com.keylesspalace.tusky.core.ui.fragment.FragmentViewBindingDelegate
|
import com.zhuinden.fragmentviewbindingdelegatekt.FragmentViewBindingDelegate
|
||||||
|
|
||||||
fun <VB : ViewBinding> Fragment.viewBinding(viewBindingFactory: (View) -> VB) =
|
fun <VB : ViewBinding> Fragment.viewBinding(viewBindingFactory: (View) -> VB) =
|
||||||
FragmentViewBindingDelegate(this, viewBindingFactory)
|
FragmentViewBindingDelegate(this, viewBindingFactory)
|
||||||
|
|
|
@ -1,74 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2021 Gabor Varadi
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.keylesspalace.tusky.core.ui.fragment
|
|
||||||
|
|
||||||
import android.view.View
|
|
||||||
import androidx.fragment.app.Fragment
|
|
||||||
import androidx.lifecycle.DefaultLifecycleObserver
|
|
||||||
import androidx.lifecycle.Lifecycle
|
|
||||||
import androidx.lifecycle.LifecycleOwner
|
|
||||||
import androidx.lifecycle.Observer
|
|
||||||
import androidx.viewbinding.ViewBinding
|
|
||||||
import kotlin.properties.ReadOnlyProperty
|
|
||||||
import kotlin.reflect.KProperty
|
|
||||||
|
|
||||||
class FragmentViewBindingDelegate<VB : ViewBinding>(
|
|
||||||
private val fragment: Fragment,
|
|
||||||
private val viewBindingFactory: (View) -> VB
|
|
||||||
) : ReadOnlyProperty<Fragment, VB> {
|
|
||||||
|
|
||||||
private var binding: VB? = null
|
|
||||||
|
|
||||||
init {
|
|
||||||
fragment.lifecycle.addObserver(object : DefaultLifecycleObserver {
|
|
||||||
val viewLifecycleOwnerDataObserver = Observer<LifecycleOwner?> {
|
|
||||||
val viewLifecycleOwner = it ?: return@Observer
|
|
||||||
|
|
||||||
viewLifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver {
|
|
||||||
override fun onDestroy(owner: LifecycleOwner) {
|
|
||||||
binding = null
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreate(owner: LifecycleOwner) {
|
|
||||||
fragment.viewLifecycleOwnerLiveData.observeForever(viewLifecycleOwnerDataObserver)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDestroy(owner: LifecycleOwner) {
|
|
||||||
fragment.viewLifecycleOwnerLiveData.removeObserver(viewLifecycleOwnerDataObserver)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getValue(thisRef: Fragment, property: KProperty<*>): VB {
|
|
||||||
val binding = binding
|
|
||||||
|
|
||||||
if(binding != null) {
|
|
||||||
return binding
|
|
||||||
}
|
|
||||||
|
|
||||||
val lifecycleState = fragment.viewLifecycleOwner.lifecycle.currentState
|
|
||||||
if(!lifecycleState.isAtLeast(Lifecycle.State.INITIALIZED)) {
|
|
||||||
throw IllegalStateException(
|
|
||||||
"Should not attempt to get bindings when Fragment views are destroyed."
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return viewBindingFactory(thisRef.requireView()).also { this.binding = it }
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -25,9 +25,10 @@ object ApplicationLibs {
|
||||||
const val filemojiCompat = "1.0.17"
|
const val filemojiCompat = "1.0.17"
|
||||||
const val flexbox = "2.0.1"
|
const val flexbox = "2.0.1"
|
||||||
const val fragmentKtx = "1.2.5"
|
const val fragmentKtx = "1.2.5"
|
||||||
|
const val fragmentviewbindingdelegateKt = "1.0.0"
|
||||||
const val glide = "4.12.0"
|
const val glide = "4.12.0"
|
||||||
const val glideImage = "1.8.0"
|
const val glideImage = "1.8.0"
|
||||||
const val lifecycle = "2.4.0"
|
const val lifecycle = "2.3.1"
|
||||||
const val markdownEdit = "1.0.0"
|
const val markdownEdit = "1.0.0"
|
||||||
const val materialDesign = "1.4.0"
|
const val materialDesign = "1.4.0"
|
||||||
const val materialDrawer = "8.2.0"
|
const val materialDrawer = "8.2.0"
|
||||||
|
@ -144,6 +145,8 @@ object ApplicationLibs {
|
||||||
const val bigImageViewer = "com.github.piasy:BigImageViewer:${Versions.bigImageViewer}"
|
const val bigImageViewer = "com.github.piasy:BigImageViewer:${Versions.bigImageViewer}"
|
||||||
const val conscryptAndroid = "org.conscrypt:conscrypt-android:${Versions.conscryptAndroid}"
|
const val conscryptAndroid = "org.conscrypt:conscrypt-android:${Versions.conscryptAndroid}"
|
||||||
const val filemojiCompat = "de.c1710:filemojicompat:${Versions.filemojiCompat}"
|
const val filemojiCompat = "de.c1710:filemojicompat:${Versions.filemojiCompat}"
|
||||||
|
const val fragmentviewbindingdelegateKt =
|
||||||
|
"com.github.Zhuinden:fragmentviewbindingdelegate-kt:${Versions.fragmentviewbindingdelegateKt}"
|
||||||
const val glideImage = "com.github.piasy:GlideImageLoader:${Versions.glideImage}"
|
const val glideImage = "com.github.piasy:GlideImageLoader:${Versions.glideImage}"
|
||||||
const val glideImageViewFactory =
|
const val glideImageViewFactory =
|
||||||
"com.github.piasy:GlideImageViewFactory:${Versions.glideImage}"
|
"com.github.piasy:GlideImageViewFactory:${Versions.glideImage}"
|
||||||
|
|
Loading…
Reference in a new issue