improved auto complete code
This commit is contained in:
parent
c76de65a39
commit
39ea713dd9
|
@ -50,6 +50,7 @@ import org.mariotaku.twidere.constant.KeyboardShortcutConstants.ACTION_NAVIGATIO
|
||||||
import org.mariotaku.twidere.constant.KeyboardShortcutConstants.CONTEXT_TAG_NAVIGATION
|
import org.mariotaku.twidere.constant.KeyboardShortcutConstants.CONTEXT_TAG_NAVIGATION
|
||||||
import org.mariotaku.twidere.constant.newDocumentApiKey
|
import org.mariotaku.twidere.constant.newDocumentApiKey
|
||||||
import org.mariotaku.twidere.model.AccountDetails
|
import org.mariotaku.twidere.model.AccountDetails
|
||||||
|
import org.mariotaku.twidere.model.SuggestionItem
|
||||||
import org.mariotaku.twidere.model.UserKey
|
import org.mariotaku.twidere.model.UserKey
|
||||||
import org.mariotaku.twidere.model.util.AccountUtils
|
import org.mariotaku.twidere.model.util.AccountUtils
|
||||||
import org.mariotaku.twidere.provider.TwidereDataStore.SearchHistory
|
import org.mariotaku.twidere.provider.TwidereDataStore.SearchHistory
|
||||||
|
@ -256,39 +257,16 @@ class QuickSearchBarActivity : BaseActivity(), OnClickListener, LoaderCallbacks<
|
||||||
searchQuery.setSelection(query.length)
|
searchQuery.setSelection(query.length)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class SuggestionItem(cursor: Cursor, indices: SuggestionsAdapter.Indices) {
|
|
||||||
|
|
||||||
|
|
||||||
val title: String?
|
|
||||||
val summary: String?
|
|
||||||
val _id: Long
|
|
||||||
val extra_id: String?
|
|
||||||
|
|
||||||
init {
|
|
||||||
_id = cursor.getLong(indices._id)
|
|
||||||
title = cursor.getString(indices.title)
|
|
||||||
summary = cursor.getString(indices.summary)
|
|
||||||
extra_id = cursor.getString(indices.extra_id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class SuggestionsAdapter internal constructor(
|
class SuggestionsAdapter internal constructor(
|
||||||
private val activity: QuickSearchBarActivity
|
private val activity: QuickSearchBarActivity
|
||||||
) : CursorAdapter(activity, null, 0), OnClickListener {
|
) : CursorAdapter(activity, null, 0), OnClickListener {
|
||||||
|
|
||||||
private val inflater: LayoutInflater
|
private val inflater: LayoutInflater = LayoutInflater.from(activity)
|
||||||
private val mediaLoader: MediaLoaderWrapper
|
private val mediaLoader: MediaLoaderWrapper = activity.mediaLoader
|
||||||
private val userColorNameManager: UserColorNameManager
|
private val userColorNameManager: UserColorNameManager = activity.userColorNameManager
|
||||||
private val removedPositions: SortableIntList?
|
private val removedPositions: SortableIntList? = SortableIntList()
|
||||||
|
|
||||||
private var indices: Indices? = null
|
private var indices: SuggestionItem.Indices? = null
|
||||||
|
|
||||||
init {
|
|
||||||
removedPositions = SortableIntList()
|
|
||||||
mediaLoader = activity.mediaLoader
|
|
||||||
userColorNameManager = activity.userColorNameManager
|
|
||||||
inflater = LayoutInflater.from(activity)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun newView(context: Context, cursor: Cursor, parent: ViewGroup): View {
|
override fun newView(context: Context, cursor: Cursor, parent: ViewGroup): View {
|
||||||
when (getActualItemViewType(cursor.position)) {
|
when (getActualItemViewType(cursor.position)) {
|
||||||
|
@ -389,7 +367,7 @@ class QuickSearchBarActivity : BaseActivity(), OnClickListener, LoaderCallbacks<
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun swapCursor(newCursor: Cursor?): Cursor? {
|
override fun swapCursor(newCursor: Cursor?): Cursor? {
|
||||||
indices = if (newCursor != null) Indices(newCursor) else null
|
indices = if (newCursor != null) SuggestionItem.Indices(newCursor) else null
|
||||||
removedPositions!!.clear()
|
removedPositions!!.clear()
|
||||||
return super.swapCursor(newCursor)
|
return super.swapCursor(newCursor)
|
||||||
}
|
}
|
||||||
|
@ -436,47 +414,18 @@ class QuickSearchBarActivity : BaseActivity(), OnClickListener, LoaderCallbacks<
|
||||||
|
|
||||||
internal class SearchViewHolder(view: View) {
|
internal class SearchViewHolder(view: View) {
|
||||||
|
|
||||||
internal val icon: ImageView
|
internal val icon: ImageView = view.findViewById(android.R.id.icon) as ImageView
|
||||||
internal val text1: TextView
|
internal val text1: TextView = view.findViewById(android.R.id.text1) as TextView
|
||||||
internal val edit_query: View
|
internal val edit_query: View = view.findViewById(R.id.edit_query)
|
||||||
|
|
||||||
init {
|
|
||||||
icon = view.findViewById(android.R.id.icon) as ImageView
|
|
||||||
text1 = view.findViewById(android.R.id.text1) as TextView
|
|
||||||
edit_query = view.findViewById(R.id.edit_query)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class UserViewHolder(view: View) {
|
internal class UserViewHolder(view: View) {
|
||||||
|
|
||||||
internal val icon: ImageView
|
internal val icon: ImageView = view.findViewById(android.R.id.icon) as ImageView
|
||||||
internal val text1: TextView
|
internal val text1: TextView = view.findViewById(android.R.id.text1) as TextView
|
||||||
internal val text2: TextView
|
internal val text2: TextView = view.findViewById(android.R.id.text2) as TextView
|
||||||
|
|
||||||
init {
|
|
||||||
icon = view.findViewById(android.R.id.icon) as ImageView
|
|
||||||
text1 = view.findViewById(android.R.id.text1) as TextView
|
|
||||||
text2 = view.findViewById(android.R.id.text2) as TextView
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal class Indices(cursor: Cursor) {
|
|
||||||
internal val _id: Int
|
|
||||||
internal val type: Int
|
|
||||||
internal val title: Int
|
|
||||||
internal val summary: Int
|
|
||||||
internal val icon: Int
|
|
||||||
internal val extra_id: Int
|
|
||||||
|
|
||||||
init {
|
|
||||||
_id = cursor.getColumnIndex(Suggestions._ID)
|
|
||||||
type = cursor.getColumnIndex(Suggestions.TYPE)
|
|
||||||
title = cursor.getColumnIndex(Suggestions.TITLE)
|
|
||||||
summary = cursor.getColumnIndex(Suggestions.SUMMARY)
|
|
||||||
icon = cursor.getColumnIndex(Suggestions.ICON)
|
|
||||||
extra_id = cursor.getColumnIndex(Suggestions.EXTRA_ID)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
|
@ -23,15 +23,14 @@ import android.content.Context
|
||||||
import android.database.Cursor
|
import android.database.Cursor
|
||||||
import android.graphics.PorterDuff.Mode
|
import android.graphics.PorterDuff.Mode
|
||||||
import android.support.v4.widget.SimpleCursorAdapter
|
import android.support.v4.widget.SimpleCursorAdapter
|
||||||
import android.text.TextUtils
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import org.apache.commons.lang3.StringUtils
|
|
||||||
import org.mariotaku.kpreferences.get
|
import org.mariotaku.kpreferences.get
|
||||||
import org.mariotaku.twidere.R
|
import org.mariotaku.twidere.R
|
||||||
import org.mariotaku.twidere.TwidereConstants.*
|
import org.mariotaku.twidere.TwidereConstants.*
|
||||||
import org.mariotaku.twidere.constant.displayProfileImageKey
|
import org.mariotaku.twidere.constant.displayProfileImageKey
|
||||||
import org.mariotaku.twidere.constant.profileImageStyleKey
|
import org.mariotaku.twidere.constant.profileImageStyleKey
|
||||||
|
import org.mariotaku.twidere.model.SuggestionItem
|
||||||
import org.mariotaku.twidere.model.UserKey
|
import org.mariotaku.twidere.model.UserKey
|
||||||
import org.mariotaku.twidere.provider.TwidereDataStore.Suggestions
|
import org.mariotaku.twidere.provider.TwidereDataStore.Suggestions
|
||||||
import org.mariotaku.twidere.util.MediaLoaderWrapper
|
import org.mariotaku.twidere.util.MediaLoaderWrapper
|
||||||
|
@ -54,12 +53,7 @@ class ComposeAutoCompleteAdapter(context: Context) : SimpleCursorAdapter(context
|
||||||
private val displayProfileImage: Boolean
|
private val displayProfileImage: Boolean
|
||||||
private val profileImageStyle: Int
|
private val profileImageStyle: Int
|
||||||
|
|
||||||
private var mTypeIdx: Int = 0
|
private var indices: SuggestionItem.Indices? = null
|
||||||
private var mIconIdx: Int = 0
|
|
||||||
private var mTitleIdx: Int = 0
|
|
||||||
private var mSummaryIdx: Int = 0
|
|
||||||
private var mExtraIdIdx: Int = 0
|
|
||||||
private var mValueIdx: Int = 0
|
|
||||||
var accountKey: UserKey? = null
|
var accountKey: UserKey? = null
|
||||||
private var token: Char = ' '
|
private var token: Char = ' '
|
||||||
|
|
||||||
|
@ -70,18 +64,19 @@ class ComposeAutoCompleteAdapter(context: Context) : SimpleCursorAdapter(context
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun bindView(view: View, context: Context?, cursor: Cursor) {
|
override fun bindView(view: View, context: Context?, cursor: Cursor) {
|
||||||
|
val indices = this.indices!!
|
||||||
val text1 = view.findViewById(android.R.id.text1) as TextView
|
val text1 = view.findViewById(android.R.id.text1) as TextView
|
||||||
val text2 = view.findViewById(android.R.id.text2) as TextView
|
val text2 = view.findViewById(android.R.id.text2) as TextView
|
||||||
val icon = view.findViewById(android.R.id.icon) as ProfileImageView
|
val icon = view.findViewById(android.R.id.icon) as ProfileImageView
|
||||||
|
|
||||||
icon.style = profileImageStyle
|
icon.style = profileImageStyle
|
||||||
|
|
||||||
if (Suggestions.AutoComplete.TYPE_USERS == cursor.getString(mTypeIdx)) {
|
if (Suggestions.AutoComplete.TYPE_USERS == cursor.getString(indices.type)) {
|
||||||
text1.text = userColorNameManager.getUserNickname(cursor.getString(mExtraIdIdx),
|
text1.text = userColorNameManager.getUserNickname(cursor.getString(indices.extra_id),
|
||||||
cursor.getString(mTitleIdx))
|
cursor.getString(indices.title))
|
||||||
text2.text = String.format("@%s", cursor.getString(mSummaryIdx))
|
text2.text = String.format("@%s", cursor.getString(indices.summary))
|
||||||
if (displayProfileImage) {
|
if (displayProfileImage) {
|
||||||
val profileImageUrl = cursor.getString(mIconIdx)
|
val profileImageUrl = cursor.getString(indices.icon)
|
||||||
mediaLoader.displayProfileImage(icon, profileImageUrl)
|
mediaLoader.displayProfileImage(icon, profileImageUrl)
|
||||||
} else {
|
} else {
|
||||||
mediaLoader.cancelDisplayTask(icon)
|
mediaLoader.cancelDisplayTask(icon)
|
||||||
|
@ -89,7 +84,7 @@ class ComposeAutoCompleteAdapter(context: Context) : SimpleCursorAdapter(context
|
||||||
|
|
||||||
icon.clearColorFilter()
|
icon.clearColorFilter()
|
||||||
} else {
|
} else {
|
||||||
text1.text = String.format("#%s", cursor.getString(mTitleIdx))
|
text1.text = String.format("#%s", cursor.getString(indices.title))
|
||||||
text2.setText(R.string.hashtag)
|
text2.setText(R.string.hashtag)
|
||||||
|
|
||||||
icon.setImageResource(R.drawable.ic_action_hashtag)
|
icon.setImageResource(R.drawable.ic_action_hashtag)
|
||||||
|
@ -106,16 +101,17 @@ class ComposeAutoCompleteAdapter(context: Context) : SimpleCursorAdapter(context
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun convertToString(cursor: Cursor?): CharSequence {
|
override fun convertToString(cursor: Cursor): CharSequence {
|
||||||
when (StringUtils.defaultIfEmpty(cursor!!.getString(mTypeIdx), "")) {
|
val indices = this.indices!!
|
||||||
|
when (cursor.getString(indices.type)) {
|
||||||
Suggestions.AutoComplete.TYPE_HASHTAGS -> {
|
Suggestions.AutoComplete.TYPE_HASHTAGS -> {
|
||||||
return '#' + cursor.getString(mValueIdx)
|
return '#' + cursor.getString(indices.value)
|
||||||
}
|
}
|
||||||
Suggestions.AutoComplete.TYPE_USERS -> {
|
Suggestions.AutoComplete.TYPE_USERS -> {
|
||||||
return '@' + cursor.getString(mValueIdx)
|
return '@' + cursor.getString(indices.value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return cursor.getString(mValueIdx)
|
return cursor.getString(indices.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun runQueryOnBackgroundThread(constraint: CharSequence?): Cursor? {
|
override fun runQueryOnBackgroundThread(constraint: CharSequence?): Cursor? {
|
||||||
|
@ -146,12 +142,7 @@ class ComposeAutoCompleteAdapter(context: Context) : SimpleCursorAdapter(context
|
||||||
|
|
||||||
override fun swapCursor(cursor: Cursor?): Cursor? {
|
override fun swapCursor(cursor: Cursor?): Cursor? {
|
||||||
if (cursor != null) {
|
if (cursor != null) {
|
||||||
mTypeIdx = cursor.getColumnIndex(Suggestions.AutoComplete.TYPE)
|
indices = SuggestionItem.Indices(cursor)
|
||||||
mTitleIdx = cursor.getColumnIndex(Suggestions.AutoComplete.TITLE)
|
|
||||||
mSummaryIdx = cursor.getColumnIndex(Suggestions.AutoComplete.SUMMARY)
|
|
||||||
mExtraIdIdx = cursor.getColumnIndex(Suggestions.AutoComplete.EXTRA_ID)
|
|
||||||
mIconIdx = cursor.getColumnIndex(Suggestions.AutoComplete.ICON)
|
|
||||||
mValueIdx = cursor.getColumnIndex(Suggestions.AutoComplete.VALUE)
|
|
||||||
}
|
}
|
||||||
return super.swapCursor(cursor)
|
return super.swapCursor(cursor)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
package org.mariotaku.twidere.model
|
||||||
|
|
||||||
|
import android.database.Cursor
|
||||||
|
import org.mariotaku.twidere.provider.TwidereDataStore
|
||||||
|
import org.mariotaku.twidere.provider.TwidereDataStore.*
|
||||||
|
|
||||||
|
class SuggestionItem(cursor: Cursor, indices: Indices) {
|
||||||
|
|
||||||
|
val title: String?
|
||||||
|
val summary: String?
|
||||||
|
val _id: Long
|
||||||
|
val extra_id: String?
|
||||||
|
|
||||||
|
init {
|
||||||
|
_id = cursor.getLong(indices._id)
|
||||||
|
title = cursor.getString(indices.title)
|
||||||
|
summary = cursor.getString(indices.summary)
|
||||||
|
extra_id = cursor.getString(indices.extra_id)
|
||||||
|
}
|
||||||
|
|
||||||
|
class Indices(cursor: Cursor) {
|
||||||
|
val _id: Int = cursor.getColumnIndex(Suggestions._ID)
|
||||||
|
val type: Int = cursor.getColumnIndex(Suggestions.TYPE)
|
||||||
|
val title: Int = cursor.getColumnIndex(Suggestions.TITLE)
|
||||||
|
val value: Int = cursor.getColumnIndex(Suggestions.VALUE)
|
||||||
|
val summary: Int = cursor.getColumnIndex(Suggestions.SUMMARY)
|
||||||
|
val icon: Int = cursor.getColumnIndex(Suggestions.ICON)
|
||||||
|
val extra_id: Int = cursor.getColumnIndex(Suggestions.EXTRA_ID)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue