From 4910b1df4e5800c380176a5439bcd7967bcfc757 Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Sun, 9 Dec 2018 19:41:31 +0100 Subject: [PATCH] Fixes #135 --- .../highlightlist/HighlightListFragment.kt | 16 ++++++- .../highlightrule/HighlightRuleFragment.kt | 1 + .../quassel/syncables/HighlightRuleManager.kt | 47 +++++++++++-------- .../interfaces/IHighlightRuleManager.kt | 28 +++++------ .../syncables/HighlightRuleManagerTest.kt | 11 +++-- 5 files changed, 63 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt index 849a04a23..ef6485ec6 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt @@ -163,6 +163,18 @@ class HighlightListFragment : SettingsFragment(), SettingsFragment.Savable, private fun startIgnoreRuleDrag(holder: HighlightRuleAdapter.HighlightRuleViewHolder) = ignoreRulesHelper.startDrag(holder) + private fun nextId(): Int { + val maxRuleId = rulesAdapter.list.maxBy { it.id }?.id + val maxIgnoreRuleId = ignoreRulesAdapter.list.maxBy { it.id }?.id + + return when { + maxRuleId != null && maxIgnoreRuleId != null -> maxOf(maxRuleId, maxIgnoreRuleId) + 1 + maxIgnoreRuleId != null -> maxIgnoreRuleId + 1 + maxRuleId != null -> maxRuleId + 1 + else -> 0 + } + } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (resultCode == Activity.RESULT_OK && data != null) { when (requestCode) { @@ -178,7 +190,7 @@ class HighlightListFragment : SettingsFragment(), SettingsFragment.Savable, val newRule = data.getSerializableExtra("new") as? HighlightRuleManager.HighlightRule if (newRule != null) { - rulesAdapter.add(newRule) + rulesAdapter.add(newRule.copy(id = nextId())) } } REQUEST_UPDATE_IGNORE_RULE -> { @@ -193,7 +205,7 @@ class HighlightListFragment : SettingsFragment(), SettingsFragment.Savable, val newRule = data.getSerializableExtra("new") as? HighlightRuleManager.HighlightRule if (newRule != null) { - ignoreRulesAdapter.add(newRule) + ignoreRulesAdapter.add(newRule.copy(id = nextId())) } } } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightrule/HighlightRuleFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightrule/HighlightRuleFragment.kt index a6163a0da..b60ac74d8 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightrule/HighlightRuleFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightrule/HighlightRuleFragment.kt @@ -81,6 +81,7 @@ class HighlightRuleFragment : SettingsFragment(), SettingsFragment.Savable, } private fun applyChanges() = HighlightRuleManager.HighlightRule( + id = rule?.id ?: -1, isInverse = rule?.isInverse ?: isInverse ?: false, isEnabled = enabled.isChecked, name = name.text.toString(), diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/HighlightRuleManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/HighlightRuleManager.kt index 21aadc7bd..ceab1fb0f 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/HighlightRuleManager.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/HighlightRuleManager.kt @@ -28,6 +28,7 @@ class HighlightRuleManager( proxy: SignalProxy ) : SyncableObject(proxy, "HighlightRuleManager"), IHighlightRuleManager { data class HighlightRule( + val id: Int, val name: String, val isRegEx: Boolean = false, val isCaseSensitive: Boolean = false, @@ -38,14 +39,24 @@ class HighlightRuleManager( ) : Serializable override fun toVariantMap(): QVariantMap = mapOf( - "HighlightRuleList" to QVariant.of(initHighlightRuleList(), Type.QVariantMap) + "HighlightRuleList" to QVariant.of(initHighlightRuleList(), Type.QVariantMap), + "highlightNick" to QVariant.of(_highlightNick.value, Type.Int), + "nicksCaseSensitive" to QVariant.of(_nicksCaseSensitive, Type.Bool) ) override fun fromVariantMap(properties: QVariantMap) { initSetHighlightRuleList(properties["HighlightRuleList"].valueOr(::emptyMap)) + + _highlightNick = properties["highlightNick"].value<Int>()?.let { + IHighlightRuleManager.HighlightNickType.of(it) + } ?: _highlightNick + _nicksCaseSensitive = properties["nicksCaseSensitive"].value(_nicksCaseSensitive) } override fun initHighlightRuleList(): QVariantMap = mapOf( + "id" to QVariant.of(_highlightRuleList.map { + QVariant.of(it.id, Type.Int) + }, Type.QVariantList), "name" to QVariant.of(_highlightRuleList.map { it.name }, Type.QStringList), @@ -66,12 +77,11 @@ class HighlightRuleManager( }, Type.QStringList), "channel" to QVariant.of(_highlightRuleList.map { it.channel - }, Type.QStringList), - "highlightNick" to QVariant.of(_highlightNick.value, Type.Int), - "nicksCaseSensitive" to QVariant.of(_nicksCaseSensitive, Type.Bool) + }, Type.QStringList) ) override fun initSetHighlightRuleList(highlightRuleList: QVariantMap) { + val idList = highlightRuleList["id"].valueOr<QVariantList>(::emptyList) val nameList = highlightRuleList["name"].valueOr<QStringList>(::emptyList) val isRegExList = highlightRuleList["isRegEx"].valueOr<QVariantList>(::emptyList) val isCaseSensitiveList = highlightRuleList["isCaseSensitive"].valueOr<QVariantList>(::emptyList) @@ -79,14 +89,15 @@ class HighlightRuleManager( val isInverseList = highlightRuleList["isInverse"].valueOr<QVariantList>(::emptyList) val senderList = highlightRuleList["sender"].valueOr<QStringList>(::emptyList) val channelList = highlightRuleList["channel"].valueOr<QStringList>(::emptyList) - val size = nameList.size - if (isRegExList.size != size || isCaseSensitiveList.size != size || + val size = idList.size + if (nameList.size != size || isRegExList.size != size || isCaseSensitiveList.size != size || isEnabledList.size != size || isInverseList.size != size || senderList.size != size || channelList.size != size) return - _highlightRuleList = List(size, { + _highlightRuleList = List(size) { HighlightRule( + id = idList[it].value(0), name = nameList[it] ?: "", isRegEx = isRegExList[it].value(false), isCaseSensitive = isCaseSensitiveList[it].value(false), @@ -95,28 +106,24 @@ class HighlightRuleManager( sender = senderList[it] ?: "", channel = channelList[it] ?: "" ) - }) - _highlightNick = highlightRuleList["highlightNick"].value<Int>()?.let { - IHighlightRuleManager.HighlightNickType.of(it) - } ?: _highlightNick - _nicksCaseSensitive = highlightRuleList["nicksCaseSensitive"].value(_nicksCaseSensitive) + } } - override fun removeHighlightRule(highlightRule: String) = removeAt(indexOf(highlightRule)) + override fun removeHighlightRule(highlightRule: Int) = removeAt(indexOf(highlightRule)) - override fun toggleHighlightRule(highlightRule: String) { + override fun toggleHighlightRule(highlightRule: Int) { _highlightRuleList = _highlightRuleList.map { - if (it.name == highlightRule) it.copy(isEnabled = !it.isEnabled) else it + if (it.id == highlightRule) it.copy(isEnabled = !it.isEnabled) else it } } - override fun addHighlightRule(name: String, isRegEx: Boolean, isCaseSensitive: Boolean, + override fun addHighlightRule(id: Int, name: String, isRegEx: Boolean, isCaseSensitive: Boolean, isEnabled: Boolean, isInverse: Boolean, sender: String, chanName: String) { - if (contains(name)) return + if (contains(id)) return _highlightRuleList += HighlightRule( - name, isRegEx, isCaseSensitive, isEnabled, isInverse, sender, chanName + id, name, isRegEx, isCaseSensitive, isEnabled, isInverse, sender, chanName ) } @@ -131,8 +138,8 @@ class HighlightRuleManager( _nicksCaseSensitive = nicksCaseSensitive } - fun indexOf(name: String): Int = _highlightRuleList.indexOfFirst { it.name == name } - fun contains(name: String) = _highlightRuleList.any { it.name == name } + fun indexOf(id: Int): Int = _highlightRuleList.indexOfFirst { it.id == id } + fun contains(id: Int) = _highlightRuleList.any { it.id == id } fun isEmpty() = _highlightRuleList.isEmpty() fun count() = _highlightRuleList.count() diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IHighlightRuleManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IHighlightRuleManager.kt index aed82d2c1..a98764eba 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IHighlightRuleManager.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IHighlightRuleManager.kt @@ -48,12 +48,12 @@ interface IHighlightRuleManager : ISyncableObject { * @param highlightRule A valid ignore rule */ @Slot - fun requestRemoveHighlightRule(highlightRule: String) { - REQUEST("requestRemoveHighlightRule", ARG(highlightRule, Type.QString)) + fun requestRemoveHighlightRule(highlightRule: Int) { + REQUEST("requestRemoveHighlightRule", ARG(highlightRule, Type.Int)) } @Slot - fun removeHighlightRule(highlightRule: String) + fun removeHighlightRule(highlightRule: Int) /** * Request toggling of "isEnabled" flag of a given ignore rule. @@ -62,12 +62,12 @@ interface IHighlightRuleManager : ISyncableObject { * @param highlightRule A valid ignore rule */ @Slot - fun requestToggleHighlightRule(highlightRule: String) { - REQUEST("requestToggleHighlightRule", ARG(highlightRule, Type.QString)) + fun requestToggleHighlightRule(highlightRule: Int) { + REQUEST("requestToggleHighlightRule", ARG(highlightRule, Type.Int)) } @Slot - fun toggleHighlightRule(highlightRule: String) + fun toggleHighlightRule(highlightRule: Int) /** * Request an HighlightRule to be added to the ignore list @@ -79,17 +79,17 @@ interface IHighlightRuleManager : ISyncableObject { * @param chanName The channel in which the rule should apply */ @Slot - fun requestAddHighlightRule(name: String, isRegEx: Boolean, isCaseSensitive: Boolean, - isEnabled: Boolean, - isInverse: Boolean, sender: String, chanName: String) { - REQUEST("requestAddHighlightRule", ARG(name, Type.QString), ARG(isRegEx, Type.Bool), - ARG(isCaseSensitive, Type.Bool), ARG(isEnabled, Type.Bool), ARG(isInverse, Type.Bool), - ARG(sender, Type.QString), ARG(chanName, Type.QString)) + fun requestAddHighlightRule(id: Int, name: String, isRegEx: Boolean, isCaseSensitive: Boolean, + isEnabled: Boolean, isInverse: Boolean, sender: String, + chanName: String) { + REQUEST("requestAddHighlightRule", ARG(id, Type.Int), ARG(name, Type.QString), + ARG(isRegEx, Type.Bool), ARG(isCaseSensitive, Type.Bool), ARG(isEnabled, Type.Bool), + ARG(isInverse, Type.Bool), ARG(sender, Type.QString), ARG(chanName, Type.QString)) } @Slot - fun addHighlightRule(name: String, isRegEx: Boolean, isCaseSensitive: Boolean, isEnabled: Boolean, - isInverse: Boolean, sender: String, chanName: String) + fun addHighlightRule(id: Int, name: String, isRegEx: Boolean, isCaseSensitive: Boolean, + isEnabled: Boolean, isInverse: Boolean, sender: String, chanName: String) @Slot fun requestSetHighlightNick(highlightNick: Int) { diff --git a/lib/src/test/java/de/kuschku/libquassel/quassel/syncables/HighlightRuleManagerTest.kt b/lib/src/test/java/de/kuschku/libquassel/quassel/syncables/HighlightRuleManagerTest.kt index b4498c37f..9f69e5be9 100644 --- a/lib/src/test/java/de/kuschku/libquassel/quassel/syncables/HighlightRuleManagerTest.kt +++ b/lib/src/test/java/de/kuschku/libquassel/quassel/syncables/HighlightRuleManagerTest.kt @@ -22,10 +22,7 @@ package de.kuschku.libquassel.quassel.syncables import de.kuschku.libquassel.protocol.primitive.serializer.VariantMapSerializer import de.kuschku.libquassel.quassel.syncables.interfaces.IHighlightRuleManager import de.kuschku.libquassel.session.SignalProxy -import de.kuschku.libquassel.util.randomBoolean -import de.kuschku.libquassel.util.randomOf -import de.kuschku.libquassel.util.randomString -import de.kuschku.libquassel.util.roundTrip +import de.kuschku.libquassel.util.* import org.junit.Test class HighlightRuleManagerTest { @@ -36,6 +33,7 @@ class HighlightRuleManagerTest { original.setNicksCaseSensitive(randomBoolean()) original.setHighlightRuleList(listOf( HighlightRuleManager.HighlightRule( + randomInt(), randomString(), randomBoolean(), randomBoolean(), @@ -45,6 +43,7 @@ class HighlightRuleManagerTest { randomString() ), HighlightRuleManager.HighlightRule( + randomInt(), randomString(), randomBoolean(), randomBoolean(), @@ -54,6 +53,7 @@ class HighlightRuleManagerTest { randomString() ), HighlightRuleManager.HighlightRule( + randomInt(), randomString(), randomBoolean(), randomBoolean(), @@ -76,6 +76,7 @@ class HighlightRuleManagerTest { original.setNicksCaseSensitive(randomBoolean()) original.setHighlightRuleList(listOf( HighlightRuleManager.HighlightRule( + randomInt(), randomString(), randomBoolean(), randomBoolean(), @@ -85,6 +86,7 @@ class HighlightRuleManagerTest { randomString() ), HighlightRuleManager.HighlightRule( + randomInt(), randomString(), randomBoolean(), randomBoolean(), @@ -94,6 +96,7 @@ class HighlightRuleManagerTest { randomString() ), HighlightRuleManager.HighlightRule( + randomInt(), randomString(), randomBoolean(), randomBoolean(), -- GitLab