Skip to content

Instantly share code, notes, and snippets.

View NikolaDespotoski's full-sized avatar

Nikola Despotoski NikolaDespotoski

View GitHub Profile
@NikolaDespotoski
NikolaDespotoski / LazyLiveDataBlockInitializer.kt
Created March 18, 2020 13:06
Lazy Live Data block initializer
fun <T> lazyLiveData(function: suspend LiveDataScope<T>.() -> Unit) = object : kotlin.Lazy<LiveData<T>> {
lateinit var liveDataCached: LiveData<T>
override val value: LiveData<T>
get() {
if (!isInitialized()) {
liveDataCached = liveData { function() }
}
return liveDataCached
}
abstract class LiveDataSharedPreferences<T>(val sharedPreferences: SharedPreferences,
val key: String,
val default: T) : MutableLiveData<T>(), SharedPreferences.OnSharedPreferenceChangeListener {
override fun onActive() {
super.onActive()
sharedPreferences.registerOnSharedPreferenceChangeListener(this)
}
override fun onInactive() {
super.onInactive()
@NikolaDespotoski
NikolaDespotoski / ViewModelProperty.kt
Created October 24, 2019 23:53
ViewModel Kotlin Property
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty
import kotlin.reflect.jvm.javaType
class FragmentViewModelProperty<VM : ViewModel>(private val viewModelFactoryProvider: () -> ViewModelProvider.Factory? = { null },
@NikolaDespotoski
NikolaDespotoski / kotlinLast.kt
Created July 23, 2019 08:32
Kotlin Flows last operator
public fun <T> Flow<T>.last(): Flow<T> = flow {
try {
var last : Any? = null
collect { value ->
last = value
}
emit(last as T)
} catch (e: Throwable) {
// Nothing, bail out
}
import android.arch.lifecycle.LifecycleOwner
import android.arch.lifecycle.MediatorLiveData
import android.arch.lifecycle.MutableLiveData
import android.arch.lifecycle.Observer
import LoadingState
import io.reactivex.Flowable
import io.reactivex.functions.Action
import io.reactivex.functions.Consumer
import io.reactivex.internal.functions.Functions
@NikolaDespotoski
NikolaDespotoski / BaseBindableAdapter.kt
Last active November 29, 2017 19:24
Kotlin operator overloading for RecyclerView operations
abstract class BaseBindableAdapter<T, VH : RecyclerView.ViewHolder> : RecyclerView.Adapter<VH>() {
internal var data: MutableList<T> = mutableListOf()
override fun onBindViewHolder(holder: VH, position: Int) {
val bindable = holder as BindableViewHolder<T>
bindable.bindViewHolder(data[position])
}
override fun getItemCount(): Int = data.size
@NikolaDespotoski
NikolaDespotoski / CustomTabsURLSpan.kt
Created August 29, 2017 22:17
Open clicked links of TextView in CustomTabs
class CustomTabsURLSpan(url: String) : URLSpan(url) {
override fun onClick(widget: View?) {
// do something with url
}
}
import android.arch.lifecycle.ViewModel;
import android.arch.lifecycle.ViewModelProvider;
import android.arch.lifecycle.ViewModelStore;
import android.arch.lifecycle.ViewModelStores;
import android.support.annotation.MainThread;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import java.lang.reflect.InvocationTargetException;
@NikolaDespotoski
NikolaDespotoski / ViewModelParameterizedProvider.kt
Last active August 12, 2019 08:11
ViewModelProvider that instantiates ViewModel with parameterized constructor
import android.arch.lifecycle.ViewModel
import android.arch.lifecycle.ViewModelProvider
import android.arch.lifecycle.ViewModelStore
import android.arch.lifecycle.ViewModelStores
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentActivity
import java.util.concurrent.atomic.AtomicBoolean
/**
* Created by Nikola on 7/19/2017.
public class RecyclerViewClickListener implements RecyclerView.OnItemTouchListener {
private final OnItemClickedListener mListener;
private final GestureDetector mGestureDetector;
public RecyclerViewClickListener(Context context, OnItemClickedListener onItemClickListener) {
mListener = onItemClickListener;
GestureDetector.OnGestureListener gestureListener = new RecyclerViewGestureListener();
mGestureDetector = new GestureDetector(context, gestureListener);
}