mirror of
https://github.com/TwidereProject/Twidere-Android
synced 2025-02-01 09:16:47 +01:00
improved account query performance
fixed menu item color
This commit is contained in:
parent
48968d2985
commit
7fb561cdee
@ -9,7 +9,6 @@ import android.support.annotation.Nullable;
|
|||||||
import org.mariotaku.twidere.R;
|
import org.mariotaku.twidere.R;
|
||||||
import org.mariotaku.twidere.annotation.AccountType;
|
import org.mariotaku.twidere.annotation.AccountType;
|
||||||
import org.mariotaku.twidere.annotation.AuthTypeInt;
|
import org.mariotaku.twidere.annotation.AuthTypeInt;
|
||||||
import org.mariotaku.twidere.extension.model.AccountDetailsExtensionsKt;
|
|
||||||
import org.mariotaku.twidere.extension.model.AccountExtensionsKt;
|
import org.mariotaku.twidere.extension.model.AccountExtensionsKt;
|
||||||
import org.mariotaku.twidere.model.AccountDetails;
|
import org.mariotaku.twidere.model.AccountDetails;
|
||||||
import org.mariotaku.twidere.model.UserKey;
|
import org.mariotaku.twidere.model.UserKey;
|
||||||
@ -118,9 +117,17 @@ public class AccountUtils {
|
|||||||
return null;
|
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) {
|
public static boolean hasOfficialKeyAccount(Context context) {
|
||||||
for (AccountDetails details : getAllAccountDetails(AccountManager.get(context), true)) {
|
final AccountManager am = AccountManager.get(context);
|
||||||
if (AccountDetailsExtensionsKt.isOfficial(details, context)) {
|
for (Account account : getAccounts(am)) {
|
||||||
|
if (AccountExtensionsKt.isOfficial(account, am, context)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -87,7 +87,6 @@ import org.mariotaku.twidere.Constants;
|
|||||||
import org.mariotaku.twidere.R;
|
import org.mariotaku.twidere.R;
|
||||||
import org.mariotaku.twidere.annotation.CustomTabType;
|
import org.mariotaku.twidere.annotation.CustomTabType;
|
||||||
import org.mariotaku.twidere.annotation.ProfileImageSize;
|
import org.mariotaku.twidere.annotation.ProfileImageSize;
|
||||||
import org.mariotaku.twidere.extension.model.AccountDetailsExtensionsKt;
|
|
||||||
import org.mariotaku.twidere.model.AccountDetails;
|
import org.mariotaku.twidere.model.AccountDetails;
|
||||||
import org.mariotaku.twidere.model.ParcelableStatus;
|
import org.mariotaku.twidere.model.ParcelableStatus;
|
||||||
import org.mariotaku.twidere.model.ParcelableUserMention;
|
import org.mariotaku.twidere.model.ParcelableUserMention;
|
||||||
@ -293,18 +292,6 @@ public final class Utils implements Constants {
|
|||||||
return hasNavBar(context);
|
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) {
|
public static boolean setLastSeen(Context context, ParcelableUserMention[] entities, long time) {
|
||||||
if (entities == null) return false;
|
if (entities == null) return false;
|
||||||
boolean result = false;
|
boolean result = false;
|
||||||
|
@ -602,8 +602,8 @@ class ComposeActivity : BaseActivity(), OnMenuItemClickListener, OnClickListener
|
|||||||
|
|
||||||
override fun onActionModeStarted(mode: ActionMode) {
|
override fun onActionModeStarted(mode: ActionMode) {
|
||||||
super.onActionModeStarted(mode)
|
super.onActionModeStarted(mode)
|
||||||
ThemeUtils.applyColorFilterToMenuIcon(mode.menu,
|
ThemeUtils.applyColorFilterToMenuIcon(mode.menu, ThemeUtils.getColorForeground(this), 0, 0,
|
||||||
ThemeUtils.getColorForeground(this), 0, 0, Mode.MULTIPLY)
|
Mode.MULTIPLY)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
|
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package org.mariotaku.twidere.extension.model
|
package org.mariotaku.twidere.extension.model
|
||||||
|
|
||||||
import android.accounts.*
|
import android.accounts.*
|
||||||
|
import android.content.Context
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.Looper
|
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.model.util.AccountUtils.ACCOUNT_USER_DATA_KEYS
|
||||||
import org.mariotaku.twidere.util.JsonSerializer
|
import org.mariotaku.twidere.util.JsonSerializer
|
||||||
import org.mariotaku.twidere.util.ParseUtils
|
import org.mariotaku.twidere.util.ParseUtils
|
||||||
|
import org.mariotaku.twidere.util.TwitterContentUtils
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.util.concurrent.Callable
|
import java.util.concurrent.Callable
|
||||||
import java.util.concurrent.Executors
|
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())
|
am.setUserData(this, ACCOUNT_USER_DATA_POSITION, position.toString())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun AccountManager.hasInvalidAccount(): Boolean {
|
fun Account.isOfficial(am: AccountManager, context: Context): Boolean {
|
||||||
for (account in AccountUtils.getAccounts(this)) {
|
val extras = getAccountExtras(am)
|
||||||
if (!isAccountValid(account)) return true
|
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
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun AccountManager.hasInvalidAccount(): Boolean {
|
||||||
|
return AccountUtils.getAccounts(this).none { isAccountValid(it) }
|
||||||
|
}
|
||||||
|
|
||||||
fun AccountManager.isAccountValid(account: Account): Boolean {
|
fun AccountManager.isAccountValid(account: Account): Boolean {
|
||||||
if (TextUtils.isEmpty(AccountDataQueue.peekAuthToken(this, account, ACCOUNT_AUTH_TOKEN_TYPE))) return false
|
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
|
if (TextUtils.isEmpty(AccountDataQueue.getUserData(this, account, ACCOUNT_USER_DATA_KEY))) return false
|
||||||
|
@ -296,7 +296,7 @@ abstract class AbsActivitiesFragment protected constructor() :
|
|||||||
override fun onGapClick(holder: GapViewHolder, position: Int) {
|
override fun onGapClick(holder: GapViewHolder, position: Int) {
|
||||||
val activity = adapter.getActivity(position)
|
val activity = adapter.getActivity(position)
|
||||||
DebugLog.v(msg = "Load activity gap $activity")
|
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
|
// Skip if item is not a status
|
||||||
if (activity.action !in Activity.Action.MENTION_ACTIONS) {
|
if (activity.action !in Activity.Action.MENTION_ACTIONS) {
|
||||||
adapter.removeGapLoadingId(ObjectId(activity.account_key, activity.id))
|
adapter.removeGapLoadingId(ObjectId(activity.account_key, activity.id))
|
||||||
|
@ -30,7 +30,7 @@ import org.mariotaku.twidere.loader.CursorSupportUsersLoader
|
|||||||
import org.mariotaku.twidere.loader.IncomingFriendshipsLoader
|
import org.mariotaku.twidere.loader.IncomingFriendshipsLoader
|
||||||
import org.mariotaku.twidere.model.UserKey
|
import org.mariotaku.twidere.model.UserKey
|
||||||
import org.mariotaku.twidere.model.event.FriendshipTaskEvent
|
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
|
import org.mariotaku.twidere.view.holder.UserViewHolder
|
||||||
|
|
||||||
class IncomingFriendshipsFragment : CursorUsersListFragment(), IUsersAdapter.RequestClickListener {
|
class IncomingFriendshipsFragment : CursorUsersListFragment(), IUsersAdapter.RequestClickListener {
|
||||||
@ -38,7 +38,7 @@ class IncomingFriendshipsFragment : CursorUsersListFragment(), IUsersAdapter.Req
|
|||||||
|
|
||||||
override fun onCreateUsersLoader(context: Context, args: Bundle,
|
override fun onCreateUsersLoader(context: Context, args: Bundle,
|
||||||
fromUser: Boolean): CursorSupportUsersLoader {
|
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)
|
val loader = IncomingFriendshipsLoader(context, accountKey, adapter.getData(), fromUser)
|
||||||
loader.cursor = nextCursor
|
loader.cursor = nextCursor
|
||||||
loader.page = nextPage
|
loader.page = nextPage
|
||||||
@ -47,14 +47,11 @@ class IncomingFriendshipsFragment : CursorUsersListFragment(), IUsersAdapter.Req
|
|||||||
|
|
||||||
override fun onCreateAdapter(context: Context): ParcelableUsersAdapter {
|
override fun onCreateAdapter(context: Context): ParcelableUsersAdapter {
|
||||||
val adapter = super.onCreateAdapter(context)
|
val adapter = super.onCreateAdapter(context)
|
||||||
val args = arguments
|
val accountKey = arguments.getParcelable<UserKey?>(EXTRA_ACCOUNT_KEY) ?: return adapter
|
||||||
val accountKey = args.getParcelable<UserKey>(EXTRA_ACCOUNT_KEY)
|
if (USER_TYPE_FANFOU_COM == accountKey.host) {
|
||||||
if (accountKey == null) {
|
adapter.requestClickListener = this
|
||||||
adapter.requestClickListener = null
|
} else if (AccountUtils.isOfficial(context, accountKey)) {
|
||||||
} else if (USER_TYPE_FANFOU_COM == accountKey.host || Utils.isOfficialCredentials(context, accountKey)) {
|
|
||||||
adapter.requestClickListener = this
|
adapter.requestClickListener = this
|
||||||
} else {
|
|
||||||
adapter.requestClickListener = null
|
|
||||||
}
|
}
|
||||||
return adapter
|
return adapter
|
||||||
}
|
}
|
||||||
|
@ -92,6 +92,7 @@ import org.mariotaku.twidere.extension.applyTheme
|
|||||||
import org.mariotaku.twidere.extension.loadProfileImage
|
import org.mariotaku.twidere.extension.loadProfileImage
|
||||||
import org.mariotaku.twidere.extension.model.applyTo
|
import org.mariotaku.twidere.extension.model.applyTo
|
||||||
import org.mariotaku.twidere.extension.model.getAccountType
|
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.model.media_type
|
||||||
import org.mariotaku.twidere.extension.view.calculateSpaceItemHeight
|
import org.mariotaku.twidere.extension.view.calculateSpaceItemHeight
|
||||||
import org.mariotaku.twidere.fragment.AbsStatusesFragment.Companion.handleActionClick
|
import org.mariotaku.twidere.fragment.AbsStatusesFragment.Companion.handleActionClick
|
||||||
@ -1004,10 +1005,7 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
|
|||||||
|
|
||||||
|
|
||||||
val lang = status.lang
|
val lang = status.lang
|
||||||
if (!Utils.isOfficialCredentials(context, account) || !CheckUtils.isValidLocale(lang)) {
|
if (CheckUtils.isValidLocale(lang) && account.isOfficial(context)) {
|
||||||
itemView.translateLabel.setText(R.string.unknown_language)
|
|
||||||
itemView.translateContainer.visibility = View.GONE
|
|
||||||
} else {
|
|
||||||
val locale = Locale(lang)
|
val locale = Locale(lang)
|
||||||
itemView.translateContainer.visibility = View.VISIBLE
|
itemView.translateContainer.visibility = View.VISIBLE
|
||||||
if (translation != null) {
|
if (translation != null) {
|
||||||
@ -1019,6 +1017,9 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
|
|||||||
locale.displayLanguage)
|
locale.displayLanguage)
|
||||||
itemView.translateResult.visibility = View.GONE
|
itemView.translateResult.visibility = View.GONE
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
itemView.translateLabel.setText(R.string.unknown_language)
|
||||||
|
itemView.translateContainer.visibility = View.GONE
|
||||||
}
|
}
|
||||||
|
|
||||||
itemView.text.setTextIsSelectable(true)
|
itemView.text.setTextIsSelectable(true)
|
||||||
@ -1108,7 +1109,7 @@ class StatusFragment : BaseFragment(), LoaderCallbacks<SingleResponse<Parcelable
|
|||||||
provider.setUseStar(useStar)
|
provider.setUseStar(useStar)
|
||||||
provider.init(itemView.menuBar, favoriteItem)
|
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.mediaPreviewLoad.setOnClickListener(this)
|
||||||
itemView.profileContainer.setOnClickListener(this)
|
itemView.profileContainer.setOnClickListener(this)
|
||||||
retweetedByView.setOnClickListener(this)
|
retweetedByView.setOnClickListener(this)
|
||||||
|
@ -40,6 +40,7 @@ import org.mariotaku.twidere.constant.SharedPreferenceConstants
|
|||||||
import org.mariotaku.twidere.constant.nameFirstKey
|
import org.mariotaku.twidere.constant.nameFirstKey
|
||||||
import org.mariotaku.twidere.model.*
|
import org.mariotaku.twidere.model.*
|
||||||
import org.mariotaku.twidere.model.event.*
|
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.ParcelableRelationshipUtils
|
||||||
import org.mariotaku.twidere.model.util.ParcelableUserListUtils
|
import org.mariotaku.twidere.model.util.ParcelableUserListUtils
|
||||||
import org.mariotaku.twidere.provider.TwidereDataStore.*
|
import org.mariotaku.twidere.provider.TwidereDataStore.*
|
||||||
@ -379,7 +380,7 @@ class AsyncTwitterWrapper(
|
|||||||
override fun onExecute(params: Any?) {
|
override fun onExecute(params: Any?) {
|
||||||
for (accountKey in accountKeys) {
|
for (accountKey in accountKeys) {
|
||||||
val microBlog = MicroBlogAPIFactory.getInstance(context, accountKey) ?: continue
|
val microBlog = MicroBlogAPIFactory.getInstance(context, accountKey) ?: continue
|
||||||
if (!Utils.isOfficialCredentials(context, accountKey)) continue
|
if (!AccountUtils.isOfficial(context, accountKey)) continue
|
||||||
microBlog.setActivitiesAboutMeUnread(cursor)
|
microBlog.setActivitiesAboutMeUnread(cursor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -962,15 +962,15 @@ object DataStoreUtils {
|
|||||||
private fun <T> getOfficialSeparatedIds(context: Context, getFromDatabase: (Array<UserKey?>, Boolean) -> T,
|
private fun <T> getOfficialSeparatedIds(context: Context, getFromDatabase: (Array<UserKey?>, Boolean) -> T,
|
||||||
mergeResult: (T, T) -> T, accountKeys: Array<UserKey?>): T {
|
mergeResult: (T, T) -> T, accountKeys: Array<UserKey?>): T {
|
||||||
val officialKeys = Array(accountKeys.size) {
|
val officialKeys = Array(accountKeys.size) {
|
||||||
val key = accountKeys[it]
|
val key = accountKeys[it] ?: return@Array null
|
||||||
if (Utils.isOfficialCredentials(context, key)) {
|
if (AccountUtils.isOfficial(context, key)) {
|
||||||
return@Array key
|
return@Array key
|
||||||
}
|
}
|
||||||
return@Array null
|
return@Array null
|
||||||
}
|
}
|
||||||
val notOfficialKeys = Array(accountKeys.size) {
|
val notOfficialKeys = Array(accountKeys.size) {
|
||||||
val key = accountKeys[it]
|
val key = accountKeys[it] ?: return@Array null
|
||||||
if (Utils.isOfficialCredentials(context, key)) {
|
if (AccountUtils.isOfficial(context, key)) {
|
||||||
return@Array null
|
return@Array null
|
||||||
}
|
}
|
||||||
return@Array key
|
return@Array key
|
||||||
|
@ -50,6 +50,7 @@ import org.mariotaku.twidere.activity.ColorPickerDialogActivity
|
|||||||
import org.mariotaku.twidere.constant.favoriteConfirmationKey
|
import org.mariotaku.twidere.constant.favoriteConfirmationKey
|
||||||
import org.mariotaku.twidere.constant.iWantMyStarsBackKey
|
import org.mariotaku.twidere.constant.iWantMyStarsBackKey
|
||||||
import org.mariotaku.twidere.constant.nameFirstKey
|
import org.mariotaku.twidere.constant.nameFirstKey
|
||||||
|
import org.mariotaku.twidere.extension.model.isOfficial
|
||||||
import org.mariotaku.twidere.fragment.*
|
import org.mariotaku.twidere.fragment.*
|
||||||
import org.mariotaku.twidere.fragment.content.FavoriteConfirmDialogFragment
|
import org.mariotaku.twidere.fragment.content.FavoriteConfirmDialogFragment
|
||||||
import org.mariotaku.twidere.fragment.content.RetweetQuoteDialogFragment
|
import org.mariotaku.twidere.fragment.content.RetweetQuoteDialogFragment
|
||||||
@ -171,7 +172,7 @@ object MenuUtils {
|
|||||||
}
|
}
|
||||||
val translate = menu.findItem(R.id.translate)
|
val translate = menu.findItem(R.id.translate)
|
||||||
if (translate != null) {
|
if (translate != null) {
|
||||||
val isOfficialKey = Utils.isOfficialCredentials(context, details)
|
val isOfficialKey = details.isOfficial(context)
|
||||||
menu.setItemAvailability(R.id.translate, isOfficialKey)
|
menu.setItemAvailability(R.id.translate, isOfficialKey)
|
||||||
}
|
}
|
||||||
menu.removeGroup(MENU_GROUP_STATUS_EXTENSION)
|
menu.removeGroup(MENU_GROUP_STATUS_EXTENSION)
|
||||||
|
@ -208,8 +208,7 @@ object ThemeUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun wrapToolbarMenuIcon(view: ActionMenuView?, itemColor: Int, popupItemColor: Int, vararg excludeGroups: Int) {
|
fun wrapToolbarMenuIcon(view: ActionMenuView, itemColor: Int, popupItemColor: Int, vararg excludeGroups: Int) {
|
||||||
if (view == null) return
|
|
||||||
val menu = view.menu
|
val menu = view.menu
|
||||||
var k = 0
|
var k = 0
|
||||||
for (i in 0 until menu.size()) {
|
for (i in 0 until menu.size()) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user