Skip to content

Commit

Permalink
Modularize all suggestions autocompletion code
Browse files Browse the repository at this point in the history
  • Loading branch information
leonardoaramaki committed Sep 12, 2018
1 parent 93d43d3 commit 8871126
Show file tree
Hide file tree
Showing 31 changed files with 177 additions and 69 deletions.
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ dependencies {
implementation project(':draw')
implementation project(':util')
implementation project(':core')
implementation project(':suggestions')

implementation libraries.kotlin
implementation libraries.coroutines
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<CommandSuggestionsViewHolder>(token = "/",
constraint = CONSTRAINT_BOUND_TO_START, threshold = RESULT_COUNT_UNLIMITED) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<PeopleSuggestionViewHolder>("@") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<RoomSuggestionsViewHolder>("#") {

Expand Down
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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?,
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/layout/fragment_chat_room.xml
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible" />

<chat.rocket.android.widget.autocompletion.ui.SuggestionsView
<chat.rocket.android.suggestions.ui.SuggestionsView
android:id="@+id/suggestions_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
Expand Down
4 changes: 0 additions & 4 deletions app/src/main/res/values/dimens.xml
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,6 @@
<dimen name="padding_mention">4dp</dimen>
<dimen name="radius_mention">6dp</dimen>

<!-- Autocomplete Popup -->
<dimen name="popup_max_height">150dp</dimen>
<dimen name="suggestions_box_max_height">250dp</dimen>

<dimen name="viewer_toolbar_padding">16dp</dimen>
<dimen name="viewer_toolbar_title">16sp</dimen>

Expand Down
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion settings.gradle
Original file line number Diff line number Diff line change
@@ -1 +1 @@
include ':app', ':player', ':emoji', ':draw', ':util', ':core' //, ':wear'
include ':app', ':player', ':emoji', ':draw', ':util', ':core', ':suggestions' //, ':wear'
1 change: 1 addition & 0 deletions suggestions/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
34 changes: 34 additions & 0 deletions suggestions/build.gradle
Original file line number Diff line number Diff line change
@@ -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
}
21 changes: 21 additions & 0 deletions suggestions/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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 <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@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());
}
}
2 changes: 2 additions & 0 deletions suggestions/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="chat.rocket.android.suggestions" />
Original file line number Diff line number Diff line change
@@ -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<String> = emptyList(), // Where to search for matches.
Expand All @@ -15,4 +15,4 @@ abstract class SuggestionModel(val text: String, // This is the text key for sea
override fun hashCode(): Int {
return text.hashCode()
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package chat.rocket.android.widget.autocompletion.repository
package chat.rocket.android.suggestions.repository

interface LocalSuggestionProvider {
fun find(prefix: String)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
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
fun autocompleteItems(prefix: String): List<SuggestionModel>
fun addAll(list: List<SuggestionModel>)
fun addPinned(list: List<SuggestionModel>)
fun size(): Int
}
}
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down Expand Up @@ -46,4 +46,4 @@ internal class StringMatchingCompletionStrategy(private val threshold: Int = RES
override fun size(): Int {
return list.size
}
}
}
Original file line number Diff line number Diff line change
@@ -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<SuggestionModel>()
Expand All @@ -28,8 +28,7 @@ class TrieCompletionStrategy : CompletionStrategy {
}

override fun addPinned(list: List<SuggestionModel>) {

}

override fun size() = items.size
}
}
Original file line number Diff line number Diff line change
@@ -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(' ')
Expand Down Expand Up @@ -67,4 +67,4 @@ internal class Trie {
}

fun getCount() = count
}
}
Original file line number Diff line number Diff line change
@@ -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,
Expand Down Expand Up @@ -44,4 +44,4 @@ internal class TrieNode(internal var data: Char,
}

override fun toString(): String = if (parent == null) "" else "${parent.toString()}$data"
}
}
Original file line number Diff line number Diff line change
@@ -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?)
}
}
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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)
}
}
}
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -32,10 +32,10 @@ abstract class SuggestionsAdapter<VH : BaseSuggestionViewHolder>(
// 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)
Expand Down
Loading

0 comments on commit 8871126

Please sign in to comment.