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

Easily allow ignoring users from the context menu

parent 27cf008f
Branches
No related tags found
No related merge requests found
Pipeline #410 canceled
Showing
with 92 additions and 27 deletions
...@@ -28,16 +28,21 @@ class IgnoreItemActivity : ServiceBoundSettingsActivity(IgnoreItemFragment()) { ...@@ -28,16 +28,21 @@ class IgnoreItemActivity : ServiceBoundSettingsActivity(IgnoreItemFragment()) {
companion object { companion object {
fun launch( fun launch(
context: Context, context: Context,
item: IgnoreListManager.IgnoreListItem? = null item: IgnoreListManager.IgnoreListItem? = null,
addRule: String? = null
) = context.startActivity(intent(context, item)) ) = context.startActivity(intent(context, item))
fun intent( fun intent(
context: Context, context: Context,
item: IgnoreListManager.IgnoreListItem? = null item: IgnoreListManager.IgnoreListItem? = null,
addRule: String? = null
) = Intent(context, IgnoreItemActivity::class.java).apply { ) = Intent(context, IgnoreItemActivity::class.java).apply {
if (item != null) { if (item != null) {
putExtra("item", item) putExtra("item", item)
} }
if (addRule != null) {
putExtra("add_rule", addRule)
}
} }
} }
} }
...@@ -119,7 +119,9 @@ class IgnoreItemFragment : ServiceBoundSettingsFragment(), Savable, ...@@ -119,7 +119,9 @@ class IgnoreItemFragment : ServiceBoundSettingsFragment(), Savable,
)) ))
scope.adapter = scopeAdapter scope.adapter = scopeAdapter
item?.let { data -> val addRule = arguments?.getString("add_rule")
val data = item
if (data != null) {
enabled.isChecked = data.isActive enabled.isChecked = data.isActive
ignoreRule.setText(data.ignoreRule) ignoreRule.setText(data.ignoreRule)
isRegEx.isChecked = data.isRegEx isRegEx.isChecked = data.isRegEx
...@@ -127,6 +129,8 @@ class IgnoreItemFragment : ServiceBoundSettingsFragment(), Savable, ...@@ -127,6 +129,8 @@ class IgnoreItemFragment : ServiceBoundSettingsFragment(), Savable,
strictness.setSelection(strictnessAdapter.indexOf(data.strictness) ?: 0) strictness.setSelection(strictnessAdapter.indexOf(data.strictness) ?: 0)
scope.setSelection(scopeAdapter.indexOf(data.scope) ?: 0) scope.setSelection(scopeAdapter.indexOf(data.scope) ?: 0)
scopeRule.setText(data.scopeRule) scopeRule.setText(data.scopeRule)
} else if (addRule != null) {
ignoreRule.setText(addRule)
} }
scope.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { scope.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
......
...@@ -25,7 +25,18 @@ import de.kuschku.quasseldroid.util.ui.settings.ServiceBoundSettingsActivity ...@@ -25,7 +25,18 @@ import de.kuschku.quasseldroid.util.ui.settings.ServiceBoundSettingsActivity
class IgnoreListActivity : ServiceBoundSettingsActivity(IgnoreListFragment()) { class IgnoreListActivity : ServiceBoundSettingsActivity(IgnoreListFragment()) {
companion object { companion object {
fun launch(context: Context) = context.startActivity(intent(context)) fun launch(
fun intent(context: Context) = Intent(context, IgnoreListActivity::class.java) context: Context,
addRule: String? = null
) = context.startActivity(intent(context, addRule))
fun intent(
context: Context,
addRule: String? = null
) = Intent(context, IgnoreListActivity::class.java).apply {
if (addRule != null) {
putExtra("add_rule", addRule)
}
}
} }
} }
...@@ -69,10 +69,17 @@ class IgnoreListFragment : ServiceBoundSettingsFragment(), Savable, ...@@ -69,10 +69,17 @@ class IgnoreListFragment : ServiceBoundSettingsFragment(), Savable,
helper = ItemTouchHelper(callback) helper = ItemTouchHelper(callback)
helper.attachToRecyclerView(list) helper.attachToRecyclerView(list)
val addRule = arguments?.getString("add_rule")
add.setOnClickListener { add.setOnClickListener {
startActivityForResult(IgnoreItemActivity.intent(requireContext()), REQUEST_CREATE_RULE) startActivityForResult(IgnoreItemActivity.intent(requireContext()), REQUEST_CREATE_RULE)
} }
if (addRule != null) {
startActivityForResult(IgnoreItemActivity.intent(requireContext(), addRule = addRule),
REQUEST_CREATE_RULE)
}
viewModel.ignoreListManager viewModel.ignoreListManager
.filter(Optional<IgnoreListManager>::isPresent) .filter(Optional<IgnoreListManager>::isPresent)
.map(Optional<IgnoreListManager>::get) .map(Optional<IgnoreListManager>::get)
......
...@@ -30,7 +30,6 @@ import android.view.ViewGroup ...@@ -30,7 +30,6 @@ import android.view.ViewGroup
import android.widget.Button import android.widget.Button
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import android.widget.Toast
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import butterknife.BindView import butterknife.BindView
import butterknife.ButterKnife import butterknife.ButterKnife
...@@ -42,9 +41,11 @@ import de.kuschku.libquassel.quassel.syncables.IrcUser ...@@ -42,9 +41,11 @@ import de.kuschku.libquassel.quassel.syncables.IrcUser
import de.kuschku.libquassel.util.Optional import de.kuschku.libquassel.util.Optional
import de.kuschku.libquassel.util.helpers.nullIf import de.kuschku.libquassel.util.helpers.nullIf
import de.kuschku.libquassel.util.helpers.value import de.kuschku.libquassel.util.helpers.value
import de.kuschku.libquassel.util.irc.HostmaskHelper
import de.kuschku.quasseldroid.R import de.kuschku.quasseldroid.R
import de.kuschku.quasseldroid.settings.MessageSettings import de.kuschku.quasseldroid.settings.MessageSettings
import de.kuschku.quasseldroid.ui.chat.ChatActivity import de.kuschku.quasseldroid.ui.chat.ChatActivity
import de.kuschku.quasseldroid.ui.coresettings.ignorelist.IgnoreListActivity
import de.kuschku.quasseldroid.util.ShortcutCreationHelper import de.kuschku.quasseldroid.util.ShortcutCreationHelper
import de.kuschku.quasseldroid.util.avatars.AvatarHelper import de.kuschku.quasseldroid.util.avatars.AvatarHelper
import de.kuschku.quasseldroid.util.avatars.MatrixApi import de.kuschku.quasseldroid.util.avatars.MatrixApi
...@@ -225,7 +226,7 @@ class UserInfoFragment : ServiceBoundFragment() { ...@@ -225,7 +226,7 @@ class UserInfoFragment : ServiceBoundFragment() {
} }
nick.text = user.nick nick.text = user.nick
val (content, hasSpoilers) = contentFormatter.formatContent( val (content, _) = contentFormatter.formatContent(
user.realName ?: "", user.realName ?: "",
networkId = user.networkId networkId = user.networkId
) )
...@@ -253,7 +254,7 @@ class UserInfoFragment : ServiceBoundFragment() { ...@@ -253,7 +254,7 @@ class UserInfoFragment : ServiceBoundFragment() {
actionWhois.visibleIf(user.knownToCore) actionWhois.visibleIf(user.knownToCore)
actionQuery.setOnClickListener { actionQuery.setOnClickListener { view ->
viewModel.session.value?.orNull()?.let { session -> viewModel.session.value?.orNull()?.let { session ->
val info = session.bufferSyncer.find( val info = session.bufferSyncer.find(
bufferName = user.nick, bufferName = user.nick,
...@@ -262,8 +263,7 @@ class UserInfoFragment : ServiceBoundFragment() { ...@@ -262,8 +263,7 @@ class UserInfoFragment : ServiceBoundFragment() {
) )
if (info != null) { if (info != null) {
ChatActivity.launch(requireContext(), ChatActivity.launch(view.context, bufferId = info.bufferId)
bufferId = info.bufferId)
} else { } else {
viewModel.allBuffers.map { viewModel.allBuffers.map {
listOfNotNull(it.find { listOfNotNull(it.find {
...@@ -273,8 +273,7 @@ class UserInfoFragment : ServiceBoundFragment() { ...@@ -273,8 +273,7 @@ class UserInfoFragment : ServiceBoundFragment() {
it.isNotEmpty() it.isNotEmpty()
}.firstElement().toLiveData().observe(this, Observer { }.firstElement().toLiveData().observe(this, Observer {
it?.firstOrNull()?.let { info -> it?.firstOrNull()?.let { info ->
ChatActivity.launch(requireContext(), ChatActivity.launch(view.context, bufferId = info.bufferId)
bufferId = info.bufferId)
} }
}) })
...@@ -282,22 +281,22 @@ class UserInfoFragment : ServiceBoundFragment() { ...@@ -282,22 +281,22 @@ class UserInfoFragment : ServiceBoundFragment() {
networkId = user.networkId, networkId = user.networkId,
type = Buffer_Type.of(Buffer_Type.StatusBuffer) type = Buffer_Type.of(Buffer_Type.StatusBuffer)
)?.let { statusInfo -> )?.let { statusInfo ->
session.rpcHandler.sendInput(statusInfo, session.rpcHandler.sendInput(statusInfo, "/query ${user.nick}")
"/query ${user.nick}")
} }
} }
} }
} }
actionIgnore.setOnClickListener { actionIgnore.setOnClickListener { view ->
Toast.makeText(requireContext(), "Not Implemented", Toast.LENGTH_SHORT).show() IgnoreListActivity.launch(view.context,
addRule = HostmaskHelper.build(user.nick, user.user, user.host))
} }
actionMention.setOnClickListener { actionMention.setOnClickListener { view ->
ChatActivity.launch(requireContext(), sharedText = "${user.nick}: ") ChatActivity.launch(view.context, sharedText = "${user.nick}: ")
} }
actionWhois.setOnClickListener { actionWhois.setOnClickListener { view ->
viewModel.session { viewModel.session {
it.orNull()?.let { session -> it.orNull()?.let { session ->
session.bufferSyncer.find( session.bufferSyncer.find(
......
...@@ -77,7 +77,7 @@ object AvatarHelper { ...@@ -77,7 +77,7 @@ object AvatarHelper {
if (size != null) { if (size != null) {
return listOf( return listOf(
Avatar.IRCCloudAvatar( Avatar.IRCCloudAvatar(
"https://static.irccloud-cdn.com/avatar-redirect/s${truncateSize(size)}/$userId" "https://static.irccloud-cdn.com/avatar-redirect/s$size/$userId"
) )
) )
} }
...@@ -99,7 +99,7 @@ object AvatarHelper { ...@@ -99,7 +99,7 @@ object AvatarHelper {
if (size == null) { if (size == null) {
"https://www.gravatar.com/avatar/$hash?d=404" "https://www.gravatar.com/avatar/$hash?d=404"
} else { } else {
"https://www.gravatar.com/avatar/$hash?d=404&s=${truncateSize(size)}" "https://www.gravatar.com/avatar/$hash?d=404&s=${size}"
} }
}.map { Avatar.GravatarAvatar(it) }.toList() }.map { Avatar.GravatarAvatar(it) }.toList()
} }
...@@ -107,12 +107,10 @@ object AvatarHelper { ...@@ -107,12 +107,10 @@ object AvatarHelper {
private fun matrixFallback(realname: String, size: Int?): List<Avatar> { private fun matrixFallback(realname: String, size: Int?): List<Avatar> {
return if (Patterns.MATRIX_REALNAME.matches(realname)) { return if (Patterns.MATRIX_REALNAME.matches(realname)) {
listOf( listOf(
Avatar.MatrixAvatar(realname, size?.let(this::truncateSize)) Avatar.MatrixAvatar(realname, size)
) )
} else { } else {
emptyList() emptyList()
} }
} }
private fun truncateSize(originalSize: Int) = originalSize //if (originalSize > 72) 512 else 72
} }
...@@ -115,10 +115,8 @@ ...@@ -115,10 +115,8 @@
style="@style/Widget.Info.ActionButton" style="@style/Widget.Info.ActionButton"
android:contentDescription="@string/label_ignore_long" android:contentDescription="@string/label_ignore_long"
android:text="@string/label_ignore" android:text="@string/label_ignore"
android:visibility="gone"
tools:drawableTint="?colorTextSecondary" tools:drawableTint="?colorTextSecondary"
tools:drawableTop="@drawable/ic_eye_off" tools:drawableTop="@drawable/ic_eye_off" />
tools:visibility="visible" />
<androidx.appcompat.widget.AppCompatButton <androidx.appcompat.widget.AppCompatButton
android:id="@+id/action_whois" android:id="@+id/action_whois"
......
...@@ -40,4 +40,14 @@ object HostmaskHelper { ...@@ -40,4 +40,14 @@ object HostmaskHelper {
return Triple(nick, user, host) return Triple(nick, user, host)
} }
fun build(nick: String, user: String?, host: String?) = buildString {
append(nick)
if (!user.isNullOrEmpty()) {
append("!$user")
}
if (!host.isNullOrEmpty()) {
append("@$host")
}
}
} }
...@@ -47,6 +47,7 @@ class MessageSerializerTest { ...@@ -47,6 +47,7 @@ class MessageSerializerTest {
"", "",
"", "",
"", "",
"",
"" ""
) )
val other = roundTrip(MessageSerializer, value, features = QuasselFeatures.empty()) val other = roundTrip(MessageSerializer, value, features = QuasselFeatures.empty())
...@@ -74,6 +75,7 @@ class MessageSerializerTest { ...@@ -74,6 +75,7 @@ class MessageSerializerTest {
"", "",
"", "",
"", "",
"",
"äẞ\u0000\uFFFF" "äẞ\u0000\uFFFF"
) )
val other = roundTrip(MessageSerializer, value, features = QuasselFeatures.empty()) val other = roundTrip(MessageSerializer, value, features = QuasselFeatures.empty())
...@@ -101,6 +103,7 @@ class MessageSerializerTest { ...@@ -101,6 +103,7 @@ class MessageSerializerTest {
"", "",
"", "",
"", "",
"",
"" ""
) )
val other = roundTrip(MessageSerializer, value, features = QuasselFeatures.all()) val other = roundTrip(MessageSerializer, value, features = QuasselFeatures.all())
...@@ -128,6 +131,7 @@ class MessageSerializerTest { ...@@ -128,6 +131,7 @@ class MessageSerializerTest {
"äẞ\u0000\uFFFF", "äẞ\u0000\uFFFF",
"äẞ\u0000\uFFFF", "äẞ\u0000\uFFFF",
"äẞ\u0000\uFFFF", "äẞ\u0000\uFFFF",
"",
"äẞ\u0000\uFFFF" "äẞ\u0000\uFFFF"
) )
val other = roundTrip(MessageSerializer, value, features = QuasselFeatures.all()) val other = roundTrip(MessageSerializer, value, features = QuasselFeatures.all())
...@@ -155,6 +159,7 @@ class MessageSerializerTest { ...@@ -155,6 +159,7 @@ class MessageSerializerTest {
"äẞ\u0000\uFFFF", "äẞ\u0000\uFFFF",
"äẞ\u0000\uFFFF", "äẞ\u0000\uFFFF",
"äẞ\u0000\uFFFF", "äẞ\u0000\uFFFF",
"",
"äẞ\u0000\uFFFF" "äẞ\u0000\uFFFF"
) )
val other = roundTrip(MessageSerializer, value, features = QuasselFeatures.all()) val other = roundTrip(MessageSerializer, value, features = QuasselFeatures.all())
......
...@@ -39,6 +39,10 @@ class HostmaskHelperTest { ...@@ -39,6 +39,10 @@ class HostmaskHelperTest {
HostmaskHelper.host("justJanne!kuschku@lithium.kuschku.de")) HostmaskHelper.host("justJanne!kuschku@lithium.kuschku.de"))
assertEquals("lithium.kuschku.de", assertEquals("lithium.kuschku.de",
HostmaskHelper.split("justJanne!kuschku@lithium.kuschku.de").third) HostmaskHelper.split("justJanne!kuschku@lithium.kuschku.de").third)
assertEquals("justJanne!kuschku@lithium.kuschku.de", HostmaskHelper.build(
"justJanne", "kuschku", "lithium.kuschku.de"
))
} }
@Test @Test
...@@ -57,6 +61,10 @@ class HostmaskHelperTest { ...@@ -57,6 +61,10 @@ class HostmaskHelperTest {
HostmaskHelper.host("justJanne!~kuschku@lithium.kuschku.de")) HostmaskHelper.host("justJanne!~kuschku@lithium.kuschku.de"))
assertEquals("lithium.kuschku.de", assertEquals("lithium.kuschku.de",
HostmaskHelper.split("justJanne!~kuschku@lithium.kuschku.de").third) HostmaskHelper.split("justJanne!~kuschku@lithium.kuschku.de").third)
assertEquals("justJanne!~kuschku@lithium.kuschku.de", HostmaskHelper.build(
"justJanne", "~kuschku", "lithium.kuschku.de"
))
} }
@Test @Test
...@@ -75,6 +83,10 @@ class HostmaskHelperTest { ...@@ -75,6 +83,10 @@ class HostmaskHelperTest {
HostmaskHelper.host("bärlauch!maße@flüge.de")) HostmaskHelper.host("bärlauch!maße@flüge.de"))
assertEquals("flüge.de", assertEquals("flüge.de",
HostmaskHelper.split("bärlauch!maße@flüge.de").third) HostmaskHelper.split("bärlauch!maße@flüge.de").third)
assertEquals("bärlauch!maße@flüge.de", HostmaskHelper.build(
"bärlauch", "maße", "flüge.de"
))
} }
@Test @Test
...@@ -93,6 +105,10 @@ class HostmaskHelperTest { ...@@ -93,6 +105,10 @@ class HostmaskHelperTest {
HostmaskHelper.host("irc.freenode.org")) HostmaskHelper.host("irc.freenode.org"))
assertEquals("", assertEquals("",
HostmaskHelper.split("irc.freenode.org").third) HostmaskHelper.split("irc.freenode.org").third)
assertEquals("irc.freenode.org", HostmaskHelper.build(
"irc.freenode.org", "", ""
))
} }
@Test @Test
...@@ -111,6 +127,10 @@ class HostmaskHelperTest { ...@@ -111,6 +127,10 @@ class HostmaskHelperTest {
HostmaskHelper.host("@nick!~ident@example.org")) HostmaskHelper.host("@nick!~ident@example.org"))
assertEquals("example.org", assertEquals("example.org",
HostmaskHelper.split("@nick!~ident@example.org").third) HostmaskHelper.split("@nick!~ident@example.org").third)
assertEquals("@nick!~ident@example.org", HostmaskHelper.build(
"@nick", "~ident", "example.org"
))
} }
@Test @Test
...@@ -129,6 +149,10 @@ class HostmaskHelperTest { ...@@ -129,6 +149,10 @@ class HostmaskHelperTest {
HostmaskHelper.host("a@a!")) HostmaskHelper.host("a@a!"))
assertEquals("a!", assertEquals("a!",
HostmaskHelper.split("a@a!").third) HostmaskHelper.split("a@a!").third)
assertEquals("a@a!", HostmaskHelper.build(
"a", "", "a!"
))
} }
@Test @Test
...@@ -147,5 +171,9 @@ class HostmaskHelperTest { ...@@ -147,5 +171,9 @@ class HostmaskHelperTest {
HostmaskHelper.host("Gin_!Gin_!♡♅ƸӜƷ♅♡!@discord")) HostmaskHelper.host("Gin_!Gin_!♡♅ƸӜƷ♅♡!@discord"))
assertEquals("discord", assertEquals("discord",
HostmaskHelper.split("Gin_!Gin_!♡♅ƸӜƷ♅♡!@discord").third) HostmaskHelper.split("Gin_!Gin_!♡♅ƸӜƷ♅♡!@discord").third)
assertEquals("Gin_!Gin_!♡♅ƸӜƷ♅♡!@discord", HostmaskHelper.build(
"Gin_", "Gin_!♡♅ƸӜƷ♅♡!", "discord"
))
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment