Skip to content
Snippets Groups Projects
Commit f1c5952f authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Added buffer activity to channel list

parent d9b0223e
No related branches found
No related tags found
No related merge requests found
...@@ -7,7 +7,6 @@ import android.arch.lifecycle.Observer ...@@ -7,7 +7,6 @@ import android.arch.lifecycle.Observer
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.support.v4.graphics.drawable.DrawableCompat import android.support.v4.graphics.drawable.DrawableCompat
import android.support.v7.util.DiffUtil import android.support.v7.util.DiffUtil
import android.support.v7.widget.AppCompatImageButton
import android.support.v7.widget.RecyclerView import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
...@@ -17,6 +16,7 @@ import android.widget.TextView ...@@ -17,6 +16,7 @@ import android.widget.TextView
import butterknife.BindView import butterknife.BindView
import butterknife.ButterKnife import butterknife.ButterKnife
import de.kuschku.libquassel.protocol.BufferId import de.kuschku.libquassel.protocol.BufferId
import de.kuschku.libquassel.protocol.Buffer_Activity
import de.kuschku.libquassel.protocol.NetworkId import de.kuschku.libquassel.protocol.NetworkId
import de.kuschku.libquassel.quassel.BufferInfo import de.kuschku.libquassel.quassel.BufferInfo
import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork
...@@ -138,7 +138,9 @@ class BufferListAdapter( ...@@ -138,7 +138,9 @@ class BufferListAdapter(
val info: BufferInfo, val info: BufferInfo,
val network: INetwork.NetworkInfo, val network: INetwork.NetworkInfo,
val bufferStatus: BufferStatus, val bufferStatus: BufferStatus,
val description: String val description: String,
val activity: Buffer_Activity,
val highlights: Int = 0
) )
data class BufferState( data class BufferState(
...@@ -160,7 +162,7 @@ class BufferListAdapter( ...@@ -160,7 +162,7 @@ class BufferListAdapter(
private val expansionListener: ((NetworkId) -> Unit)? = null private val expansionListener: ((NetworkId) -> Unit)? = null
) : BufferViewHolder(itemView) { ) : BufferViewHolder(itemView) {
@BindView(R.id.status) @BindView(R.id.status)
lateinit var status: AppCompatImageButton lateinit var status: ImageView
@BindView(R.id.name) @BindView(R.id.name)
lateinit var name: TextView lateinit var name: TextView
...@@ -214,6 +216,11 @@ class BufferListAdapter( ...@@ -214,6 +216,11 @@ class BufferListAdapter(
private val online: Drawable private val online: Drawable
private val offline: Drawable private val offline: Drawable
private var none: Int = 0
private var activity: Int = 0
private var message: Int = 0
private var highlight: Int = 0
init { init {
ButterKnife.bind(this, itemView) ButterKnife.bind(this, itemView)
itemView.setOnClickListener { itemView.setOnClickListener {
...@@ -225,9 +232,18 @@ class BufferListAdapter( ...@@ -225,9 +232,18 @@ class BufferListAdapter(
online = itemView.context.getCompatDrawable(R.drawable.ic_status) online = itemView.context.getCompatDrawable(R.drawable.ic_status)
offline = itemView.context.getCompatDrawable(R.drawable.ic_status_offline) offline = itemView.context.getCompatDrawable(R.drawable.ic_status_offline)
itemView.context.theme.styledAttributes(R.attr.colorAccent, R.attr.colorAway) { itemView.context.theme.styledAttributes(
R.attr.colorAccent, R.attr.colorAway,
R.attr.colorForeground, R.attr.colorTintActivity, R.attr.colorTintMessage,
R.attr.colorTintHighlight
) {
DrawableCompat.setTint(online, getColor(0, 0)) DrawableCompat.setTint(online, getColor(0, 0))
DrawableCompat.setTint(offline, getColor(1, 0)) DrawableCompat.setTint(offline, getColor(1, 0))
none = getColor(2, 0)
activity = getColor(3, 0)
message = getColor(4, 0)
highlight = getColor(5, 0)
} }
} }
...@@ -237,6 +253,15 @@ class BufferListAdapter( ...@@ -237,6 +253,15 @@ class BufferListAdapter(
name.text = props.info.bufferName name.text = props.info.bufferName
description.text = props.description description.text = props.description
name.setTextColor(
when (props.activity) {
Buffer_Activity.NoActivity -> none
Buffer_Activity.OtherActivity -> activity
Buffer_Activity.NewMessage -> message
Buffer_Activity.Highlight -> highlight
}
)
description.visibility = if (props.description == "") { description.visibility = if (props.description == "") {
View.GONE View.GONE
} else { } else {
...@@ -270,6 +295,11 @@ class BufferListAdapter( ...@@ -270,6 +295,11 @@ class BufferListAdapter(
private val online: Drawable private val online: Drawable
private val offline: Drawable private val offline: Drawable
private var none: Int = 0
private var activity: Int = 0
private var message: Int = 0
private var highlight: Int = 0
init { init {
ButterKnife.bind(this, itemView) ButterKnife.bind(this, itemView)
itemView.setOnClickListener { itemView.setOnClickListener {
...@@ -281,9 +311,18 @@ class BufferListAdapter( ...@@ -281,9 +311,18 @@ class BufferListAdapter(
online = itemView.context.getCompatDrawable(R.drawable.ic_status_channel) online = itemView.context.getCompatDrawable(R.drawable.ic_status_channel)
offline = itemView.context.getCompatDrawable(R.drawable.ic_status_channel_offline) offline = itemView.context.getCompatDrawable(R.drawable.ic_status_channel_offline)
itemView.context.theme.styledAttributes(R.attr.colorAccent, R.attr.colorAway) { itemView.context.theme.styledAttributes(
R.attr.colorAccent, R.attr.colorAway,
R.attr.colorForeground, R.attr.colorTintActivity, R.attr.colorTintMessage,
R.attr.colorTintHighlight
) {
DrawableCompat.setTint(online, getColor(0, 0)) DrawableCompat.setTint(online, getColor(0, 0))
DrawableCompat.setTint(offline, getColor(1, 0)) DrawableCompat.setTint(offline, getColor(1, 0))
none = getColor(2, 0)
activity = getColor(3, 0)
message = getColor(4, 0)
highlight = getColor(5, 0)
} }
} }
...@@ -293,6 +332,15 @@ class BufferListAdapter( ...@@ -293,6 +332,15 @@ class BufferListAdapter(
name.text = props.info.bufferName name.text = props.info.bufferName
description.text = props.description description.text = props.description
name.setTextColor(
when (props.activity) {
Buffer_Activity.NoActivity -> none
Buffer_Activity.OtherActivity -> activity
Buffer_Activity.NewMessage -> message
Buffer_Activity.Highlight -> highlight
}
)
description.visibility = if (props.description == "") { description.visibility = if (props.description == "") {
View.GONE View.GONE
} else { } else {
...@@ -327,6 +375,11 @@ class BufferListAdapter( ...@@ -327,6 +375,11 @@ class BufferListAdapter(
private val away: Drawable private val away: Drawable
private val offline: Drawable private val offline: Drawable
private var none: Int = 0
private var activity: Int = 0
private var message: Int = 0
private var highlight: Int = 0
init { init {
ButterKnife.bind(this, itemView) ButterKnife.bind(this, itemView)
itemView.setOnClickListener { itemView.setOnClickListener {
...@@ -339,10 +392,19 @@ class BufferListAdapter( ...@@ -339,10 +392,19 @@ class BufferListAdapter(
away = itemView.context.getCompatDrawable(R.drawable.ic_status) away = itemView.context.getCompatDrawable(R.drawable.ic_status)
offline = itemView.context.getCompatDrawable(R.drawable.ic_status_offline) offline = itemView.context.getCompatDrawable(R.drawable.ic_status_offline)
itemView.context.theme.styledAttributes(R.attr.colorAccent, R.attr.colorAway) { itemView.context.theme.styledAttributes(
R.attr.colorAccent, R.attr.colorAway,
R.attr.colorForeground, R.attr.colorTintActivity, R.attr.colorTintMessage,
R.attr.colorTintHighlight
) {
DrawableCompat.setTint(online, getColor(0, 0)) DrawableCompat.setTint(online, getColor(0, 0))
DrawableCompat.setTint(away, getColor(1, 0)) DrawableCompat.setTint(away, getColor(1, 0))
DrawableCompat.setTint(offline, getColor(1, 0)) DrawableCompat.setTint(offline, getColor(1, 0))
none = getColor(2, 0)
activity = getColor(3, 0)
message = getColor(4, 0)
highlight = getColor(5, 0)
} }
} }
...@@ -352,6 +414,15 @@ class BufferListAdapter( ...@@ -352,6 +414,15 @@ class BufferListAdapter(
name.text = props.info.bufferName name.text = props.info.bufferName
description.text = props.description description.text = props.description
name.setTextColor(
when (props.activity) {
Buffer_Activity.NoActivity -> none
Buffer_Activity.OtherActivity -> activity
Buffer_Activity.NewMessage -> message
Buffer_Activity.Highlight -> highlight
}
)
description.visibility = if (props.description == "") { description.visibility = if (props.description == "") {
View.GONE View.GONE
} else { } else {
......
...@@ -11,12 +11,15 @@ import android.widget.AdapterView ...@@ -11,12 +11,15 @@ import android.widget.AdapterView
import butterknife.BindView import butterknife.BindView
import butterknife.ButterKnife import butterknife.ButterKnife
import de.kuschku.libquassel.protocol.BufferId 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.NetworkId
import de.kuschku.libquassel.quassel.BufferInfo import de.kuschku.libquassel.quassel.BufferInfo
import de.kuschku.libquassel.quassel.syncables.* import de.kuschku.libquassel.quassel.syncables.*
import de.kuschku.libquassel.session.Backend import de.kuschku.libquassel.session.Backend
import de.kuschku.libquassel.session.ISession import de.kuschku.libquassel.session.ISession
import de.kuschku.libquassel.session.SessionManager import de.kuschku.libquassel.session.SessionManager
import de.kuschku.libquassel.util.hasFlag
import de.kuschku.quasseldroid_ng.R import de.kuschku.quasseldroid_ng.R
import de.kuschku.quasseldroid_ng.util.AndroidHandlerThread import de.kuschku.quasseldroid_ng.util.AndroidHandlerThread
import de.kuschku.quasseldroid_ng.util.helper.map import de.kuschku.quasseldroid_ng.util.helper.map
...@@ -76,6 +79,8 @@ class BufferViewConfigFragment : ServiceBoundFragment() { ...@@ -76,6 +79,8 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
private val bufferList: LiveData<List<BufferListAdapter.BufferProps>?> = sessionManager.switchMap { manager -> private val bufferList: LiveData<List<BufferListAdapter.BufferProps>?> = sessionManager.switchMap { manager ->
bufferIdList.switchMapRx { ids -> bufferIdList.switchMapRx { ids ->
val bufferSyncer = manager.bufferSyncer
if (bufferSyncer != null) {
Observable.combineLatest( Observable.combineLatest(
ids.mapNotNull { id -> ids.mapNotNull { id ->
manager.bufferSyncer?.bufferInfo( manager.bufferSyncer?.bufferInfo(
...@@ -89,9 +94,18 @@ class BufferViewConfigFragment : ServiceBoundFragment() { ...@@ -89,9 +94,18 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
it to network it to network
} }
}.map { (info, 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()) { when (info.type.toInt()) {
BufferInfo.Type.QueryBuffer.toInt() -> { BufferInfo.Type.QueryBuffer.toInt() -> {
network.liveIrcUser(info.bufferName).distinctUntilChanged().switchMap { user -> network.liveIrcUser(info.bufferName).switchMap { user ->
user.live_away.switchMap { away -> user.live_away.switchMap { away ->
user.live_realName.map { realName -> user.live_realName.map { realName ->
BufferListAdapter.BufferProps( BufferListAdapter.BufferProps(
...@@ -102,14 +116,17 @@ class BufferViewConfigFragment : ServiceBoundFragment() { ...@@ -102,14 +116,17 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
away -> BufferListAdapter.BufferStatus.AWAY away -> BufferListAdapter.BufferStatus.AWAY
else -> BufferListAdapter.BufferStatus.ONLINE else -> BufferListAdapter.BufferStatus.ONLINE
}, },
description = realName description = realName,
activity = activity
) )
} }
} }
} }
} }
BufferInfo.Type.ChannelBuffer.toInt() -> { BufferInfo.Type.ChannelBuffer.toInt() -> {
network.liveIrcChannel(info.bufferName).distinctUntilChanged().switchMap { channel -> network.liveIrcChannel(
info.bufferName
).switchMap { channel ->
channel.live_topic.map { topic -> channel.live_topic.map { topic ->
BufferListAdapter.BufferProps( BufferListAdapter.BufferProps(
info = info, info = info,
...@@ -118,7 +135,8 @@ class BufferViewConfigFragment : ServiceBoundFragment() { ...@@ -118,7 +135,8 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
IrcChannel.NULL -> BufferListAdapter.BufferStatus.OFFLINE IrcChannel.NULL -> BufferListAdapter.BufferStatus.OFFLINE
else -> BufferListAdapter.BufferStatus.ONLINE else -> BufferListAdapter.BufferStatus.ONLINE
}, },
description = topic description = topic,
activity = activity
) )
} }
} }
...@@ -129,7 +147,8 @@ class BufferViewConfigFragment : ServiceBoundFragment() { ...@@ -129,7 +147,8 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
info = info, info = info,
network = network.networkInfo(), network = network.networkInfo(),
bufferStatus = BufferListAdapter.BufferStatus.OFFLINE, bufferStatus = BufferListAdapter.BufferStatus.OFFLINE,
description = "" description = "",
activity = activity
) )
} }
} }
...@@ -138,14 +157,19 @@ class BufferViewConfigFragment : ServiceBoundFragment() { ...@@ -138,14 +157,19 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
info = info, info = info,
network = network.networkInfo(), network = network.networkInfo(),
bufferStatus = BufferListAdapter.BufferStatus.OFFLINE, bufferStatus = BufferListAdapter.BufferStatus.OFFLINE,
description = "" description = "",
activity = activity
) )
) )
} }
}
}, { array: Array<Any> -> }, { array: Array<Any> ->
array.toList() as List<BufferListAdapter.BufferProps> array.toList() as List<BufferListAdapter.BufferProps>
} }
) )
} else {
Observable.empty()
}
} }
} }
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:minHeight="48dp" android:minHeight="48dp"
android:paddingBottom="8dp" android:paddingBottom="8dp"
android:paddingLeft="16dp" android:paddingLeft="16dp"
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:minHeight="48dp" android:minHeight="48dp"
tools:background="@android:color/background_light" tools:background="@android:color/background_light"
tools:theme="@style/Theme.ChatTheme.Quassel_Light"> tools:theme="@style/Theme.ChatTheme.Quassel_Light">
...@@ -24,13 +25,10 @@ ...@@ -24,13 +25,10 @@
android:textStyle="bold" android:textStyle="bold"
tools:text="Freenode" /> tools:text="Freenode" />
<android.support.v7.widget.AppCompatImageButton <ImageView
android:id="@+id/status" android:id="@+id/status"
style="?attr/buttonStyleSmall"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@null"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:minWidth="72dp" android:minWidth="72dp"
android:paddingBottom="12dp" android:paddingBottom="12dp"
android:paddingEnd="16dp" android:paddingEnd="16dp"
......
...@@ -5,6 +5,8 @@ import de.kuschku.libquassel.protocol.Type ...@@ -5,6 +5,8 @@ import de.kuschku.libquassel.protocol.Type
import de.kuschku.libquassel.quassel.BufferInfo import de.kuschku.libquassel.quassel.BufferInfo
import de.kuschku.libquassel.quassel.syncables.interfaces.IBufferSyncer import de.kuschku.libquassel.quassel.syncables.interfaces.IBufferSyncer
import de.kuschku.libquassel.session.SignalProxy import de.kuschku.libquassel.session.SignalProxy
import io.reactivex.Observable
import io.reactivex.subjects.BehaviorSubject
class BufferSyncer constructor( class BufferSyncer constructor(
proxy: SignalProxy proxy: SignalProxy
...@@ -12,6 +14,8 @@ class BufferSyncer constructor( ...@@ -12,6 +14,8 @@ class BufferSyncer constructor(
fun lastSeenMsg(buffer: BufferId): MsgId = _lastSeenMsg[buffer] ?: 0 fun lastSeenMsg(buffer: BufferId): MsgId = _lastSeenMsg[buffer] ?: 0
fun markerLine(buffer: BufferId): MsgId = _markerLines[buffer] ?: 0 fun markerLine(buffer: BufferId): MsgId = _markerLines[buffer] ?: 0
fun activity(buffer: BufferId): Message_Types = _bufferActivities[buffer] ?: Message_Types.of() fun activity(buffer: BufferId): Message_Types = _bufferActivities[buffer] ?: Message_Types.of()
fun liveActivity(buffer: BufferId): Observable<Message_Types>
= live_bufferActivities.map { activity(buffer) }.distinctUntilChanged()
override fun toVariantMap(): QVariantMap = mapOf( override fun toVariantMap(): QVariantMap = mapOf(
"Activities" to QVariant_(initActivities(), Type.QVariantList), "Activities" to QVariant_(initActivities(), Type.QVariantList),
...@@ -125,10 +129,14 @@ class BufferSyncer constructor( ...@@ -125,10 +129,14 @@ class BufferSyncer constructor(
val flags = Message_Types.of<Message_Type>(activity) val flags = Message_Types.of<Message_Type>(activity)
super.setBufferActivity(buffer, activity) super.setBufferActivity(buffer, activity)
_bufferActivities[buffer] = flags _bufferActivities[buffer] = flags
live_bufferActivities.onNext(_bufferActivities)
} }
private val _lastSeenMsg: MutableMap<BufferId, MsgId> = mutableMapOf() private val _lastSeenMsg: MutableMap<BufferId, MsgId> = mutableMapOf()
private val _markerLines: MutableMap<BufferId, MsgId> = mutableMapOf() private val _markerLines: MutableMap<BufferId, MsgId> = mutableMapOf()
private val _bufferActivities: MutableMap<BufferId, Message_Types> = mutableMapOf() private val _bufferActivities: MutableMap<BufferId, Message_Types> = mutableMapOf()
private val live_bufferActivities = BehaviorSubject.createDefault(
mutableMapOf<BufferId, Message_Types>()
)
private val _bufferInfos = mutableMapOf<BufferId, BufferInfo>() private val _bufferInfos = mutableMapOf<BufferId, BufferInfo>()
} }
...@@ -336,7 +336,12 @@ class Network constructor( ...@@ -336,7 +336,12 @@ class Network constructor(
} }
fun ircUser(nickName: String?) = _ircUsers[nickName?.toLowerCase(Locale.ENGLISH)] fun ircUser(nickName: String?) = _ircUsers[nickName?.toLowerCase(Locale.ENGLISH)]
fun liveIrcUser(nickName: String?) = live_ircUsers.map { ircUser(nickName) ?: IrcUser.NULL } fun liveIrcUser(nickName: String?) = live_ircUsers.map {
ircUser(
nickName
) ?: IrcUser.NULL
}.distinctUntilChanged()
fun ircUsers() = _ircUsers.values.toList() fun ircUsers() = _ircUsers.values.toList()
fun ircUserCount(): UInt = _ircUsers.size fun ircUserCount(): UInt = _ircUsers.size
fun newIrcChannel(channelName: String, initData: QVariantMap = emptyMap()): IrcChannel { fun newIrcChannel(channelName: String, initData: QVariantMap = emptyMap()): IrcChannel {
...@@ -363,7 +368,7 @@ class Network constructor( ...@@ -363,7 +368,7 @@ class Network constructor(
ircChannel( ircChannel(
channelName channelName
) ?: IrcChannel.NULL ) ?: IrcChannel.NULL
} }.distinctUntilChanged()
fun ircChannels() = _ircChannels.values.toList() fun ircChannels() = _ircChannels.values.toList()
fun ircChannelCount(): UInt = _ircChannels.size fun ircChannelCount(): UInt = _ircChannels.size
......
...@@ -36,6 +36,9 @@ data class Flags<E>( ...@@ -36,6 +36,9 @@ data class Flags<E>(
fun enabledValues() = values?.filter { hasFlag(it) }?.toSet() ?: emptySet() fun enabledValues() = values?.filter { hasFlag(it) }?.toSet() ?: emptySet()
fun empty() = value == 0
fun nonEmpty() = !empty()
override fun toString() = if (values != null) { override fun toString() = if (values != null) {
enabledValues().joinToString("|", "[", "]") enabledValues().joinToString("|", "[", "]")
} else { } else {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment