diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt index bd29ef6b7bff3b7e05b1d0f23bd18bbb4ca57eed..88942631b463280ec16b7c9559d8e0cb0a591787 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt @@ -10,15 +10,13 @@ import android.view.ViewGroup import android.widget.AdapterView import butterknife.BindView import butterknife.ButterKnife -import de.kuschku.libquassel.protocol.BufferId -import de.kuschku.libquassel.protocol.Buffer_Activity -import de.kuschku.libquassel.protocol.Message -import de.kuschku.libquassel.protocol.NetworkId +import de.kuschku.libquassel.protocol.* import de.kuschku.libquassel.quassel.BufferInfo import de.kuschku.libquassel.quassel.syncables.* import de.kuschku.libquassel.session.Backend import de.kuschku.libquassel.session.ISession import de.kuschku.libquassel.session.SessionManager +import de.kuschku.libquassel.util.and import de.kuschku.libquassel.util.hasFlag import de.kuschku.quasseldroid_ng.R import de.kuschku.quasseldroid_ng.util.AndroidHandlerThread @@ -28,6 +26,7 @@ import de.kuschku.quasseldroid_ng.util.helper.switchMap import de.kuschku.quasseldroid_ng.util.helper.switchMapRx import de.kuschku.quasseldroid_ng.util.service.ServiceBoundFragment import io.reactivex.Observable +import java.util.concurrent.TimeUnit class BufferViewConfigFragment : ServiceBoundFragment() { private val handlerThread = AndroidHandlerThread("ChatList") @@ -78,97 +77,115 @@ class BufferViewConfigFragment : ServiceBoundFragment() { private val bufferIdList = selectedBufferViewConfig.switchMapRx(BufferViewConfig::live_buffers) private val bufferList: LiveData<List<BufferListAdapter.BufferProps>?> = sessionManager.switchMap { manager -> - bufferIdList.switchMapRx { ids -> - val bufferSyncer = manager.bufferSyncer - if (bufferSyncer != null) { - bufferSyncer.live_bufferInfos.switchMap { - Observable.combineLatest( - ids.mapNotNull { id -> - bufferSyncer.bufferInfo(id) - }.mapNotNull { - val network = manager.networks[it.networkId] - if (network == null) { - null - } else { - it to network - } - }.map { (info, network) -> - bufferSyncer.liveActivity(info.bufferId).map { activity -> - when { - activity.hasFlag(Message.MessageType.Plain) || - activity.hasFlag(Message.MessageType.Notice) || - activity.hasFlag(Message.MessageType.Action) -> Buffer_Activity.NewMessage - activity.nonEmpty() -> Buffer_Activity.OtherActivity - else -> Buffer_Activity.NoActivity - } - }.switchMap { activity -> - when (info.type.toInt()) { - BufferInfo.Type.QueryBuffer.toInt() -> { - network.liveIrcUser(info.bufferName).switchMap { user -> - user.live_away.switchMap { away -> - user.live_realName.map { realName -> + selectedBufferViewConfig.switchMapRx { config -> + config.live_config.debounce(16, TimeUnit.MILLISECONDS).switchMap { currentConfig -> + config.live_buffers.switchMap { ids -> + val bufferSyncer = manager.bufferSyncer + if (bufferSyncer != null) { + bufferSyncer.live_bufferInfos.switchMap { + Observable.combineLatest( + ids.mapNotNull { id -> + bufferSyncer.bufferInfo(id) + }.filter { + currentConfig.networkId() <= 0 || currentConfig.networkId() == it.networkId + }.filter { + (currentConfig.allowedBufferTypes() and it.type).isNotEmpty() || + it.type.hasFlag(Buffer_Type.StatusBuffer) + }.mapNotNull { + val network = manager.networks[it.networkId] + if (network == null) { + null + } else { + it to network + } + }.map { (info, network) -> + bufferSyncer.liveActivity(info.bufferId).map { activity -> + when { + activity.hasFlag(Message.MessageType.Plain) || + activity.hasFlag(Message.MessageType.Notice) || + activity.hasFlag(Message.MessageType.Action) -> Buffer_Activity.NewMessage + activity.isNotEmpty() -> Buffer_Activity.OtherActivity + else -> Buffer_Activity.NoActivity + } + }.switchMap { activity -> + when (info.type.toInt()) { + BufferInfo.Type.QueryBuffer.toInt() -> { + network.liveIrcUser(info.bufferName).switchMap { user -> + user.live_away.switchMap { away -> + user.live_realName.map { realName -> + BufferListAdapter.BufferProps( + info = info, + network = network.networkInfo(), + bufferStatus = when { + user == IrcUser.NULL -> BufferListAdapter.BufferStatus.OFFLINE + away -> BufferListAdapter.BufferStatus.AWAY + else -> BufferListAdapter.BufferStatus.ONLINE + }, + description = realName, + activity = activity + ) + } + } + } + } + BufferInfo.Type.ChannelBuffer.toInt() -> { + network.liveIrcChannel( + info.bufferName + ).switchMap { channel -> + channel.live_topic.map { topic -> + BufferListAdapter.BufferProps( + info = info, + network = network.networkInfo(), + bufferStatus = when (channel) { + IrcChannel.NULL -> BufferListAdapter.BufferStatus.OFFLINE + else -> BufferListAdapter.BufferStatus.ONLINE + }, + description = topic, + activity = activity + ) + } + } + } + BufferInfo.Type.StatusBuffer.toInt() -> { + network.liveConnectionState.map { BufferListAdapter.BufferProps( info = info, network = network.networkInfo(), - bufferStatus = when { - user == IrcUser.NULL -> BufferListAdapter.BufferStatus.OFFLINE - away -> BufferListAdapter.BufferStatus.AWAY - else -> BufferListAdapter.BufferStatus.ONLINE - }, - description = realName, + bufferStatus = BufferListAdapter.BufferStatus.OFFLINE, + description = "", activity = activity ) } } - } - } - BufferInfo.Type.ChannelBuffer.toInt() -> { - network.liveIrcChannel( - info.bufferName - ).switchMap { channel -> - channel.live_topic.map { topic -> + else -> Observable.just( BufferListAdapter.BufferProps( info = info, network = network.networkInfo(), - bufferStatus = when (channel) { - IrcChannel.NULL -> BufferListAdapter.BufferStatus.OFFLINE - else -> BufferListAdapter.BufferStatus.ONLINE - }, - description = topic, + bufferStatus = BufferListAdapter.BufferStatus.OFFLINE, + description = "", activity = activity ) - } - } - } - BufferInfo.Type.StatusBuffer.toInt() -> { - network.liveConnectionState.map { - BufferListAdapter.BufferProps( - info = info, - network = network.networkInfo(), - bufferStatus = BufferListAdapter.BufferStatus.OFFLINE, - description = "", - activity = activity ) } } - else -> Observable.just( - BufferListAdapter.BufferProps( - info = info, - network = network.networkInfo(), - bufferStatus = BufferListAdapter.BufferStatus.OFFLINE, - description = "", - activity = activity - ) - ) + }, { array: Array<Any> -> + array.toList() as List<BufferListAdapter.BufferProps> + } + ).map { list -> + list.filter { + config.minimumActivity().value <= it.activity.bit || + it.info.type.hasFlag(Buffer_Type.StatusBuffer) + }.filter { + (!config.hideInactiveBuffers()) || + it.bufferStatus != BufferListAdapter.BufferStatus.OFFLINE || + it.info.type.hasFlag(Buffer_Type.StatusBuffer) } } - }, { array: Array<Any> -> - array.toList() as List<BufferListAdapter.BufferProps> } - ) + } else { + Observable.empty() + } } - } else { - Observable.empty() } } } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MessageListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MessageListFragment.kt index 1e67bdae3bfd85a309b4cb9c2babfb64ea36cb56..1150ac143e2ce1bca2958b188c3fc3ac2e3574b2 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MessageListFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MessageListFragment.kt @@ -76,7 +76,7 @@ class MessageListFragment : ServiceBoundFragment() { buffer.observe( this, Observer { handler.post { - // Try loading messages when switching to empty buffer + // Try loading messages when switching to isEmpty buffer if (it != null && database.message().bufferSize(it) == 0) { loadMore() } diff --git a/build.gradle.kts b/build.gradle.kts index b5ff130acd1899c464feb09dd105c80c449b321a..8b9c2758c291a8137b36ac6fb8bcab30c0364907 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,8 +5,8 @@ buildscript { } dependencies { classpath("com.android.tools.build:gradle:3.0.1") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.0") - classpath("org.jetbrains.kotlin:kotlin-android-extensions:1.2.0") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.21") + classpath("org.jetbrains.kotlin:kotlin-android-extensions:1.2.21") } } diff --git a/invokergenerator/build.gradle.kts b/invokergenerator/build.gradle.kts index fb83f9a7d5ea04d38ce94fe261879be8bc90c0bd..687da46b9cfd35235648ff5f808d1a3128f75371 100644 --- a/invokergenerator/build.gradle.kts +++ b/invokergenerator/build.gradle.kts @@ -8,6 +8,6 @@ plugins { dependencies { implementation(project(":invokerannotations")) - implementation("com.google.auto.service:auto-service:1.0-rc3") - implementation("com.squareup:javapoet:1.9.0") + implementation("com.google.auto.service:auto-service:1.0-rc4") + implementation("com.squareup:javapoet:1.10.0") } diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts index 0161971e9748fe1809634f4e8fcea0e19b7466e4..1c33f64ccb3a7def9318b8d5cb77552e442fcbf1 100644 --- a/lib/build.gradle.kts +++ b/lib/build.gradle.kts @@ -9,13 +9,13 @@ plugins { kotlin("kapt") } -val appCompatVersion = "26.1.0" +val appCompatVersion = "27.0.2" dependencies { - implementation(kotlin("stdlib", "1.2.0")) + implementation(kotlin("stdlib", "1.2.21")) implementation(appCompat("support-annotations")) implementation("org.threeten", "threetenbp", "1.3.6") - implementation("io.reactivex.rxjava2:rxjava:2.1.3") + implementation("io.reactivex.rxjava2:rxjava:2.1.9") implementation(project(":invokerannotations")) kapt(project(":invokergenerator")) diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt index 86a270e1cac506ff74f8d8ec80cb18a13c1acdf6..e0328ec12a6fe8ecc9fa4d032d1f9bb11785539c 100644 --- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt @@ -49,6 +49,7 @@ abstract class StringSerializer( val charBuffer = charBuffer(data.length) charBuffer.put(data) charBuffer.flip() + encoder.reset() val byteBuffer = encoder.encode(charBuffer) IntSerializer.serialize(buffer, byteBuffer.remaining() + trailingNullBytes, features) buffer.put(byteBuffer) @@ -63,6 +64,7 @@ abstract class StringSerializer( val charBuffer = charBuffer(data.length) charBuffer.put(data) charBuffer.flip() + encoder.reset() encoder.encode(charBuffer) } diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt index 04d4f643702bb5bba6c166512c000869afcbde81..3b578132a11c940a697c0fb9ad709ea10c26dfb1 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt @@ -83,12 +83,14 @@ class BufferSyncer constructor( fun initSetBufferInfos(infos: QVariantList?) { _bufferInfos.clear() infos?.mapNotNull { it.value<BufferInfo>() }?.forEach { _bufferInfos[it.bufferId] = it } + live_bufferInfos.onNext(_bufferInfos) } override fun mergeBuffersPermanently(buffer1: BufferId, buffer2: BufferId) { _lastSeenMsg.remove(buffer2) _markerLines.remove(buffer2) _bufferActivities.remove(buffer2) + live_bufferInfos.onNext(_bufferInfos) } override fun removeBuffer(buffer: BufferId) { @@ -96,14 +98,27 @@ class BufferSyncer constructor( _markerLines.remove(buffer) _bufferActivities.remove(buffer) _bufferInfos.remove(buffer) + live_bufferInfos.onNext(_bufferInfos) } override fun renameBuffer(buffer: BufferId, newName: String) { + val bufferInfo = _bufferInfos[buffer] + if (bufferInfo != null) { + _bufferInfos[buffer] = bufferInfo.copy(bufferName = newName) + live_bufferInfos.onNext(_bufferInfos) + } } fun bufferInfo(bufferId: BufferId) = _bufferInfos[bufferId] + fun liveBufferInfo(bufferId: BufferId) = live_bufferInfos.distinctUntilChanged().map { + bufferInfo(bufferId) + } + fun bufferInfoUpdated(info: BufferInfo) { - _bufferInfos[info.bufferId] = info + if (info != _bufferInfos[info.bufferId]) { + _bufferInfos[info.bufferId] = info + live_bufferInfos.onNext(_bufferInfos) + } } override fun setLastSeenMsg(buffer: BufferId, msgId: MsgId) { @@ -139,4 +154,5 @@ class BufferSyncer constructor( mutableMapOf<BufferId, Message_Types>() ) private val _bufferInfos = mutableMapOf<BufferId, BufferInfo>() + val live_bufferInfos = BehaviorSubject.createDefault(mutableMapOf<BufferId, BufferInfo>()) } diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt index 949af19cfdd2de4bf09ccca0e839195a09384f29..82abb56e1cb9d5a5e888439536e7c7bb106e12f6 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt @@ -167,51 +167,61 @@ class BufferViewConfig constructor( override fun setAddNewBuffersAutomatically(addNewBuffersAutomatically: Boolean) { _addNewBuffersAutomatically = addNewBuffersAutomatically super.setAddNewBuffersAutomatically(addNewBuffersAutomatically) + live_config.onNext(this) } override fun setAllowedBufferTypes(bufferTypes: Int) { _allowedBufferTypes = Buffer_Type.of(bufferTypes.toShort()) super.setAllowedBufferTypes(bufferTypes) + live_config.onNext(this) } override fun setBufferViewName(bufferViewName: String) { _bufferViewName = bufferViewName super.setBufferViewName(bufferViewName) + live_config.onNext(this) } override fun setDisableDecoration(disableDecoration: Boolean) { _disableDecoration = disableDecoration super.setDisableDecoration(disableDecoration) + live_config.onNext(this) } override fun setHideInactiveBuffers(hideInactiveBuffers: Boolean) { _hideInactiveBuffers = hideInactiveBuffers super.setHideInactiveBuffers(hideInactiveBuffers) + live_config.onNext(this) } override fun setHideInactiveNetworks(hideInactiveNetworks: Boolean) { _hideInactiveNetworks = hideInactiveNetworks super.setHideInactiveNetworks(hideInactiveNetworks) + live_config.onNext(this) } override fun setMinimumActivity(activity: Int) { _minimumActivity = Buffer_Activity.of(activity) super.setMinimumActivity(activity) + live_config.onNext(this) } override fun setNetworkId(networkId: NetworkId) { _networkId = networkId super.setNetworkId(networkId) + live_config.onNext(this) } override fun setShowSearch(showSearch: Boolean) { _showSearch = showSearch super.setShowSearch(showSearch) + live_config.onNext(this) } override fun setSortAlphabetically(sortAlphabetically: Boolean) { _sortAlphabetically = sortAlphabetically super.setSortAlphabetically(sortAlphabetically) + live_config.onNext(this) } private val _bufferViewId: Int = bufferViewId @@ -228,6 +238,7 @@ class BufferViewConfig constructor( private var _buffers: MutableList<BufferId> = mutableListOf() private var _removedBuffers: MutableSet<BufferId> = mutableSetOf() private var _temporarilyRemovedBuffers: MutableSet<BufferId> = mutableSetOf() + val live_config = BehaviorSubject.createDefault(this) val live_buffers: BehaviorSubject<List<BufferId>> = BehaviorSubject.createDefault<List<BufferId>>(emptyList()) diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt index a45e245015312c50eef07ef30dd427d39cbee1bb..3f0152e6e161c2686a11f84ed83c0faf1f0f5db4 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt @@ -180,7 +180,7 @@ class Identity constructor( } private var _identityId: IdentityId = -1 - private var _identityName: String = "<empty>" + private var _identityName: String = "<isEmpty>" private var _realName: String = "" private var _nicks: MutableList<String> = mutableListOf("quassel") private var _awayNick: String = "" diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt index 294ef1b7f5cfab6a1e5956881aa7c225475ad2ee..f08a638c7dd91cdb4b093a8337d99ef90c7f577d 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt @@ -282,7 +282,7 @@ class Network constructor( * Gets the value of an available capability, e.g. for SASL, "EXTERNAL,PLAIN". * * @param capability Name of capability - * @return Value of capability if one was specified, otherwise empty string + * @return Value of capability if one was specified, otherwise isEmpty string */ fun capValue(capability: String) = _caps.getOr(capability.toLowerCase(Locale.ENGLISH), "") diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt index e7ad6859a9a73c30c801d1d4ab9102c17ba9b3d5..60ad4a78af1e419dec2e7f89b9fcd5efa200b384 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt @@ -45,6 +45,7 @@ class RpcHandler( } override fun displayMsg(message: Message) { + session.bufferSyncer.bufferInfoUpdated(message.bufferInfo) backlogStorage.storeMessages(message) } diff --git a/lib/src/main/java/de/kuschku/libquassel/util/Flag.kt b/lib/src/main/java/de/kuschku/libquassel/util/Flag.kt index 3cf89ad0ffb86b88bdeb72188670e908eb387d20..59e57ea45fff6d6646b1ec32e9dfbdde50a2c8ce 100644 --- a/lib/src/main/java/de/kuschku/libquassel/util/Flag.kt +++ b/lib/src/main/java/de/kuschku/libquassel/util/Flag.kt @@ -36,8 +36,8 @@ data class Flags<E>( fun enabledValues() = values?.filter { hasFlag(it) }?.toSet() ?: emptySet() - fun empty() = value == 0 - fun nonEmpty() = !empty() + fun isEmpty() = value == 0 + fun isNotEmpty() = !isEmpty() override fun toString() = if (values != null) { enabledValues().joinToString("|", "[", "]") @@ -71,6 +71,18 @@ infix fun <T> Flags<T>.or(other: Flag<T>): Flags<T> where T : kotlin.Enum<T>, T value or other.bit ) +infix fun <T> Flags<T>.or(other: Flags<T>): Flags<T> where T : kotlin.Enum<T>, T : Flag<T> = Flags( + value or other.value +) + +infix fun <T> Flags<T>.and(other: Flag<T>): Flags<T> where T : kotlin.Enum<T>, T : Flag<T> = Flags( + value and other.bit +) + +infix fun <T> Flags<T>.and(other: Flags<T>): Flags<T> where T : kotlin.Enum<T>, T : Flag<T> = Flags( + value and other.value +) + operator infix fun <T> Flags<T>.plus( other: Flags<T>): Flags<T> where T : Enum<T>, T : Flag<T> = Flags(value or other.value) diff --git a/lib/src/main/java/de/kuschku/libquassel/util/LongFlag.kt b/lib/src/main/java/de/kuschku/libquassel/util/LongFlag.kt index 9dd681cb138615f27dd2d41477a15a374891e6bb..266f21eba26319a0e187c3c7534858c51a08c745 100644 --- a/lib/src/main/java/de/kuschku/libquassel/util/LongFlag.kt +++ b/lib/src/main/java/de/kuschku/libquassel/util/LongFlag.kt @@ -36,6 +36,9 @@ data class LongFlags<E>( fun enabledValues() = values?.filter { hasFlag(it) }?.toSet() ?: emptySet() + fun isEmpty() = value == 0L + fun isNotEmpty() = !isEmpty() + override fun toString() = if (values != null) { enabledValues().joinToString("|", "[", "]") } else { @@ -69,6 +72,21 @@ infix fun <T> LongFlags<T>.or( value or other.bit ) +infix fun <T> LongFlags<T>.or( + other: LongFlags<T>): LongFlags<T> where T : kotlin.Enum<T>, T : LongFlag<T> = LongFlags( + value or other.value +) + +infix fun <T> LongFlags<T>.and( + other: LongFlag<T>): LongFlags<T> where T : kotlin.Enum<T>, T : LongFlag<T> = LongFlags( + value and other.bit +) + +infix fun <T> LongFlags<T>.and( + other: LongFlags<T>): LongFlags<T> where T : kotlin.Enum<T>, T : LongFlag<T> = LongFlags( + value and other.value +) + operator infix fun <T> LongFlags<T>.plus( other: LongFlags<T>): LongFlags<T> where T : Enum<T>, T : LongFlag<T> = LongFlags( value or other.value diff --git a/lib/src/main/java/de/kuschku/libquassel/util/ShortFlag.kt b/lib/src/main/java/de/kuschku/libquassel/util/ShortFlag.kt index 25b668398934b59e5c4278eb8a291d011c432c4d..f5305d4759ba5a4dd423780c940b229fcc72fa2a 100644 --- a/lib/src/main/java/de/kuschku/libquassel/util/ShortFlag.kt +++ b/lib/src/main/java/de/kuschku/libquassel/util/ShortFlag.kt @@ -40,6 +40,9 @@ data class ShortFlags<E>( fun enabledValues() = values?.filter { hasFlag(it) }?.toSet() ?: emptySet() + fun isEmpty() = value == 0.toShort() + fun isNotEmpty() = !isEmpty() + override fun toString() = if (values != null) { enabledValues().joinToString("|", "[", "]") } else { @@ -73,6 +76,21 @@ infix fun <T> ShortFlags<T>.or( value or other.bit ) +infix fun <T> ShortFlags<T>.or( + other: ShortFlags<T>): ShortFlags<T> where T : kotlin.Enum<T>, T : ShortFlag<T> = ShortFlags( + value or other.value +) + +infix fun <T> ShortFlags<T>.and( + other: ShortFlag<T>): ShortFlags<T> where T : kotlin.Enum<T>, T : ShortFlag<T> = ShortFlags( + value and other.bit +) + +infix fun <T> ShortFlags<T>.and( + other: ShortFlags<T>): ShortFlags<T> where T : kotlin.Enum<T>, T : ShortFlag<T> = ShortFlags( + value and other.value +) + operator infix fun <T> ShortFlags<T>.plus( other: ShortFlags<T>): ShortFlags<T> where T : Enum<T>, T : ShortFlag<T> = ShortFlags( value or other.value diff --git a/lib/src/main/java/de/kuschku/libquassel/util/helpers/ObservableHelper.kt b/lib/src/main/java/de/kuschku/libquassel/util/helpers/ObservableHelper.kt index 6347af5301b44db4ab24690956194fea8c661edd..edc47fcedb6323e9bad8a75fd4204eddbb6fb805 100644 --- a/lib/src/main/java/de/kuschku/libquassel/util/helpers/ObservableHelper.kt +++ b/lib/src/main/java/de/kuschku/libquassel/util/helpers/ObservableHelper.kt @@ -2,5 +2,8 @@ package de.kuschku.libquassel.util.helpers import io.reactivex.Observable -fun <T> Observable<T>.or(default: T): T - = this.blockingLatest().firstOrNull() ?: default +fun <T> Observable<T>.or(default: T): T = try { + this.blockingLatest().firstOrNull() ?: default +} catch (_: Throwable) { + default +} diff --git a/malheur/build.gradle.kts b/malheur/build.gradle.kts index 95578183e06c7445e57ebdb4ff33c74103e1f3e7..66662a902f0cfe0378e5ed6f26facbfa70a5ffb2 100644 --- a/malheur/build.gradle.kts +++ b/malheur/build.gradle.kts @@ -17,7 +17,7 @@ android { } dependencies { - implementation(kotlin("stdlib", "1.2.0")) + implementation(kotlin("stdlib", "1.2.21")) - implementation("com.google.code.gson", "gson", "2.8.0") + implementation("com.google.code.gson", "gson", "2.8.2") }