From 70830e404da5d0f37c4cf16a890a232d3b551070 Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Mon, 16 Jan 2017 01:55:53 +0800 Subject: [PATCH] removed timeline user color/nickname caching --- .../twidere/model/ParcelableStatus.java | 35 ------ .../twidere/provider/TwidereDataStore.java | 3 - .../java/org/mariotaku/twidere/Constants.java | 2 +- .../model/ActivityTitleSummaryMessage.java | 19 ++-- .../twidere/util/ContentValuesCreator.java | 9 -- .../twidere/util/UserColorNameManager.java | 100 +++++------------- .../twidere/fragment/AbsActivitiesFragment.kt | 3 +- .../twidere/fragment/AbsStatusesFragment.kt | 3 +- .../twidere/fragment/ItemsListFragment.kt | 2 +- .../twidere/fragment/StatusFragment.kt | 18 ++-- .../util/ParcelableActivityExtensions.kt | 8 -- .../model/util/ParcelableStatusUtils.kt | 15 --- .../org/mariotaku/twidere/util/MenuUtils.kt | 14 ++- .../twidere/view/holder/StatusViewHolder.kt | 9 +- 14 files changed, 66 insertions(+), 174 deletions(-) diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java index aa386736c..9befcea80 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/model/ParcelableStatus.java @@ -321,34 +321,6 @@ public class ParcelableStatus implements Parcelable, Comparable colorCache; + private final LruCache nicknameCache; private final Context context; public UserColorNameManager(Context context) { this.context = context; colorPreferences = context.getSharedPreferences(USER_COLOR_PREFERENCES_NAME, Context.MODE_PRIVATE); nicknamePreferences = context.getSharedPreferences(USER_NICKNAME_PREFERENCES_NAME, Context.MODE_PRIVATE); + colorCache = new LruCache<>(512); + nicknameCache = new LruCache<>(256); } public SharedPreferences getColorPreferences() { @@ -87,7 +88,7 @@ public class UserColorNameManager implements TwidereConstants { public void clearUserColor(@NonNull final UserKey userKey) { final SharedPreferences.Editor editor = colorPreferences.edit(); final String userKeyString = userKey.toString(); - updateColor(userKeyString, 0); + colorCache.remove(userKeyString); editor.remove(userKeyString); editor.apply(); } @@ -95,7 +96,7 @@ public class UserColorNameManager implements TwidereConstants { public void setUserColor(@NonNull final UserKey userKey, final int color) { final SharedPreferences.Editor editor = colorPreferences.edit(); final String userKeyString = userKey.toString(); - updateColor(userKeyString, color); + colorCache.put(userKeyString, color); editor.putInt(userKeyString, color); editor.apply(); } @@ -103,7 +104,7 @@ public class UserColorNameManager implements TwidereConstants { public void setUserNickname(@NonNull final UserKey userKey, final String nickname) { final SharedPreferences.Editor editor = nicknamePreferences.edit(); final String userKeyString = userKey.toString(); - updateNickname(userKeyString, null); + nicknameCache.put(userKeyString, nickname); editor.putString(userKeyString, nickname); editor.apply(); } @@ -111,63 +112,11 @@ public class UserColorNameManager implements TwidereConstants { public void clearUserNickname(@NonNull final UserKey userKey) { final SharedPreferences.Editor editor = nicknamePreferences.edit(); final String userKeyString = userKey.toString(); - updateNickname(userKeyString, null); + nicknameCache.remove(userKeyString); editor.remove(userKeyString); editor.apply(); } - private void updateColor(String userKey, int color) { - final ContentResolver cr = context.getContentResolver(); - ContentValues cv = new ContentValues(); - updateColumn(cr, Statuses.CONTENT_URI, userKey, Statuses.USER_COLOR, Statuses.USER_KEY, - color, cv); - updateColumn(cr, Statuses.CONTENT_URI, userKey, Statuses.QUOTED_USER_COLOR, - Statuses.QUOTED_USER_KEY, color, cv); - updateColumn(cr, Statuses.CONTENT_URI, userKey, Statuses.RETWEET_USER_COLOR, - Statuses.RETWEETED_BY_USER_KEY, color, cv); - - updateColumn(cr, Activities.AboutMe.CONTENT_URI, userKey, Activities.STATUS_USER_COLOR, - Activities.STATUS_USER_KEY, color, cv); - updateColumn(cr, Activities.AboutMe.CONTENT_URI, userKey, Activities.STATUS_RETWEET_USER_COLOR, - Activities.STATUS_RETWEETED_BY_USER_KEY, color, cv); - updateColumn(cr, Activities.AboutMe.CONTENT_URI, userKey, Activities.STATUS_QUOTED_USER_COLOR, - Activities.STATUS_QUOTED_USER_KEY, color, cv); - } - - private void updateNickname(String userKey, String nickname) { - final ContentResolver cr = context.getContentResolver(); - ContentValues cv = new ContentValues(); - updateColumn(cr, Statuses.CONTENT_URI, userKey, Statuses.USER_NICKNAME, Statuses.USER_KEY, - nickname, cv); - updateColumn(cr, Statuses.CONTENT_URI, userKey, Statuses.QUOTED_USER_NICKNAME, - Statuses.QUOTED_USER_KEY, nickname, cv); - updateColumn(cr, Statuses.CONTENT_URI, userKey, Statuses.RETWEET_USER_NICKNAME, - Statuses.RETWEETED_BY_USER_KEY, nickname, cv); - - updateColumn(cr, Activities.AboutMe.CONTENT_URI, userKey, Activities.STATUS_USER_NICKNAME, - Activities.STATUS_USER_KEY, nickname, cv); - updateColumn(cr, Activities.AboutMe.CONTENT_URI, userKey, Activities.STATUS_RETWEET_USER_NICKNAME, - Activities.STATUS_RETWEETED_BY_USER_KEY, nickname, cv); - updateColumn(cr, Activities.AboutMe.CONTENT_URI, userKey, Activities.STATUS_QUOTED_USER_NICKNAME, - Activities.STATUS_QUOTED_USER_KEY, nickname, cv); - } - - private static void updateColumn(ContentResolver cr, Uri uri, String userKey, String valueColumn, - String whereColumn, int value, ContentValues temp) { - temp.clear(); - temp.put(valueColumn, value); - cr.update(uri, temp, Expression.equalsArgs(whereColumn).getSQL(), - new String[]{userKey}); - } - - - private static void updateColumn(ContentResolver cr, Uri uri, String userKey, String valueColumn, - String whereColumn, String value, ContentValues temp) { - temp.clear(); - temp.put(valueColumn, value); - cr.update(uri, temp, Expression.equalsArgs(whereColumn).getSQL(), - new String[]{userKey}); - } public String getDisplayName(final ParcelableUser user, final boolean nameFirst) { return getDisplayName(user.key, user.name, user.screen_name, nameFirst); @@ -201,21 +150,17 @@ public class UserColorNameManager implements TwidereConstants { } public int getUserColor(@NonNull final String userId) { - return colorPreferences.getInt(userId, Color.TRANSPARENT); + final Integer cached = colorCache.get(userId); + if (cached != null) return cached; + final int color = colorPreferences.getInt(userId, Color.TRANSPARENT); + colorCache.put(userId, color); + return color; } @Nullable public String getUserNickname(@NonNull final UserKey userKey) { final String userKeyString = userKey.toString(); - if (nicknamePreferences.contains(userKey.getId())) { - String nick = nicknamePreferences.getString(userKey.getId(), null); - SharedPreferences.Editor editor = nicknamePreferences.edit(); - editor.remove(userKey.getId()); - editor.putString(userKeyString, nick); - editor.apply(); - return nick; - } - return nicknamePreferences.getString(userKeyString, null); + return getUserNicknameInternal(userKeyString); } @Nullable @@ -235,7 +180,16 @@ public class UserColorNameManager implements TwidereConstants { } private String getUserNicknameInternal(@NonNull final String userId) { - return nicknamePreferences.getString(userId, null); + final String cached = nicknameCache.get(userId); + if (NICKNAME_NULL.equals(cached)) return null; + if (cached != null) return cached; + final String nickname = nicknamePreferences.getString(userId, null); + if (nickname != null) { + nicknameCache.put(userId, nickname); + } else { + nicknameCache.put(userId, NICKNAME_NULL); + } + return nickname; } public interface UserColorChangedListener { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsActivitiesFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsActivitiesFragment.kt index 3db1656c8..84abc7884 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsActivitiesFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsActivitiesFragment.kt @@ -464,7 +464,8 @@ abstract class AbsActivitiesFragment protected constructor() : ITEM_VIEW_TYPE_STATUS -> { val status = getActivityStatus(position) ?: return inflater.inflate(R.menu.action_status, menu) - MenuUtils.setupForStatus(context, preferences, menu, status, twitterWrapper) + MenuUtils.setupForStatus(context, preferences, menu, status, twitterWrapper, + userColorNameManager) } } } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsStatusesFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsStatusesFragment.kt index 54569c1ef..487ff4da8 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsStatusesFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsStatusesFragment.kt @@ -472,7 +472,8 @@ abstract class AbsStatusesFragment protected constructor() : val contextMenuInfo = menuInfo as ExtendedRecyclerView.ContextMenuInfo? val status = adapter.getStatus(contextMenuInfo!!.position) inflater.inflate(R.menu.action_status, menu) - MenuUtils.setupForStatus(context, preferences, menu, status!!, twitterWrapper) + MenuUtils.setupForStatus(context, preferences, menu, status!!, twitterWrapper, + userColorNameManager) } override fun onContextItemSelected(item: MenuItem): Boolean { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ItemsListFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ItemsListFragment.kt index 82a7e3814..911c9e215 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ItemsListFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ItemsListFragment.kt @@ -122,7 +122,7 @@ class ItemsListFragment : AbsContentListRecyclerViewFragment return null } status.account_color = account_color - status.user_color = status_user_color - status.retweet_user_color = status_retweet_user_color - status.quoted_user_color = status_quoted_user_color - - status.user_nickname = status_user_nickname - status.in_reply_to_user_nickname = status_in_reply_to_user_nickname - status.retweet_user_nickname = status_retweet_user_nickname - status.quoted_user_nickname = status_quoted_user_nickname return status } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/model/util/ParcelableStatusUtils.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/model/util/ParcelableStatusUtils.kt index 9607738f0..4a913ef16 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/model/util/ParcelableStatusUtils.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/model/util/ParcelableStatusUtils.kt @@ -268,21 +268,6 @@ object ParcelableStatusUtils { fun updateExtraInformation(status: ParcelableStatus, details: AccountDetails, manager: UserColorNameManager) { status.account_color = details.color - status.user_color = manager.getUserColor(status.user_key) - status.user_nickname = manager.getUserNickname(status.user_key) - - if (status.quoted_user_key != null) { - status.quoted_user_color = manager.getUserColor(status.quoted_user_key!!) - status.quoted_user_nickname = manager.getUserNickname(status.quoted_user_key!!) - } - if (status.retweeted_by_user_key != null) { - status.retweet_user_color = manager.getUserColor(status.retweeted_by_user_key!!) - status.retweet_user_nickname = manager.getUserNickname(status.retweeted_by_user_key!!) - } - - if (status.in_reply_to_user_key != null) { - status.in_reply_to_user_nickname = manager.getUserNickname(status.in_reply_to_user_key!!) - } } fun Status.inferExternalUrl(): String? { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/MenuUtils.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/MenuUtils.kt index b174a59c5..5188bba09 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/util/MenuUtils.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/MenuUtils.kt @@ -36,6 +36,7 @@ import android.util.Log import android.view.ContextMenu import android.view.Menu import android.view.MenuItem +import org.mariotaku.kpreferences.get import org.mariotaku.ktextension.setItemChecked import org.mariotaku.ktextension.setMenuItemIcon import org.mariotaku.twidere.Constants @@ -44,6 +45,7 @@ import org.mariotaku.twidere.TwidereConstants.* import org.mariotaku.twidere.activity.AccountSelectorActivity import org.mariotaku.twidere.activity.ColorPickerDialogActivity import org.mariotaku.twidere.constant.SharedPreferenceConstants +import org.mariotaku.twidere.constant.nameFirstKey import org.mariotaku.twidere.fragment.AbsStatusesFragment import org.mariotaku.twidere.fragment.AddStatusFilterDialogFragment import org.mariotaku.twidere.fragment.DestroyStatusDialogFragment @@ -113,10 +115,11 @@ object MenuUtils { preferences: SharedPreferencesWrapper, menu: Menu, status: ParcelableStatus, - twitter: AsyncTwitterWrapper) { + twitter: AsyncTwitterWrapper, + manager: UserColorNameManager) { val account = AccountUtils.getAccountDetails(AccountManager.get(context), status.account_key, true) ?: return - setupForStatus(context, preferences, menu, status, account, twitter) + setupForStatus(context, preferences, menu, status, account, twitter, manager) } @UiThread @@ -125,11 +128,12 @@ object MenuUtils { menu: Menu, status: ParcelableStatus, details: AccountDetails, - twitter: AsyncTwitterWrapper) { + twitter: AsyncTwitterWrapper, + manager: UserColorNameManager) { if (menu is ContextMenu) { menu.setHeaderTitle(context.getString(R.string.status_menu_title_format, - UserColorNameManager.decideDisplayName(status.user_nickname, status.user_name, - status.user_screen_name, preferences.getBoolean(SharedPreferenceConstants.KEY_NAME_FIRST)), + manager.getDisplayName(status.user_key, status.user_name, status.user_screen_name, + preferences[nameFirstKey]), status.text_unescaped)) } val retweetHighlight = ContextCompat.getColor(context, R.color.highlight_retweet) diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/StatusViewHolder.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/StatusViewHolder.kt index d046c46f9..d58d284dd 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/StatusViewHolder.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/view/holder/StatusViewHolder.kt @@ -268,13 +268,14 @@ class StatusViewHolder(private val adapter: IStatusesAdapter<*>, itemView: View) quotedView.drawStart(ThemeUtils.getColorFromAttribute(context, R.attr.quoteIndicatorBackgroundColor, 0)) } - itemContent.drawStart(status.user_color) + itemContent.drawStart(colorNameManager.getUserColor(status.user_key)) } else { quotedView.visibility = View.GONE + val userColor = colorNameManager.getUserColor(status.user_key) + if (status.is_retweet) { - val retweetUserColor = status.retweet_user_color - val userColor = status.user_color + val retweetUserColor = colorNameManager.getUserColor(status.retweeted_by_user_key!!) if (retweetUserColor == 0) { itemContent.drawStart(userColor) } else if (userColor == 0) { @@ -283,7 +284,7 @@ class StatusViewHolder(private val adapter: IStatusesAdapter<*>, itemView: View) itemContent.drawStart(retweetUserColor, userColor) } } else { - itemContent.drawStart(status.user_color) + itemContent.drawStart(userColor) } }