diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferListAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferListAdapter.kt index 749a8669c7aa05574e2cd6c5054cc94c6af64426..4a329ce630f10bdebe046b62c5c9ed0b84b5dc21 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferListAdapter.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferListAdapter.kt @@ -36,10 +36,8 @@ import de.kuschku.libquassel.protocol.NetworkId import de.kuschku.libquassel.quassel.BufferInfo import de.kuschku.libquassel.util.flag.hasFlag import de.kuschku.quasseldroid.R -import de.kuschku.quasseldroid.util.helper.getVectorDrawableCompat -import de.kuschku.quasseldroid.util.helper.styledAttributes -import de.kuschku.quasseldroid.util.helper.tint -import de.kuschku.quasseldroid.util.helper.visibleIf +import de.kuschku.quasseldroid.settings.MessageSettings +import de.kuschku.quasseldroid.util.helper.* import de.kuschku.quasseldroid.util.lists.ListAdapter import de.kuschku.quasseldroid.viewmodel.data.BufferListItem import de.kuschku.quasseldroid.viewmodel.data.BufferProps @@ -48,6 +46,7 @@ import de.kuschku.quasseldroid.viewmodel.data.BufferStatus import io.reactivex.subjects.BehaviorSubject class BufferListAdapter( + private val messageSettings: MessageSettings, private val selectedBuffer: BehaviorSubject<BufferId>, private val expandedNetworks: BehaviorSubject<Map<NetworkId, Boolean>> ) : ListAdapter<BufferListItem, BufferListAdapter.BufferViewHolder>( @@ -94,47 +93,56 @@ class BufferListAdapter( selectedBuffer.onNext(Int.MAX_VALUE) } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = when (viewType) { - BufferInfo.Type.ChannelBuffer.toInt() -> BufferViewHolder.ChannelBuffer( - LayoutInflater.from(parent.context).inflate( - R.layout.widget_buffer, parent, false - ), - clickListener = clickListener, - longClickListener = longClickListener - ) - BufferInfo.Type.QueryBuffer.toInt() -> BufferViewHolder.QueryBuffer( - LayoutInflater.from(parent.context).inflate( - R.layout.widget_buffer, parent, false - ), - clickListener = clickListener, - longClickListener = longClickListener - ) - BufferInfo.Type.GroupBuffer.toInt() -> BufferViewHolder.GroupBuffer( - LayoutInflater.from(parent.context).inflate( - R.layout.widget_buffer, parent, false - ), - clickListener = clickListener, - longClickListener = longClickListener - ) - BufferInfo.Type.StatusBuffer.toInt() -> BufferViewHolder.StatusBuffer( - LayoutInflater.from(parent.context).inflate( - R.layout.widget_network, parent, false - ), - clickListener = clickListener, - longClickListener = longClickListener, - expansionListener = ::expandListener - ) - else -> throw IllegalArgumentException( - "No such viewType: $viewType" - ) + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BufferViewHolder { + val bufferType = viewType and 0xFFFF + val bufferStatus = BufferStatus.of(((viewType ushr 16) and 0xFFFF).toShort()) + return when (bufferType) { + BufferInfo.Type.ChannelBuffer.toInt() -> BufferViewHolder.ChannelBuffer( + LayoutInflater.from(parent.context).inflate( + R.layout.widget_buffer, parent, false + ), + clickListener = clickListener, + longClickListener = longClickListener + ) + BufferInfo.Type.QueryBuffer.toInt() -> BufferViewHolder.QueryBuffer( + LayoutInflater.from(parent.context).inflate( + if (bufferStatus == BufferStatus.AWAY) R.layout.widget_buffer_away + else R.layout.widget_buffer + , parent, false + ), + clickListener = clickListener, + longClickListener = longClickListener + ) + BufferInfo.Type.GroupBuffer.toInt() -> BufferViewHolder.GroupBuffer( + LayoutInflater.from(parent.context).inflate( + R.layout.widget_buffer, parent, false + ), + clickListener = clickListener, + longClickListener = longClickListener + ) + BufferInfo.Type.StatusBuffer.toInt() -> BufferViewHolder.StatusBuffer( + LayoutInflater.from(parent.context).inflate( + R.layout.widget_network, parent, false + ), + clickListener = clickListener, + longClickListener = longClickListener, + expansionListener = ::expandListener + ) + else -> throw IllegalArgumentException( + "No such viewType: ${viewType.toString(16)}" + ) + } } override fun onBindViewHolder(holder: BufferViewHolder, position: Int) = - holder.bind(getItem(position).props, getItem(position).state) + holder.bind(getItem(position).props, getItem(position).state, messageSettings) + + override fun getItemViewType(position: Int) = getItem(position).let { + (it.props.bufferStatus.ordinal shl 16) + (it.props.info.type.toInt() and 0xFFFF) + } - override fun getItemViewType(position: Int) = getItem(position).props.info.type.toInt() abstract class BufferViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - abstract fun bind(props: BufferProps, state: BufferState) + abstract fun bind(props: BufferProps, state: BufferState, messageSettings: MessageSettings) class StatusBuffer( itemView: View, @@ -193,7 +201,7 @@ class BufferListAdapter( } } - override fun bind(props: BufferProps, state: BufferState) { + override fun bind(props: BufferProps, state: BufferState, messageSettings: MessageSettings) { name.text = props.network.networkName bufferId = props.info.bufferId networkId = props.info.networkId @@ -279,7 +287,7 @@ class BufferListAdapter( } } - override fun bind(props: BufferProps, state: BufferState) { + override fun bind(props: BufferProps, state: BufferState, messageSettings: MessageSettings) { bufferId = props.info.bufferId name.text = props.info.bufferName @@ -367,7 +375,7 @@ class BufferListAdapter( } } - override fun bind(props: BufferProps, state: BufferState) { + override fun bind(props: BufferProps, state: BufferState, messageSettings: MessageSettings) { bufferId = props.info.bufferId name.text = props.info.bufferName @@ -411,8 +419,6 @@ class BufferListAdapter( var bufferId: BufferId? = null - private val online: Drawable? - private val away: Drawable? private val offline: Drawable? private var none: Int = 0 @@ -438,27 +444,23 @@ class BufferListAdapter( } } - online = itemView.context.getVectorDrawableCompat(R.drawable.ic_status)?.mutate() - away = itemView.context.getVectorDrawableCompat(R.drawable.ic_status)?.mutate() offline = itemView.context.getVectorDrawableCompat(R.drawable.ic_status_offline)?.mutate() itemView.context.theme.styledAttributes( - R.attr.colorAccent, R.attr.colorAway, + R.attr.colorAway, R.attr.colorTextPrimary, R.attr.colorTintActivity, R.attr.colorTintMessage, R.attr.colorTintHighlight ) { - online?.tint(getColor(0, 0)) - away?.tint(getColor(1, 0)) - offline?.tint(getColor(1, 0)) + offline?.tint(getColor(0, 0)) - none = getColor(2, 0) - activity = getColor(3, 0) - message = getColor(4, 0) - highlight = getColor(5, 0) + none = getColor(1, 0) + activity = getColor(2, 0) + message = getColor(3, 0) + highlight = getColor(4, 0) } } - override fun bind(props: BufferProps, state: BufferState) { + override fun bind(props: BufferProps, state: BufferState, messageSettings: MessageSettings) { bufferId = props.info.bufferId name.text = props.info.bufferName @@ -477,13 +479,9 @@ class BufferListAdapter( description.visibleIf(props.description.isNotBlank()) - status.setImageDrawable( - when (props.bufferStatus) { - BufferStatus.ONLINE -> online - BufferStatus.AWAY -> away - else -> offline - } - ) + status.loadAvatars(props.avatarUrls, + props.fallbackDrawable ?: offline, + crop = !messageSettings.squareAvatars) } } } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt index da67e284a7ae5b2b0ef281af569bf03fff8cd06f..75fc022f1a971d68c60afb50fec839261c4a7d4f 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt @@ -38,16 +38,21 @@ import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork import de.kuschku.libquassel.util.flag.hasFlag import de.kuschku.libquassel.util.flag.minus import de.kuschku.libquassel.util.helpers.value +import de.kuschku.libquassel.util.irc.SenderColorUtil import de.kuschku.quasseldroid.R import de.kuschku.quasseldroid.persistence.QuasselDatabase import de.kuschku.quasseldroid.settings.AppearanceSettings import de.kuschku.quasseldroid.settings.MessageSettings import de.kuschku.quasseldroid.ui.coresettings.network.NetworkEditActivity +import de.kuschku.quasseldroid.util.avatars.AvatarHelper import de.kuschku.quasseldroid.util.helper.combineLatest +import de.kuschku.quasseldroid.util.helper.styledAttributes import de.kuschku.quasseldroid.util.helper.toLiveData import de.kuschku.quasseldroid.util.helper.zip import de.kuschku.quasseldroid.util.irc.format.IrcFormatDeserializer import de.kuschku.quasseldroid.util.service.ServiceBoundFragment +import de.kuschku.quasseldroid.util.ui.TextDrawable +import de.kuschku.quasseldroid.viewmodel.EditorViewModel.Companion.IGNORED_CHARS import de.kuschku.quasseldroid.viewmodel.data.BufferHiddenState import de.kuschku.quasseldroid.viewmodel.data.BufferListItem import de.kuschku.quasseldroid.viewmodel.data.BufferState @@ -245,9 +250,28 @@ class BufferViewConfigFragment : ServiceBoundFragment() { chatListSpinner.adapter = adapter listAdapter = BufferListAdapter( + messageSettings, viewModel.selectedBufferId, viewModel.expandedNetworks ) + + val avatarSize = resources.getDimensionPixelSize(R.dimen.avatar_size_buffer) + + val senderColors = requireContext().theme.styledAttributes( + R.attr.senderColor0, R.attr.senderColor1, R.attr.senderColor2, R.attr.senderColor3, + R.attr.senderColor4, R.attr.senderColor5, R.attr.senderColor6, R.attr.senderColor7, + R.attr.senderColor8, R.attr.senderColor9, R.attr.senderColorA, R.attr.senderColorB, + R.attr.senderColorC, R.attr.senderColorD, R.attr.senderColorE, R.attr.senderColorF + ) { + IntArray(length()) { + getColor(it, 0) + } + } + + val selfColor = requireContext().theme.styledAttributes(R.attr.colorForegroundSecondary) { + getColor(0, 0) + } + combineLatest(viewModel.bufferList, viewModel.expandedNetworks, viewModel.selectedBuffer) .toLiveData().zip(database.filtered().listen(accountId)) .observe(this, Observer { it -> @@ -279,7 +303,29 @@ class BufferViewConfigFragment : ServiceBoundFragment() { activity.isNotEmpty() -> Buffer_Activity.OtherActivity else -> Buffer_Activity.NoActivity } - ) + ), + fallbackDrawable = props.ircUser?.let { + val nickName = it.nick() + val senderColorIndex = SenderColorUtil.senderColor(nickName) + val rawInitial = nickName.trimStart(*IGNORED_CHARS).firstOrNull() + ?: nickName.firstOrNull() + val initial = rawInitial?.toUpperCase().toString() + val senderColor = when (messageSettings.colorizeNicknames) { + MessageSettings.ColorizeNicknamesMode.ALL -> senderColors[senderColorIndex] + MessageSettings.ColorizeNicknamesMode.ALL_BUT_MINE -> + if (props.ircUser?.network()?.isMyNick(nickName) == true) selfColor + else senderColors[senderColorIndex] + MessageSettings.ColorizeNicknamesMode.NONE -> selfColor + } + + TextDrawable.builder().let { + if (messageSettings.squareAvatars) it.buildRect(initial, senderColor) + else it.buildRound(initial, senderColor) + } + }, + avatarUrls = props.ircUser?.let { + AvatarHelper.avatar(messageSettings, it, avatarSize) + } ?: emptyList() ), BufferState( networkExpanded = expandedNetworks[props.network.networkId] diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt index 936fbe74f5cb5bc02581c3e87dd851d8c7272612..80f6d2ce160d9bf5958f58599c94606e1da391ba 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt @@ -104,17 +104,7 @@ class NickListFragment : ServiceBoundFragment() { it?.asSequence()?.map { val nickName = it.nick val senderColorIndex = SenderColorUtil.senderColor(nickName) - val rawInitial = nickName.trimStart('-', - '_', - '[', - ']', - '{', - '}', - '|', - '`', - '^', - '.', - '\\') + val rawInitial = nickName.trimStart(*IGNORED_CHARS) .firstOrNull() ?: nickName.firstOrNull() val initial = rawInitial?.toUpperCase().toString() val senderColor = when (messageSettings.colorizeNicknames) { diff --git a/app/src/main/res/drawable/ic_status_channel.xml b/app/src/main/res/drawable/ic_status_channel.xml index 64196ef0bd2f009fbee5af1c011ae67c3d4c6c1f..954f227f340b0c79773ecc7b5ae8b0462e561ddd 100644 --- a/app/src/main/res/drawable/ic_status_channel.xml +++ b/app/src/main/res/drawable/ic_status_channel.xml @@ -20,15 +20,15 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" - android:viewportHeight="24" - android:viewportWidth="24"> + android:viewportHeight="20" + android:viewportWidth="20"> <path android:fillColor="#000" - android:pathData="M2,12a10,10 0 1,0 20,0 10,10 0 1,0-20,0 - M9.7,9.7l0.295,-2.13a0.625,0.625 0 0 1 1.238,0.17l-0.27,1.953 2.779,-0.015 0.293,-2.109a + android:pathData="M0,10a10,10 0 1,0 20,0 10,10 0 1,0-20,0 + M7.7,7.7l0.295,-2.13a0.625,0.625 0 0 1 1.238,0.17l-0.27,1.953 2.779,-0.015 0.293,-2.109a 0.625,0.625 0 0 1 1.239,0.171l-0.268,1.932 1.609,0a0.625,0.625 0 1 1 0,1.25l-1.789,0-0.331,2.388 1.712,0a0.625,0.625 0 0 1 0,1.249l-1.892,0.01-0.305,2.196a0.625,0.625 0 0 1-1.238,-0.172l0.28, -2.018-2.78,0.015-0.302,2.175a0.625,0.625 0 0 1-1.238,-0.172l0.277,-1.997-1.418,0a0.625,0.625 0 0 1 0,-1.249l1.598,0 0.504,-3.638-0.173,1.25-1.521,0a0.625,0.625 0 0 1 0,-1.25z - M9.7,9.7m1.089,1.25-0.331,2.388 2.779,-0.015 0.331,-2.387z" /> + M7.7,7.7m1.089,1.25-0.331,2.388 2.779,-0.015 0.331,-2.387z" /> </vector> diff --git a/app/src/main/res/drawable/ic_status_channel_offline.xml b/app/src/main/res/drawable/ic_status_channel_offline.xml index 989a62f895f369e2328b2438766506afb38923cb..b84f8145c07c4d150820dd8ced0aa329431abd5b 100644 --- a/app/src/main/res/drawable/ic_status_channel_offline.xml +++ b/app/src/main/res/drawable/ic_status_channel_offline.xml @@ -20,16 +20,16 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" - android:viewportHeight="24" - android:viewportWidth="24"> + android:viewportHeight="20" + android:viewportWidth="20"> <path android:fillColor="#000" - android:pathData="M2,12a10,10 0 1,0 20,0 10,10 0 1,0-20,0 + android:pathData="M0,10a10,10 0 1,0 20,0 10,10 0 1,0-20,0 m1.5,0a8.5,8.5 0 0,1 17,0a8.5,8.5 0 0,1-17,0 - M9.7,9.7l0.295,-2.13a0.625,0.625 0 0 1 1.238,0.17l-0.27,1.953 2.779,-0.015 0.293,-2.109a + M7.7,7.7l0.295,-2.13a0.625,0.625 0 0 1 1.238,0.17l-0.27,1.953 2.779,-0.015 0.293,-2.109a 0.625,0.625 0 0 1 1.239,0.171l-0.268,1.932 1.609,0a0.625,0.625 0 1 1 0,1.25l-1.789,0-0.331,2.388 1.712,0a0.625,0.625 0 0 1 0,1.249l-1.892,0.01-0.305,2.196a0.625,0.625 0 0 1-1.238,-0.172l0.28, -2.018-2.78,0.015-0.302,2.175a0.625,0.625 0 0 1-1.238,-0.172l0.277,-1.997-1.418,0a0.625,0.625 0 0 1 0,-1.249l1.598,0 0.504,-3.638-0.173,1.25-1.521,0a0.625,0.625 0 0 1 0,-1.25z - M9.7,9.7m1.089,1.25-0.331,2.388 2.779,-0.015 0.331,-2.387z" /> + M7.7,7.7m1.089,1.25-0.331,2.388 2.779,-0.015 0.331,-2.387z" /> </vector> diff --git a/app/src/main/res/drawable/ic_status_offline.xml b/app/src/main/res/drawable/ic_status_offline.xml index bf507501be02794375aedf265d08107de4f224c6..292697f16b57c4598572481dfe8ff860e2932838 100644 --- a/app/src/main/res/drawable/ic_status_offline.xml +++ b/app/src/main/res/drawable/ic_status_offline.xml @@ -20,10 +20,10 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" - android:viewportHeight="24" - android:viewportWidth="24"> + android:viewportHeight="20" + android:viewportWidth="20"> <path android:fillColor="#000" - android:pathData="M2,12a10,10 0 1,0 20,0 10,10 0 1,0-20,0 + android:pathData="M0,10a10,10 0 1,0 20,0 10,10 0 1,0-20,0 m1.5,0a8.5,8.5 0 0,1 17,0a8.5,8.5 0 0,1-17,0" /> </vector> diff --git a/app/src/main/res/layout/widget_buffer.xml b/app/src/main/res/layout/widget_buffer.xml index 4ee1a394ca1457a59aef8f8092776a4521c26540..a751b0fa17c35d4a57313b240a1b4f74ae87df3b 100644 --- a/app/src/main/res/layout/widget_buffer.xml +++ b/app/src/main/res/layout/widget_buffer.xml @@ -22,48 +22,53 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/backgroundMenuItem" - android:minHeight="48dp" - android:paddingBottom="8dp" + android:minHeight="?listPreferredItemHeightSmall" + android:orientation="horizontal" + android:paddingBottom="4dp" android:paddingLeft="16dp" android:paddingRight="16dp" - android:paddingTop="8dp"> + android:paddingTop="4dp" + android:textAppearance="?android:attr/textAppearanceListItemSmall"> - <android.support.v7.widget.AppCompatImageView + <ImageView android:id="@+id/status" - android:layout_width="24dp" - android:layout_height="24dp" - android:layout_gravity="center" - android:layout_marginEnd="32dp" - android:layout_marginRight="32dp" - tools:src="@drawable/ic_status_channel" - tools:tint="?attr/colorAccent" /> + android:layout_width="@dimen/avatar_size_buffer" + android:layout_height="@dimen/avatar_size_buffer" + android:layout_gravity="center_vertical" + android:layout_marginEnd="16dp" + android:layout_marginRight="16dp" + android:contentDescription="@string/label_avatar" + tools:src="@tools:sample/avatars" /> <LinearLayout - android:layout_width="0dip" + android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="center" - android:layout_weight="1" + android:layout_gravity="center_vertical" android:orientation="vertical"> <TextView android:id="@+id/name" + style="@style/Widget.RtlConformTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:ellipsize="marquee" android:layout_gravity="center_vertical|start" android:fontFamily="sans-serif-medium" android:singleLine="true" android:textColor="?attr/colorTextPrimary" android:textSize="13sp" - tools:text="#quasseldroid" /> + tools:text="@sample/messages.json/data/sender" /> <TextView android:id="@+id/description" + style="@style/Widget.RtlConformTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center_vertical|start" + android:ellipsize="marquee" android:singleLine="true" android:textColor="?attr/colorTextSecondary" android:textSize="12sp" - tools:text="Quasseldroid is an Android client for #quassel ♥ justJanne's much improved version: https://dl.kuschku.de/releases/quasseldroid/ ♥ http://github.com/sandsmark/Quasseldroid ♥ Quasseldroid on play https://market.android.com/details?id=com.iskrembilen.quasseldroid ♥ Sign up for beta: https://plus.google.com/communities/104094956084217666662" /> + tools:text="@sample/messages.json/data/sender" + tools:visibility="visible" /> </LinearLayout> </LinearLayout> diff --git a/app/src/main/res/layout/widget_buffer_away.xml b/app/src/main/res/layout/widget_buffer_away.xml new file mode 100644 index 0000000000000000000000000000000000000000..aabbfe9e37cd8675a9b9a003553e217f49fe4676 --- /dev/null +++ b/app/src/main/res/layout/widget_buffer_away.xml @@ -0,0 +1,88 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + Quasseldroid - Quassel client for Android + + Copyright (c) 2018 Janne Koschinski + Copyright (c) 2018 The Quassel Project + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License version 3 as published + by the Free Software Foundation. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program. If not, see <http://www.gnu.org/licenses/>. + --> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="?attr/backgroundMenuItem" + android:minHeight="?listPreferredItemHeightSmall" + android:orientation="horizontal" + android:paddingBottom="4dp" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:paddingTop="4dp" + android:textAppearance="?android:attr/textAppearanceListItemSmall"> + + <ImageView + android:id="@+id/status" + android:layout_width="@dimen/avatar_size_buffer" + android:layout_height="@dimen/avatar_size_buffer" + android:layout_gravity="center_vertical" + android:layout_marginEnd="16dp" + android:layout_marginRight="16dp" + android:contentDescription="@string/label_avatar" + tools:src="@drawable/ic_status_channel" /> + + <LinearLayout + android:layout_width="0dip" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:layout_weight="1" + android:orientation="vertical"> + + <TextView + android:id="@+id/name" + style="@style/Widget.RtlConformTextView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical|start" + android:ellipsize="marquee" + android:fontFamily="sans-serif-medium" + android:singleLine="true" + android:textColor="?attr/colorTextSecondary" + android:textSize="13sp" + android:textStyle="italic" + tools:text="@sample/messages.json/data/sender" /> + + <TextView + android:id="@+id/description" + style="@style/Widget.RtlConformTextView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:ellipsize="marquee" + android:singleLine="true" + android:textColor="?attr/colorTextSecondary" + android:textSize="12sp" + android:textStyle="italic" + tools:text="@sample/messages.json/data/sender" + tools:visibility="visible" /> + </LinearLayout> + + <android.support.v7.widget.AppCompatImageView + android:layout_width="24dp" + android:layout_height="24dp" + android:layout_gravity="center_vertical" + android:layout_marginLeft="16dp" + android:layout_marginStart="16dp" + android:contentDescription="@string/label_user_away" + app:srcCompat="@drawable/ic_clock" + app:tint="?colorTextSecondary" /> +</LinearLayout> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index c0d6497fadad9bcd19ab74fb04e9bf5e67953046..2b47dc9492503bce463254d6f0b5e1c01e97fed2 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -37,6 +37,7 @@ <dimen name="colorchooser_circlesize">56dp</dimen> <dimen name="avatar_size">35sp</dimen> <dimen name="avatar_size_action">20sp</dimen> + <dimen name="avatar_size_buffer">32dp</dimen> <dimen name="notification_avatar_width">64dp</dimen> <dimen name="notification_avatar_height">64dp</dimen> diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt index d2681f79d8f449bc7a032494f6a06dc1ddc68928..6fd66581504f499956ceb7fd072f38a870e38517 100644 --- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt +++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt @@ -379,7 +379,8 @@ class QuasselViewModel : ViewModel() { description = user?.realName() ?: "", activity = activity, highlights = highlights, - hiddenState = state + hiddenState = state, + ircUser = user ) } } diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferProps.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferProps.kt index 6aa5b90becc89187f4c4b1a8717c29fc48a7a986..daddbb58092241f7fd04ec83ca6501a8399e319a 100644 --- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferProps.kt +++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferProps.kt @@ -19,9 +19,11 @@ package de.kuschku.quasseldroid.viewmodel.data +import android.graphics.drawable.Drawable import de.kuschku.libquassel.protocol.Buffer_Activities import de.kuschku.libquassel.protocol.Message_Types import de.kuschku.libquassel.quassel.BufferInfo +import de.kuschku.libquassel.quassel.syncables.IrcUser import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork data class BufferProps( @@ -35,5 +37,8 @@ data class BufferProps( val bufferActivity: Buffer_Activities = BufferInfo.Activity.of( BufferInfo.Activity.NoActivity ), - val hiddenState: BufferHiddenState + val hiddenState: BufferHiddenState, + val ircUser: IrcUser? = null, + val avatarUrls: List<Avatar> = emptyList(), + val fallbackDrawable: Drawable? = null ) diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferStatus.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferStatus.kt index 13a1359ac9669100f78a96f0cf175b4d37c5e53e..b98f08939fbcd7b32a244aada63e9b94a820bfcd 100644 --- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferStatus.kt +++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferStatus.kt @@ -19,8 +19,13 @@ package de.kuschku.quasseldroid.viewmodel.data -enum class BufferStatus { - ONLINE, - AWAY, - OFFLINE +enum class BufferStatus(val value: Short) { + ONLINE(0), + AWAY(1), + OFFLINE(2); + + companion object { + private val map = values().associateBy { it.value } + fun of(value: Short) = map[value] + } }