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