Skip to content

Instantly share code, notes, and snippets.

@AniketSK
Created September 20, 2019 05:36
Show Gist options
  • Save AniketSK/187889aeeb0932d9cb928dedb0db75e4 to your computer and use it in GitHub Desktop.
Save AniketSK/187889aeeb0932d9cb928dedb0db75e4 to your computer and use it in GitHub Desktop.
An RxBindings-like observable to inform of clipboard updates.
package com.aniketkadam.cleanlinks
import android.content.ClipData
import android.content.ClipboardManager
import io.reactivex.Observable
import io.reactivex.Observer
import io.reactivex.disposables.Disposable
import java.util.concurrent.atomic.AtomicBoolean
fun ClipboardManager.updates(): Observable<OptionalClipData> = ClipboardObservable(this)
data class OptionalClipData(val clipData: ClipData?)
/**
* Given a clipboard manager, it returns a stream of clipdata when it changes.
*
*/
private class ClipboardObservable(private val clipboardManager: ClipboardManager) :
Observable<OptionalClipData>() {
override fun subscribeActual(observer: Observer<in OptionalClipData>) {
val listener = Listener(observer, clipboardManager)
observer.onSubscribe(listener)
clipboardManager.addPrimaryClipChangedListener(listener)
}
private class Listener(
private val observer: Observer<in OptionalClipData>,
private val clipboardManager: ClipboardManager
) : Disposable, ClipboardManager.OnPrimaryClipChangedListener {
private val defaultDisposable =
DefaultDisposable { clipboardManager.removePrimaryClipChangedListener(this) }
override fun isDisposed(): Boolean = defaultDisposable.isDisposed
override fun dispose() = defaultDisposable.dispose()
override fun onPrimaryClipChanged() {
observer.onNext(OptionalClipData(clipboardManager.primaryClip))
}
}
}
private class DefaultDisposable(private val onDispose: () -> Unit) : Disposable {
private val unsubscribed: AtomicBoolean = AtomicBoolean(false)
override fun isDisposed(): Boolean = unsubscribed.get()
override fun dispose() {
if (unsubscribed.compareAndSet(false, true)) {
onDispose()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment