improved account query performance

fixed menu item color
This commit is contained in:
Mariotaku Lee 2017-04-15 20:38:39 +08:00
parent 48968d2985
commit 7fb561cdee
No known key found for this signature in database
GPG Key ID: 15C10F89D7C33535
11 changed files with 49 additions and 44 deletions

View File

@ -9,7 +9,6 @@ import android.support.annotation.Nullable;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.annotation.AccountType;
import org.mariotaku.twidere.annotation.AuthTypeInt;
import org.mariotaku.twidere.extension.model.AccountDetailsExtensionsKt;
import org.mariotaku.twidere.extension.model.AccountExtensionsKt;
import org.mariotaku.twidere.model.AccountDetails;
import org.mariotaku.twidere.model.UserKey;
@ -118,9 +117,17 @@ public class AccountUtils {
return null;
}
public static boolean isOfficial(@NonNull final Context context, @NonNull final UserKey accountKey) {
AccountManager am = AccountManager.get(context);
Account account = AccountUtils.findByAccountKey(am, accountKey);
if (account == null) return false;
return AccountExtensionsKt.isOfficial(account, am, context);
}
public static boolean hasOfficialKeyAccount(Context context) {
for (AccountDetails details : getAllAccountDetails(AccountManager.get(context), true)) {
if (AccountDetailsExtensionsKt.isOfficial(details, context)) {
final AccountManager am = AccountManager.get(context);
for (Account account : getAccounts(am)) {
if (AccountExtensionsKt.isOfficial(account, am, context)) {
return true;
}
}

View File

@ -87,7 +87,6 @@ import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.annotation.CustomTabType;
import org.mariotaku.twidere.annotation.ProfileImageSize;
import org.mariotaku.twidere.extension.model.AccountDetailsExtensionsKt;
import org.mariotaku.twidere.model.AccountDetails;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.ParcelableUserMention;
@ -293,18 +292,6 @@ public final class Utils implements Constants {
return hasNavBar(context);
}
public static boolean isOfficialCredentials(@NonNull final Context context, final UserKey accountKey) {
final AccountDetails details = AccountUtils.getAccountDetails(AccountManager.get(context), accountKey, true);
if (details == null) return false;
return AccountDetailsExtensionsKt.isOfficial(details, context);
}
public static boolean isOfficialCredentials(@NonNull final Context context,
@NonNull final AccountDetails account) {
return AccountDetailsExtensionsKt.isOfficial(account, context);
}
public static boolean setLastSeen(Context context, ParcelableUserMention[] entities, long time) {
if (entities == null) return false;
boolean result = false;

View File

@ -602,8 +602,8 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
override fun onActionModeStarted(mode: ActionMode) {
super.onActionModeStarted(mode)
ThemeUtils.applyColorFilterToMenuIcon(mode.menu,
ThemeUtils.getColorForeground(this), 0, 0, Mode.MULTIPLY)
ThemeUtils.applyColorFilterToMenuIcon(mode.menu, ThemeUtils.getColorForeground(this), 0, 0,
Mode.MULTIPLY)
}
override fun dispatchKeyEvent(event: KeyEvent): Boolean {

View File

@ -1,6 +1,7 @@
package org.mariotaku.twidere.extension.model
import android.accounts.*
import android.content.Context
import android.os.Build
import android.os.Handler
import android.os.Looper
@ -24,6 +25,7 @@ import org.mariotaku.twidere.model.util.AccountUtils
import org.mariotaku.twidere.model.util.AccountUtils.ACCOUNT_USER_DATA_KEYS
import org.mariotaku.twidere.util.JsonSerializer
import org.mariotaku.twidere.util.ParseUtils
import org.mariotaku.twidere.util.TwitterContentUtils
import java.io.IOException
import java.util.concurrent.Callable
import java.util.concurrent.Executors
@ -109,13 +111,23 @@ fun Account.setPosition(am: AccountManager, position: Int) {
am.setUserData(this, ACCOUNT_USER_DATA_POSITION, position.toString())
}
fun AccountManager.hasInvalidAccount(): Boolean {
for (account in AccountUtils.getAccounts(this)) {
if (!isAccountValid(account)) return true
fun Account.isOfficial(am: AccountManager, context: Context): Boolean {
val extras = getAccountExtras(am)
if (extras is TwitterAccountExtras) {
return extras.isOfficialCredentials
}
val credentials = getCredentials(am)
if (credentials is OAuthCredentials) {
return TwitterContentUtils.isOfficialKey(context, credentials.consumer_key,
credentials.consumer_secret)
}
return false
}
fun AccountManager.hasInvalidAccount(): Boolean {
return AccountUtils.getAccounts(this).none { isAccountValid(it) }
}
fun AccountManager.isAccountValid(account: Account): Boolean {
if (TextUtils.isEmpty(AccountDataQueue.peekAuthToken(this, account, ACCOUNT_AUTH_TOKEN_TYPE))) return false
if (TextUtils.isEmpty(AccountDataQueue.getUserData(this, account, ACCOUNT_USER_DATA_KEY))) return false

View File

@ -296,7 +296,7 @@ abstract class AbsActivitiesFragment protected constructor() :
override fun onGapClick(holder: GapViewHolder, position: Int) {
val activity = adapter.getActivity(position)
DebugLog.v(msg = "Load activity gap $activity")
if (!Utils.isOfficialCredentials(context, activity.account_key)) {
if (!AccountUtils.isOfficial(context, activity.account_key)) {
// Skip if item is not a status
if (activity.action !in Activity.Action.MENTION_ACTIONS) {
adapter.removeGapLoadingId(ObjectId(activity.account_key, activity.id))

View File

@ -30,7 +30,7 @@ import org.mariotaku.twidere.loader.CursorSupportUsersLoader
import org.mariotaku.twidere.loader.IncomingFriendshipsLoader
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.event.FriendshipTaskEvent
import org.mariotaku.twidere.util.Utils
import org.mariotaku.twidere.model.util.AccountUtils
import org.mariotaku.twidere.view.holder.UserViewHolder
class IncomingFriendshipsFragment : CursorUsersListFragment(), IUsersAdapter.RequestClickListener {
@ -38,7 +38,7 @@ class IncomingFriendshipsFragment : CursorUsersListFragment(), IUsersAdapter.Req
override fun onCreateUsersLoader(context: Context, args: Bundle,
fromUser: Boolean): CursorSupportUsersLoader {
val accountKey = args.getParcelable<UserKey>(EXTRA_ACCOUNT_KEY)
val accountKey = args.getParcelable<UserKey?>(EXTRA_ACCOUNT_KEY)
val loader = IncomingFriendshipsLoader(context, accountKey, adapter.getData(), fromUser)
loader.cursor = nextCursor
loader.page = nextPage
@ -47,14 +47,11 @@ class IncomingFriendshipsFragment : CursorUsersListFragment(), IUsersAdapter.Req
override fun onCreateAdapter(context: Context): ParcelableUsersAdapter {
val adapter = super.onCreateAdapter(context)
val args = arguments
val accountKey = args.getParcelable<UserKey>(EXTRA_ACCOUNT_KEY)
if (accountKey == null) {
adapter.requestClickListener = null
} else if (USER_TYPE_FANFOU_COM == accountKey.host || Utils.isOfficialCredentials(context, accountKey)) {
val accountKey = arguments.getParcelable<UserKey?>(EXTRA_ACCOUNT_KEY) ?: return adapter
if (USER_TYPE_FANFOU_COM == accountKey.host) {
adapter.requestClickListener = this
} else if (AccountUtils.isOfficial(context, accountKey)) {
adapter.requestClickListener = this
} else {
adapter.requestClickListener = null
}
return adapter
}

View File

@ -92,6 +92,7 @@ import org.mariotaku.twidere.extension.applyTheme
import org.mariotaku.twidere.extension.loadProfileImage
import org.mariotaku.twidere.extension.model.applyTo
import org.mariotaku.twidere.extension.model.getAccountType
import org.mariotaku.twidere.extension.model.isOfficial
import org.mariotaku.twidere.extension.model.media_type
import org.mariotaku.twidere.extension.view.calculateSpaceItemHeight
import org.mariotaku.twidere.fragment.AbsStatusesFragment.Companion.handleActionClick
@ -1004,10 +1005,7 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
val lang = status.lang
if (!Utils.isOfficialCredentials(context, account) || !CheckUtils.isValidLocale(lang)) {
itemView.translateLabel.setText(R.string.unknown_language)
itemView.translateContainer.visibility = View.GONE
} else {
if (CheckUtils.isValidLocale(lang) && account.isOfficial(context)) {
val locale = Locale(lang)
itemView.translateContainer.visibility = View.VISIBLE
if (translation != null) {
@ -1019,6 +1017,9 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
locale.displayLanguage)
itemView.translateResult.visibility = View.GONE
}
} else {
itemView.translateLabel.setText(R.string.unknown_language)
itemView.translateContainer.visibility = View.GONE
}
itemView.text.setTextIsSelectable(true)
@ -1108,7 +1109,7 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
provider.setUseStar(useStar)
provider.init(itemView.menuBar, favoriteItem)
}
ThemeUtils.wrapMenuIcon(itemView.menuBar, MENU_GROUP_STATUS_SHARE)
ThemeUtils.wrapMenuIcon(itemView.menuBar, excludeGroups = MENU_GROUP_STATUS_SHARE)
itemView.mediaPreviewLoad.setOnClickListener(this)
itemView.profileContainer.setOnClickListener(this)
retweetedByView.setOnClickListener(this)

View File

@ -40,6 +40,7 @@ import org.mariotaku.twidere.constant.SharedPreferenceConstants
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.model.*
import org.mariotaku.twidere.model.event.*
import org.mariotaku.twidere.model.util.AccountUtils
import org.mariotaku.twidere.model.util.ParcelableRelationshipUtils
import org.mariotaku.twidere.model.util.ParcelableUserListUtils
import org.mariotaku.twidere.provider.TwidereDataStore.*
@ -379,7 +380,7 @@ class AsyncTwitterWrapper(
override fun onExecute(params: Any?) {
for (accountKey in accountKeys) {
val microBlog = MicroBlogAPIFactory.getInstance(context, accountKey) ?: continue
if (!Utils.isOfficialCredentials(context, accountKey)) continue
if (!AccountUtils.isOfficial(context, accountKey)) continue
microBlog.setActivitiesAboutMeUnread(cursor)
}
}

View File

@ -962,15 +962,15 @@ object DataStoreUtils {
private fun <T> getOfficialSeparatedIds(context: Context, getFromDatabase: (Array<UserKey?>, Boolean) -> T,
mergeResult: (T, T) -> T, accountKeys: Array<UserKey?>): T {
val officialKeys = Array(accountKeys.size) {
val key = accountKeys[it]
if (Utils.isOfficialCredentials(context, key)) {
val key = accountKeys[it] ?: return@Array null
if (AccountUtils.isOfficial(context, key)) {
return@Array key
}
return@Array null
}
val notOfficialKeys = Array(accountKeys.size) {
val key = accountKeys[it]
if (Utils.isOfficialCredentials(context, key)) {
val key = accountKeys[it] ?: return@Array null
if (AccountUtils.isOfficial(context, key)) {
return@Array null
}
return@Array key

View File

@ -50,6 +50,7 @@ import org.mariotaku.twidere.activity.ColorPickerDialogActivity
import org.mariotaku.twidere.constant.favoriteConfirmationKey
import org.mariotaku.twidere.constant.iWantMyStarsBackKey
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.extension.model.isOfficial
import org.mariotaku.twidere.fragment.*
import org.mariotaku.twidere.fragment.content.FavoriteConfirmDialogFragment
import org.mariotaku.twidere.fragment.content.RetweetQuoteDialogFragment
@ -171,7 +172,7 @@ object MenuUtils {
}
val translate = menu.findItem(R.id.translate)
if (translate != null) {
val isOfficialKey = Utils.isOfficialCredentials(context, details)
val isOfficialKey = details.isOfficial(context)
menu.setItemAvailability(R.id.translate, isOfficialKey)
}
menu.removeGroup(MENU_GROUP_STATUS_EXTENSION)

View File

@ -208,8 +208,7 @@ object ThemeUtils {
}
fun wrapToolbarMenuIcon(view: ActionMenuView?, itemColor: Int, popupItemColor: Int, vararg excludeGroups: Int) {
if (view == null) return
fun wrapToolbarMenuIcon(view: ActionMenuView, itemColor: Int, popupItemColor: Int, vararg excludeGroups: Int) {
val menu = view.menu
var k = 0
for (i in 0 until menu.size()) {