From 2eca6ee2ea61699e8f27276f46e50b825171103a Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Fri, 22 Feb 2019 13:08:26 +0100 Subject: [PATCH] Easily allow ignoring users from the context menu --- .../ignoreitem/IgnoreItemActivity.kt | 9 ++++-- .../ignoreitem/IgnoreItemFragment.kt | 6 +++- .../ignorelist/IgnoreListActivity.kt | 15 ++++++++-- .../ignorelist/IgnoreListFragment.kt | 7 +++++ .../ui/info/user/UserInfoFragment.kt | 27 +++++++++--------- .../quasseldroid/util/avatars/AvatarHelper.kt | 8 ++---- app/src/main/res/layout/info_user.xml | 4 +-- .../libquassel/util/irc/HostmaskHelper.kt | 10 +++++++ .../serializer/MessageSerializerTest.kt | 5 ++++ .../libquassel/util/irc/HostmaskHelperTest.kt | 28 +++++++++++++++++++ 10 files changed, 92 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemActivity.kt index 28b2e2093..57ec8ac39 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemActivity.kt @@ -28,16 +28,21 @@ class IgnoreItemActivity : ServiceBoundSettingsActivity(IgnoreItemFragment()) { companion object { fun launch( context: Context, - item: IgnoreListManager.IgnoreListItem? = null + item: IgnoreListManager.IgnoreListItem? = null, + addRule: String? = null ) = context.startActivity(intent(context, item)) fun intent( context: Context, - item: IgnoreListManager.IgnoreListItem? = null + item: IgnoreListManager.IgnoreListItem? = null, + addRule: String? = null ) = Intent(context, IgnoreItemActivity::class.java).apply { if (item != null) { putExtra("item", item) } + if (addRule != null) { + putExtra("add_rule", addRule) + } } } } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemFragment.kt index 4c9bfda8f..dd347fa5f 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignoreitem/IgnoreItemFragment.kt @@ -119,7 +119,9 @@ class IgnoreItemFragment : ServiceBoundSettingsFragment(), Savable, )) scope.adapter = scopeAdapter - item?.let { data -> + val addRule = arguments?.getString("add_rule") + val data = item + if (data != null) { enabled.isChecked = data.isActive ignoreRule.setText(data.ignoreRule) isRegEx.isChecked = data.isRegEx @@ -127,6 +129,8 @@ class IgnoreItemFragment : ServiceBoundSettingsFragment(), Savable, strictness.setSelection(strictnessAdapter.indexOf(data.strictness) ?: 0) scope.setSelection(scopeAdapter.indexOf(data.scope) ?: 0) scopeRule.setText(data.scopeRule) + } else if (addRule != null) { + ignoreRule.setText(addRule) } scope.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListActivity.kt index 4b919d42a..d188afb67 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListActivity.kt @@ -25,7 +25,18 @@ import de.kuschku.quasseldroid.util.ui.settings.ServiceBoundSettingsActivity class IgnoreListActivity : ServiceBoundSettingsActivity(IgnoreListFragment()) { companion object { - fun launch(context: Context) = context.startActivity(intent(context)) - fun intent(context: Context) = Intent(context, IgnoreListActivity::class.java) + fun launch( + 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) + } + } } } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListFragment.kt index 88632f990..904b79892 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/ignorelist/IgnoreListFragment.kt @@ -69,10 +69,17 @@ class IgnoreListFragment : ServiceBoundSettingsFragment(), Savable, helper = ItemTouchHelper(callback) helper.attachToRecyclerView(list) + val addRule = arguments?.getString("add_rule") + add.setOnClickListener { startActivityForResult(IgnoreItemActivity.intent(requireContext()), REQUEST_CREATE_RULE) } + if (addRule != null) { + startActivityForResult(IgnoreItemActivity.intent(requireContext(), addRule = addRule), + REQUEST_CREATE_RULE) + } + viewModel.ignoreListManager .filter(Optional<IgnoreListManager>::isPresent) .map(Optional<IgnoreListManager>::get) diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/info/user/UserInfoFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/info/user/UserInfoFragment.kt index 66ce0b3ee..3d9087978 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/info/user/UserInfoFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/info/user/UserInfoFragment.kt @@ -30,7 +30,6 @@ import android.view.ViewGroup import android.widget.Button import android.widget.ImageView import android.widget.TextView -import android.widget.Toast import androidx.lifecycle.Observer import butterknife.BindView import butterknife.ButterKnife @@ -42,9 +41,11 @@ import de.kuschku.libquassel.quassel.syncables.IrcUser import de.kuschku.libquassel.util.Optional import de.kuschku.libquassel.util.helpers.nullIf import de.kuschku.libquassel.util.helpers.value +import de.kuschku.libquassel.util.irc.HostmaskHelper import de.kuschku.quasseldroid.R import de.kuschku.quasseldroid.settings.MessageSettings 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.avatars.AvatarHelper import de.kuschku.quasseldroid.util.avatars.MatrixApi @@ -225,7 +226,7 @@ class UserInfoFragment : ServiceBoundFragment() { } nick.text = user.nick - val (content, hasSpoilers) = contentFormatter.formatContent( + val (content, _) = contentFormatter.formatContent( user.realName ?: "", networkId = user.networkId ) @@ -253,7 +254,7 @@ class UserInfoFragment : ServiceBoundFragment() { actionWhois.visibleIf(user.knownToCore) - actionQuery.setOnClickListener { + actionQuery.setOnClickListener { view -> viewModel.session.value?.orNull()?.let { session -> val info = session.bufferSyncer.find( bufferName = user.nick, @@ -262,8 +263,7 @@ class UserInfoFragment : ServiceBoundFragment() { ) if (info != null) { - ChatActivity.launch(requireContext(), - bufferId = info.bufferId) + ChatActivity.launch(view.context, bufferId = info.bufferId) } else { viewModel.allBuffers.map { listOfNotNull(it.find { @@ -273,8 +273,7 @@ class UserInfoFragment : ServiceBoundFragment() { it.isNotEmpty() }.firstElement().toLiveData().observe(this, Observer { it?.firstOrNull()?.let { info -> - ChatActivity.launch(requireContext(), - bufferId = info.bufferId) + ChatActivity.launch(view.context, bufferId = info.bufferId) } }) @@ -282,22 +281,22 @@ class UserInfoFragment : ServiceBoundFragment() { networkId = user.networkId, type = Buffer_Type.of(Buffer_Type.StatusBuffer) )?.let { statusInfo -> - session.rpcHandler.sendInput(statusInfo, - "/query ${user.nick}") + session.rpcHandler.sendInput(statusInfo, "/query ${user.nick}") } } } } - actionIgnore.setOnClickListener { - Toast.makeText(requireContext(), "Not Implemented", Toast.LENGTH_SHORT).show() + actionIgnore.setOnClickListener { view -> + IgnoreListActivity.launch(view.context, + addRule = HostmaskHelper.build(user.nick, user.user, user.host)) } - actionMention.setOnClickListener { - ChatActivity.launch(requireContext(), sharedText = "${user.nick}: ") + actionMention.setOnClickListener { view -> + ChatActivity.launch(view.context, sharedText = "${user.nick}: ") } - actionWhois.setOnClickListener { + actionWhois.setOnClickListener { view -> viewModel.session { it.orNull()?.let { session -> session.bufferSyncer.find( diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/avatars/AvatarHelper.kt b/app/src/main/java/de/kuschku/quasseldroid/util/avatars/AvatarHelper.kt index 09b536b35..0e7bcc20f 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/util/avatars/AvatarHelper.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/util/avatars/AvatarHelper.kt @@ -77,7 +77,7 @@ object AvatarHelper { if (size != null) { return listOf( 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 { if (size == null) { "https://www.gravatar.com/avatar/$hash?d=404" } 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() } @@ -107,12 +107,10 @@ object AvatarHelper { private fun matrixFallback(realname: String, size: Int?): List<Avatar> { return if (Patterns.MATRIX_REALNAME.matches(realname)) { listOf( - Avatar.MatrixAvatar(realname, size?.let(this::truncateSize)) + Avatar.MatrixAvatar(realname, size) ) } else { emptyList() } } - - private fun truncateSize(originalSize: Int) = originalSize //if (originalSize > 72) 512 else 72 } diff --git a/app/src/main/res/layout/info_user.xml b/app/src/main/res/layout/info_user.xml index 18b446d11..b33d185d3 100644 --- a/app/src/main/res/layout/info_user.xml +++ b/app/src/main/res/layout/info_user.xml @@ -115,10 +115,8 @@ style="@style/Widget.Info.ActionButton" android:contentDescription="@string/label_ignore_long" android:text="@string/label_ignore" - android:visibility="gone" tools:drawableTint="?colorTextSecondary" - tools:drawableTop="@drawable/ic_eye_off" - tools:visibility="visible" /> + tools:drawableTop="@drawable/ic_eye_off" /> <androidx.appcompat.widget.AppCompatButton android:id="@+id/action_whois" diff --git a/lib/src/main/java/de/kuschku/libquassel/util/irc/HostmaskHelper.kt b/lib/src/main/java/de/kuschku/libquassel/util/irc/HostmaskHelper.kt index 5828730ba..4edae3681 100644 --- a/lib/src/main/java/de/kuschku/libquassel/util/irc/HostmaskHelper.kt +++ b/lib/src/main/java/de/kuschku/libquassel/util/irc/HostmaskHelper.kt @@ -40,4 +40,14 @@ object HostmaskHelper { 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") + } + } } diff --git a/lib/src/test/java/de/kuschku/libquassel/protocol/primitive/serializer/MessageSerializerTest.kt b/lib/src/test/java/de/kuschku/libquassel/protocol/primitive/serializer/MessageSerializerTest.kt index e4fe91853..df2961ac9 100644 --- a/lib/src/test/java/de/kuschku/libquassel/protocol/primitive/serializer/MessageSerializerTest.kt +++ b/lib/src/test/java/de/kuschku/libquassel/protocol/primitive/serializer/MessageSerializerTest.kt @@ -47,6 +47,7 @@ class MessageSerializerTest { "", "", "", + "", "" ) val other = roundTrip(MessageSerializer, value, features = QuasselFeatures.empty()) @@ -74,6 +75,7 @@ class MessageSerializerTest { "", "", "", + "", "äẞ\u0000\uFFFF" ) val other = roundTrip(MessageSerializer, value, features = QuasselFeatures.empty()) @@ -101,6 +103,7 @@ class MessageSerializerTest { "", "", "", + "", "" ) val other = roundTrip(MessageSerializer, value, features = QuasselFeatures.all()) @@ -128,6 +131,7 @@ class MessageSerializerTest { "äẞ\u0000\uFFFF", "äẞ\u0000\uFFFF", "äẞ\u0000\uFFFF", + "", "äẞ\u0000\uFFFF" ) val other = roundTrip(MessageSerializer, value, features = QuasselFeatures.all()) @@ -155,6 +159,7 @@ class MessageSerializerTest { "äẞ\u0000\uFFFF", "äẞ\u0000\uFFFF", "äẞ\u0000\uFFFF", + "", "äẞ\u0000\uFFFF" ) val other = roundTrip(MessageSerializer, value, features = QuasselFeatures.all()) diff --git a/lib/src/test/java/de/kuschku/libquassel/util/irc/HostmaskHelperTest.kt b/lib/src/test/java/de/kuschku/libquassel/util/irc/HostmaskHelperTest.kt index d3cd088d8..f189ecb73 100644 --- a/lib/src/test/java/de/kuschku/libquassel/util/irc/HostmaskHelperTest.kt +++ b/lib/src/test/java/de/kuschku/libquassel/util/irc/HostmaskHelperTest.kt @@ -39,6 +39,10 @@ class HostmaskHelperTest { HostmaskHelper.host("justJanne!kuschku@lithium.kuschku.de")) assertEquals("lithium.kuschku.de", HostmaskHelper.split("justJanne!kuschku@lithium.kuschku.de").third) + + assertEquals("justJanne!kuschku@lithium.kuschku.de", HostmaskHelper.build( + "justJanne", "kuschku", "lithium.kuschku.de" + )) } @Test @@ -57,6 +61,10 @@ class HostmaskHelperTest { HostmaskHelper.host("justJanne!~kuschku@lithium.kuschku.de")) assertEquals("lithium.kuschku.de", HostmaskHelper.split("justJanne!~kuschku@lithium.kuschku.de").third) + + assertEquals("justJanne!~kuschku@lithium.kuschku.de", HostmaskHelper.build( + "justJanne", "~kuschku", "lithium.kuschku.de" + )) } @Test @@ -75,6 +83,10 @@ class HostmaskHelperTest { HostmaskHelper.host("bärlauch!maße@flüge.de")) assertEquals("flüge.de", 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 @@ -93,6 +105,10 @@ class HostmaskHelperTest { HostmaskHelper.host("irc.freenode.org")) assertEquals("", HostmaskHelper.split("irc.freenode.org").third) + + assertEquals("irc.freenode.org", HostmaskHelper.build( + "irc.freenode.org", "", "" + )) } @Test @@ -111,6 +127,10 @@ class HostmaskHelperTest { HostmaskHelper.host("@nick!~ident@example.org")) assertEquals("example.org", HostmaskHelper.split("@nick!~ident@example.org").third) + + assertEquals("@nick!~ident@example.org", HostmaskHelper.build( + "@nick", "~ident", "example.org" + )) } @Test @@ -129,6 +149,10 @@ class HostmaskHelperTest { HostmaskHelper.host("a@a!")) assertEquals("a!", HostmaskHelper.split("a@a!").third) + + assertEquals("a@a!", HostmaskHelper.build( + "a", "", "a!" + )) } @Test @@ -147,5 +171,9 @@ class HostmaskHelperTest { HostmaskHelper.host("Gin_!Gin_!♡♅ƸӜƷ♅♡!@discord")) assertEquals("discord", HostmaskHelper.split("Gin_!Gin_!♡♅ƸӜƷ♅♡!@discord").third) + + assertEquals("Gin_!Gin_!♡♅ƸӜƷ♅♡!@discord", HostmaskHelper.build( + "Gin_", "Gin_!♡♅ƸӜƷ♅♡!", "discord" + )) } } -- GitLab