diff --git a/twidere/src/main/java/org/mariotaku/twidere/model/util/AccountUtils.java b/twidere/src/main/java/org/mariotaku/twidere/model/util/AccountUtils.java index b15cdddcf..9b764f232 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/model/util/AccountUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/model/util/AccountUtils.java @@ -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; } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java index 604ba1f14..85e72b440 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java @@ -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; diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/ComposeActivity.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/ComposeActivity.kt index 3adba1cd7..f9bde0027 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/ComposeActivity.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/ComposeActivity.kt @@ -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 { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/AccountExtensions.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/AccountExtensions.kt index 1a862ce4f..5a0897608 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/AccountExtensions.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/extension/model/AccountExtensions.kt @@ -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 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 b811b8b2c..54d7d7d02 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsActivitiesFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AbsActivitiesFragment.kt @@ -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)) diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/IncomingFriendshipsFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/IncomingFriendshipsFragment.kt index fb8af60f2..46ad312b9 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/IncomingFriendshipsFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/IncomingFriendshipsFragment.kt @@ -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(EXTRA_ACCOUNT_KEY) + val accountKey = args.getParcelable(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(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(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 } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/StatusFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/StatusFragment.kt index e2a26bab7..b0b1a7157 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/StatusFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/StatusFragment.kt @@ -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 getOfficialSeparatedIds(context: Context, getFromDatabase: (Array, Boolean) -> T, mergeResult: (T, T) -> T, accountKeys: Array): 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 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 effc3e372..71fc4c1ca 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/util/MenuUtils.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/MenuUtils.kt @@ -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) diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/ThemeUtils.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/ThemeUtils.kt index 505f7228f..854e7b021 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/util/ThemeUtils.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/ThemeUtils.kt @@ -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()) {