From f5ea4fb6ac44f993eb49bced2d29cd3851e6ff65 Mon Sep 17 00:00:00 2001
From: Benoit Marty <benoit@matrix.org>
Date: Tue, 25 Aug 2020 16:15:42 +0200
Subject: [PATCH] Refactor: Extract method to dedicated files

---
 .../pushrules/ContainsDisplayNameCondition.kt | 29 +-------------
 .../sdk/api/pushrules/EventMatchCondition.kt  | 27 ++-----------
 .../matrix/android/sdk/internal/util/Glob.kt  | 38 +++++++++++++++++++
 .../android/sdk/internal/util/StringUtils.kt  | 22 +++++++++++
 4 files changed, 65 insertions(+), 51 deletions(-)
 create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/Glob.kt

diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/ContainsDisplayNameCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/ContainsDisplayNameCondition.kt
index 2d0f81e5ca..72eda20679 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/ContainsDisplayNameCondition.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/ContainsDisplayNameCondition.kt
@@ -20,7 +20,7 @@ import org.matrix.android.sdk.api.session.events.model.Event
 import org.matrix.android.sdk.api.session.events.model.EventType
 import org.matrix.android.sdk.api.session.events.model.toModel
 import org.matrix.android.sdk.api.session.room.model.message.MessageContent
-import timber.log.Timber
+import org.matrix.android.sdk.internal.util.caseInsensitiveFind
 
 class ContainsDisplayNameCondition : Condition {
 
@@ -43,31 +43,6 @@ class ContainsDisplayNameCondition : Condition {
             else              -> null
         } ?: return false
 
-        return caseInsensitiveFind(displayName, message.body)
-    }
-
-    companion object {
-        /**
-         * Returns whether a string contains an occurrence of another, as a standalone word, regardless of case.
-         *
-         * @param subString  the string to search for
-         * @param longString the string to search in
-         * @return whether a match was found
-         */
-        fun caseInsensitiveFind(subString: String, longString: String): Boolean {
-            // add sanity checks
-            if (subString.isEmpty() || longString.isEmpty()) {
-                return false
-            }
-
-            try {
-                val regex = Regex("(\\W|^)" + Regex.escape(subString) + "(\\W|$)", RegexOption.IGNORE_CASE)
-                return regex.containsMatchIn(longString)
-            } catch (e: Exception) {
-                Timber.e(e, "## caseInsensitiveFind() : failed")
-            }
-
-            return false
-        }
+        return message.body.caseInsensitiveFind(displayName)
     }
 }
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/EventMatchCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/EventMatchCondition.kt
index 5646f5e805..a6e3836a7a 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/EventMatchCondition.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/EventMatchCondition.kt
@@ -18,6 +18,8 @@ package org.matrix.android.sdk.api.pushrules
 
 import org.matrix.android.sdk.api.session.events.model.Event
 import org.matrix.android.sdk.internal.di.MoshiProvider
+import org.matrix.android.sdk.internal.util.hasSpecialGlobChar
+import org.matrix.android.sdk.internal.util.simpleGlobToRegExp
 import timber.log.Timber
 
 class EventMatchCondition(
@@ -47,7 +49,7 @@ class EventMatchCondition(
         // Patterns with no special glob characters should be treated as having asterisks prepended
         // and appended when testing the condition.
         try {
-            val modPattern = if (hasSpecialGlobChar(pattern)) simpleGlobToRegExp(pattern) else simpleGlobToRegExp("*$pattern*")
+            val modPattern = if (pattern.hasSpecialGlobChar()) pattern.simpleGlobToRegExp() else "*$pattern*".simpleGlobToRegExp()
             val regex = Regex(modPattern, RegexOption.DOT_MATCHES_ALL)
             return regex.containsMatchIn(value)
         } catch (e: Throwable) {
@@ -76,27 +78,4 @@ class EventMatchCondition(
         }
         return null
     }
-
-    companion object {
-
-        private fun hasSpecialGlobChar(glob: String): Boolean {
-            return glob.contains("*") || glob.contains("?")
-        }
-
-        // Very simple glob to regexp converter
-        private fun simpleGlobToRegExp(glob: String): String {
-            var out = "" // "^"
-            for (element in glob) {
-                when (element) {
-                    '*'  -> out += ".*"
-                    '?'  -> out += '.'.toString()
-                    '.'  -> out += "\\."
-                    '\\' -> out += "\\\\"
-                    else -> out += element
-                }
-            }
-            out += "" // '$'.toString()
-            return out
-        }
-    }
 }
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/Glob.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/Glob.kt
new file mode 100644
index 0000000000..fb8a5367dd
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/Glob.kt
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2020 New Vector Ltd
+ * Copyright 2020 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.matrix.android.sdk.internal.util
+
+internal fun String.hasSpecialGlobChar(): Boolean {
+    return contains("*") || contains("?")
+}
+
+// Very simple glob to regexp converter
+internal fun String.simpleGlobToRegExp(): String {
+    var out = "" // "^"
+    for (element in this) {
+        when (element) {
+            '*'  -> out += ".*"
+            '?'  -> out += '.'.toString()
+            '.'  -> out += "\\."
+            '\\' -> out += "\\\\"
+            else -> out += element
+        }
+    }
+    out += "" // '$'.toString()
+    return out
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/StringUtils.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/StringUtils.kt
index a236771cd6..681e7e5fed 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/StringUtils.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/StringUtils.kt
@@ -52,3 +52,25 @@ fun convertFromUTF8(s: String): String {
 }
 
 fun String.withoutPrefix(prefix: String) = if (startsWith(prefix)) substringAfter(prefix) else this
+
+/**
+ * Returns whether a string contains an occurrence of another, as a standalone word, regardless of case.
+ *
+ * @param subString  the string to search for
+ * @return whether a match was found
+ */
+fun String.caseInsensitiveFind(subString: String): Boolean {
+    // add sanity checks
+    if (subString.isEmpty() || isEmpty()) {
+        return false
+    }
+
+    try {
+        val regex = Regex("(\\W|^)" + Regex.escape(subString) + "(\\W|$)", RegexOption.IGNORE_CASE)
+        return regex.containsMatchIn(this)
+    } catch (e: Exception) {
+        Timber.e(e, "## caseInsensitiveFind() : failed")
+    }
+
+    return false
+}