Skip to content

Instantly share code, notes, and snippets.

View jakubkinst's full-sized avatar

Jakub Kinst jakubkinst

View GitHub Profile
@jakubkinst
jakubkinst / a-ktools.md
Last active January 29, 2020 16:40
ktools

ktools

Kotlin Tools for Android ViewModel, LiveData, Data Binding, Dependency injection, Async operations, Repository pattern, Retrofit, Form Validation, Cloud Firestore, etc.

@jakubkinst
jakubkinst / SmartLockManager.kt
Last active August 1, 2019 12:22
SmartLockManager
package com.uncommon.model.smartlock
import android.app.Activity
import android.content.Intent
import android.content.IntentSender
import com.google.android.gms.auth.api.credentials.Credential
import com.google.android.gms.auth.api.credentials.CredentialPickerConfig
import com.google.android.gms.auth.api.credentials.CredentialRequest
import com.google.android.gms.auth.api.credentials.Credentials
import com.google.android.gms.auth.api.credentials.HintRequest
@jakubkinst
jakubkinst / recyclerview-databinding.kt
Last active June 11, 2018 08:46
RecyclerView Data Binding
open class DataBoundAdapter<T>(val lifecycleOwner: LifecycleOwner, val itemLayoutIdProvider: (T) -> Int, val bindingVariableId: Int, diffCallback: DiffUtil.ItemCallback<T>) : ListAdapter<T, DataBoundViewHolder>(diffCallback) {
constructor(lifecycleOwner: LifecycleOwner, @LayoutRes itemLayoutId: Int, bindingVariableId: Int, diffCallback: DiffUtil.ItemCallback<T>) : this(lifecycleOwner, { itemLayoutId }, bindingVariableId, diffCallback)
private val extras = hashMapOf<Int, Any>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DataBoundViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val binding = DataBindingUtil.inflate<ViewDataBinding>(layoutInflater, viewType, parent, false)
binding.setLifecycleOwner(lifecycleOwner)
return DataBoundViewHolder(binding)
interface SignInView {
//...
}
class SignInFragment : Fragment(), SignInView {
val vmb by vmb<SignInViewModel, FragmentSignInBinding>(R.layout.fragment_sign_in)
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return vmb.rootView
}
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/global_email"
android:inputType="textEmailAddress"
android:text="@={viewModel.email}" />
val formValid = MediatorLiveData<Boolean>()
.addValueSource(email, { validateForm(email, password) })
.addValueSource(password, { validateForm(email, password) })
val email = mutableLiveDataOf(defaultEmail)
val password = mutableLiveDataOf(defaultPassword)
val formValid = MediatorLiveData<Boolean>().apply {
addSource(email, {value = validateForm(email.value, password.value)})
addSource(password, {value = validateForm(email.value, password.value)})
}
private fun validateForm(email: String, password: String): Boolean
= validateEmail(email) && validatePassword(password, config.MIN_PASSWORD_LENGTH)
class MainViewModel : ViewModel(){
// val email = ObservableField<String>("@")
val email = mutableLiveDataOf("@")
}
class MainActivity : AppCompatActivity(){
val viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val titleView = findViewById<TextView>(R.id.title)
viewModel.myliveData.observe(this, Observer {
titleView.setText(it.title)
})
<layout>
<data>
<variable
name="viewModel"
type="com.strv.dundee.ui.main.MainViewModel" />
<variable
name="view"
type="com.strv.dundee.ui.main.MainView" />
</data>