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

Add user info to message context menu when only one is selected

parent 7c4233be
Branches
Tags v1.0.12
No related merge requests found
Pipeline #331 canceled
...@@ -120,10 +120,31 @@ class MessageListFragment : ServiceBoundFragment() { ...@@ -120,10 +120,31 @@ class MessageListFragment : ServiceBoundFragment() {
private val actionModeCallback = object : ActionMode.Callback { private val actionModeCallback = object : ActionMode.Callback {
override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?) = when (item?.itemId) { override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?) = when (item?.itemId) {
R.id.action_user_info -> {
viewModel.selectedMessages.value.values.firstOrNull()?.let { msg ->
viewModel.session.value?.orNull()?.bufferSyncer?.let { bufferSyncer ->
viewModel.bufferData.value?.info?.let(BufferInfo::networkId)?.let { networkId ->
UserInfoActivity.launch(
requireContext(),
openBuffer = false,
bufferId = bufferSyncer.find(
bufferName = HostmaskHelper.nick(msg.original.sender),
networkId = networkId,
type = Buffer_Type.of(Buffer_Type.QueryBuffer)
)?.let(BufferInfo::bufferId),
nick = HostmaskHelper.nick(msg.original.sender),
networkId = networkId
)
}
}
true
} ?: false
}
R.id.action_copy -> { R.id.action_copy -> {
val builder = SpannableStringBuilder() val builder = SpannableStringBuilder()
viewModel.selectedMessages.value.values.asSequence().sortedBy { viewModel.selectedMessages.value.values.asSequence().sortedBy {
it.id it.original.messageId
}.map { }.map {
if (it.name != null && it.content != null) { if (it.name != null && it.content != null) {
SpanFormatter.format(getString(R.string.message_format_copy_complex), SpanFormatter.format(getString(R.string.message_format_copy_complex),
...@@ -152,7 +173,7 @@ class MessageListFragment : ServiceBoundFragment() { ...@@ -152,7 +173,7 @@ class MessageListFragment : ServiceBoundFragment() {
R.id.action_share -> { R.id.action_share -> {
val builder = SpannableStringBuilder() val builder = SpannableStringBuilder()
viewModel.selectedMessages.value.values.asSequence().sortedBy { viewModel.selectedMessages.value.values.asSequence().sortedBy {
it.id it.original.messageId
}.map { }.map {
if (it.name != null && it.content != null) { if (it.name != null && it.content != null) {
SpanFormatter.format(getString(R.string.message_format_copy_complex), SpanFormatter.format(getString(R.string.message_format_copy_complex),
...@@ -225,8 +246,10 @@ class MessageListFragment : ServiceBoundFragment() { ...@@ -225,8 +246,10 @@ class MessageListFragment : ServiceBoundFragment() {
adapter.setOnClickListener { msg -> adapter.setOnClickListener { msg ->
if (actionMode != null) { if (actionMode != null) {
if (!viewModel.selectedMessagesToggle(msg.id, msg)) { when (viewModel.selectedMessagesToggle(msg.original.messageId, msg)) {
actionMode?.finish() 0 -> actionMode?.finish()
1 -> actionMode?.menu?.findItem(R.id.action_user_info)?.isVisible = true
else -> actionMode?.menu?.findItem(R.id.action_user_info)?.isVisible = false
} }
} }
} }
...@@ -234,8 +257,10 @@ class MessageListFragment : ServiceBoundFragment() { ...@@ -234,8 +257,10 @@ class MessageListFragment : ServiceBoundFragment() {
if (actionMode == null) { if (actionMode == null) {
activity?.startActionMode(actionModeCallback) activity?.startActionMode(actionModeCallback)
} }
if (!viewModel.selectedMessagesToggle(msg.id, msg)) { when (viewModel.selectedMessagesToggle(msg.original.messageId, msg)) {
actionMode?.finish() 0 -> actionMode?.finish()
1 -> actionMode?.menu?.findItem(R.id.action_user_info)?.isVisible = true
else -> actionMode?.menu?.findItem(R.id.action_user_info)?.isVisible = false
} }
} }
if (autoCompleteSettings.senderDoubleClick) if (autoCompleteSettings.senderDoubleClick)
......
...@@ -274,7 +274,7 @@ class QuasselMessageRenderer @Inject constructor( ...@@ -274,7 +274,7 @@ class QuasselMessageRenderer @Inject constructor(
val senderColor = if (useSelfColor) selfColor else senderColors[senderColorIndex] val senderColor = if (useSelfColor) selfColor else senderColors[senderColorIndex]
FormattedMessage( FormattedMessage(
id = message.content.messageId, original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)), time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message), dayChange = formatDayChange(message),
name = nick, name = nick,
...@@ -308,7 +308,7 @@ class QuasselMessageRenderer @Inject constructor( ...@@ -308,7 +308,7 @@ class QuasselMessageRenderer @Inject constructor(
val senderColor = if (useSelfColor) selfColor else senderColors[senderColorIndex] val senderColor = if (useSelfColor) selfColor else senderColors[senderColorIndex]
FormattedMessage( FormattedMessage(
id = message.content.messageId, original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)), time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message), dayChange = formatDayChange(message),
combined = SpanFormatter.format( combined = SpanFormatter.format(
...@@ -328,7 +328,7 @@ class QuasselMessageRenderer @Inject constructor( ...@@ -328,7 +328,7 @@ class QuasselMessageRenderer @Inject constructor(
) )
} }
Message_Type.Notice -> FormattedMessage( Message_Type.Notice -> FormattedMessage(
id = message.content.messageId, original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)), time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message), dayChange = formatDayChange(message),
combined = SpanFormatter.format( combined = SpanFormatter.format(
...@@ -347,7 +347,7 @@ class QuasselMessageRenderer @Inject constructor( ...@@ -347,7 +347,7 @@ class QuasselMessageRenderer @Inject constructor(
Message_Type.Nick -> { Message_Type.Nick -> {
val nickSelf = message.content.sender == message.content.content || self val nickSelf = message.content.sender == message.content.content || self
FormattedMessage( FormattedMessage(
id = message.content.messageId, original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)), time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message), dayChange = formatDayChange(message),
combined = if (nickSelf) { combined = if (nickSelf) {
...@@ -387,7 +387,7 @@ class QuasselMessageRenderer @Inject constructor( ...@@ -387,7 +387,7 @@ class QuasselMessageRenderer @Inject constructor(
) )
} }
Message_Type.Mode -> FormattedMessage( Message_Type.Mode -> FormattedMessage(
id = message.content.messageId, original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)), time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message), dayChange = formatDayChange(message),
combined = SpanFormatter.format( combined = SpanFormatter.format(
...@@ -402,7 +402,7 @@ class QuasselMessageRenderer @Inject constructor( ...@@ -402,7 +402,7 @@ class QuasselMessageRenderer @Inject constructor(
isSelected = message.isSelected isSelected = message.isSelected
) )
Message_Type.Join -> FormattedMessage( Message_Type.Join -> FormattedMessage(
id = message.content.messageId, original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)), time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message), dayChange = formatDayChange(message),
combined = SpanFormatter.format( combined = SpanFormatter.format(
...@@ -422,7 +422,7 @@ class QuasselMessageRenderer @Inject constructor( ...@@ -422,7 +422,7 @@ class QuasselMessageRenderer @Inject constructor(
isSelected = message.isSelected isSelected = message.isSelected
) )
Message_Type.Part -> FormattedMessage( Message_Type.Part -> FormattedMessage(
id = message.content.messageId, original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)), time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message), dayChange = formatDayChange(message),
combined = if (message.content.content.isBlank()) { combined = if (message.content.content.isBlank()) {
...@@ -457,7 +457,7 @@ class QuasselMessageRenderer @Inject constructor( ...@@ -457,7 +457,7 @@ class QuasselMessageRenderer @Inject constructor(
isSelected = message.isSelected isSelected = message.isSelected
) )
Message_Type.Quit -> FormattedMessage( Message_Type.Quit -> FormattedMessage(
id = message.content.messageId, original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)), time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message), dayChange = formatDayChange(message),
combined = if (message.content.content.isBlank()) { combined = if (message.content.content.isBlank()) {
...@@ -494,7 +494,7 @@ class QuasselMessageRenderer @Inject constructor( ...@@ -494,7 +494,7 @@ class QuasselMessageRenderer @Inject constructor(
Message_Type.Kick -> { Message_Type.Kick -> {
val (user, reason) = message.content.content.split(' ', limit = 2) + listOf("", "") val (user, reason) = message.content.content.split(' ', limit = 2) + listOf("", "")
FormattedMessage( FormattedMessage(
id = message.content.messageId, original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)), time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message), dayChange = formatDayChange(message),
combined = if (reason.isBlank()) { combined = if (reason.isBlank()) {
...@@ -530,7 +530,7 @@ class QuasselMessageRenderer @Inject constructor( ...@@ -530,7 +530,7 @@ class QuasselMessageRenderer @Inject constructor(
Message_Type.Kill -> { Message_Type.Kill -> {
val (user, reason) = message.content.content.split(' ', limit = 2) + listOf("", "") val (user, reason) = message.content.content.split(' ', limit = 2) + listOf("", "")
FormattedMessage( FormattedMessage(
id = message.content.messageId, original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)), time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message), dayChange = formatDayChange(message),
combined = if (reason.isBlank()) { combined = if (reason.isBlank()) {
...@@ -572,7 +572,7 @@ class QuasselMessageRenderer @Inject constructor( ...@@ -572,7 +572,7 @@ class QuasselMessageRenderer @Inject constructor(
} }
FormattedMessage( FormattedMessage(
id = message.content.messageId, original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)), time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message), dayChange = formatDayChange(message),
combined = context.resources.getQuantityString( combined = context.resources.getQuantityString(
...@@ -598,7 +598,7 @@ class QuasselMessageRenderer @Inject constructor( ...@@ -598,7 +598,7 @@ class QuasselMessageRenderer @Inject constructor(
} }
FormattedMessage( FormattedMessage(
id = message.content.messageId, original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)), time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message), dayChange = formatDayChange(message),
combined = context.resources.getQuantityString( combined = context.resources.getQuantityString(
...@@ -618,7 +618,7 @@ class QuasselMessageRenderer @Inject constructor( ...@@ -618,7 +618,7 @@ class QuasselMessageRenderer @Inject constructor(
Message_Type.Server, Message_Type.Server,
Message_Type.Info, Message_Type.Info,
Message_Type.Error -> FormattedMessage( Message_Type.Error -> FormattedMessage(
id = message.content.messageId, original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)), time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message), dayChange = formatDayChange(message),
combined = contentFormatter.formatContent(message.content.content, combined = contentFormatter.formatContent(message.content.content,
...@@ -630,7 +630,7 @@ class QuasselMessageRenderer @Inject constructor( ...@@ -630,7 +630,7 @@ class QuasselMessageRenderer @Inject constructor(
isSelected = message.isSelected isSelected = message.isSelected
) )
Message_Type.Topic -> FormattedMessage( Message_Type.Topic -> FormattedMessage(
id = message.content.messageId, original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)), time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message), dayChange = formatDayChange(message),
combined = contentFormatter.formatContent(message.content.content, combined = contentFormatter.formatContent(message.content.content,
...@@ -642,7 +642,7 @@ class QuasselMessageRenderer @Inject constructor( ...@@ -642,7 +642,7 @@ class QuasselMessageRenderer @Inject constructor(
isSelected = message.isSelected isSelected = message.isSelected
) )
Message_Type.DayChange -> FormattedMessage( Message_Type.DayChange -> FormattedMessage(
id = message.content.messageId, original = message.content,
time = "", time = "",
dayChange = formatDayChange(message), dayChange = formatDayChange(message),
combined = dateFormatter.format(message.content.time.atZone(zoneId)), combined = dateFormatter.format(message.content.time.atZone(zoneId)),
...@@ -652,7 +652,7 @@ class QuasselMessageRenderer @Inject constructor( ...@@ -652,7 +652,7 @@ class QuasselMessageRenderer @Inject constructor(
isSelected = false isSelected = false
) )
Message_Type.Invite -> FormattedMessage( Message_Type.Invite -> FormattedMessage(
id = message.content.messageId, original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)), time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message), dayChange = formatDayChange(message),
combined = contentFormatter.formatContent(message.content.content, combined = contentFormatter.formatContent(message.content.content,
...@@ -664,7 +664,7 @@ class QuasselMessageRenderer @Inject constructor( ...@@ -664,7 +664,7 @@ class QuasselMessageRenderer @Inject constructor(
isSelected = message.isSelected isSelected = message.isSelected
) )
else -> FormattedMessage( else -> FormattedMessage(
id = message.content.messageId, original = message.content,
time = timeFormatter.format(message.content.time.atZone(zoneId)), time = timeFormatter.format(message.content.time.atZone(zoneId)),
dayChange = formatDayChange(message), dayChange = formatDayChange(message),
combined = SpanFormatter.format( combined = SpanFormatter.format(
......
...@@ -18,6 +18,10 @@ ...@@ -18,6 +18,10 @@
--> -->
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_user_info"
android:icon="@drawable/ic_account"
android:title="@string/label_info_user" />
<item <item
android:id="@+id/action_copy" android:id="@+id/action_copy"
android:icon="@drawable/ic_copy" android:icon="@drawable/ic_copy"
......
...@@ -58,11 +58,11 @@ class QuasselViewModel : ViewModel() { ...@@ -58,11 +58,11 @@ class QuasselViewModel : ViewModel() {
val backendWrapper = BehaviorSubject.createDefault(Observable.empty<Optional<Backend>>()) val backendWrapper = BehaviorSubject.createDefault(Observable.empty<Optional<Backend>>())
val selectedMessages = BehaviorSubject.createDefault(emptyMap<MsgId, FormattedMessage>()) val selectedMessages = BehaviorSubject.createDefault(emptyMap<MsgId, FormattedMessage>())
fun selectedMessagesToggle(key: MsgId, value: FormattedMessage): Boolean { fun selectedMessagesToggle(key: MsgId, value: FormattedMessage): Int {
val set = selectedMessages.value.orEmpty() val set = selectedMessages.value.orEmpty()
val result = if (set.containsKey(key)) set - key else set + Pair(key, value) val result = if (set.containsKey(key)) set - key else set + Pair(key, value)
selectedMessages.onNext(result) selectedMessages.onNext(result)
return result.isNotEmpty() return result.size
} }
val expandedMessages = BehaviorSubject.createDefault(emptySet<MsgId>()) val expandedMessages = BehaviorSubject.createDefault(emptySet<MsgId>())
......
...@@ -20,10 +20,10 @@ ...@@ -20,10 +20,10 @@
package de.kuschku.quasseldroid.viewmodel.data package de.kuschku.quasseldroid.viewmodel.data
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import de.kuschku.libquassel.protocol.MsgId import de.kuschku.quasseldroid.persistence.QuasselDatabase
class FormattedMessage( class FormattedMessage(
val id: MsgId, val original: QuasselDatabase.MessageData,
val time: CharSequence, val time: CharSequence,
val dayChange: CharSequence? = null, val dayChange: CharSequence? = null,
val name: CharSequence? = null, val name: CharSequence? = null,
...@@ -44,7 +44,7 @@ class FormattedMessage( ...@@ -44,7 +44,7 @@ class FormattedMessage(
other as FormattedMessage other as FormattedMessage
if (id != other.id) return false if (original != other.original) return false
if (time != other.time) return false if (time != other.time) return false
if (dayChange != other.dayChange) return false if (dayChange != other.dayChange) return false
if (name != other.name) return false if (name != other.name) return false
...@@ -62,7 +62,7 @@ class FormattedMessage( ...@@ -62,7 +62,7 @@ class FormattedMessage(
} }
override fun hashCode(): Int { override fun hashCode(): Int {
var result = id.hashCode() var result = original.hashCode()
result = 31 * result + time.hashCode() result = 31 * result + time.hashCode()
result = 31 * result + (dayChange?.hashCode() ?: 0) result = 31 * result + (dayChange?.hashCode() ?: 0)
result = 31 * result + (name?.hashCode() ?: 0) result = 31 * result + (name?.hashCode() ?: 0)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment