improved auto complete code

This commit is contained in:
Mariotaku Lee 2017-01-23 14:56:55 +08:00
parent c76de65a39
commit 39ea713dd9
No known key found for this signature in database
GPG Key ID: 9C0706AE47FCE2AD
3 changed files with 60 additions and 89 deletions

View File

@ -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 {

View File

@ -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)
} }

View File

@ -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)
}
}