From 887112650b08f2883f9d7ff730809faeea9f1ad3 Mon Sep 17 00:00:00 2001 From: Leonardo Aramaki Date: Tue, 11 Sep 2018 16:08:03 -0300 Subject: [PATCH] Modularize all suggestions autocompletion code --- app/build.gradle | 1 + .../adapter/CommandSuggestionsAdapter.kt | 6 ++-- .../adapter/PeopleSuggestionsAdapter.kt | 6 ++-- .../adapter/RoomSuggestionsAdapter.kt | 6 ++-- .../suggestion/ChatRoomSuggestionUiModel.kt | 2 +- .../suggestion/CommandSuggestionUiModel.kt | 2 +- .../suggestion/PeopleSuggestionUiModel.kt | 2 +- .../main/res/layout/fragment_chat_room.xml | 2 +- app/src/main/res/values/dimens.xml | 4 --- build.gradle | 1 + settings.gradle | 2 +- suggestions/.gitignore | 1 + suggestions/build.gradle | 34 +++++++++++++++++++ suggestions/proguard-rules.pro | 21 ++++++++++++ .../suggestions/ExampleInstrumentedTest.java | 26 ++++++++++++++ suggestions/src/main/AndroidManifest.xml | 2 ++ .../suggestions}/model/SuggestionModel.kt | 4 +-- .../repository/LocalSuggestionProvider.kt | 2 +- .../strategy/CompletionStrategy.kt | 6 ++-- .../regex/StringMatchingCompletionStrategy.kt | 10 +++--- .../strategy/trie/TrieCompletionStrategy.kt | 11 +++--- .../suggestions}/strategy/trie/data/Trie.kt | 6 ++-- .../strategy/trie/data/TrieNode.kt | 6 ++-- .../ui/BaseSuggestionViewHolder.kt | 8 ++--- .../suggestions}/ui/PopupRecyclerView.kt | 6 ++-- .../suggestions}/ui/SuggestionsAdapter.kt | 12 +++---- .../suggestions}/ui/SuggestionsView.kt | 30 ++++++++-------- .../drawable/suggestions_menu_decorator.xml | 2 +- suggestions/src/main/res/values/dimens.xml | 5 +++ suggestions/src/main/res/values/strings.xml | 3 ++ .../com/suggestions/ExampleUnitTest.java | 17 ++++++++++ 31 files changed, 177 insertions(+), 69 deletions(-) create mode 100644 suggestions/.gitignore create mode 100644 suggestions/build.gradle create mode 100644 suggestions/proguard-rules.pro create mode 100644 suggestions/src/androidTest/java/yampsample/leonardoaramaki/github/com/suggestions/ExampleInstrumentedTest.java create mode 100644 suggestions/src/main/AndroidManifest.xml rename {app/src/main/java/chat/rocket/android/widget/autocompletion => suggestions/src/main/java/chat/rocket/android/suggestions}/model/SuggestionModel.kt (91%) rename {app/src/main/java/chat/rocket/android/widget/autocompletion => suggestions/src/main/java/chat/rocket/android/suggestions}/repository/LocalSuggestionProvider.kt (52%) rename {app/src/main/java/chat/rocket/android/widget/autocompletion => suggestions/src/main/java/chat/rocket/android/suggestions}/strategy/CompletionStrategy.kt (67%) rename {app/src/main/java/chat/rocket/android/widget/autocompletion => suggestions/src/main/java/chat/rocket/android/suggestions}/strategy/regex/StringMatchingCompletionStrategy.kt (81%) rename {app/src/main/java/chat/rocket/android/widget/autocompletion => suggestions/src/main/java/chat/rocket/android/suggestions}/strategy/trie/TrieCompletionStrategy.kt (72%) rename {app/src/main/java/chat/rocket/android/widget/autocompletion => suggestions/src/main/java/chat/rocket/android/suggestions}/strategy/trie/data/Trie.kt (93%) rename {app/src/main/java/chat/rocket/android/widget/autocompletion => suggestions/src/main/java/chat/rocket/android/suggestions}/strategy/trie/data/TrieNode.kt (89%) rename {app/src/main/java/chat/rocket/android/widget/autocompletion => suggestions/src/main/java/chat/rocket/android/suggestions}/ui/BaseSuggestionViewHolder.kt (67%) rename {app/src/main/java/chat/rocket/android/widget/autocompletion => suggestions/src/main/java/chat/rocket/android/suggestions}/ui/PopupRecyclerView.kt (93%) rename {app/src/main/java/chat/rocket/android/widget/autocompletion => suggestions/src/main/java/chat/rocket/android/suggestions}/ui/SuggestionsAdapter.kt (90%) rename {app/src/main/java/chat/rocket/android/widget/autocompletion => suggestions/src/main/java/chat/rocket/android/suggestions}/ui/SuggestionsView.kt (94%) rename {app => suggestions}/src/main/res/drawable/suggestions_menu_decorator.xml (96%) create mode 100644 suggestions/src/main/res/values/dimens.xml create mode 100644 suggestions/src/main/res/values/strings.xml create mode 100644 suggestions/src/test/java/yampsample/leonardoaramaki/github/com/suggestions/ExampleUnitTest.java diff --git a/app/build.gradle b/app/build.gradle index 83e009e82a..e9bf5bf1bb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -93,6 +93,7 @@ dependencies { implementation project(':draw') implementation project(':util') implementation project(':core') + implementation project(':suggestions') implementation libraries.kotlin implementation libraries.coroutines diff --git a/app/src/main/java/chat/rocket/android/chatroom/adapter/CommandSuggestionsAdapter.kt b/app/src/main/java/chat/rocket/android/chatroom/adapter/CommandSuggestionsAdapter.kt index a3ad020dd2..cbed113608 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/adapter/CommandSuggestionsAdapter.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/adapter/CommandSuggestionsAdapter.kt @@ -7,9 +7,9 @@ import android.widget.TextView import chat.rocket.android.R import chat.rocket.android.chatroom.adapter.CommandSuggestionsAdapter.CommandSuggestionsViewHolder import chat.rocket.android.chatroom.uimodel.suggestion.CommandSuggestionUiModel -import chat.rocket.android.widget.autocompletion.model.SuggestionModel -import chat.rocket.android.widget.autocompletion.ui.BaseSuggestionViewHolder -import chat.rocket.android.widget.autocompletion.ui.SuggestionsAdapter +import chat.rocket.android.suggestions.model.SuggestionModel +import chat.rocket.android.suggestions.ui.BaseSuggestionViewHolder +import chat.rocket.android.suggestions.ui.SuggestionsAdapter class CommandSuggestionsAdapter : SuggestionsAdapter(token = "/", constraint = CONSTRAINT_BOUND_TO_START, threshold = RESULT_COUNT_UNLIMITED) { diff --git a/app/src/main/java/chat/rocket/android/chatroom/adapter/PeopleSuggestionsAdapter.kt b/app/src/main/java/chat/rocket/android/chatroom/adapter/PeopleSuggestionsAdapter.kt index 22d043546b..85f44fd3d0 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/adapter/PeopleSuggestionsAdapter.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/adapter/PeopleSuggestionsAdapter.kt @@ -11,9 +11,9 @@ import chat.rocket.android.R import chat.rocket.android.chatroom.adapter.PeopleSuggestionsAdapter.PeopleSuggestionViewHolder import chat.rocket.android.chatroom.uimodel.suggestion.PeopleSuggestionUiModel import chat.rocket.android.util.extensions.setVisible -import chat.rocket.android.widget.autocompletion.model.SuggestionModel -import chat.rocket.android.widget.autocompletion.ui.BaseSuggestionViewHolder -import chat.rocket.android.widget.autocompletion.ui.SuggestionsAdapter +import chat.rocket.android.suggestions.model.SuggestionModel +import chat.rocket.android.suggestions.ui.BaseSuggestionViewHolder +import chat.rocket.android.suggestions.ui.SuggestionsAdapter import com.facebook.drawee.view.SimpleDraweeView class PeopleSuggestionsAdapter(context: Context) : SuggestionsAdapter("@") { diff --git a/app/src/main/java/chat/rocket/android/chatroom/adapter/RoomSuggestionsAdapter.kt b/app/src/main/java/chat/rocket/android/chatroom/adapter/RoomSuggestionsAdapter.kt index 9417172ea9..f3c192c996 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/adapter/RoomSuggestionsAdapter.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/adapter/RoomSuggestionsAdapter.kt @@ -7,9 +7,9 @@ import android.widget.TextView import chat.rocket.android.R import chat.rocket.android.chatroom.adapter.RoomSuggestionsAdapter.RoomSuggestionsViewHolder import chat.rocket.android.chatroom.uimodel.suggestion.ChatRoomSuggestionUiModel -import chat.rocket.android.widget.autocompletion.model.SuggestionModel -import chat.rocket.android.widget.autocompletion.ui.BaseSuggestionViewHolder -import chat.rocket.android.widget.autocompletion.ui.SuggestionsAdapter +import chat.rocket.android.suggestions.model.SuggestionModel +import chat.rocket.android.suggestions.ui.BaseSuggestionViewHolder +import chat.rocket.android.suggestions.ui.SuggestionsAdapter class RoomSuggestionsAdapter : SuggestionsAdapter("#") { diff --git a/app/src/main/java/chat/rocket/android/chatroom/uimodel/suggestion/ChatRoomSuggestionUiModel.kt b/app/src/main/java/chat/rocket/android/chatroom/uimodel/suggestion/ChatRoomSuggestionUiModel.kt index 30086ed0d8..7a084925a2 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/uimodel/suggestion/ChatRoomSuggestionUiModel.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/uimodel/suggestion/ChatRoomSuggestionUiModel.kt @@ -1,6 +1,6 @@ package chat.rocket.android.chatroom.uimodel.suggestion -import chat.rocket.android.widget.autocompletion.model.SuggestionModel +import chat.rocket.android.suggestions.model.SuggestionModel class ChatRoomSuggestionUiModel(text: String, val fullName: String, diff --git a/app/src/main/java/chat/rocket/android/chatroom/uimodel/suggestion/CommandSuggestionUiModel.kt b/app/src/main/java/chat/rocket/android/chatroom/uimodel/suggestion/CommandSuggestionUiModel.kt index be9e8ecf05..44cdf394d3 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/uimodel/suggestion/CommandSuggestionUiModel.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/uimodel/suggestion/CommandSuggestionUiModel.kt @@ -1,6 +1,6 @@ package chat.rocket.android.chatroom.uimodel.suggestion -import chat.rocket.android.widget.autocompletion.model.SuggestionModel +import chat.rocket.android.suggestions.model.SuggestionModel class CommandSuggestionUiModel(text: String, val description: String, diff --git a/app/src/main/java/chat/rocket/android/chatroom/uimodel/suggestion/PeopleSuggestionUiModel.kt b/app/src/main/java/chat/rocket/android/chatroom/uimodel/suggestion/PeopleSuggestionUiModel.kt index 8e35925a66..5dd18411b0 100644 --- a/app/src/main/java/chat/rocket/android/chatroom/uimodel/suggestion/PeopleSuggestionUiModel.kt +++ b/app/src/main/java/chat/rocket/android/chatroom/uimodel/suggestion/PeopleSuggestionUiModel.kt @@ -1,6 +1,6 @@ package chat.rocket.android.chatroom.uimodel.suggestion -import chat.rocket.android.widget.autocompletion.model.SuggestionModel +import chat.rocket.android.suggestions.model.SuggestionModel import chat.rocket.common.model.UserStatus class PeopleSuggestionUiModel(val imageUri: String?, diff --git a/app/src/main/res/layout/fragment_chat_room.xml b/app/src/main/res/layout/fragment_chat_room.xml index 9887da003a..410119c25f 100644 --- a/app/src/main/res/layout/fragment_chat_room.xml +++ b/app/src/main/res/layout/fragment_chat_room.xml @@ -74,7 +74,7 @@ app:layout_constraintTop_toTopOf="parent" tools:visibility="visible" /> - 4dp 6dp - - 150dp - 250dp - 16dp 16sp diff --git a/build.gradle b/build.gradle index a9ef2421c1..38b4ae3da7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,6 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { + ext.kotlin_version = '1.0.0' apply from: rootProject.file('dependencies.gradle') repositories { diff --git a/settings.gradle b/settings.gradle index 19316d7b9b..526a05f10b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', ':player', ':emoji', ':draw', ':util', ':core' //, ':wear' \ No newline at end of file +include ':app', ':player', ':emoji', ':draw', ':util', ':core', ':suggestions' //, ':wear' \ No newline at end of file diff --git a/suggestions/.gitignore b/suggestions/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/suggestions/.gitignore @@ -0,0 +1 @@ +/build diff --git a/suggestions/build.gradle b/suggestions/build.gradle new file mode 100644 index 0000000000..ea82aa6699 --- /dev/null +++ b/suggestions/build.gradle @@ -0,0 +1,34 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion versions.compileSdk + buildToolsVersion versions.buildTools + + defaultConfig { + minSdkVersion versions.minSdk + targetSdkVersion versions.targetSdk + versionCode 1 + versionName "1.0.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation libraries.kotlin + implementation libraries.recyclerview + implementation libraries.appCompat + implementation libraries.material +} + +androidExtensions { + experimental = true +} diff --git a/suggestions/proguard-rules.pro b/suggestions/proguard-rules.pro new file mode 100644 index 0000000000..f1b424510d --- /dev/null +++ b/suggestions/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/suggestions/src/androidTest/java/yampsample/leonardoaramaki/github/com/suggestions/ExampleInstrumentedTest.java b/suggestions/src/androidTest/java/yampsample/leonardoaramaki/github/com/suggestions/ExampleInstrumentedTest.java new file mode 100644 index 0000000000..56046a860c --- /dev/null +++ b/suggestions/src/androidTest/java/yampsample/leonardoaramaki/github/com/suggestions/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package yampsample.leonardoaramaki.github.com.suggestions; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("yampsample.leonardoaramaki.github.com.suggestions.test", appContext.getPackageName()); + } +} diff --git a/suggestions/src/main/AndroidManifest.xml b/suggestions/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..d4d33b1fc6 --- /dev/null +++ b/suggestions/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/app/src/main/java/chat/rocket/android/widget/autocompletion/model/SuggestionModel.kt b/suggestions/src/main/java/chat/rocket/android/suggestions/model/SuggestionModel.kt similarity index 91% rename from app/src/main/java/chat/rocket/android/widget/autocompletion/model/SuggestionModel.kt rename to suggestions/src/main/java/chat/rocket/android/suggestions/model/SuggestionModel.kt index af4f931b3f..b438d3bf84 100644 --- a/app/src/main/java/chat/rocket/android/widget/autocompletion/model/SuggestionModel.kt +++ b/suggestions/src/main/java/chat/rocket/android/suggestions/model/SuggestionModel.kt @@ -1,4 +1,4 @@ -package chat.rocket.android.widget.autocompletion.model +package chat.rocket.android.suggestions.model abstract class SuggestionModel(val text: String, // This is the text key for searches, must be unique. val searchList: List = emptyList(), // Where to search for matches. @@ -15,4 +15,4 @@ abstract class SuggestionModel(val text: String, // This is the text key for sea override fun hashCode(): Int { return text.hashCode() } -} \ No newline at end of file +} diff --git a/app/src/main/java/chat/rocket/android/widget/autocompletion/repository/LocalSuggestionProvider.kt b/suggestions/src/main/java/chat/rocket/android/suggestions/repository/LocalSuggestionProvider.kt similarity index 52% rename from app/src/main/java/chat/rocket/android/widget/autocompletion/repository/LocalSuggestionProvider.kt rename to suggestions/src/main/java/chat/rocket/android/suggestions/repository/LocalSuggestionProvider.kt index 807be0131b..992e6bc4da 100644 --- a/app/src/main/java/chat/rocket/android/widget/autocompletion/repository/LocalSuggestionProvider.kt +++ b/suggestions/src/main/java/chat/rocket/android/suggestions/repository/LocalSuggestionProvider.kt @@ -1,4 +1,4 @@ -package chat.rocket.android.widget.autocompletion.repository +package chat.rocket.android.suggestions.repository interface LocalSuggestionProvider { fun find(prefix: String) diff --git a/app/src/main/java/chat/rocket/android/widget/autocompletion/strategy/CompletionStrategy.kt b/suggestions/src/main/java/chat/rocket/android/suggestions/strategy/CompletionStrategy.kt similarity index 67% rename from app/src/main/java/chat/rocket/android/widget/autocompletion/strategy/CompletionStrategy.kt rename to suggestions/src/main/java/chat/rocket/android/suggestions/strategy/CompletionStrategy.kt index 59da95751e..665062cbb0 100644 --- a/app/src/main/java/chat/rocket/android/widget/autocompletion/strategy/CompletionStrategy.kt +++ b/suggestions/src/main/java/chat/rocket/android/suggestions/strategy/CompletionStrategy.kt @@ -1,6 +1,6 @@ -package chat.rocket.android.widget.autocompletion.strategy +package chat.rocket.android.suggestions.strategy -import chat.rocket.android.widget.autocompletion.model.SuggestionModel +import chat.rocket.android.suggestions.model.SuggestionModel interface CompletionStrategy { fun getItem(prefix: String, position: Int): SuggestionModel @@ -8,4 +8,4 @@ interface CompletionStrategy { fun addAll(list: List) fun addPinned(list: List) fun size(): Int -} \ No newline at end of file +} diff --git a/app/src/main/java/chat/rocket/android/widget/autocompletion/strategy/regex/StringMatchingCompletionStrategy.kt b/suggestions/src/main/java/chat/rocket/android/suggestions/strategy/regex/StringMatchingCompletionStrategy.kt similarity index 81% rename from app/src/main/java/chat/rocket/android/widget/autocompletion/strategy/regex/StringMatchingCompletionStrategy.kt rename to suggestions/src/main/java/chat/rocket/android/suggestions/strategy/regex/StringMatchingCompletionStrategy.kt index 837deb5437..78cfb58cc2 100644 --- a/app/src/main/java/chat/rocket/android/widget/autocompletion/strategy/regex/StringMatchingCompletionStrategy.kt +++ b/suggestions/src/main/java/chat/rocket/android/suggestions/strategy/regex/StringMatchingCompletionStrategy.kt @@ -1,8 +1,8 @@ -package chat.rocket.android.widget.autocompletion.strategy.regex +package chat.rocket.android.suggestions.strategy.regex -import chat.rocket.android.widget.autocompletion.model.SuggestionModel -import chat.rocket.android.widget.autocompletion.strategy.CompletionStrategy -import chat.rocket.android.widget.autocompletion.ui.SuggestionsAdapter.Companion.RESULT_COUNT_UNLIMITED +import chat.rocket.android.suggestions.model.SuggestionModel +import chat.rocket.android.suggestions.strategy.CompletionStrategy +import chat.rocket.android.suggestions.ui.SuggestionsAdapter.Companion.RESULT_COUNT_UNLIMITED import java.util.concurrent.CopyOnWriteArrayList internal class StringMatchingCompletionStrategy(private val threshold: Int = RESULT_COUNT_UNLIMITED) : CompletionStrategy { @@ -46,4 +46,4 @@ internal class StringMatchingCompletionStrategy(private val threshold: Int = RES override fun size(): Int { return list.size } -} \ No newline at end of file +} diff --git a/app/src/main/java/chat/rocket/android/widget/autocompletion/strategy/trie/TrieCompletionStrategy.kt b/suggestions/src/main/java/chat/rocket/android/suggestions/strategy/trie/TrieCompletionStrategy.kt similarity index 72% rename from app/src/main/java/chat/rocket/android/widget/autocompletion/strategy/trie/TrieCompletionStrategy.kt rename to suggestions/src/main/java/chat/rocket/android/suggestions/strategy/trie/TrieCompletionStrategy.kt index 12533dc5c6..62dc88aac0 100644 --- a/app/src/main/java/chat/rocket/android/widget/autocompletion/strategy/trie/TrieCompletionStrategy.kt +++ b/suggestions/src/main/java/chat/rocket/android/suggestions/strategy/trie/TrieCompletionStrategy.kt @@ -1,8 +1,8 @@ -package chat.rocket.android.widget.autocompletion.strategy.trie +package chat.rocket.android.suggestions.strategy.trie -import chat.rocket.android.widget.autocompletion.model.SuggestionModel -import chat.rocket.android.widget.autocompletion.strategy.CompletionStrategy -import chat.rocket.android.widget.autocompletion.strategy.trie.data.Trie +import chat.rocket.android.suggestions.model.SuggestionModel +import chat.rocket.android.suggestions.strategy.CompletionStrategy +import chat.rocket.android.suggestions.strategy.trie.data.Trie class TrieCompletionStrategy : CompletionStrategy { private val items = mutableListOf() @@ -28,8 +28,7 @@ class TrieCompletionStrategy : CompletionStrategy { } override fun addPinned(list: List) { - } override fun size() = items.size -} \ No newline at end of file +} diff --git a/app/src/main/java/chat/rocket/android/widget/autocompletion/strategy/trie/data/Trie.kt b/suggestions/src/main/java/chat/rocket/android/suggestions/strategy/trie/data/Trie.kt similarity index 93% rename from app/src/main/java/chat/rocket/android/widget/autocompletion/strategy/trie/data/Trie.kt rename to suggestions/src/main/java/chat/rocket/android/suggestions/strategy/trie/data/Trie.kt index 117bb47f14..6be65d9267 100644 --- a/app/src/main/java/chat/rocket/android/widget/autocompletion/strategy/trie/data/Trie.kt +++ b/suggestions/src/main/java/chat/rocket/android/suggestions/strategy/trie/data/Trie.kt @@ -1,6 +1,6 @@ -package chat.rocket.android.widget.autocompletion.strategy.trie.data +package chat.rocket.android.suggestions.strategy.trie.data -import chat.rocket.android.widget.autocompletion.model.SuggestionModel +import chat.rocket.android.suggestions.model.SuggestionModel internal class Trie { private val root = TrieNode(' ') @@ -67,4 +67,4 @@ internal class Trie { } fun getCount() = count -} \ No newline at end of file +} diff --git a/app/src/main/java/chat/rocket/android/widget/autocompletion/strategy/trie/data/TrieNode.kt b/suggestions/src/main/java/chat/rocket/android/suggestions/strategy/trie/data/TrieNode.kt similarity index 89% rename from app/src/main/java/chat/rocket/android/widget/autocompletion/strategy/trie/data/TrieNode.kt rename to suggestions/src/main/java/chat/rocket/android/suggestions/strategy/trie/data/TrieNode.kt index 06b7adb4a9..16774941e0 100644 --- a/app/src/main/java/chat/rocket/android/widget/autocompletion/strategy/trie/data/TrieNode.kt +++ b/suggestions/src/main/java/chat/rocket/android/suggestions/strategy/trie/data/TrieNode.kt @@ -1,6 +1,6 @@ -package chat.rocket.android.widget.autocompletion.strategy.trie.data +package chat.rocket.android.suggestions.strategy.trie.data -import chat.rocket.android.widget.autocompletion.model.SuggestionModel +import chat.rocket.android.suggestions.model.SuggestionModel internal class TrieNode(internal var data: Char, internal var parent: TrieNode? = null, @@ -44,4 +44,4 @@ internal class TrieNode(internal var data: Char, } override fun toString(): String = if (parent == null) "" else "${parent.toString()}$data" -} \ No newline at end of file +} diff --git a/app/src/main/java/chat/rocket/android/widget/autocompletion/ui/BaseSuggestionViewHolder.kt b/suggestions/src/main/java/chat/rocket/android/suggestions/ui/BaseSuggestionViewHolder.kt similarity index 67% rename from app/src/main/java/chat/rocket/android/widget/autocompletion/ui/BaseSuggestionViewHolder.kt rename to suggestions/src/main/java/chat/rocket/android/suggestions/ui/BaseSuggestionViewHolder.kt index db40b86bc3..55c22d8963 100644 --- a/app/src/main/java/chat/rocket/android/widget/autocompletion/ui/BaseSuggestionViewHolder.kt +++ b/suggestions/src/main/java/chat/rocket/android/suggestions/ui/BaseSuggestionViewHolder.kt @@ -1,9 +1,9 @@ -package chat.rocket.android.widget.autocompletion.ui +package chat.rocket.android.suggestions.ui -import androidx.recyclerview.widget.RecyclerView import android.view.View -import chat.rocket.android.widget.autocompletion.model.SuggestionModel +import androidx.recyclerview.widget.RecyclerView +import chat.rocket.android.suggestions.model.SuggestionModel abstract class BaseSuggestionViewHolder(view: View) : RecyclerView.ViewHolder(view) { abstract fun bind(item: SuggestionModel, itemClickListener: SuggestionsAdapter.ItemClickListener?) -} \ No newline at end of file +} diff --git a/app/src/main/java/chat/rocket/android/widget/autocompletion/ui/PopupRecyclerView.kt b/suggestions/src/main/java/chat/rocket/android/suggestions/ui/PopupRecyclerView.kt similarity index 93% rename from app/src/main/java/chat/rocket/android/widget/autocompletion/ui/PopupRecyclerView.kt rename to suggestions/src/main/java/chat/rocket/android/suggestions/ui/PopupRecyclerView.kt index 2367718e08..d3e4d0ad17 100644 --- a/app/src/main/java/chat/rocket/android/widget/autocompletion/ui/PopupRecyclerView.kt +++ b/suggestions/src/main/java/chat/rocket/android/suggestions/ui/PopupRecyclerView.kt @@ -1,11 +1,11 @@ -package chat.rocket.android.widget.autocompletion.ui +package chat.rocket.android.suggestions.ui import android.content.Context import android.util.AttributeSet import android.util.DisplayMetrics import android.view.WindowManager import androidx.recyclerview.widget.RecyclerView -import chat.rocket.android.R +import chat.rocket.android.suggestions.R internal class PopupRecyclerView : RecyclerView { private var displayWidth: Int = 0 @@ -38,4 +38,4 @@ internal class PopupRecyclerView : RecyclerView { override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) { super.onLayout(changed, l + 40, t, r - 40, b) } -} \ No newline at end of file +} diff --git a/app/src/main/java/chat/rocket/android/widget/autocompletion/ui/SuggestionsAdapter.kt b/suggestions/src/main/java/chat/rocket/android/suggestions/ui/SuggestionsAdapter.kt similarity index 90% rename from app/src/main/java/chat/rocket/android/widget/autocompletion/ui/SuggestionsAdapter.kt rename to suggestions/src/main/java/chat/rocket/android/suggestions/ui/SuggestionsAdapter.kt index 83dae186a7..dab0905576 100644 --- a/app/src/main/java/chat/rocket/android/widget/autocompletion/ui/SuggestionsAdapter.kt +++ b/suggestions/src/main/java/chat/rocket/android/suggestions/ui/SuggestionsAdapter.kt @@ -1,9 +1,9 @@ -package chat.rocket.android.widget.autocompletion.ui +package chat.rocket.android.suggestions.ui import androidx.recyclerview.widget.RecyclerView -import chat.rocket.android.widget.autocompletion.model.SuggestionModel -import chat.rocket.android.widget.autocompletion.strategy.CompletionStrategy -import chat.rocket.android.widget.autocompletion.strategy.regex.StringMatchingCompletionStrategy +import chat.rocket.android.suggestions.model.SuggestionModel +import chat.rocket.android.suggestions.strategy.CompletionStrategy +import chat.rocket.android.suggestions.strategy.regex.StringMatchingCompletionStrategy import java.lang.reflect.Type import kotlin.properties.Delegates @@ -32,10 +32,10 @@ abstract class SuggestionsAdapter( // The strategy used for suggesting completions. private val strategy: CompletionStrategy = StringMatchingCompletionStrategy(resultsThreshold) // Current input term to look up for suggestions. - private var currentTerm: String by Delegates.observable("", { _, _, newTerm -> + private var currentTerm: String by Delegates.observable("") { _, _, newTerm -> val items = strategy.autocompleteItems(newTerm) notifyDataSetChanged() - }) + } init { setHasStableIds(true) diff --git a/app/src/main/java/chat/rocket/android/widget/autocompletion/ui/SuggestionsView.kt b/suggestions/src/main/java/chat/rocket/android/suggestions/ui/SuggestionsView.kt similarity index 94% rename from app/src/main/java/chat/rocket/android/widget/autocompletion/ui/SuggestionsView.kt rename to suggestions/src/main/java/chat/rocket/android/suggestions/ui/SuggestionsView.kt index 3b256ca935..c66f7fe3af 100644 --- a/app/src/main/java/chat/rocket/android/widget/autocompletion/ui/SuggestionsView.kt +++ b/suggestions/src/main/java/chat/rocket/android/suggestions/ui/SuggestionsView.kt @@ -1,27 +1,27 @@ -package chat.rocket.android.widget.autocompletion.ui +package chat.rocket.android.suggestions.ui import android.content.Context import android.graphics.Canvas import android.graphics.Rect import android.graphics.drawable.Drawable -import androidx.annotation.DrawableRes -import androidx.transition.Slide -import androidx.transition.TransitionManager -import androidx.core.content.ContextCompat -import androidx.recyclerview.widget.DefaultItemAnimator -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView import android.text.Editable import android.text.InputType import android.text.TextWatcher +import android.transition.Slide +import android.transition.TransitionManager import android.util.AttributeSet import android.view.Gravity import android.view.View import android.widget.EditText import android.widget.FrameLayout -import chat.rocket.android.R -import chat.rocket.android.widget.autocompletion.model.SuggestionModel -import chat.rocket.android.widget.autocompletion.ui.SuggestionsAdapter.Companion.CONSTRAINT_BOUND_TO_START +import androidx.annotation.DrawableRes +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.DefaultItemAnimator +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import chat.rocket.android.suggestions.R +import chat.rocket.android.suggestions.model.SuggestionModel +import chat.rocket.android.suggestions.ui.SuggestionsAdapter.Companion.CONSTRAINT_BOUND_TO_START import java.lang.ref.WeakReference import java.util.concurrent.atomic.AtomicInteger @@ -103,7 +103,8 @@ class SuggestionsView : FrameLayout, TextWatcher { val prefixEndIndex = this.editor?.get()?.selectionStart ?: NO_STATE_INDEX if (prefixEndIndex == NO_STATE_INDEX || prefixEndIndex < completionOffset.get()) return - val prefix = s.subSequence(completionOffset.get(), this.editor?.get()?.selectionStart ?: completionOffset.get()).toString() + val prefix = s.subSequence(completionOffset.get(), this.editor?.get()?.selectionStart + ?: completionOffset.get()).toString() recyclerView.adapter?.let { it as SuggestionsAdapter // we need to look up only after the '@' @@ -156,7 +157,7 @@ class SuggestionsView : FrameLayout, TextWatcher { if (list.isNotEmpty()) { val adapter = adapter(token) localProvidersByToken.getOrPut(token, { hashMapOf() }) - .put(adapter.term(), list) + .put(adapter.term(), list) if (completionOffset.get() > NO_STATE_INDEX && adapter.itemCount == 0) expand() adapter.addItems(list) } @@ -192,7 +193,8 @@ class SuggestionsView : FrameLayout, TextWatcher { } private fun adapter(token: String): SuggestionsAdapter<*> { - return adaptersByToken[token] ?: throw IllegalStateException("no adapter binds to token \"$token\"") + return adaptersByToken[token] + ?: throw IllegalStateException("no adapter binds to token \"$token\"") } private fun cancelSuggestions(haltCompletion: Boolean) { diff --git a/app/src/main/res/drawable/suggestions_menu_decorator.xml b/suggestions/src/main/res/drawable/suggestions_menu_decorator.xml similarity index 96% rename from app/src/main/res/drawable/suggestions_menu_decorator.xml rename to suggestions/src/main/res/drawable/suggestions_menu_decorator.xml index 22e9422ad2..7aa4ccbadf 100644 --- a/app/src/main/res/drawable/suggestions_menu_decorator.xml +++ b/suggestions/src/main/res/drawable/suggestions_menu_decorator.xml @@ -8,4 +8,4 @@ - \ No newline at end of file + diff --git a/suggestions/src/main/res/values/dimens.xml b/suggestions/src/main/res/values/dimens.xml new file mode 100644 index 0000000000..da61ce5600 --- /dev/null +++ b/suggestions/src/main/res/values/dimens.xml @@ -0,0 +1,5 @@ + + + 150dp + 250dp + \ No newline at end of file diff --git a/suggestions/src/main/res/values/strings.xml b/suggestions/src/main/res/values/strings.xml new file mode 100644 index 0000000000..d734091758 --- /dev/null +++ b/suggestions/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + suggestions + diff --git a/suggestions/src/test/java/yampsample/leonardoaramaki/github/com/suggestions/ExampleUnitTest.java b/suggestions/src/test/java/yampsample/leonardoaramaki/github/com/suggestions/ExampleUnitTest.java new file mode 100644 index 0000000000..08ef365e1d --- /dev/null +++ b/suggestions/src/test/java/yampsample/leonardoaramaki/github/com/suggestions/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package yampsample.leonardoaramaki.github.com.suggestions; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file