added mastodon relationship operations

This commit is contained in:
Mariotaku Lee 2017-04-22 15:18:44 +08:00
parent ca382e499a
commit 2afa4375e9
No known key found for this signature in database
GPG Key ID: 15C10F89D7C33535
20 changed files with 378 additions and 114 deletions

View File

@ -81,7 +81,8 @@ public interface AccountsResources {
Relationship unmuteUser(@Path("id") String id) throws MicroBlogException;
@GET("/v1/accounts/relationships")
LinkHeaderList<Relationship> getRelationships(@Path("id") String id) throws MicroBlogException;
LinkHeaderList<Relationship> getRelationships(@Query(value = "id", arrayDelimiter = ',')
String[] id) throws MicroBlogException;
@GET("/v1/accounts/search")
LinkHeaderList<Account> searchAccounts(@Query("q") String query, @Nullable @Query Paging paging) throws MicroBlogException;

View File

@ -18,10 +18,14 @@
package org.mariotaku.microblog.library.mastodon.api;
import org.mariotaku.microblog.library.MicroBlogException;
import org.mariotaku.microblog.library.mastodon.model.Account;
import org.mariotaku.microblog.library.mastodon.model.LinkHeaderList;
import org.mariotaku.microblog.library.twitter.model.Paging;
import org.mariotaku.microblog.library.twitter.model.ResponseCode;
import org.mariotaku.restfu.annotation.method.GET;
import org.mariotaku.restfu.annotation.method.POST;
import org.mariotaku.restfu.annotation.param.Path;
import org.mariotaku.restfu.annotation.param.Query;
/**
@ -29,5 +33,12 @@ import org.mariotaku.restfu.annotation.param.Query;
*/
public interface FollowRequestsResources {
@GET("/v1/follow_requests")
LinkHeaderList<Account> getFollowRequests(@Query Paging paging);
LinkHeaderList<Account> getFollowRequests(@Query Paging paging) throws MicroBlogException;
@POST("/v1/follow_requests/{id}/authorize")
ResponseCode authorizeFollowRequest(@Path("id") String id) throws MicroBlogException;
@POST("/v1/follow_requests/{id}/reject")
ResponseCode rejectFollowRequest(@Path("id") String id) throws MicroBlogException;
}

View File

@ -18,9 +18,22 @@
package org.mariotaku.microblog.library.mastodon.api;
import org.mariotaku.microblog.library.mastodon.model.Account;
import org.mariotaku.restfu.annotation.method.POST;
import org.mariotaku.restfu.annotation.param.Param;
/**
* Created by mariotaku on 2017/4/17.
*/
public interface FollowsResources {
/**
* Following a remote user
*
* @param uri {@code username@domain} of the person you want to follow
* @return The local representation of the followed account, as an {@link Account}.
*/
@POST("/v1/follows")
Account followRemoteUser(@Param("uri") String uri);
}

View File

@ -19,14 +19,3 @@
package org.mariotaku.twidere.extension.model
import org.mariotaku.microblog.library.twitter.model.UserList
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.extension.model.api.microblog.toParcelable
/**
* Created by mariotaku on 2017/4/7.
*/
fun Array<UserList>.toParcelables(accountKey: UserKey, profileImageSize: String = "normal") = Array(size) {
this[it].toParcelable(accountKey, profileImageSize = profileImageSize)
}

View File

@ -0,0 +1,38 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2017 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.extension.model.api.mastodon
import org.mariotaku.microblog.library.mastodon.model.Relationship
import org.mariotaku.twidere.model.ParcelableRelationship
import org.mariotaku.twidere.model.UserKey
fun Relationship.toParcelable(accountKey: UserKey, userKey: UserKey, filtering: Boolean = false):
ParcelableRelationship {
val obj = ParcelableRelationship()
obj.account_key = accountKey
obj.user_key = userKey
obj.following = isFollowing
obj.followed_by = isFollowedBy
obj.blocking = isBlocking
obj.muting = isMuting
obj.filtering = filtering
return obj
}

View File

@ -22,7 +22,6 @@ package org.mariotaku.twidere.extension.model.api.microblog
import org.mariotaku.ktextension.mapToArray
import org.mariotaku.microblog.library.twitter.model.Activity
import org.mariotaku.twidere.extension.model.api.toParcelable
import org.mariotaku.twidere.extension.model.toParcelables
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableActivity
import org.mariotaku.twidere.model.UserKey
@ -54,16 +53,18 @@ fun Activity.toParcelable(accountKey: UserKey, accountType: String, isGap: Boole
result.target_users = targetUsers?.mapToArray {
it.toParcelable(accountKey, accountType, profileImageSize = profileImageSize)
}
result.target_user_lists = targetUserLists?.toParcelables(accountKey,
profileImageSize)
result.target_user_lists = targetUserLists?.mapToArray {
it.toParcelable(accountKey, profileImageSize = profileImageSize)
}
result.target_statuses = targetStatuses?.mapToArray {
it.toParcelable(accountKey, accountType, profileImageSize)
}
result.target_object_statuses = targetObjectStatuses?.mapToArray {
it.toParcelable(accountKey, accountType, profileImageSize)
}
result.target_object_user_lists = targetObjectUserLists?.toParcelables(accountKey,
profileImageSize)
result.target_object_user_lists = targetObjectUserLists?.mapToArray {
it.toParcelable(accountKey, profileImageSize = profileImageSize)
}
result.target_object_users = targetObjectUsers?.mapToArray {
it.toParcelable(accountKey, accountType, profileImageSize = profileImageSize)
}

View File

@ -0,0 +1,42 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2017 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.extension.model.api.microblog
import org.mariotaku.microblog.library.twitter.model.Relationship
import org.mariotaku.twidere.model.ParcelableRelationship
import org.mariotaku.twidere.model.UserKey
fun Relationship.toParcelable(accountKey: UserKey, userKey: UserKey, filtering: Boolean = false):
ParcelableRelationship {
val obj = ParcelableRelationship()
obj.account_key = accountKey
obj.user_key = userKey
obj.following = isSourceFollowingTarget
obj.followed_by = isSourceFollowedByTarget
obj.blocking = isSourceBlockingTarget
obj.blocked_by = isSourceBlockedByTarget
obj.muting = isSourceMutingTarget
obj.retweet_enabled = isSourceWantRetweetsFromTarget
obj.notifications_enabled = isSourceNotificationsEnabledForTarget
obj.can_dm = canSourceDMTarget()
obj.filtering = filtering
return obj
}

View File

@ -19,6 +19,7 @@
package org.mariotaku.twidere.fragment
import android.accounts.AccountManager
import android.content.Context
import android.os.Bundle
import android.support.v4.app.LoaderManager.LoaderCallbacks
@ -38,9 +39,11 @@ import org.mariotaku.twidere.adapter.decorator.ExtendedDividerItemDecoration
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter
import org.mariotaku.twidere.adapter.iface.IUsersAdapter
import org.mariotaku.twidere.adapter.iface.IUsersAdapter.UserClickListener
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.annotation.Referral
import org.mariotaku.twidere.constant.IntentConstants.*
import org.mariotaku.twidere.constant.newDocumentApiKey
import org.mariotaku.twidere.extension.model.getAccountType
import org.mariotaku.twidere.loader.iface.IExtendedLoader
import org.mariotaku.twidere.loader.iface.IPaginationLoader
import org.mariotaku.twidere.loader.users.AbsRequestUsersLoader
@ -49,6 +52,7 @@ import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.event.FriendshipTaskEvent
import org.mariotaku.twidere.model.pagination.Pagination
import org.mariotaku.twidere.model.util.AccountUtils
import org.mariotaku.twidere.util.IntentUtils
import org.mariotaku.twidere.util.KeyboardShortcutsHandler
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback
@ -172,7 +176,18 @@ abstract class ParcelableUsersFragment : AbsContentListRecyclerViewFragment<Parc
val adapter = ParcelableUsersAdapter(context, Glide.with(this))
adapter.simpleLayout = simpleLayout
adapter.showFollow = showFollow
adapter.friendshipClickListener = this
val accountType = arguments.getParcelable<UserKey?>(EXTRA_ACCOUNT_KEY)?.let { key ->
val am = AccountManager.get(context)
return@let AccountUtils.findByAccountKey(am, key)?.getAccountType(am)
}
when (accountType) {
AccountType.TWITTER, AccountType.FANFOU, AccountType.STATUSNET -> {
adapter.friendshipClickListener = this
}
else -> {
adapter.friendshipClickListener = null
}
}
return adapter
}

View File

@ -91,6 +91,7 @@ import org.mariotaku.ktextension.*
import org.mariotaku.library.objectcursor.ObjectCursor
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.mastodon.Mastodon
import org.mariotaku.microblog.library.twitter.model.FriendshipUpdate
import org.mariotaku.microblog.library.twitter.model.Paging
import org.mariotaku.microblog.library.twitter.model.UserList
@ -108,13 +109,10 @@ import org.mariotaku.twidere.annotation.Referral
import org.mariotaku.twidere.constant.*
import org.mariotaku.twidere.constant.KeyboardShortcutConstants.*
import org.mariotaku.twidere.extension.*
import org.mariotaku.twidere.extension.model.*
import org.mariotaku.twidere.extension.model.api.mastodon.toParcelable
import org.mariotaku.twidere.extension.model.api.microblog.toParcelable
import org.mariotaku.twidere.extension.model.applyTo
import org.mariotaku.twidere.extension.model.getBestProfileBanner
import org.mariotaku.twidere.extension.model.originalProfileImage
import org.mariotaku.twidere.extension.model.urlPreferred
import org.mariotaku.twidere.fragment.AbsStatusesFragment.StatusesFragmentDelegate
import org.mariotaku.twidere.fragment.statuses.UserTimelineFragment.UserTimelineFragmentDelegate
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback
import org.mariotaku.twidere.fragment.iface.IToolBarSupportFragment
import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface
@ -122,6 +120,7 @@ import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback
import org.mariotaku.twidere.fragment.statuses.UserFavoritesFragment
import org.mariotaku.twidere.fragment.statuses.UserMediaTimelineFragment
import org.mariotaku.twidere.fragment.statuses.UserTimelineFragment
import org.mariotaku.twidere.fragment.statuses.UserTimelineFragment.UserTimelineFragmentDelegate
import org.mariotaku.twidere.graphic.ActionBarColorDrawable
import org.mariotaku.twidere.graphic.ActionIconDrawable
import org.mariotaku.twidere.loader.ParcelableUserLoader
@ -130,7 +129,10 @@ import org.mariotaku.twidere.model.event.FriendshipTaskEvent
import org.mariotaku.twidere.model.event.FriendshipUpdatedEvent
import org.mariotaku.twidere.model.event.ProfileUpdatedEvent
import org.mariotaku.twidere.model.event.TaskStateChangedEvent
import org.mariotaku.twidere.model.util.*
import org.mariotaku.twidere.model.util.AccountUtils
import org.mariotaku.twidere.model.util.ParcelableMediaUtils
import org.mariotaku.twidere.model.util.ParcelableRelationshipUtils
import org.mariotaku.twidere.model.util.UserKeyUtils
import org.mariotaku.twidere.provider.TwidereDataStore.CachedRelationships
import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers
import org.mariotaku.twidere.text.TwidereURLSpan
@ -1671,37 +1673,47 @@ class UserFragment : BaseFragment(), OnClickListener, OnLinkClickListener,
override fun loadInBackground(): SingleResponse<ParcelableRelationship> {
if (accountKey == null || user == null) {
return SingleResponse.Companion.getInstance<ParcelableRelationship>(MicroBlogException("Null parameters"))
return SingleResponse(MicroBlogException("Null parameters"))
}
val userKey = user.key
val isFiltering = DataStoreUtils.isFilteringUser(context, userKey)
if (accountKey == user.key) {
return SingleResponse.getInstance(ParcelableRelationshipUtils.create(accountKey, userKey,
return SingleResponse(ParcelableRelationshipUtils.create(accountKey, userKey,
null, isFiltering))
}
val details = AccountUtils.getAccountDetails(AccountManager.get(context),
accountKey, true) ?: return SingleResponse.getInstance<ParcelableRelationship>(MicroBlogException("No Account"))
accountKey, true) ?: return SingleResponse(MicroBlogException("No Account"))
if (details.type == AccountType.TWITTER) {
if (!UserKeyUtils.isSameHost(accountKey, user.key)) {
return SingleResponse.getInstance(ParcelableRelationshipUtils.create(user, isFiltering))
}
}
val twitter = MicroBlogAPIFactory.getInstance(context, accountKey) ?: return SingleResponse.Companion.getInstance<ParcelableRelationship>(MicroBlogException("No Account"))
try {
val relationship = twitter.showFriendship(user.key.id)
if (relationship.isSourceBlockingTarget || relationship.isSourceBlockedByTarget) {
val data = when (details.type) {
AccountType.MASTODON -> {
val mastodon = details.newMicroBlogInstance(context, Mastodon::class.java)
mastodon.getRelationships(arrayOf(userKey.id))?.firstOrNull()
?.toParcelable(accountKey, userKey, isFiltering)
?: throw MicroBlogException("No relationship")
}
else -> {
val microBlog = details.newMicroBlogInstance(context, MicroBlog::class.java)
microBlog.showFriendship(user.key.id).toParcelable(accountKey, userKey,
isFiltering)
}
}
if (data.blocking || data.blocked_by) {
Utils.setLastSeen(context, userKey, -1)
} else {
Utils.setLastSeen(context, userKey, System.currentTimeMillis())
}
val data = ParcelableRelationshipUtils.create(accountKey, userKey, relationship,
isFiltering)
val resolver = context.contentResolver
val values = ObjectCursor.valuesCreatorFrom(ParcelableRelationship::class.java).create(data)
resolver.insert(CachedRelationships.CONTENT_URI, values)
return SingleResponse.getInstance(data)
return SingleResponse(data)
} catch (e: MicroBlogException) {
return SingleResponse.Companion.getInstance<ParcelableRelationship>(e)
return SingleResponse(e)
}
}

View File

@ -3,14 +3,10 @@ package org.mariotaku.twidere.task
import android.accounts.AccountManager
import android.content.Context
import android.widget.Toast
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.twitter.model.User
import org.mariotaku.twidere.R
import org.mariotaku.twidere.exception.AccountNotFoundException
import org.mariotaku.twidere.extension.getErrorMessage
import org.mariotaku.twidere.extension.model.api.toParcelable
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.UserKey
@ -26,7 +22,7 @@ abstract class AbsFriendshipOperationTask(
) : ExceptionHandlingAbstractTask<AbsFriendshipOperationTask.Arguments, ParcelableUser,
MicroBlogException, Any?>(context) {
private val profileImageSize = context.getString(R.string.profile_image_size)
protected val profileImageSize: String = context.getString(R.string.profile_image_size)
override val exceptionClass = MicroBlogException::class.java
override fun beforeExecute() {
@ -39,8 +35,7 @@ abstract class AbsFriendshipOperationTask(
override fun afterExecute(callback: Any?, result: ParcelableUser?, exception: MicroBlogException?) {
microBlogWrapper.removeUpdatingRelationshipId(params.accountKey, params.userKey)
val event = FriendshipTaskEvent(action, params.accountKey,
params.userKey)
val event = FriendshipTaskEvent(action, params.accountKey, params.userKey)
event.isFinished = true
if (result != null) {
val user = result
@ -57,31 +52,27 @@ abstract class AbsFriendshipOperationTask(
val am = AccountManager.get(context)
val details = AccountUtils.getAccountDetails(am, params.accountKey, true)
?: throw AccountNotFoundException()
val twitter = details.newMicroBlogInstance(context, cls = MicroBlog::class.java)
val user = perform(twitter, details, params)
val parcelableUser = user.toParcelable(details, profileImageSize = profileImageSize)
succeededWorker(twitter, details, params, parcelableUser)
return parcelableUser
val user = perform(details, params)
succeededWorker(details, params, user)
return user
}
@Throws(MicroBlogException::class)
protected abstract fun perform(twitter: MicroBlog,
details: AccountDetails,
args: Arguments): User
protected abstract fun succeededWorker(twitter: MicroBlog, details: AccountDetails,
args: Arguments, user: ParcelableUser)
protected abstract fun showSucceededMessage(params: Arguments, user: ParcelableUser)
fun setup(accountKey: UserKey, userKey: UserKey, screenName: String? = null) {
params = Arguments(accountKey, userKey, screenName)
}
protected open fun showErrorMessage(params: Arguments, exception: Exception) {
Toast.makeText(context, exception.getErrorMessage(context), Toast.LENGTH_SHORT).show()
}
fun setup(accountKey: UserKey, userKey: UserKey) {
params = Arguments(accountKey, userKey)
}
@Throws(MicroBlogException::class)
protected abstract fun perform(details: AccountDetails, args: Arguments): ParcelableUser
class Arguments(val accountKey: UserKey, val userKey: UserKey)
protected abstract fun succeededWorker(details: AccountDetails, args: Arguments,
user: ParcelableUser)
protected abstract fun showSucceededMessage(params: Arguments, user: ParcelableUser)
class Arguments(val accountKey: UserKey, val userKey: UserKey, val screenName: String?)
}

View File

@ -4,10 +4,13 @@ import android.content.Context
import android.widget.Toast
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.twitter.model.User
import org.mariotaku.microblog.library.mastodon.Mastodon
import org.mariotaku.twidere.R
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.extension.model.api.mastodon.toParcelable
import org.mariotaku.twidere.extension.model.api.toParcelable
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.event.FriendshipTaskEvent
@ -19,16 +22,30 @@ import org.mariotaku.twidere.util.Utils
class AcceptFriendshipTask(context: Context) : AbsFriendshipOperationTask(context, FriendshipTaskEvent.Action.ACCEPT) {
@Throws(MicroBlogException::class)
override fun perform(twitter: MicroBlog, details: AccountDetails, args: AbsFriendshipOperationTask.Arguments): User {
override fun perform(details: AccountDetails, args: Arguments): ParcelableUser {
when (details.type) {
AccountType.FANFOU -> {
return twitter.acceptFanfouFriendship(args.userKey.id)
val fanfou = details.newMicroBlogInstance(context, MicroBlog::class.java)
return fanfou.acceptFanfouFriendship(args.userKey.id).toParcelable(details,
profileImageSize = profileImageSize)
}
AccountType.MASTODON -> {
val mastodon = details.newMicroBlogInstance(context, Mastodon::class.java)
if (details.key.host != args.userKey.host) {
throw MicroBlogException("Authorize remote follow request is not supported yet")
}
mastodon.authorizeFollowRequest(args.userKey.id)
return mastodon.getAccount(args.userKey.id).toParcelable(details)
}
else -> {
val twitter = details.newMicroBlogInstance(context, MicroBlog::class.java)
return twitter.acceptFriendship(args.accountKey.id).toParcelable(details,
profileImageSize = profileImageSize)
}
}
return twitter.acceptFriendship(args.userKey.id)
}
override fun succeededWorker(twitter: MicroBlog, details: AccountDetails, args: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
override fun succeededWorker(details: AccountDetails, args: Arguments, user: ParcelableUser) {
Utils.setLastSeen(context, user.key, System.currentTimeMillis())
}

View File

@ -4,11 +4,15 @@ import android.content.Context
import android.widget.Toast
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.twitter.model.User
import org.mariotaku.microblog.library.mastodon.Mastodon
import org.mariotaku.twidere.Constants
import org.mariotaku.twidere.R
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.exception.APINotSupportedException
import org.mariotaku.twidere.extension.model.api.mastodon.toParcelable
import org.mariotaku.twidere.extension.model.api.toParcelable
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.event.FriendshipTaskEvent
@ -20,16 +24,33 @@ import org.mariotaku.twidere.util.Utils
class CreateFriendshipTask(context: Context) : AbsFriendshipOperationTask(context, FriendshipTaskEvent.Action.FOLLOW), Constants {
@Throws(MicroBlogException::class)
override fun perform(twitter: MicroBlog, details: AccountDetails, args: AbsFriendshipOperationTask.Arguments): User {
override fun perform(details: AccountDetails, args: Arguments): ParcelableUser {
when (details.type) {
AccountType.FANFOU -> {
return twitter.createFanfouFriendship(args.userKey.id)
val fanfou = details.newMicroBlogInstance(context, MicroBlog::class.java)
return fanfou.createFanfouFriendship(args.userKey.id).toParcelable(details,
profileImageSize = profileImageSize)
}
AccountType.MASTODON -> {
val mastodon = details.newMicroBlogInstance(context, Mastodon::class.java)
if (details.key.host != args.userKey.host) {
if (args.screenName == null)
throw MicroBlogException("Screen name required to follow remote user")
return mastodon.followRemoteUser("${args.screenName}@${args.userKey.host}")
.toParcelable(details)
}
mastodon.followUser(args.userKey.id)
return mastodon.getAccount(args.userKey.id).toParcelable(details)
}
else -> {
val twitter = details.newMicroBlogInstance(context, MicroBlog::class.java)
return twitter.createFriendship(args.accountKey.id).toParcelable(details,
profileImageSize = profileImageSize)
}
}
return twitter.createFriendship(args.userKey.id)
}
override fun succeededWorker(twitter: MicroBlog, details: AccountDetails, args: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
override fun succeededWorker(details: AccountDetails, args: Arguments, user: ParcelableUser) {
user.is_following = true
Utils.setLastSeen(context, user.key, System.currentTimeMillis())
}

View File

@ -5,12 +5,15 @@ import android.content.Context
import android.widget.Toast
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.twitter.model.User
import org.mariotaku.microblog.library.mastodon.Mastodon
import org.mariotaku.sqliteqb.library.Expression
import org.mariotaku.twidere.Constants
import org.mariotaku.twidere.R
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.extension.model.api.mastodon.toParcelable
import org.mariotaku.twidere.extension.model.api.toParcelable
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.event.FriendshipTaskEvent
@ -27,18 +30,30 @@ open class CreateUserBlockTask(
) : AbsFriendshipOperationTask(context, FriendshipTaskEvent.Action.BLOCK), Constants {
@Throws(MicroBlogException::class)
override fun perform(twitter: MicroBlog, details: AccountDetails,
args: Arguments): User {
override fun perform(details: AccountDetails, args: Arguments): ParcelableUser {
when (details.type) {
AccountType.MASTODON -> {
val mastodon = details.newMicroBlogInstance(context, Mastodon::class.java)
if (details.key.host != args.userKey.host) {
throw MicroBlogException("Block remote user is not supported yet")
}
mastodon.blockUser(args.userKey.id)
return mastodon.getAccount(args.userKey.id).toParcelable(details)
}
AccountType.FANFOU -> {
return twitter.createFanfouBlock(args.userKey.id)
val fanfou = details.newMicroBlogInstance(context, MicroBlog::class.java)
return fanfou.createFanfouBlock(args.accountKey.id).toParcelable(details,
profileImageSize = profileImageSize)
}
else -> {
val twitter = details.newMicroBlogInstance(context, MicroBlog::class.java)
return twitter.createBlock(args.accountKey.id).toParcelable(details,
profileImageSize = profileImageSize)
}
}
return twitter.createBlock(args.userKey.id)
}
override fun succeededWorker(twitter: MicroBlog, details: AccountDetails, args: Arguments,
user: ParcelableUser) {
override fun succeededWorker(details: AccountDetails, args: Arguments, user: ParcelableUser) {
val resolver = context.contentResolver
Utils.setLastSeen(context, args.userKey, -1)
for (uri in DataStoreUtils.STATUSES_URIS) {

View File

@ -5,10 +5,15 @@ import android.content.Context
import android.widget.Toast
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.twitter.model.User
import org.mariotaku.microblog.library.mastodon.Mastodon
import org.mariotaku.sqliteqb.library.Expression
import org.mariotaku.twidere.R
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.exception.APINotSupportedException
import org.mariotaku.twidere.extension.model.api.mastodon.toParcelable
import org.mariotaku.twidere.extension.model.api.toParcelable
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.event.FriendshipTaskEvent
@ -25,14 +30,26 @@ class CreateUserMuteTask(
) : AbsFriendshipOperationTask(context, FriendshipTaskEvent.Action.MUTE) {
@Throws(MicroBlogException::class)
override fun perform(twitter: MicroBlog, details: AccountDetails,
args: AbsFriendshipOperationTask.Arguments): User {
return twitter.createMute(args.userKey.id)
override fun perform(details: AccountDetails, args: Arguments): ParcelableUser {
when (details.type) {
AccountType.TWITTER -> {
val twitter = details.newMicroBlogInstance(context, MicroBlog::class.java)
return twitter.createMute(args.accountKey.id).toParcelable(details,
profileImageSize = profileImageSize)
}
AccountType.MASTODON -> {
val mastodon = details.newMicroBlogInstance(context, Mastodon::class.java)
if (details.key.host != args.userKey.host) {
throw MicroBlogException("Mute remote user is not supported yet")
}
mastodon.muteUser(args.userKey.id)
return mastodon.getAccount(args.userKey.id).toParcelable(details)
}
else -> throw APINotSupportedException(details.type)
}
}
override fun succeededWorker(twitter: MicroBlog,
details: AccountDetails,
args: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
override fun succeededWorker(details: AccountDetails, args: Arguments, user: ParcelableUser) {
val resolver = context.contentResolver
Utils.setLastSeen(context, args.userKey, -1)
for (uri in DataStoreUtils.STATUSES_URIS) {

View File

@ -4,10 +4,13 @@ import android.content.Context
import android.widget.Toast
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.twitter.model.User
import org.mariotaku.microblog.library.mastodon.Mastodon
import org.mariotaku.twidere.R
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.extension.model.api.mastodon.toParcelable
import org.mariotaku.twidere.extension.model.api.toParcelable
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.event.FriendshipTaskEvent
@ -19,16 +22,30 @@ import org.mariotaku.twidere.util.Utils
class DenyFriendshipTask(context: Context) : AbsFriendshipOperationTask(context, FriendshipTaskEvent.Action.DENY) {
@Throws(MicroBlogException::class)
override fun perform(twitter: MicroBlog, details: AccountDetails, args: AbsFriendshipOperationTask.Arguments): User {
override fun perform(details: AccountDetails, args: Arguments): ParcelableUser {
when (details.type) {
AccountType.FANFOU -> {
return twitter.denyFanfouFriendship(args.userKey.id)
val fanfou = details.newMicroBlogInstance(context, MicroBlog::class.java)
return fanfou.denyFanfouFriendship(args.userKey.id).toParcelable(details,
profileImageSize = profileImageSize)
}
AccountType.MASTODON -> {
val mastodon = details.newMicroBlogInstance(context, Mastodon::class.java)
if (details.key.host != args.userKey.host) {
throw MicroBlogException("Reject remote follow request is not supported yet")
}
mastodon.rejectFollowRequest(args.userKey.id)
return mastodon.getAccount(args.userKey.id).toParcelable(details)
}
else -> {
val twitter = details.newMicroBlogInstance(context, MicroBlog::class.java)
return twitter.denyFriendship(args.accountKey.id).toParcelable(details,
profileImageSize = profileImageSize)
}
}
return twitter.denyFriendship(args.userKey.id)
}
override fun succeededWorker(twitter: MicroBlog, details: AccountDetails, args: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
override fun succeededWorker(details: AccountDetails, args: Arguments, user: ParcelableUser) {
Utils.setLastSeen(context, user.key, -1)
}

View File

@ -4,11 +4,14 @@ import android.content.Context
import android.widget.Toast
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.twitter.model.User
import org.mariotaku.microblog.library.mastodon.Mastodon
import org.mariotaku.sqliteqb.library.Expression
import org.mariotaku.twidere.R
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.extension.model.api.mastodon.toParcelable
import org.mariotaku.twidere.extension.model.api.toParcelable
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.event.FriendshipTaskEvent
@ -21,16 +24,30 @@ import org.mariotaku.twidere.util.Utils
class DestroyFriendshipTask(context: Context) : AbsFriendshipOperationTask(context, FriendshipTaskEvent.Action.UNFOLLOW) {
@Throws(MicroBlogException::class)
override fun perform(twitter: MicroBlog, details: AccountDetails, args: AbsFriendshipOperationTask.Arguments): User {
override fun perform(details: AccountDetails, args: Arguments): ParcelableUser {
when (details.type) {
AccountType.FANFOU -> {
return twitter.destroyFanfouFriendship(args.userKey.id)
val fanfou = details.newMicroBlogInstance(context, MicroBlog::class.java)
return fanfou.destroyFanfouFriendship(args.userKey.id).toParcelable(details,
profileImageSize = profileImageSize)
}
AccountType.MASTODON -> {
val mastodon = details.newMicroBlogInstance(context, Mastodon::class.java)
if (details.key.host != args.userKey.host) {
throw MicroBlogException("Unfollow remote user is not supported yet")
}
mastodon.unfollowUser(args.userKey.id)
return mastodon.getAccount(args.userKey.id).toParcelable(details)
}
else -> {
val twitter = details.newMicroBlogInstance(context, MicroBlog::class.java)
return twitter.destroyFriendship(args.accountKey.id).toParcelable(details,
profileImageSize = profileImageSize)
}
}
return twitter.destroyFriendship(args.userKey.id)
}
override fun succeededWorker(twitter: MicroBlog, details: AccountDetails, args: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
override fun succeededWorker(details: AccountDetails, args: Arguments, user: ParcelableUser) {
user.is_following = false
Utils.setLastSeen(context, user.key, -1)
val where = Expression.and(Expression.equalsArgs(Statuses.ACCOUNT_KEY),

View File

@ -5,10 +5,13 @@ import android.content.Context
import android.widget.Toast
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.twitter.model.User
import org.mariotaku.microblog.library.mastodon.Mastodon
import org.mariotaku.twidere.R
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.extension.model.api.mastodon.toParcelable
import org.mariotaku.twidere.extension.model.api.toParcelable
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.event.FriendshipTaskEvent
@ -20,19 +23,32 @@ import org.mariotaku.twidere.provider.TwidereDataStore.CachedRelationships
class DestroyUserBlockTask(context: Context) : AbsFriendshipOperationTask(context, FriendshipTaskEvent.Action.UNBLOCK) {
@Throws(MicroBlogException::class)
override fun perform(twitter: MicroBlog, details: AccountDetails,
args: AbsFriendshipOperationTask.Arguments): User {
override fun perform(details: AccountDetails, args: Arguments): ParcelableUser {
when (details.type) {
AccountType.MASTODON -> {
val mastodon = details.newMicroBlogInstance(context, Mastodon::class.java)
if (details.key.host != args.userKey.host) {
throw MicroBlogException("Unblock remote user is not supported yet")
}
mastodon.unblockUser(args.userKey.id)
return mastodon.getAccount(args.userKey.id).toParcelable(details)
}
AccountType.FANFOU -> {
return twitter.destroyFanfouBlock(args.userKey.id)
val fanfou = details.newMicroBlogInstance(context, MicroBlog::class.java)
return fanfou.destroyFanfouBlock(args.accountKey.id).toParcelable(details,
profileImageSize = profileImageSize)
}
else -> {
val twitter = details.newMicroBlogInstance(context, MicroBlog::class.java)
return twitter.destroyBlock(args.accountKey.id).toParcelable(details,
profileImageSize = profileImageSize)
}
}
return twitter.destroyBlock(args.userKey.id)
}
override fun succeededWorker(twitter: MicroBlog,
details: AccountDetails,
args: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
override fun succeededWorker(details: AccountDetails,
args: Arguments,
user: ParcelableUser) {
val resolver = context.contentResolver
// I bet you don't want to see this user in your auto complete list.
val values = ContentValues()

View File

@ -5,9 +5,14 @@ import android.content.Context
import android.widget.Toast
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.twitter.model.User
import org.mariotaku.microblog.library.mastodon.Mastodon
import org.mariotaku.twidere.R
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.exception.APINotSupportedException
import org.mariotaku.twidere.extension.model.api.mastodon.toParcelable
import org.mariotaku.twidere.extension.model.api.toParcelable
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.event.FriendshipTaskEvent
@ -19,14 +24,28 @@ import org.mariotaku.twidere.provider.TwidereDataStore.CachedRelationships
class DestroyUserMuteTask(context: Context) : AbsFriendshipOperationTask(context, FriendshipTaskEvent.Action.UNMUTE) {
@Throws(MicroBlogException::class)
override fun perform(twitter: MicroBlog, details: AccountDetails,
args: AbsFriendshipOperationTask.Arguments): User {
return twitter.destroyMute(args.userKey.id)
override fun perform(details: AccountDetails, args: Arguments): ParcelableUser {
when (details.type) {
AccountType.TWITTER -> {
val twitter = details.newMicroBlogInstance(context, MicroBlog::class.java)
return twitter.destroyMute(args.accountKey.id).toParcelable(details,
profileImageSize = profileImageSize)
}
AccountType.MASTODON -> {
val mastodon = details.newMicroBlogInstance(context, Mastodon::class.java)
if (details.key.host != args.userKey.host) {
throw MicroBlogException("Unmute remote user is not supported yet")
}
mastodon.unmuteUser(args.userKey.id)
return mastodon.getAccount(args.userKey.id).toParcelable(details)
}
else -> throw APINotSupportedException(details.type)
}
}
override fun succeededWorker(twitter: MicroBlog,
details: AccountDetails,
args: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
override fun succeededWorker(details: AccountDetails,
args: Arguments,
user: ParcelableUser) {
val resolver = context.contentResolver
// I bet you don't want to see this user in your auto complete list.
val values = ContentValues()

View File

@ -1,11 +1,14 @@
package org.mariotaku.twidere.task
import android.content.Context
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.twitter.model.User
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.exception.APINotSupportedException
import org.mariotaku.twidere.extension.model.api.toParcelable
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser
/**
* Created by mariotaku on 16/3/11.
@ -13,8 +16,16 @@ import org.mariotaku.twidere.model.AccountDetails
class ReportSpamAndBlockTask(context: Context) : CreateUserBlockTask(context) {
@Throws(MicroBlogException::class)
override fun perform(twitter: MicroBlog, details: AccountDetails,
args: AbsFriendshipOperationTask.Arguments): User {
return twitter.reportSpam(args.userKey.id)
override fun perform(details: AccountDetails, args: Arguments): ParcelableUser {
when (details.type) {
AccountType.MASTODON -> {
throw APINotSupportedException(details.type)
}
else -> {
val twitter = details.newMicroBlogInstance(context, MicroBlog::class.java)
return twitter.reportSpam(args.accountKey.id).toParcelable(details,
profileImageSize = profileImageSize)
}
}
}
}

View File

@ -42,6 +42,7 @@ import org.mariotaku.twidere.constant.homeRefreshDirectMessagesKey
import org.mariotaku.twidere.constant.homeRefreshMentionsKey
import org.mariotaku.twidere.constant.homeRefreshSavedSearchesKey
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.extension.model.api.mastodon.toParcelable
import org.mariotaku.twidere.extension.model.api.microblog.toParcelable
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.model.*