Skip to content

Instantly share code, notes, and snippets.

View kakajika's full-sized avatar
🏠
STAY HOME

Keita Kajiwara kakajika

🏠
STAY HOME
View GitHub Profile
@kakajika
kakajika / AnimatedVectorDrawableMarkerIcon.kt
Last active March 9, 2020 09:07
Workaround to use AnimatedVectorDrawable as marker icon on Google Maps SDK.
class AnimatedVectorDrawableMarkerIcon(
marker: Marker,
private val avd: AnimatedVectorDrawableCompat,
width: Int = avd.intrinsicWidth,
height: Int = avd.intrinsicHeight
) {
private val handler = Handler(Looper.getMainLooper())
private val invalidateTask = Runnable { avd.invalidateSelf() }
private var isRunning = false
private var isAutoLoop = false
@kakajika
kakajika / OneShotGlobalLayoutListener.kt
Last active January 30, 2020 08:36
Listener for View's global layout event only once like [OneShotPreDrawListener](https://developer.android.com/reference/androidx/core/view/OneShotPreDrawListener).
class OneShotGlobalLayoutListener private constructor(
private val view: View,
private val runnable: Runnable
) : ViewTreeObserver.OnGlobalLayoutListener, View.OnAttachStateChangeListener {
private var viewTreeObserver: ViewTreeObserver = view.viewTreeObserver
init {
view.viewTreeObserver.addOnGlobalLayoutListener(this)
view.addOnAttachStateChangeListener(this)
}
@kakajika
kakajika / CancellableDelayedTask.swift
Created October 26, 2015 08:52
Cancellable delayed task in Swift.
class CancellableDelayedTask {
var cancelled = false
func run(delay: Double, task: () -> Void ) {
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(time, dispatch_get_main_queue()) { [unowned self] () -> Void in
if !self.cancelled {
task()
}
}
}
@kakajika
kakajika / _LocaleTimePicker.java
Last active August 1, 2019 23:07
Android TimePicker with custom Locale.
public class LocaleTimePicker extends TimePicker {
public LocaleTimePicker(Context context) {
this(context, null);
}
public LocaleTimePicker(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, Resources.getSystem().getIdentifier("timePickerStyle", "attr", "android"));
}
@kakajika
kakajika / DimBehindPopupWindow.kt
Created July 10, 2019 22:21
PopupWindow with dim background
val popup = PopupWindow(...)
val container = popup.contentView.takeIf { it.layoutParams is WindowManager.LayoutParams }
?: (popup.contentView.parent as? View)?.takeIf { it.layoutParams is WindowManager.LayoutParams }
?: (popup.contentView.parent.parent as? View)?.takeIf { it.layoutParams is WindowManager.LayoutParams }
?: throw IllegalStateException("NO WindowManager.LayoutParams!")
val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
val lp = container.layoutParams as WindowManager.LayoutParams
lp.flags = lp.flags or WindowManager.LayoutParams.FLAG_DIM_BEHIND
@kakajika
kakajika / flatMap.ts
Created July 3, 2015 18:52
Array.prototype.flatMap method in TypeScript.
interface Array<T> {
flatMap<E>(callback: (t: T) => Array<E>): Array<E>
}
Object.defineProperty(Array.prototype, 'flatMap', {
value: function(f: Function) {
return this.reduce((ys: any, x: any) => {
return ys.concat(f.call(this, x))
}, [])
},
@kakajika
kakajika / flatMapCompletable.swift
Created February 16, 2018 10:02
Single::flatMapCompletable in RxSwift
extension PrimitiveSequenceType where Self: ObservableConvertibleType, Self.TraitType == SingleTrait {
func flatMapCompletable(_ selector: @escaping (E) -> Completable) -> Completable {
return self
.asObservable()
.flatMap { e -> Observable<Never> in
selector(e).asObservable()
}
.asCompletable()
}
@kakajika
kakajika / Rx+mapNotNull.kt
Created December 13, 2018 11:10
mapNotNull operators for Rx Observable/Single/Maybe.
fun <T, R> Observable<T>.mapNotNull(mapper: (T) -> R?): Observable<R> {
return lift { observer ->
object: Observer<T> {
override fun onNext(t: T) {
mapper(t)?.let { observer.onNext(it) }
}
override fun onComplete() {
observer.onComplete()
}
override fun onError(e: Throwable) {
@kakajika
kakajika / expand.kt
Last active September 24, 2018 05:00
A port of RxJS's expand to RxKotlin.
import io.reactivex.Flowable
import io.reactivex.Maybe
import io.reactivex.Observable
import io.reactivex.Single
import io.reactivex.rxkotlin.Flowables
import io.reactivex.rxkotlin.Maybes
import io.reactivex.rxkotlin.Observables
import io.reactivex.rxkotlin.Singles
fun <T> Observables.expand(source: Observable<T>, expander: (T) -> Observable<T>): Observable<T> {
@kakajika
kakajika / combinations.kt
Last active September 22, 2018 10:34
List all combinations of picking n elements.
fun <T> Collection<T>.combinations(n: Int): List<List<T>> {
return when {
n < 0 -> throw Error("combinations size cannot be negative")
n > size -> emptyList()
n == 1 -> map { mutableListOf(it) }
else -> foldIndexed<T, List<List<T>>>(mutableListOf()) { index, all, first ->
all + drop(index + 1)
.combinations(n - 1)
.map { it + first }
}