migrating to Glide

This commit is contained in:
Mariotaku Lee 2017-03-02 17:23:34 +08:00
parent a48efc6b89
commit 719794778d
No known key found for this signature in database
GPG Key ID: 15C10F89D7C33535
12 changed files with 45 additions and 47 deletions

View File

@ -1,20 +1,15 @@
# Project-wide Gradle settings. # Project-wide Gradle settings.
# IDE (e.g. Android Studio) users: # IDE (e.g. Android Studio) users:
# Settings specified in this file will override any Gradle settings # Settings specified in this file will override any Gradle settings
# configured through the IDE. # configured through the IDE.
# For more details on how to configure your build environment visit # For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html # http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process. # Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings. # The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m # Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx10248m -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # org.gradle.jvmargs=-Xmx10248m -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode. # When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit # This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true # org.gradle.parallel=true
org.gradle.jvmargs=-Xmx2048M org.gradle.jvmargs=-Xmx2048M
kotlin.incremental=true

View File

@ -50,6 +50,7 @@ import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_KEY
import org.mariotaku.twidere.constant.KeyboardShortcutConstants.ACTION_NAVIGATION_BACK import org.mariotaku.twidere.constant.KeyboardShortcutConstants.ACTION_NAVIGATION_BACK
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.extension.loadProfileImage
import org.mariotaku.twidere.model.AccountDetails import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.SuggestionItem import org.mariotaku.twidere.model.SuggestionItem
import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.model.UserKey
@ -263,10 +264,11 @@ class QuickSearchBarActivity : BaseActivity(), OnClickListener, LoaderCallbacks<
private val activity: QuickSearchBarActivity private val activity: QuickSearchBarActivity
) : CursorAdapter(activity, null, 0), OnClickListener { ) : CursorAdapter(activity, null, 0), OnClickListener {
private val inflater: LayoutInflater = LayoutInflater.from(activity) private val requestManager = Glide.with(activity)
private val mediaLoader: MediaLoaderWrapper = activity.mediaLoader private val inflater = LayoutInflater.from(activity)
private val userColorNameManager: UserColorNameManager = activity.userColorNameManager private val mediaLoader = activity.mediaLoader
private val removedPositions: SortableIntList? = SortableIntList() private val userColorNameManager = activity.userColorNameManager
private val removedPositions = SortableIntList()
private var indices: SuggestionItem.Indices? = null private var indices: SuggestionItem.Indices? = null
@ -319,7 +321,7 @@ class QuickSearchBarActivity : BaseActivity(), OnClickListener, LoaderCallbacks<
holder.text2.visibility = View.VISIBLE holder.text2.visibility = View.VISIBLE
holder.text2.text = "@${cursor.getString(indices.summary)}" holder.text2.text = "@${cursor.getString(indices.summary)}"
holder.icon.clearColorFilter() holder.icon.clearColorFilter()
mediaLoader.displayProfileImage(holder.icon, cursor.getString(indices.icon)) requestManager.loadProfileImage(context, cursor.getString(indices.icon)).into(holder.icon)
} }
VIEW_TYPE_USER_SCREEN_NAME -> { VIEW_TYPE_USER_SCREEN_NAME -> {
val holder = view.tag as UserViewHolder val holder = view.tag as UserViewHolder
@ -396,7 +398,6 @@ class QuickSearchBarActivity : BaseActivity(), OnClickListener, LoaderCallbacks<
} }
private fun getActualPosition(position: Int): Int { private fun getActualPosition(position: Int): Int {
if (removedPositions == null) return position
var skipped = 0 var skipped = 0
for (i in 0 until removedPositions.size()) { for (i in 0 until removedPositions.size()) {
if (position + skipped >= removedPositions.get(i)) { if (position + skipped >= removedPositions.get(i)) {
@ -408,9 +409,9 @@ class QuickSearchBarActivity : BaseActivity(), OnClickListener, LoaderCallbacks<
fun addRemovedPositions(positions: IntArray) { fun addRemovedPositions(positions: IntArray) {
for (position in positions) { for (position in positions) {
removedPositions!!.add(getActualPosition(position)) removedPositions.add(getActualPosition(position))
} }
removedPositions!!.sort() removedPositions.sort()
notifyDataSetChanged() notifyDataSetChanged()
} }

View File

@ -25,11 +25,13 @@ import android.graphics.PorterDuff.Mode
import android.support.v4.widget.SimpleCursorAdapter import android.support.v4.widget.SimpleCursorAdapter
import android.view.View import android.view.View
import android.widget.TextView import android.widget.TextView
import com.bumptech.glide.RequestManager
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.extension.loadProfileImage
import org.mariotaku.twidere.model.SuggestionItem 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
@ -40,7 +42,7 @@ import org.mariotaku.twidere.util.dagger.GeneralComponentHelper
import org.mariotaku.twidere.view.ProfileImageView import org.mariotaku.twidere.view.ProfileImageView
import javax.inject.Inject import javax.inject.Inject
class ComposeAutoCompleteAdapter(context: Context) : SimpleCursorAdapter(context, class ComposeAutoCompleteAdapter(context: Context, val requestManager: RequestManager) : SimpleCursorAdapter(context,
R.layout.list_item_auto_complete, null, emptyArray(), intArrayOf(), 0) { R.layout.list_item_auto_complete, null, emptyArray(), intArrayOf(), 0) {
@Inject @Inject
@ -63,7 +65,7 @@ class ComposeAutoCompleteAdapter(context: Context) : SimpleCursorAdapter(context
profileImageStyle = preferences[profileImageStyleKey] profileImageStyle = preferences[profileImageStyleKey]
} }
override fun bindView(view: View, context: Context?, cursor: Cursor) { override fun bindView(view: View, context: Context, cursor: Cursor) {
val indices = this.indices!! 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
@ -77,7 +79,7 @@ class ComposeAutoCompleteAdapter(context: Context) : SimpleCursorAdapter(context
text2.text = String.format("@%s", cursor.getString(indices.summary)) text2.text = String.format("@%s", cursor.getString(indices.summary))
if (displayProfileImage) { if (displayProfileImage) {
val profileImageUrl = cursor.getString(indices.icon) val profileImageUrl = cursor.getString(indices.icon)
mediaLoader.displayProfileImage(icon, profileImageUrl) requestManager.loadProfileImage(context, profileImageUrl).into(icon)
} else { } else {
//TODO cancel image load //TODO cancel image load
} }

View File

@ -27,6 +27,7 @@ import android.support.v4.widget.SimpleCursorAdapter
import android.text.TextUtils import android.text.TextUtils
import android.view.View import android.view.View
import android.widget.TextView import android.widget.TextView
import com.bumptech.glide.RequestManager
import org.mariotaku.kpreferences.get import org.mariotaku.kpreferences.get
import org.mariotaku.sqliteqb.library.Columns import org.mariotaku.sqliteqb.library.Columns
import org.mariotaku.sqliteqb.library.Expression import org.mariotaku.sqliteqb.library.Expression
@ -34,6 +35,7 @@ import org.mariotaku.sqliteqb.library.OrderBy
import org.mariotaku.twidere.R import org.mariotaku.twidere.R
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.extension.loadProfileImage
import org.mariotaku.twidere.model.ParcelableUserCursorIndices import org.mariotaku.twidere.model.ParcelableUserCursorIndices
import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers
@ -46,9 +48,10 @@ import org.mariotaku.twidere.view.ProfileImageView
import javax.inject.Inject import javax.inject.Inject
class UserAutoCompleteAdapter(val context: Context) : SimpleCursorAdapter(context, class UserAutoCompleteAdapter(
R.layout.list_item_auto_complete, null, emptyArray(), val context: Context,
intArrayOf(), 0) { val requestManager: RequestManager
) : SimpleCursorAdapter(context, R.layout.list_item_auto_complete, null, emptyArray(), intArrayOf(), 0) {
@Inject @Inject
lateinit var profileImageLoader: MediaLoaderWrapper lateinit var profileImageLoader: MediaLoaderWrapper
@ -70,7 +73,7 @@ class UserAutoCompleteAdapter(val context: Context) : SimpleCursorAdapter(contex
profileImageStyle = preferences[profileImageStyleKey] profileImageStyle = preferences[profileImageStyleKey]
} }
override fun bindView(view: View, context: Context?, cursor: Cursor) { override fun bindView(view: View, context: Context, cursor: Cursor) {
val indices = this.indices!! 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
@ -83,7 +86,7 @@ class UserAutoCompleteAdapter(val context: Context) : SimpleCursorAdapter(contex
text2.text = "@${cursor.getString(indices.screen_name)}" text2.text = "@${cursor.getString(indices.screen_name)}"
if (displayProfileImage) { if (displayProfileImage) {
val profileImageUrl = cursor.getString(indices.profile_image_url) val profileImageUrl = cursor.getString(indices.profile_image_url)
profileImageLoader.displayProfileImage(icon, profileImageUrl) requestManager.loadProfileImage(context, profileImageUrl, profileImageStyle).into(icon)
} else { } else {
//TODO cancel image load //TODO cancel image load
} }

View File

@ -95,7 +95,7 @@ fun RequestManager.loadProfileImage(context: Context, conversation: ParcelableMe
fun RequestManager.loadOriginalProfileImage(context: Context, user: ParcelableUser, fun RequestManager.loadOriginalProfileImage(context: Context, user: ParcelableUser,
@ImageShapeStyle shapeStyle: Int = ImageShapeStyle.SHAPE_CIRCLE): DrawableRequestBuilder<String> { @ImageShapeStyle shapeStyle: Int = ImageShapeStyle.SHAPE_CIRCLE): DrawableRequestBuilder<String> {
val original = user.extras.profile_image_url_original?.takeIf(String::isEmpty) val original = user.extras.profile_image_url_original?.takeUnless(String::isEmpty)
?: Utils.getOriginalTwitterProfileImage(user.profile_image_url) ?: Utils.getOriginalTwitterProfileImage(user.profile_image_url)
return configureLoadProfileImage(context, shapeStyle) { load(original) } return configureLoadProfileImage(context, shapeStyle) { load(original) }
} }

View File

@ -147,6 +147,10 @@ class AccountsDashboardFragment : BaseFragment(), LoaderCallbacks<AccountsInfo>,
hasPrevAccountIndicator.alpha = 0f hasPrevAccountIndicator.alpha = 0f
hasNextAccountIndicator.alpha = 0f hasNextAccountIndicator.alpha = 0f
val profileImageStyle = preferences[profileImageStyleKey]
floatingProfileImageSnapshot.style = profileImageStyle
accountProfileImageView.style = profileImageStyle
val menuInflater = SupportMenuInflater(context) val menuInflater = SupportMenuInflater(context)
menuInflater.inflate(R.menu.action_dashboard_timeline_toggle, accountDashboardMenu.menu) menuInflater.inflate(R.menu.action_dashboard_timeline_toggle, accountDashboardMenu.menu)
accountDashboardMenu.setOnMenuItemClickListener(OnMenuItemClickListener { item -> accountDashboardMenu.setOnMenuItemClickListener(OnMenuItemClickListener { item ->

View File

@ -41,6 +41,7 @@ import android.text.TextUtils
import android.view.* import android.view.*
import android.widget.* import android.widget.*
import android.widget.AbsListView.MultiChoiceModeListener import android.widget.AbsListView.MultiChoiceModeListener
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.fragment_content_listview.* import kotlinx.android.synthetic.main.fragment_content_listview.*
import org.mariotaku.ktextension.setGroupAvailability import org.mariotaku.ktextension.setGroupAvailability
import org.mariotaku.sqliteqb.library.Columns import org.mariotaku.sqliteqb.library.Columns
@ -300,7 +301,7 @@ abstract class BaseFiltersFragment : AbsContentListViewFragment<SimpleCursorAdap
if (autoCompleteType == AUTO_COMPLETE_TYPE_SOURCES) { if (autoCompleteType == AUTO_COMPLETE_TYPE_SOURCES) {
userAutoCompleteAdapter = SourceAutoCompleteAdapter(activity) userAutoCompleteAdapter = SourceAutoCompleteAdapter(activity)
} else { } else {
val adapter = ComposeAutoCompleteAdapter(activity) val adapter = ComposeAutoCompleteAdapter(activity, Glide.with(this))
adapter.accountKey = Utils.getDefaultAccountKey(activity) adapter.accountKey = Utils.getDefaultAccountKey(activity)
userAutoCompleteAdapter = adapter userAutoCompleteAdapter = adapter
} }

View File

@ -173,7 +173,7 @@ class FilteredUsersFragment : BaseFiltersFragment() {
nameFirst = preferences[nameFirstKey] nameFirst = preferences[nameFirstKey]
} }
override fun bindView(view: View, context: Context?, cursor: Cursor) { override fun bindView(view: View, context: Context, cursor: Cursor) {
super.bindView(view, context, cursor) super.bindView(view, context, cursor)
val indices = this.indices!! val indices = this.indices!!
val icon = view.findViewById(android.R.id.icon) val icon = view.findViewById(android.R.id.icon)

View File

@ -26,6 +26,7 @@ import android.support.v4.content.FixedAsyncTaskLoader
import android.text.TextUtils import android.text.TextUtils
import android.util.Log import android.util.Log
import org.mariotaku.abstask.library.TaskStarter import org.mariotaku.abstask.library.TaskStarter
import org.mariotaku.ktextension.set
import org.mariotaku.microblog.library.MicroBlog import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.twitter.model.User import org.mariotaku.microblog.library.twitter.model.User
@ -87,9 +88,9 @@ class ParcelableUserLoader(
val values = ParcelableUserValuesCreator.create(user) val values = ParcelableUserValuesCreator.create(user)
resolver.insert(CachedUsers.CONTENT_URI, values) resolver.insert(CachedUsers.CONTENT_URI, values)
ParcelableUserUtils.updateExtraInformation(user, details, userColorNameManager) ParcelableUserUtils.updateExtraInformation(user, details, userColorNameManager)
val response = SingleResponse(user) return SingleResponse(user).apply {
response.extras.putParcelable(EXTRA_ACCOUNT, details) extras[EXTRA_ACCOUNT] = details
return response }
} }
} }
val twitter = details.newMicroBlogInstance(context = context, cls = MicroBlog::class.java) val twitter = details.newMicroBlogInstance(context = context, cls = MicroBlog::class.java)
@ -123,9 +124,9 @@ class ParcelableUserLoader(
if (TextUtils.equals(UserKeyUtils.getUserHost(user), user.key.host)) { if (TextUtils.equals(UserKeyUtils.getUserHost(user), user.key.host)) {
user.account_key = accountKey user.account_key = accountKey
user.account_color = details.color user.account_color = details.color
val response = SingleResponse(user) return SingleResponse(user).apply {
response.extras.putParcelable(EXTRA_ACCOUNT, details) extras[EXTRA_ACCOUNT] = details
return response }
} }
cur.moveToNext() cur.moveToNext()
} }
@ -148,8 +149,7 @@ class ParcelableUserLoader(
twitterUser = twitter.showExternalProfile(profileUrl) twitterUser = twitter.showExternalProfile(profileUrl)
} else { } else {
val id = userKey?.id val id = userKey?.id
twitterUser = TwitterWrapper.tryShowUser(twitter, id, screenName, twitterUser = TwitterWrapper.tryShowUser(twitter, id, screenName, details.type)
details.type)
} }
} }
val cachedUserValues = createCachedUser(twitterUser, profileImageSize) val cachedUserValues = createCachedUser(twitterUser, profileImageSize)
@ -157,9 +157,9 @@ class ParcelableUserLoader(
val user = ParcelableUserUtils.fromUser(twitterUser, accountKey, val user = ParcelableUserUtils.fromUser(twitterUser, accountKey,
profileImageSize = profileImageSize) profileImageSize = profileImageSize)
ParcelableUserUtils.updateExtraInformation(user, details, userColorNameManager) ParcelableUserUtils.updateExtraInformation(user, details, userColorNameManager)
val response = SingleResponse.Companion.getInstance(user) return SingleResponse(user).apply {
response.extras.putParcelable(EXTRA_ACCOUNT, details) extras[EXTRA_ACCOUNT] = details
return response }
} catch (e: MicroBlogException) { } catch (e: MicroBlogException) {
Log.w(LOGTAG, e) Log.w(LOGTAG, e)
return SingleResponse(exception = e) return SingleResponse(exception = e)

View File

@ -20,14 +20,12 @@
package org.mariotaku.twidere.util package org.mariotaku.twidere.util
import android.content.SharedPreferences import android.content.SharedPreferences
import android.widget.ImageView
import org.mariotaku.kpreferences.get import org.mariotaku.kpreferences.get
import org.mariotaku.twidere.constant.mediaPreloadKey import org.mariotaku.twidere.constant.mediaPreloadKey
import org.mariotaku.twidere.constant.mediaPreloadOnWifiOnlyKey import org.mariotaku.twidere.constant.mediaPreloadOnWifiOnlyKey
import org.mariotaku.twidere.model.ParcelableActivity import org.mariotaku.twidere.model.ParcelableActivity
import org.mariotaku.twidere.model.ParcelableMedia import org.mariotaku.twidere.model.ParcelableMedia
import org.mariotaku.twidere.model.ParcelableStatus import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.util.getActivityStatus import org.mariotaku.twidere.model.util.getActivityStatus
class MediaLoaderWrapper { class MediaLoaderWrapper {
@ -39,13 +37,6 @@ class MediaLoaderWrapper {
private val shouldPreload: Boolean get() = preloadEnabled && (!preloadOnWifiOnly || !isNetworkMetered) private val shouldPreload: Boolean get() = preloadEnabled && (!preloadOnWifiOnly || !isNetworkMetered)
fun displayOriginalProfileImage(view: ImageView, user: ParcelableUser) {
}
fun displayProfileImage(view: ImageView, url: String?) {
}
fun preloadStatus(status: ParcelableStatus) { fun preloadStatus(status: ParcelableStatus) {
if (!shouldPreload) return if (!shouldPreload) return
preloadProfileImage(status.user_profile_image_url) preloadProfileImage(status.user_profile_image_url)

View File

@ -26,6 +26,7 @@ import android.text.method.ArrowKeyMovementMethod
import android.text.method.MovementMethod import android.text.method.MovementMethod
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.AdapterView import android.widget.AdapterView
import com.bumptech.glide.Glide
import org.mariotaku.chameleon.view.ChameleonMultiAutoCompleteTextView import org.mariotaku.chameleon.view.ChameleonMultiAutoCompleteTextView
import org.mariotaku.twidere.adapter.ComposeAutoCompleteAdapter import org.mariotaku.twidere.adapter.ComposeAutoCompleteAdapter
import org.mariotaku.twidere.model.UserKey import org.mariotaku.twidere.model.UserKey
@ -61,7 +62,7 @@ class ComposeEditText(
override fun onAttachedToWindow() { override fun onAttachedToWindow() {
super.onAttachedToWindow() super.onAttachedToWindow()
if (!isInEditMode && adapter == null) { if (!isInEditMode && adapter == null) {
adapter = ComposeAutoCompleteAdapter(context) adapter = ComposeAutoCompleteAdapter(context, Glide.with(context))
} }
setAdapter(adapter) setAdapter(adapter)
updateAccountKey() updateAccountKey()

View File

@ -174,7 +174,7 @@
</LinearLayout> </LinearLayout>
</RelativeLayout> </RelativeLayout>
<ImageView <org.mariotaku.twidere.view.ShapedImageView
android:id="@+id/floatingProfileImageSnapshot" android:id="@+id/floatingProfileImageSnapshot"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"