Merge branch 'master' into base_naviagation
# Conflicts: # navigation-base/src/main/java/ru/touchin/roboswag/components/navigation_base/fragments/BaseFragment.kt
This commit is contained in:
commit
5e2cd74839
|
|
@ -2,8 +2,9 @@ package ru.touchin.extensions
|
|||
|
||||
import android.os.Build
|
||||
import android.view.View
|
||||
import ru.touchin.utils.ActionThrottler
|
||||
|
||||
private const val RIPPLE_EFFECT_DELAY = 150L
|
||||
const val RIPPLE_EFFECT_DELAY_MS = 150L
|
||||
|
||||
/**
|
||||
* Sets click listener to view. On click it will call something after delay.
|
||||
|
|
@ -12,7 +13,11 @@ private const val RIPPLE_EFFECT_DELAY = 150L
|
|||
*/
|
||||
fun View.setOnRippleClickListener(listener: () -> Unit) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
setOnClickListener { postDelayed({ if (hasWindowFocus()) listener() }, RIPPLE_EFFECT_DELAY) }
|
||||
setOnClickListener {
|
||||
ActionThrottler.throttleAction {
|
||||
postDelayed({ if (hasWindowFocus()) listener() }, RIPPLE_EFFECT_DELAY_MS)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
setOnClickListener { listener() }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,27 @@
|
|||
package ru.touchin.utils
|
||||
|
||||
import android.os.SystemClock
|
||||
import ru.touchin.extensions.RIPPLE_EFFECT_DELAY_MS
|
||||
|
||||
object ActionThrottler {
|
||||
|
||||
// It is necessary because in interval after ripple effect finish and before
|
||||
// action invoking start user may be in time to click and launch action again
|
||||
private const val PREVENTION_OF_CLICK_AGAIN_COEFFICIENT = 2
|
||||
private const val DELAY_MS = PREVENTION_OF_CLICK_AGAIN_COEFFICIENT * RIPPLE_EFFECT_DELAY_MS
|
||||
private var lastActionTime = 0L
|
||||
|
||||
fun throttleAction(action: () -> Unit): Boolean {
|
||||
val currentTime = SystemClock.elapsedRealtime()
|
||||
val diff = currentTime - lastActionTime
|
||||
|
||||
return if (diff >= DELAY_MS) {
|
||||
lastActionTime = currentTime
|
||||
action.invoke()
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
package ru.touchin.lifecycle.extensions
|
||||
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
|
||||
fun <T> MutableLiveData<T>.toImmutable() = this as LiveData<T>
|
||||
|
|
@ -31,9 +31,6 @@ dependencies {
|
|||
implementation "androidx.fragment:fragment:$versions.fragment"
|
||||
implementation "androidx.fragment:fragment-ktx:$versions.fragment"
|
||||
|
||||
implementation "com.jakewharton:butterknife:$versions.butterknife"
|
||||
kapt "com.jakewharton:butterknife-compiler:$versions.butterknife"
|
||||
|
||||
implementation("com.crashlytics.sdk.android:crashlytics:$versions.crashlytics@aar") {
|
||||
transitive = true
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,9 +15,8 @@ import androidx.annotation.LayoutRes
|
|||
import androidx.core.content.ContextCompat
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import butterknife.ButterKnife
|
||||
import butterknife.Unbinder
|
||||
import ru.touchin.roboswag.components.navigation_base.BuildConfig
|
||||
import ru.touchin.roboswag.components.navigation_base.LifecycleLoggingObserver
|
||||
|
||||
open class BaseFragment<TActivity : FragmentActivity, TState : Parcelable>(@LayoutRes layoutRes: Int) : Fragment(layoutRes) {
|
||||
|
||||
|
|
@ -54,8 +53,6 @@ open class BaseFragment<TActivity : FragmentActivity, TState : Parcelable>(@Layo
|
|||
protected lateinit var state: TState
|
||||
private set
|
||||
|
||||
private lateinit var butterKnifeUnbinder: Unbinder
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
|
|
@ -74,12 +71,6 @@ open class BaseFragment<TActivity : FragmentActivity, TState : Parcelable>(@Layo
|
|||
super.onViewCreated(view, savedInstanceState)
|
||||
|
||||
lifecycle.addObserver(LifecycleLoggingObserver(this))
|
||||
butterKnifeUnbinder = ButterKnife.bind(this, view)
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
butterKnifeUnbinder.unbind()
|
||||
super.onDestroyView()
|
||||
}
|
||||
|
||||
override fun onSaveInstanceState(outState: Bundle) {
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
/build
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
apply plugin: 'kotlin'
|
||||
|
||||
dependencies {
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||
implementation "io.reactivex.rxjava2:rxjava:$versions.rxJava"
|
||||
}
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
<manifest
|
||||
package="ru.touchin.extensions.rx"/>
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
package ru.touchin.extensions.rx
|
||||
|
||||
import io.reactivex.Completable
|
||||
import io.reactivex.Flowable
|
||||
|
||||
fun <T> Flowable<T>.emitAfter(other: Completable): Flowable<T> = this.flatMap { value ->
|
||||
other.andThen(Flowable.just(value))
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
package ru.touchin.extensions.rx
|
||||
|
||||
import io.reactivex.Completable
|
||||
import io.reactivex.Maybe
|
||||
|
||||
fun <T> Maybe<T>.emitAfter(other: Completable): Maybe<T> = this.flatMap { value ->
|
||||
other.andThen(Maybe.just(value))
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
package ru.touchin.extensions.rx
|
||||
|
||||
import io.reactivex.Completable
|
||||
import io.reactivex.Observable
|
||||
|
||||
fun <T> Observable<T>.emitAfter(other: Completable): Observable<T> = this.flatMap { value ->
|
||||
other.andThen(Observable.just(value))
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
package ru.touchin.extensions.rx
|
||||
|
||||
import io.reactivex.Completable
|
||||
import io.reactivex.Single
|
||||
|
||||
fun <T> Single<T>.emitAfter(other: Completable): Single<T> = this.flatMap { value ->
|
||||
other.andThen(Single.just(value))
|
||||
}
|
||||
Loading…
Reference in New Issue