fixed account set color

This commit is contained in:
Mariotaku Lee 2016-12-09 10:02:41 +08:00
parent 82bcdfd877
commit e4668f45ef
37 changed files with 1037 additions and 1126 deletions

View File

@ -1,56 +0,0 @@
package org.mariotaku.twidere.task;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import org.mariotaku.microblog.library.MicroBlog;
import org.mariotaku.microblog.library.MicroBlogException;
import org.mariotaku.microblog.library.twitter.model.User;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.annotation.AccountType;
import org.mariotaku.twidere.model.AccountDetails;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.message.FriendshipTaskEvent;
import org.mariotaku.twidere.util.Utils;
/**
* Created by mariotaku on 16/3/11.
*/
public class AcceptFriendshipTask extends AbsFriendshipOperationTask implements Constants {
public AcceptFriendshipTask(final Context context) {
super(context, FriendshipTaskEvent.Action.ACCEPT);
}
@NonNull
@Override
protected User perform(@NonNull MicroBlog twitter, @NonNull AccountDetails details, @NonNull Arguments args) throws MicroBlogException {
switch (details.type) {
case AccountType.FANFOU: {
return twitter.acceptFanfouFriendship(args.getUserKey().getId());
}
}
return twitter.acceptFriendship(args.getUserKey().getId());
}
@Override
protected void succeededWorker(@NonNull MicroBlog twitter, @NonNull AccountDetails details, @NonNull Arguments args, @NonNull ParcelableUser user) {
Utils.setLastSeen(getContext(), user.key, System.currentTimeMillis());
}
@Override
protected void showErrorMessage(@NonNull Arguments params, @Nullable Exception exception) {
Utils.showErrorMessage(getContext(), R.string.action_accepting_follow_request, exception, false);
}
@Override
protected void showSucceededMessage(@NonNull Arguments params, @NonNull ParcelableUser user) {
final boolean nameFirst = getPreferences().getBoolean(KEY_NAME_FIRST);
final String message = getContext().getString(R.string.accepted_users_follow_request,
getManager().getDisplayName(user, nameFirst));
Utils.showOkMessage(getContext(), message, false);
}
}

View File

@ -1,74 +0,0 @@
package org.mariotaku.twidere.task;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import org.mariotaku.microblog.library.MicroBlog;
import org.mariotaku.microblog.library.MicroBlogException;
import org.mariotaku.microblog.library.twitter.model.User;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.annotation.AccountType;
import org.mariotaku.twidere.model.AccountDetails;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.message.FriendshipTaskEvent;
import org.mariotaku.twidere.util.Utils;
/**
* Created by mariotaku on 16/3/11.
*/
public class CreateFriendshipTask extends AbsFriendshipOperationTask implements Constants {
public CreateFriendshipTask(final Context context) {
super(context, FriendshipTaskEvent.Action.FOLLOW);
}
@NonNull
@Override
protected User perform(@NonNull MicroBlog twitter, @NonNull AccountDetails details, @NonNull Arguments args) throws MicroBlogException {
switch (details.type) {
case AccountType.FANFOU: {
return twitter.createFanfouFriendship(args.getUserKey().getId());
}
}
return twitter.createFriendship(args.getUserKey().getId());
}
@Override
protected void succeededWorker(@NonNull MicroBlog twitter, @NonNull AccountDetails details, @NonNull Arguments args, @NonNull ParcelableUser user) {
user.is_following = true;
Utils.setLastSeen(getContext(), user.key, System.currentTimeMillis());
}
@Override
protected void showErrorMessage(@NonNull Arguments params, @Nullable Exception exception) {
if (USER_TYPE_FANFOU_COM.equals(params.getAccountKey().getHost())) {
// Fanfou returns 403 for follow request
if (exception instanceof MicroBlogException) {
MicroBlogException te = (MicroBlogException) exception;
if (te.getStatusCode() == 403 && !TextUtils.isEmpty(te.getErrorMessage())) {
Utils.showErrorMessage(getContext(), te.getErrorMessage(), false);
return;
}
}
}
Utils.showErrorMessage(getContext(), R.string.action_following, exception, false);
}
@Override
protected void showSucceededMessage(@NonNull Arguments params, @NonNull ParcelableUser user) {
final String message;
final boolean nameFirst = getPreferences().getBoolean(KEY_NAME_FIRST);
if (user.is_protected) {
message = getContext().getString(R.string.sent_follow_request_to_user,
getManager().getDisplayName(user, nameFirst));
} else {
message = getContext().getString(R.string.followed_user,
getManager().getDisplayName(user, nameFirst));
}
Utils.showOkMessage(getContext(), message, false);
}
}

View File

@ -1,91 +0,0 @@
package org.mariotaku.twidere.task;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import org.mariotaku.microblog.library.MicroBlog;
import org.mariotaku.microblog.library.MicroBlogException;
import org.mariotaku.microblog.library.twitter.model.User;
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.model.AccountDetails;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.message.FriendshipTaskEvent;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedRelationships;
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses;
import org.mariotaku.twidere.util.DataStoreUtils;
import org.mariotaku.twidere.util.Utils;
/**
* Created by mariotaku on 16/3/11.
*/
public class CreateUserBlockTask extends AbsFriendshipOperationTask implements Constants {
public CreateUserBlockTask(Context context) {
super(context, FriendshipTaskEvent.Action.BLOCK);
}
@NonNull
@Override
protected User perform(@NonNull MicroBlog twitter, @NonNull AccountDetails details,
@NonNull Arguments args) throws MicroBlogException {
switch (details.type) {
case AccountType.FANFOU: {
return twitter.createFanfouBlock(args.getUserKey().getId());
}
}
return twitter.createBlock(args.getUserKey().getId());
}
@Override
protected void succeededWorker(@NonNull MicroBlog twitter,
@NonNull AccountDetails details,
@NonNull Arguments args, @NonNull ParcelableUser user) {
final ContentResolver resolver = getContext().getContentResolver();
Utils.setLastSeen(getContext(), args.getUserKey(), -1);
for (final Uri uri : DataStoreUtils.STATUSES_URIS) {
final Expression where = Expression.and(
Expression.equalsArgs(Statuses.ACCOUNT_KEY),
Expression.equalsArgs(Statuses.USER_KEY)
);
final String[] whereArgs = {args.getAccountKey().toString(), args.getUserKey().toString()};
resolver.delete(uri, where.getSQL(), whereArgs);
}
for (final Uri uri : DataStoreUtils.ACTIVITIES_URIS) {
final Expression where = Expression.and(
Expression.equalsArgs(Activities.ACCOUNT_KEY),
Expression.equalsArgs(Activities.STATUS_USER_KEY)
);
final String[] whereArgs = {args.getAccountKey().toString(), args.getUserKey().toString()};
resolver.delete(uri, where.getSQL(), whereArgs);
}
// I bet you don't want to see this user in your auto complete list.
final ContentValues values = new ContentValues();
values.put(CachedRelationships.ACCOUNT_KEY, args.getAccountKey().toString());
values.put(CachedRelationships.USER_KEY, args.getUserKey().toString());
values.put(CachedRelationships.BLOCKING, true);
values.put(CachedRelationships.FOLLOWING, false);
values.put(CachedRelationships.FOLLOWED_BY, false);
resolver.insert(CachedRelationships.CONTENT_URI, values);
}
@Override
protected void showSucceededMessage(@NonNull Arguments params, @NonNull ParcelableUser user) {
final boolean nameFirst = getPreferences().getBoolean(KEY_NAME_FIRST);
final String message = getContext().getString(R.string.blocked_user, getManager().getDisplayName(user,
nameFirst));
Utils.showInfoMessage(getContext(), message, false);
}
@Override
protected void showErrorMessage(@NonNull Arguments params, @Nullable Exception exception) {
Utils.showErrorMessage(getContext(), R.string.action_blocking, exception, true);
}
}

View File

@ -1,86 +0,0 @@
package org.mariotaku.twidere.task;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import org.mariotaku.microblog.library.MicroBlog;
import org.mariotaku.microblog.library.MicroBlogException;
import org.mariotaku.microblog.library.twitter.model.User;
import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.model.AccountDetails;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.message.FriendshipTaskEvent;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedRelationships;
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses;
import org.mariotaku.twidere.util.DataStoreUtils;
import org.mariotaku.twidere.util.Utils;
import static org.mariotaku.twidere.constant.SharedPreferenceConstants.KEY_NAME_FIRST;
/**
* Created by mariotaku on 16/3/11.
*/
public class CreateUserMuteTask extends AbsFriendshipOperationTask {
public CreateUserMuteTask(Context context) {
super(context, FriendshipTaskEvent.Action.MUTE);
}
@NonNull
@Override
protected User perform(@NonNull MicroBlog twitter, @NonNull AccountDetails details,
@NonNull Arguments args) throws MicroBlogException {
return twitter.createMute(args.getUserKey().getId());
}
@Override
protected void succeededWorker(@NonNull MicroBlog twitter,
@NonNull AccountDetails details,
@NonNull Arguments args, @NonNull ParcelableUser user) {
final ContentResolver resolver = getContext().getContentResolver();
Utils.setLastSeen(getContext(), args.getUserKey(), -1);
for (final Uri uri : DataStoreUtils.STATUSES_URIS) {
final Expression where = Expression.and(
Expression.equalsArgs(Statuses.ACCOUNT_KEY),
Expression.equalsArgs(Statuses.USER_KEY)
);
final String[] whereArgs = {args.getAccountKey().toString(), args.getUserKey().toString()};
resolver.delete(uri, where.getSQL(), whereArgs);
}
if (!user.is_following) {
for (final Uri uri : DataStoreUtils.ACTIVITIES_URIS) {
final Expression where = Expression.and(
Expression.equalsArgs(Activities.ACCOUNT_KEY),
Expression.equalsArgs(Activities.STATUS_USER_KEY)
);
final String[] whereArgs = {args.getAccountKey().toString(), args.getUserKey().toString()};
resolver.delete(uri, where.getSQL(), whereArgs);
}
}
// I bet you don't want to see this user in your auto complete list.
final ContentValues values = new ContentValues();
values.put(CachedRelationships.ACCOUNT_KEY, args.getAccountKey().toString());
values.put(CachedRelationships.USER_KEY, args.getUserKey().toString());
values.put(CachedRelationships.MUTING, true);
resolver.insert(CachedRelationships.CONTENT_URI, values);
}
@Override
protected void showSucceededMessage(@NonNull Arguments params, @NonNull ParcelableUser user) {
final boolean nameFirst = getPreferences().getBoolean(KEY_NAME_FIRST);
final String message = getContext().getString(R.string.muted_user, getManager().getDisplayName(user,
nameFirst));
Utils.showInfoMessage(getContext(), message, false);
}
@Override
protected void showErrorMessage(@NonNull Arguments params, @Nullable Exception exception) {
Utils.showErrorMessage(getContext(), R.string.action_muting, exception, true);
}
}

View File

@ -1,57 +0,0 @@
package org.mariotaku.twidere.task;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
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.annotation.AccountType;
import org.mariotaku.twidere.model.AccountDetails;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.message.FriendshipTaskEvent;
import org.mariotaku.twidere.util.Utils;
import static org.mariotaku.twidere.constant.SharedPreferenceConstants.KEY_NAME_FIRST;
/**
* Created by mariotaku on 16/3/11.
*/
public class DenyFriendshipTask extends AbsFriendshipOperationTask {
public DenyFriendshipTask(final Context context) {
super(context, FriendshipTaskEvent.Action.DENY);
}
@NonNull
@Override
protected User perform(@NonNull MicroBlog twitter, @NonNull AccountDetails details, @NonNull Arguments args) throws MicroBlogException {
switch (details.type) {
case AccountType.FANFOU: {
return twitter.denyFanfouFriendship(args.getUserKey().getId());
}
}
return twitter.denyFriendship(args.getUserKey().getId());
}
@Override
protected void succeededWorker(@NonNull MicroBlog twitter, @NonNull AccountDetails details, @NonNull Arguments args, @NonNull ParcelableUser user) {
Utils.setLastSeen(getContext(), user.key, -1);
}
@Override
protected void showErrorMessage(@NonNull Arguments params, @Nullable Exception exception) {
Utils.showErrorMessage(getContext(), R.string.action_denying_follow_request, exception, false);
}
@Override
protected void showSucceededMessage(@NonNull Arguments params, @NonNull ParcelableUser user) {
final boolean nameFirst = getPreferences().getBoolean(KEY_NAME_FIRST);
final String message = getContext().getString(R.string.denied_users_follow_request,
getManager().getDisplayName(user, nameFirst));
Utils.showOkMessage(getContext(), message, false);
}
}

View File

@ -1,68 +0,0 @@
package org.mariotaku.twidere.task;
import android.content.ContentResolver;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import org.mariotaku.microblog.library.MicroBlog;
import org.mariotaku.microblog.library.MicroBlogException;
import org.mariotaku.microblog.library.twitter.model.User;
import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.annotation.AccountType;
import org.mariotaku.twidere.model.AccountDetails;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.message.FriendshipTaskEvent;
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses;
import org.mariotaku.twidere.util.Utils;
import static org.mariotaku.twidere.constant.SharedPreferenceConstants.KEY_NAME_FIRST;
/**
* Created by mariotaku on 16/3/11.
*/
public class DestroyFriendshipTask extends AbsFriendshipOperationTask {
public DestroyFriendshipTask(final Context context) {
super(context, FriendshipTaskEvent.Action.UNFOLLOW);
}
@NonNull
@Override
protected User perform(@NonNull MicroBlog twitter, @NonNull AccountDetails details, @NonNull Arguments args) throws MicroBlogException {
switch (details.type) {
case AccountType.FANFOU: {
return twitter.destroyFanfouFriendship(args.getUserKey().getId());
}
}
return twitter.destroyFriendship(args.getUserKey().getId());
}
@Override
protected void succeededWorker(@NonNull MicroBlog twitter, @NonNull AccountDetails details, @NonNull Arguments args, @NonNull ParcelableUser user) {
user.is_following = false;
Utils.setLastSeen(getContext(), user.key, -1);
final Expression where = Expression.and(Expression.equalsArgs(Statuses.ACCOUNT_KEY),
Expression.or(Expression.equalsArgs(Statuses.USER_KEY),
Expression.equalsArgs(Statuses.RETWEETED_BY_USER_KEY)));
final String[] whereArgs = {args.getUserKey().toString(), args.getUserKey().toString(),
args.getUserKey().toString()};
final ContentResolver resolver = getContext().getContentResolver();
resolver.delete(Statuses.CONTENT_URI, where.getSQL(), whereArgs);
}
@Override
protected void showErrorMessage(@NonNull Arguments params, @Nullable Exception exception) {
Utils.showErrorMessage(getContext(), R.string.action_unfollowing, exception, false);
}
@Override
protected void showSucceededMessage(@NonNull Arguments params, @NonNull ParcelableUser user) {
final boolean nameFirst = getPreferences().getBoolean(KEY_NAME_FIRST);
final String message = getContext().getString(R.string.unfollowed_user,
getManager().getDisplayName(user, nameFirst));
Utils.showInfoMessage(getContext(), message, false);
}
}

View File

@ -1,70 +0,0 @@
package org.mariotaku.twidere.task;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
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.annotation.AccountType;
import org.mariotaku.twidere.model.AccountDetails;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.message.FriendshipTaskEvent;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedRelationships;
import org.mariotaku.twidere.util.Utils;
import static org.mariotaku.twidere.constant.SharedPreferenceConstants.KEY_NAME_FIRST;
/**
* Created by mariotaku on 16/3/11.
*/
public class DestroyUserBlockTask extends AbsFriendshipOperationTask {
public DestroyUserBlockTask(Context context) {
super(context, FriendshipTaskEvent.Action.UNBLOCK);
}
@NonNull
@Override
protected User perform(@NonNull MicroBlog twitter, @NonNull AccountDetails details,
@NonNull Arguments args) throws MicroBlogException {
switch (details.type) {
case AccountType.FANFOU: {
return twitter.destroyFanfouBlock(args.getUserKey().getId());
}
}
return twitter.destroyBlock(args.getUserKey().getId());
}
@Override
protected void succeededWorker(@NonNull MicroBlog twitter,
@NonNull AccountDetails details,
@NonNull Arguments args, @NonNull ParcelableUser user) {
final ContentResolver resolver = getContext().getContentResolver();
// I bet you don't want to see this user in your auto complete list.
final ContentValues values = new ContentValues();
values.put(CachedRelationships.ACCOUNT_KEY, args.getAccountKey().toString());
values.put(CachedRelationships.USER_KEY, args.getUserKey().toString());
values.put(CachedRelationships.BLOCKING, false);
values.put(CachedRelationships.FOLLOWING, false);
values.put(CachedRelationships.FOLLOWED_BY, false);
resolver.insert(CachedRelationships.CONTENT_URI, values);
}
@Override
protected void showSucceededMessage(@NonNull Arguments params, @NonNull ParcelableUser user) {
final boolean nameFirst = getPreferences().getBoolean(KEY_NAME_FIRST);
final String message = getContext().getString(R.string.unblocked_user, getManager().getDisplayName(user,
nameFirst));
Utils.showInfoMessage(getContext(), message, false);
}
@Override
protected void showErrorMessage(@NonNull Arguments params, @Nullable Exception exception) {
Utils.showErrorMessage(getContext(), R.string.action_unblocking, exception, true);
}
}

View File

@ -1,62 +0,0 @@
package org.mariotaku.twidere.task;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
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.model.AccountDetails;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.message.FriendshipTaskEvent;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedRelationships;
import org.mariotaku.twidere.util.Utils;
import static org.mariotaku.twidere.constant.SharedPreferenceConstants.KEY_NAME_FIRST;
/**
* Created by mariotaku on 16/3/11.
*/
public class DestroyUserMuteTask extends AbsFriendshipOperationTask {
public DestroyUserMuteTask(Context context) {
super(context, FriendshipTaskEvent.Action.UNMUTE);
}
@NonNull
@Override
protected User perform(@NonNull MicroBlog twitter, @NonNull AccountDetails details,
@NonNull Arguments args) throws MicroBlogException {
return twitter.destroyMute(args.getUserKey().getId());
}
@Override
protected void succeededWorker(@NonNull MicroBlog twitter,
@NonNull AccountDetails details,
@NonNull Arguments args, @NonNull ParcelableUser user) {
final ContentResolver resolver = getContext().getContentResolver();
// I bet you don't want to see this user in your auto complete list.
final ContentValues values = new ContentValues();
values.put(CachedRelationships.ACCOUNT_KEY, args.getAccountKey().toString());
values.put(CachedRelationships.USER_KEY, args.getUserKey().toString());
values.put(CachedRelationships.MUTING, false);
resolver.insert(CachedRelationships.CONTENT_URI, values);
}
@Override
protected void showSucceededMessage(@NonNull Arguments params, @NonNull ParcelableUser user) {
final boolean nameFirst = getPreferences().getBoolean(KEY_NAME_FIRST);
final String message = getContext().getString(R.string.unmuted_user, getManager().getDisplayName(user,
nameFirst));
Utils.showInfoMessage(getContext(), message, false);
}
@Override
protected void showErrorMessage(@NonNull Arguments params, @Nullable Exception exception) {
Utils.showErrorMessage(getContext(), R.string.action_unmuting, exception, true);
}
}

View File

@ -150,7 +150,7 @@ public abstract class GetDirectMessagesTask extends AbstractTask<RefreshTaskPara
}
@Override
protected void afterExecute(Object callback, List<TwitterWrapper.MessageListResponse> result) {
protected void afterExecute(Object handler, List<TwitterWrapper.MessageListResponse> result) {
bus.post(new GetMessagesTaskEvent(getDatabaseUri(), false, AsyncTwitterWrapper.getException(result)));
}
}

View File

@ -58,7 +58,7 @@ public abstract class GetTrendsTask extends AbstractTask<Object, Object, Object>
}
@Override
protected void afterExecute(Object callback, Object result) {
protected void afterExecute(Object handler, Object result) {
mBus.post(new TrendsRefreshedEvent());
}

View File

@ -1,94 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 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.task;
import android.content.Context;
import android.os.AsyncTask;
import com.squareup.otto.Bus;
import org.mariotaku.twidere.model.message.TaskStateChangedEvent;
import org.mariotaku.twidere.util.AsyncTaskManager;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.SharedPreferencesWrapper;
import org.mariotaku.twidere.util.UserColorNameManager;
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper;
import javax.inject.Inject;
public abstract class ManagedAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {
@Inject
protected AsyncTaskManager manager;
@Inject
protected Bus bus;
@Inject
protected UserColorNameManager mUserColorNameManager;
@Inject
protected SharedPreferencesWrapper mPreferences;
@Inject
protected AsyncTwitterWrapper mAsyncTwitterWrapper;
private final Context context;
private final String tag;
public ManagedAsyncTask(final Context context) {
this(context, null);
}
public ManagedAsyncTask(final Context context, final String tag) {
//noinspection unchecked
GeneralComponentHelper.build(context).inject((ManagedAsyncTask<Object, Object, Object>) this);
this.context = context;
this.tag = tag;
}
public Context getContext() {
return context;
}
public String getTag() {
return tag;
}
@Override
protected void finalize() throws Throwable {
manager.remove(hashCode());
super.finalize();
}
@Override
protected void onCancelled() {
super.onCancelled();
bus.post(new TaskStateChangedEvent());
}
@Override
protected void onPostExecute(final Result result) {
super.onPostExecute(result);
bus.post(new TaskStateChangedEvent());
}
@Override
protected void onPreExecute() {
super.onPreExecute();
bus.post(new TaskStateChangedEvent());
}
}

View File

@ -1,25 +0,0 @@
package org.mariotaku.twidere.task;
import android.content.Context;
import android.support.annotation.NonNull;
import org.mariotaku.microblog.library.MicroBlog;
import org.mariotaku.microblog.library.MicroBlogException;
import org.mariotaku.microblog.library.twitter.model.User;
import org.mariotaku.twidere.model.AccountDetails;
/**
* Created by mariotaku on 16/3/11.
*/
public class ReportSpamAndBlockTask extends CreateUserBlockTask {
public ReportSpamAndBlockTask(Context context) {
super(context);
}
@NonNull
@Override
protected User perform(@NonNull MicroBlog twitter, @NonNull AccountDetails details,
@NonNull Arguments args) throws MicroBlogException {
return twitter.reportSpam(args.getUserKey().getId());
}
}

View File

@ -1,91 +0,0 @@
package org.mariotaku.twidere.task;
import android.content.Context;
import android.net.Uri;
import android.util.Log;
import com.squareup.otto.Bus;
import org.mariotaku.abstask.library.AbstractTask;
import org.mariotaku.microblog.library.MicroBlog;
import org.mariotaku.microblog.library.MicroBlogException;
import org.mariotaku.microblog.library.twitter.model.User;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.SingleResponse;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.message.ProfileUpdatedEvent;
import org.mariotaku.twidere.model.util.ParcelableUserUtils;
import org.mariotaku.twidere.util.MicroBlogAPIFactory;
import org.mariotaku.twidere.util.TwitterWrapper;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper;
import java.io.IOException;
import javax.inject.Inject;
/**
* Created by mariotaku on 16/3/11.
*/
public class UpdateProfileBackgroundImageTask<ResultHandler> extends AbstractTask<Object,
SingleResponse<ParcelableUser>, ResultHandler> implements Constants {
@Inject
protected Bus mBus;
private final UserKey mAccountKey;
private final Uri mImageUri;
private boolean mTile;
private final boolean mDeleteImage;
private final Context mContext;
public UpdateProfileBackgroundImageTask(final Context context, final UserKey accountKey,
final Uri imageUri, final boolean tile,
final boolean deleteImage) {
//noinspection unchecked
GeneralComponentHelper.build(context).inject((UpdateProfileBackgroundImageTask<Object>) this);
mContext = context;
mAccountKey = accountKey;
mImageUri = imageUri;
mDeleteImage = deleteImage;
mTile = tile;
}
@Override
protected void afterExecute(ResultHandler callback, SingleResponse<ParcelableUser> result) {
super.afterExecute(callback, result);
if (result.hasData()) {
Utils.showOkMessage(mContext, R.string.profile_banner_image_updated, false);
mBus.post(new ProfileUpdatedEvent(result.getData()));
} else {
Utils.showErrorMessage(mContext, R.string.action_updating_profile_background_image,
result.getException(),
true);
}
}
@Override
protected SingleResponse<ParcelableUser> doLongOperation(final Object params) {
try {
final MicroBlog twitter = MicroBlogAPIFactory.getInstance(mContext, mAccountKey
);
TwitterWrapper.updateProfileBackgroundImage(mContext, twitter, mImageUri, mTile,
mDeleteImage);
// Wait for 5 seconds, see
// https://dev.twitter.com/docs/api/1.1/post/account/update_profile_image
try {
Thread.sleep(5000L);
} catch (InterruptedException e) {
Log.w(LOGTAG, e);
}
final User user = twitter.verifyCredentials();
return SingleResponse.Companion.getInstance(ParcelableUserUtils.fromUser(user, mAccountKey));
} catch (MicroBlogException | IOException e) {
return SingleResponse.Companion.getInstance(e);
}
}
}

View File

@ -1,86 +0,0 @@
package org.mariotaku.twidere.task;
import android.content.Context;
import android.net.Uri;
import android.util.Log;
import com.squareup.otto.Bus;
import org.mariotaku.abstask.library.AbstractTask;
import org.mariotaku.microblog.library.MicroBlog;
import org.mariotaku.microblog.library.MicroBlogException;
import org.mariotaku.microblog.library.twitter.model.User;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.SingleResponse;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.message.ProfileUpdatedEvent;
import org.mariotaku.twidere.model.util.ParcelableUserUtils;
import org.mariotaku.twidere.util.MicroBlogAPIFactory;
import org.mariotaku.twidere.util.TwitterWrapper;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper;
import java.io.IOException;
import javax.inject.Inject;
/**
* Created by mariotaku on 16/3/11.
*/
public class UpdateProfileBannerImageTask<ResultHandler> extends AbstractTask<Object,
SingleResponse<ParcelableUser>, ResultHandler> implements Constants {
@Inject
protected Bus mBus;
private final UserKey mAccountKey;
private final Uri mImageUri;
private final boolean mDeleteImage;
private final Context mContext;
public UpdateProfileBannerImageTask(final Context context, final UserKey accountKey,
final Uri imageUri, final boolean deleteImage) {
//noinspection unchecked
GeneralComponentHelper.build(context).inject((UpdateProfileBannerImageTask<Object>) this);
mContext = context;
mAccountKey = accountKey;
mImageUri = imageUri;
mDeleteImage = deleteImage;
}
@Override
protected void afterExecute(ResultHandler callback, final SingleResponse<ParcelableUser> result) {
super.afterExecute(callback, result);
if (result.hasData()) {
Utils.showOkMessage(mContext, R.string.profile_banner_image_updated, false);
mBus.post(new ProfileUpdatedEvent(result.getData()));
} else {
Utils.showErrorMessage(mContext, R.string.action_updating_profile_banner_image, result.getException(),
true);
}
}
@Override
protected SingleResponse<ParcelableUser> doLongOperation(final Object params) {
try {
final MicroBlog twitter = MicroBlogAPIFactory.getInstance(mContext, mAccountKey
);
TwitterWrapper.updateProfileBannerImage(mContext, twitter, mImageUri, mDeleteImage);
// Wait for 5 seconds, see
// https://dev.twitter.com/docs/api/1.1/post/account/update_profile_image
try {
Thread.sleep(5000L);
} catch (InterruptedException e) {
Log.w(LOGTAG, e);
}
final User user = twitter.verifyCredentials();
return SingleResponse.Companion.getInstance(ParcelableUserUtils.fromUser(user, mAccountKey));
} catch (MicroBlogException | IOException e) {
return SingleResponse.Companion.getInstance(e);
}
}
}

View File

@ -76,7 +76,6 @@ import org.mariotaku.twidere.model.message.GetMessagesTaskEvent;
import org.mariotaku.twidere.model.message.GetStatusesTaskEvent;
import org.mariotaku.twidere.model.message.ProfileUpdatedEvent;
import org.mariotaku.twidere.model.message.SavedSearchDestroyedEvent;
import org.mariotaku.twidere.model.message.StatusDestroyedEvent;
import org.mariotaku.twidere.model.message.StatusListChangedEvent;
import org.mariotaku.twidere.model.message.StatusRetweetedEvent;
import org.mariotaku.twidere.model.message.UserListCreatedEvent;
@ -99,11 +98,13 @@ import org.mariotaku.twidere.provider.TwidereDataStore.Drafts;
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses;
import org.mariotaku.twidere.service.BackgroundOperationService;
import org.mariotaku.twidere.task.AcceptFriendshipTask;
import org.mariotaku.twidere.task.AddUserListMembersTask;
import org.mariotaku.twidere.task.CreateFriendshipTask;
import org.mariotaku.twidere.task.CreateUserBlockTask;
import org.mariotaku.twidere.task.CreateUserMuteTask;
import org.mariotaku.twidere.task.DenyFriendshipTask;
import org.mariotaku.twidere.task.DestroyFriendshipTask;
import org.mariotaku.twidere.task.DestroyStatusTask;
import org.mariotaku.twidere.task.DestroyUserBlockTask;
import org.mariotaku.twidere.task.DestroyUserMuteTask;
import org.mariotaku.twidere.task.GetActivitiesAboutMeTask;
@ -140,8 +141,8 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
private IntList mCreatingFavoriteIds = new ArrayIntList();
private IntList mDestroyingFavoriteIds = new ArrayIntList();
private IntList mCreatingRetweetIds = new ArrayIntList();
private IntList mDestroyingStatusIds = new ArrayIntList();
private IntList mUpdatingRelationshipIds = new ArrayIntList();
public IntList destroyingStatusIds = new ArrayIntList();
private IntList updatingRelationshipIds = new ArrayIntList();
private final LongList sendingDraftIds = new ArrayLongList();
@ -190,7 +191,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
}
public int addUserListMembersAsync(final UserKey accountKey, final String listId, @NonNull final ParcelableUser... users) {
final AddUserListMembersTask task = new AddUserListMembersTask(accountKey, listId, users);
final AddUserListMembersTask task = new AddUserListMembersTask(context, accountKey, listId, users);
return asyncTaskManager.add(task, true);
}
@ -311,7 +312,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
}
public int destroyStatusAsync(final UserKey accountKey, final String statusId) {
final DestroyStatusTask task = new DestroyStatusTask(accountKey, statusId);
final DestroyStatusTask task = new DestroyStatusTask(context,accountKey, statusId);
return asyncTaskManager.add(task, true);
}
@ -377,10 +378,10 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
}
public boolean isDestroyingStatus(@Nullable final UserKey accountId, @Nullable final String statusId) {
return mDestroyingStatusIds.contains(calculateHashCode(accountId, statusId));
return destroyingStatusIds.contains(calculateHashCode(accountId, statusId));
}
static int calculateHashCode(@Nullable final UserKey accountId, @Nullable final String statusId) {
public static int calculateHashCode(@Nullable final UserKey accountId, @Nullable final String statusId) {
return (accountId == null ? 0 : accountId.hashCode()) ^ (statusId == null ? 0 : statusId.hashCode());
}
@ -579,128 +580,15 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
}
public void addUpdatingRelationshipId(UserKey accountKey, UserKey userId) {
mUpdatingRelationshipIds.add(ParcelableUser.calculateHashCode(accountKey, userId));
updatingRelationshipIds.add(ParcelableUser.calculateHashCode(accountKey, userId));
}
public void removeUpdatingRelationshipId(UserKey accountKey, UserKey userId) {
mUpdatingRelationshipIds.removeElement(ParcelableUser.calculateHashCode(accountKey, userId));
updatingRelationshipIds.removeElement(ParcelableUser.calculateHashCode(accountKey, userId));
}
public boolean isUpdatingRelationship(UserKey accountId, UserKey userId) {
return mUpdatingRelationshipIds.contains(ParcelableUser.calculateHashCode(accountId, userId));
}
public static class UpdateProfileImageTask<ResultHandler> extends AbstractTask<Object,
SingleResponse<ParcelableUser>, ResultHandler> {
@Inject
protected Bus mBus;
private final UserKey mAccountKey;
private final Uri mImageUri;
private final boolean mDeleteImage;
private final Context mContext;
public UpdateProfileImageTask(final Context context, final UserKey accountKey,
final Uri imageUri, final boolean deleteImage) {
//noinspection unchecked
GeneralComponentHelper.build(context).inject((UpdateProfileImageTask<Object>) this);
this.mContext = context;
this.mAccountKey = accountKey;
this.mImageUri = imageUri;
this.mDeleteImage = deleteImage;
}
@Override
protected SingleResponse<ParcelableUser> doLongOperation(final Object params) {
try {
final MicroBlog microBlog = MicroBlogAPIFactory.getInstance(mContext, mAccountKey);
TwitterWrapper.updateProfileImage(mContext, microBlog, mImageUri, mDeleteImage);
// Wait for 5 seconds, see
// https://dev.twitter.com/rest/reference/post/account/update_profile_image
try {
Thread.sleep(5000L);
} catch (InterruptedException e) {
Log.w(LOGTAG, e);
}
final User user = microBlog.verifyCredentials();
return SingleResponse.Companion.getInstance(ParcelableUserUtils.fromUser(user, mAccountKey));
} catch (MicroBlogException | IOException e) {
return SingleResponse.Companion.getInstance(e);
}
}
@Override
protected void afterExecute(ResultHandler handler, SingleResponse<ParcelableUser> result) {
super.afterExecute(handler, result);
if (result.hasData()) {
Utils.showOkMessage(mContext, R.string.profile_image_updated, false);
mBus.post(new ProfileUpdatedEvent(result.getData()));
} else {
Utils.showErrorMessage(mContext, R.string.action_updating_profile_image, result.getException(), true);
}
}
}
class AddUserListMembersTask extends ManagedAsyncTask<Object, Object, SingleResponse<ParcelableUserList>> {
private final UserKey mAccountKey;
private final String mListId;
@NonNull
private final ParcelableUser[] mUsers;
AddUserListMembersTask(@NonNull final UserKey accountKey,
final String listId,
@NonNull final ParcelableUser[] users) {
super(context);
this.mAccountKey = accountKey;
this.mListId = listId;
this.mUsers = users;
}
@Override
protected SingleResponse<ParcelableUserList> doInBackground(final Object... params) {
final MicroBlog microBlog = MicroBlogAPIFactory.getInstance(context, mAccountKey);
if (microBlog == null) return SingleResponse.Companion.getInstance();
try {
final UserKey[] userIds = new UserKey[mUsers.length];
for (int i = 0, j = mUsers.length; i < j; i++) {
userIds[i] = mUsers[i].key;
}
final UserList result = microBlog.addUserListMembers(mListId, UserKey.getIds(userIds));
final ParcelableUserList list = ParcelableUserListUtils.from(result, mAccountKey);
return SingleResponse.Companion.getInstance(list);
} catch (final MicroBlogException e) {
return SingleResponse.Companion.getInstance(e);
}
}
@Override
protected void onPostExecute(final SingleResponse<ParcelableUserList> result) {
final boolean succeed = result.hasData();
if (succeed) {
final String message;
if (mUsers.length == 1) {
final ParcelableUser user = mUsers[0];
final boolean nameFirst = mPreferences.getBoolean(KEY_NAME_FIRST);
final String displayName = mUserColorNameManager.getDisplayName(user.key, user.name,
user.screen_name, nameFirst);
message = context.getString(R.string.added_user_to_list, displayName, result.getData().name);
} else {
final Resources res = context.getResources();
message = res.getQuantityString(R.plurals.added_N_users_to_list, mUsers.length, mUsers.length,
result.getData().name);
}
Utils.showOkMessage(context, message, false);
} else {
Utils.showErrorMessage(context, R.string.action_adding_member, result.getException(), true);
}
bus.post(new UserListMembersChangedEvent(UserListMembersChangedEvent.Action.ADDED,
result.getData(), mUsers));
super.onPostExecute(result);
}
return updatingRelationshipIds.contains(ParcelableUser.calculateHashCode(accountId, userId));
}
final class ClearNotificationTask extends AsyncTask<Object, Object, Integer> {
@ -766,7 +654,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
}
}
ParcelableStatusUtils.INSTANCE.updateExtraInformation(result, details,
mUserColorNameManager);
getUserColorNameManager());
Utils.setLastSeen(getContext(), result.mentions, System.currentTimeMillis());
final ContentValues values = new ContentValues();
values.put(Statuses.IS_FAVORITE, true);
@ -819,7 +707,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
if (!mCreatingFavoriteIds.contains(hashCode)) {
mCreatingFavoriteIds.add(hashCode);
}
bus.post(new StatusListChangedEvent());
getBus().post(new StatusListChangedEvent());
}
@Override
@ -841,8 +729,8 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
taskEvent.setSucceeded(false);
Utils.showErrorMessage(getContext(), R.string.action_favoriting, result.getException(), true);
}
bus.post(taskEvent);
bus.post(new StatusListChangedEvent());
getBus().post(taskEvent);
getBus().post(new StatusListChangedEvent());
super.onPostExecute(result);
}
@ -981,7 +869,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
if (succeed) {
final String message = context.getString(R.string.subscribed_to_list, result.getData().name);
Utils.showOkMessage(context, message, false);
bus.post(new UserListSubscriptionEvent(UserListSubscriptionEvent.Action.SUBSCRIBE,
getBus().post(new UserListSubscriptionEvent(UserListSubscriptionEvent.Action.SUBSCRIBE,
result.getData()));
} else {
Utils.showErrorMessage(context, R.string.action_subscribing_to_list, result.getException(), true);
@ -1031,7 +919,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
final ParcelableUserList userList = result.getData();
final String message = context.getString(R.string.created_list, userList.name);
Utils.showOkMessage(context, message, false);
bus.post(new UserListCreatedEvent(userList));
getBus().post(new UserListCreatedEvent(userList));
} else {
Utils.showErrorMessage(context, R.string.action_creating_list, result.getException(), true);
}
@ -1077,8 +965,8 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
if (succeed) {
if (users.length == 1) {
final ParcelableUser user = users[0];
final boolean nameFirst = mPreferences.getBoolean(KEY_NAME_FIRST);
final String displayName = mUserColorNameManager.getDisplayName(user.key,
final boolean nameFirst = getPreferences().getBoolean(KEY_NAME_FIRST);
final String displayName = getUserColorNameManager().getDisplayName(user.key,
user.name, user.screen_name, nameFirst);
message = context.getString(R.string.deleted_user_from_list, displayName,
result.getData().name);
@ -1087,7 +975,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
message = res.getQuantityString(R.plurals.deleted_N_users_from_list, users.length, users.length,
result.getData().name);
}
bus.post(new UserListMembersChangedEvent(UserListMembersChangedEvent.Action.REMOVED,
getBus().post(new UserListMembersChangedEvent(UserListMembersChangedEvent.Action.REMOVED,
result.getData(), users));
Utils.showInfoMessage(context, message, false);
} else {
@ -1295,7 +1183,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
if (!mDestroyingFavoriteIds.contains(hashCode)) {
mDestroyingFavoriteIds.add(hashCode);
}
bus.post(new StatusListChangedEvent());
getBus().post(new StatusListChangedEvent());
}
@Override
@ -1318,8 +1206,8 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
taskEvent.setSucceeded(false);
Utils.showErrorMessage(context, R.string.action_unfavoriting, result.getException(), true);
}
bus.post(taskEvent);
bus.post(new StatusListChangedEvent());
getBus().post(taskEvent);
getBus().post(new StatusListChangedEvent());
super.onPostExecute(result);
}
@ -1352,7 +1240,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
if (result.hasData()) {
final String message = context.getString(R.string.search_name_deleted, result.getData().getQuery());
Utils.showOkMessage(context, message, false);
bus.post(new SavedSearchDestroyedEvent(mAccountKey, mSearchId));
getBus().post(new SavedSearchDestroyedEvent(mAccountKey, mSearchId));
} else {
Utils.showErrorMessage(context, R.string.action_deleting_search, result.getException(), false);
}
@ -1361,71 +1249,6 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
}
class DestroyStatusTask extends ManagedAsyncTask<Object, Object, SingleResponse<ParcelableStatus>> {
private final UserKey mAccountKey;
private final String mStatusId;
public DestroyStatusTask(final UserKey accountKey, final String statusId) {
super(context);
this.mAccountKey = accountKey;
this.mStatusId = statusId;
}
@Override
protected SingleResponse<ParcelableStatus> doInBackground(final Object... params) {
final AccountDetails details = AccountUtils.getAccountDetails(AccountManager.get(getContext()),
mAccountKey);
if (details == null) return SingleResponse.Companion.getInstance();
final MicroBlog microBlog = AccountDetailsExtensionsKt.newMicroBlogInstance(details,
getContext(), MicroBlog.class);
if (microBlog == null) return SingleResponse.Companion.getInstance();
ParcelableStatus status = null;
MicroBlogException exception = null;
try {
status = ParcelableStatusUtils.INSTANCE.fromStatus(microBlog.destroyStatus(mStatusId),
mAccountKey, false);
ParcelableStatusUtils.INSTANCE.updateExtraInformation(status, details,
mUserColorNameManager);
} catch (final MicroBlogException e) {
exception = e;
}
if (status != null || (exception.getErrorCode() == ErrorInfo.STATUS_NOT_FOUND)) {
DataStoreUtils.deleteStatus(resolver, mAccountKey, mStatusId, status);
DataStoreUtils.deleteActivityStatus(resolver, mAccountKey, mStatusId, status);
}
return SingleResponse.Companion.getInstance(status);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
final int hashCode = calculateHashCode(mAccountKey, mStatusId);
if (!mDestroyingStatusIds.contains(hashCode)) {
mDestroyingStatusIds.add(hashCode);
}
bus.post(new StatusListChangedEvent());
}
@Override
protected void onPostExecute(final SingleResponse<ParcelableStatus> result) {
mDestroyingStatusIds.removeElement(calculateHashCode(mAccountKey, mStatusId));
if (result.hasData()) {
final ParcelableStatus status = result.getData();
if (status.retweet_id != null) {
Utils.showInfoMessage(context, R.string.retweet_cancelled, false);
} else {
Utils.showInfoMessage(context, R.string.status_deleted, false);
}
bus.post(new StatusDestroyedEvent(status));
} else {
Utils.showErrorMessage(context, R.string.action_deleting, result.getException(), true);
}
super.onPostExecute(result);
}
}
class DestroyUserListSubscriptionTask extends ManagedAsyncTask<Object, Object, SingleResponse<ParcelableUserList>> {
private final UserKey mAccountKey;
@ -1457,7 +1280,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
if (succeed) {
final String message = context.getString(R.string.unsubscribed_from_list, result.getData().name);
Utils.showOkMessage(context, message, false);
bus.post(new UserListSubscriptionEvent(UserListSubscriptionEvent.Action.UNSUBSCRIBE,
getBus().post(new UserListSubscriptionEvent(UserListSubscriptionEvent.Action.UNSUBSCRIBE,
result.getData()));
} else {
Utils.showErrorMessage(context, R.string.action_unsubscribing_from_list, result.getException(), true);
@ -1499,7 +1322,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
if (succeed) {
final String message = context.getString(R.string.deleted_list, result.getData().name);
Utils.showInfoMessage(context, message, false);
bus.post(new UserListDestroyedEvent(result.getData()));
getBus().post(new UserListDestroyedEvent(result.getData()));
} else {
Utils.showErrorMessage(context, R.string.action_deleting, result.getException(), true);
}
@ -1609,7 +1432,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
final ParcelableStatus result = ParcelableStatusUtils.INSTANCE.fromStatus(microBlog.retweetStatus(mStatusId),
mAccountKey, false);
ParcelableStatusUtils.INSTANCE.updateExtraInformation(result, details,
mUserColorNameManager);
getUserColorNameManager());
Utils.setLastSeen(getContext(), result.mentions, System.currentTimeMillis());
final ContentValues values = new ContentValues();
values.put(Statuses.MY_RETWEET_ID, result.id);
@ -1657,7 +1480,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
if (!mCreatingRetweetIds.contains(hashCode)) {
mCreatingRetweetIds.add(hashCode);
}
bus.post(new StatusListChangedEvent());
getBus().post(new StatusListChangedEvent());
}
@Override
@ -1671,7 +1494,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
HotMobiLogger.getInstance(getContext()).log(mAccountKey, event);
// END HotMobi
bus.post(new StatusRetweetedEvent(status));
getBus().post(new StatusRetweetedEvent(status));
} else {
Utils.showErrorMessage(getContext(), R.string.action_retweeting, result.getException(), true);
}
@ -1717,7 +1540,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
if (result.hasData()) {
final String message = mContext.getString(R.string.updated_list_details, result.getData().name);
Utils.showOkMessage(mContext, message, false);
bus.post(new UserListUpdatedEvent(result.getData()));
getBus().post(new UserListUpdatedEvent(result.getData()));
} else {
Utils.showErrorMessage(mContext, R.string.action_updating_details, result.getException(), true);
}

View File

@ -111,7 +111,7 @@ public class TwitterWrapper implements Constants {
}
@NonNull
public static User showUser(final MicroBlog twitter, final String id, final String screenName,
public static User showUser(@NonNull final MicroBlog twitter, final String id, final String screenName,
final String accountType) throws MicroBlogException {
if (id != null) {
if (AccountType.FANFOU.equals(accountType)) {
@ -128,7 +128,7 @@ public class TwitterWrapper implements Constants {
}
@NonNull
public static User showUserAlternative(final MicroBlog twitter, final String id,
public static User showUserAlternative(@NonNull final MicroBlog twitter, final String id,
final String screenName)
throws MicroBlogException {
final String searchScreenName;
@ -162,7 +162,7 @@ public class TwitterWrapper implements Constants {
}
@NonNull
public static User tryShowUser(final MicroBlog twitter, final String id, final String screenName,
public static User tryShowUser(@NonNull final MicroBlog twitter, final String id, final String screenName,
String accountType)
throws MicroBlogException {
try {
@ -176,8 +176,10 @@ public class TwitterWrapper implements Constants {
}
}
public static void updateProfileBannerImage(final Context context, final MicroBlog twitter,
final Uri imageUri, final boolean deleteImage)
public static void updateProfileBannerImage(@NonNull final Context context,
@NonNull final MicroBlog twitter,
@NonNull final Uri imageUri,
final boolean deleteImage)
throws IOException, MicroBlogException {
FileBody fileBody = null;
try {
@ -215,8 +217,8 @@ public class TwitterWrapper implements Constants {
}
}
public static User updateProfileImage(final Context context, final MicroBlog twitter,
final Uri imageUri, final boolean deleteImage)
public static User updateProfileImage(@NonNull final Context context, @NonNull final MicroBlog twitter,
@NonNull final Uri imageUri, final boolean deleteImage)
throws IOException, MicroBlogException {
FileBody fileBody = null;
try {

View File

@ -44,9 +44,8 @@ class ColorPickerDialogActivity : BaseActivity(), Callback {
}
override fun onColorSelected(color: Int) {
val intent = Intent()
intent.putExtra(EXTRA_COLOR, color)
setResult(Activity.RESULT_OK, intent)
setResult(Activity.RESULT_OK, Intent().putExtra(EXTRA_COLOR, color)
.putExtra(EXTRA_EXTRAS, intent.getBundleExtra(EXTRA_EXTRAS)))
finish()
}

View File

@ -26,6 +26,7 @@ import android.widget.CompoundButton
import org.mariotaku.twidere.R
import org.mariotaku.twidere.adapter.iface.IBaseAdapter
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.util.AccountUtils
import org.mariotaku.twidere.util.MediaLoaderWrapper
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper
@ -37,6 +38,15 @@ class AccountDetailsAdapter(context: Context) : ArrayAdapter<AccountDetails>(con
@Inject
lateinit override var mediaLoader: MediaLoaderWrapper
override val linkHighlightOption: Int
get() = 0
override var textSize: Float = 0f
override var isDisplayNameFirst: Boolean = true
override var isShowAccountColor: Boolean = true
override var isProfileImageDisplayed: Boolean = false
private var sortEnabled: Boolean = false
private var switchEnabled: Boolean = false
@ -77,30 +87,10 @@ class AccountDetailsAdapter(context: Context) : ArrayAdapter<AccountDetails>(con
return view
}
override val linkHighlightOption: Int
get() = 0
override fun setLinkHighlightOption(option: String) {
}
override var textSize: Float
get() = 0f
set(textSize) {
}
override var isDisplayNameFirst: Boolean
get() = false
set(nameFirst) {
}
override var isShowAccountColor: Boolean
get() = false
set(show) {
}
override fun hasStableIds(): Boolean {
return true
@ -128,4 +118,12 @@ class AccountDetailsAdapter(context: Context) : ArrayAdapter<AccountDetails>(con
insert(fromItem, to)
}
fun findItem(key: UserKey): AccountDetails? {
(0 until count).forEach { i ->
val item = getItem(i)
if (key == item.key) return item
}
return null
}
}

View File

@ -16,6 +16,8 @@ import android.view.ContextMenu.ContextMenuInfo
import android.widget.AdapterView
import android.widget.AdapterView.AdapterContextMenuInfo
import kotlinx.android.synthetic.main.layout_draggable_list_with_empty_view.*
import org.mariotaku.ktextension.Bundle
import org.mariotaku.ktextension.set
import org.mariotaku.sqliteqb.library.Expression
import org.mariotaku.twidere.Constants.*
import org.mariotaku.twidere.R
@ -23,7 +25,7 @@ import org.mariotaku.twidere.activity.ColorPickerDialogActivity
import org.mariotaku.twidere.activity.SignInActivity
import org.mariotaku.twidere.adapter.AccountDetailsAdapter
import org.mariotaku.twidere.annotation.Referral
import org.mariotaku.twidere.constant.IntentConstants
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT_KEY
import org.mariotaku.twidere.constant.SharedPreferenceConstants.KEY_NEW_DOCUMENT_API
import org.mariotaku.twidere.extension.getAccountKey
import org.mariotaku.twidere.extension.setActivated
@ -31,6 +33,7 @@ import org.mariotaku.twidere.extension.setColor
import org.mariotaku.twidere.extension.setPosition
import org.mariotaku.twidere.loader.AccountDetailsLoader
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.provider.TwidereDataStore.*
import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages.Inbox
import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages.Outbox
@ -46,7 +49,6 @@ class AccountsManagerFragment : BaseSupportFragment(), LoaderManager.LoaderCallb
AdapterView.OnItemClickListener {
private lateinit var adapter: AccountDetailsAdapter
private var selectedAccount: AccountDetails? = null
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
@ -85,10 +87,15 @@ class AccountsManagerFragment : BaseSupportFragment(), LoaderManager.LoaderCallb
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
when (requestCode) {
REQUEST_SET_COLOR -> {
if (resultCode != Activity.RESULT_OK || data == null || selectedAccount == null)
if (resultCode != Activity.RESULT_OK || data == null)
return
val am = AccountManager.get(context)
selectedAccount?.account?.setColor(am, data.getIntExtra(EXTRA_COLOR, Color.WHITE))
val accountKey: UserKey = data.getBundleExtra(EXTRA_EXTRAS).getParcelable(EXTRA_ACCOUNT_KEY) ?: return
val color = data.getIntExtra(EXTRA_COLOR, Color.WHITE)
val details = adapter.findItem(accountKey) ?: return
details.color = color
details.account.setColor(am, color)
adapter.notifyDataSetChanged()
return
}
}
@ -113,11 +120,13 @@ class AccountsManagerFragment : BaseSupportFragment(), LoaderManager.LoaderCallb
override fun onContextItemSelected(item: MenuItem?): Boolean {
val menuInfo = item!!.menuInfo as? AdapterContextMenuInfo ?: return false
val details = adapter.getItem(menuInfo.position) ?: return false
selectedAccount = details
when (item.itemId) {
R.id.set_color -> {
val intent = Intent(activity, ColorPickerDialogActivity::class.java)
intent.putExtra(EXTRA_COLOR, details.color)
intent.putExtra(EXTRA_EXTRAS, Bundle {
this[EXTRA_ACCOUNT_KEY] = details.key
})
intent.putExtra(EXTRA_ALPHA_SLIDER, false)
startActivityForResult(intent, REQUEST_SET_COLOR)
}
@ -174,7 +183,7 @@ class AccountsManagerFragment : BaseSupportFragment(), LoaderManager.LoaderCallb
class AccountDeletionDialogFragment : BaseDialogFragment(), DialogInterface.OnClickListener {
override fun onClick(dialog: DialogInterface, which: Int) {
val account: Account = arguments.getParcelable(IntentConstants.EXTRA_ACCOUNT)
val account: Account = arguments.getParcelable(EXTRA_ACCOUNT)
val resolver = context.contentResolver
val am = AccountManager.get(context)
when (which) {

View File

@ -60,8 +60,8 @@ import org.mariotaku.twidere.model.util.ParcelableUserUtils
import org.mariotaku.twidere.task.UpdateAccountInfoTask
import org.mariotaku.twidere.task.UpdateProfileBackgroundImageTask
import org.mariotaku.twidere.task.UpdateProfileBannerImageTask
import org.mariotaku.twidere.task.UpdateProfileImageTask
import org.mariotaku.twidere.util.*
import org.mariotaku.twidere.util.AsyncTwitterWrapper.UpdateProfileImageTask
import org.mariotaku.twidere.view.iface.IExtendedView.OnSizeChangedListener
class UserProfileEditorFragment : BaseSupportFragment(), OnSizeChangedListener, TextWatcher,
@ -390,9 +390,9 @@ class UserProfileEditorFragment : BaseSupportFragment(), OnSizeChangedListener,
return false
}
override fun afterExecute(callback: UserProfileEditorFragment?, result: SingleResponse<ParcelableUser>) {
if (callback == null) return
val activity = callback.activity ?: return
override fun afterExecute(handler: UserProfileEditorFragment?, result: SingleResponse<ParcelableUser>) {
if (handler == null) return
val activity = handler.activity ?: return
if (result.hasData()) {
val account: AccountDetails? = result.extras.getParcelable(EXTRA_ACCOUNT)
if (account != null) {
@ -401,7 +401,7 @@ class UserProfileEditorFragment : BaseSupportFragment(), OnSizeChangedListener,
TaskStarter.execute(task)
}
}
callback.executeAfterFragmentResumed { fragment ->
handler.executeAfterFragmentResumed { fragment ->
val f = (fragment as UserProfileEditorFragment).fragmentManager.findFragmentByTag(DIALOG_FRAGMENT_TAG)
if (f is DialogFragment) {
f.dismissAllowingStateLoss()
@ -432,8 +432,8 @@ class UserProfileEditorFragment : BaseSupportFragment(), OnSizeChangedListener,
return TwitterWrapper.deleteProfileBannerImage(activity, accountKey)
}
override fun afterExecute(callback: UserProfileEditorFragment?, result: SingleResponse<Boolean>) {
super.afterExecute(callback, result)
override fun afterExecute(handler: UserProfileEditorFragment?, result: SingleResponse<Boolean>) {
super.afterExecute(handler, result)
if (result.data != null) {
getUserInfo()
Toast.makeText(activity, R.string.profile_banner_image_updated, Toast.LENGTH_SHORT).show()
@ -454,8 +454,8 @@ class UserProfileEditorFragment : BaseSupportFragment(), OnSizeChangedListener,
private inner class UpdateProfileBannerImageTaskInternal(context: Context, accountKey: UserKey,
imageUri: Uri, deleteImage: Boolean) : UpdateProfileBannerImageTask<UserProfileEditorFragment>(context, accountKey, imageUri, deleteImage) {
override fun afterExecute(callback: UserProfileEditorFragment?, result: SingleResponse<ParcelableUser>?) {
super.afterExecute(callback, result)
override fun afterExecute(handler: UserProfileEditorFragment?, result: SingleResponse<ParcelableUser>?) {
super.afterExecute(handler, result)
setUpdateState(false)
getUserInfo()
}
@ -467,12 +467,17 @@ class UserProfileEditorFragment : BaseSupportFragment(), OnSizeChangedListener,
}
private inner class UpdateProfileBackgroundImageTaskInternal(context: Context, accountKey: UserKey,
imageUri: Uri, tile: Boolean,
deleteImage: Boolean) : UpdateProfileBackgroundImageTask<UserProfileEditorFragment>(context, accountKey, imageUri, tile, deleteImage) {
private inner class UpdateProfileBackgroundImageTaskInternal(
context: Context,
accountKey: UserKey,
imageUri: Uri,
tile: Boolean,
deleteImage: Boolean
) : UpdateProfileBackgroundImageTask<UserProfileEditorFragment>(context, accountKey, imageUri,
tile, deleteImage) {
override fun afterExecute(callback: UserProfileEditorFragment?, result: SingleResponse<ParcelableUser>?) {
super.afterExecute(callback, result)
override fun afterExecute(handler: UserProfileEditorFragment?, result: SingleResponse<ParcelableUser>) {
super.afterExecute(handler, result)
setUpdateState(false)
getUserInfo()
}
@ -484,12 +489,16 @@ class UserProfileEditorFragment : BaseSupportFragment(), OnSizeChangedListener,
}
private inner class UpdateProfileImageTaskInternal(context: Context, accountKey: UserKey,
imageUri: Uri, deleteImage: Boolean) : UpdateProfileImageTask<UserProfileEditorFragment>(context, accountKey, imageUri, deleteImage) {
private inner class UpdateProfileImageTaskInternal(
context: Context,
accountKey: UserKey,
imageUri: Uri,
deleteImage: Boolean
) : UpdateProfileImageTask<UserProfileEditorFragment>(context, accountKey, imageUri, deleteImage) {
override fun afterExecute(callback: UserProfileEditorFragment?, result: SingleResponse<ParcelableUser>?) {
super.afterExecute(callback, result)
if (result != null && result.data != null) {
override fun afterExecute(handler: UserProfileEditorFragment?, result: SingleResponse<ParcelableUser>) {
super.afterExecute(handler, result)
if (result.data != null) {
displayUser(result.data)
}
setUpdateState(false)

View File

@ -4,6 +4,7 @@ import android.accounts.AccountManager
import android.content.Context
import com.squareup.otto.Bus
import org.mariotaku.abstask.library.AbstractTask
import org.mariotaku.kpreferences.KPreferences
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.twitter.model.User
@ -36,6 +37,8 @@ abstract class AbsFriendshipOperationTask(
@Inject
lateinit var preferences: SharedPreferencesWrapper
@Inject
lateinit var kPreferences: KPreferences
@Inject
lateinit var manager: UserColorNameManager
init {
@ -51,7 +54,7 @@ abstract class AbsFriendshipOperationTask(
bus.post(event)
}
override fun afterExecute(callback: Any?, result: SingleResponse<ParcelableUser>?) {
override fun afterExecute(handler: Any?, result: SingleResponse<ParcelableUser>?) {
twitter.removeUpdatingRelationshipId(params.accountKey, params.userKey)
val event = FriendshipTaskEvent(action, params.accountKey,
params.userKey)

View File

@ -0,0 +1,46 @@
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.Constants
import org.mariotaku.twidere.R
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.message.FriendshipTaskEvent
import org.mariotaku.twidere.util.Utils
/**
* Created by mariotaku on 16/3/11.
*/
class AcceptFriendshipTask(context: Context) : AbsFriendshipOperationTask(context, FriendshipTaskEvent.Action.ACCEPT), Constants {
@Throws(MicroBlogException::class)
override fun perform(twitter: MicroBlog, details: AccountDetails, args: AbsFriendshipOperationTask.Arguments): User {
when (details.type) {
AccountType.FANFOU -> {
return twitter.acceptFanfouFriendship(args.userKey.id)
}
}
return twitter.acceptFriendship(args.userKey.id)
}
override fun succeededWorker(twitter: MicroBlog, details: AccountDetails, args: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
Utils.setLastSeen(context, user.key, System.currentTimeMillis())
}
override fun showErrorMessage(params: AbsFriendshipOperationTask.Arguments, exception: Exception?) {
Utils.showErrorMessage(context, R.string.action_accepting_follow_request, exception, false)
}
override fun showSucceededMessage(params: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
val nameFirst = kPreferences[nameFirstKey]
val message = context.getString(R.string.accepted_users_follow_request,
manager.getDisplayName(user, nameFirst))
Utils.showOkMessage(context, message, false)
}
}

View File

@ -0,0 +1,62 @@
package org.mariotaku.twidere.task
import android.content.Context
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.SharedPreferenceConstants.KEY_NAME_FIRST
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.ParcelableUserList
import org.mariotaku.twidere.model.SingleResponse
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.message.UserListMembersChangedEvent
import org.mariotaku.twidere.model.util.ParcelableUserListUtils
import org.mariotaku.twidere.util.MicroBlogAPIFactory
import org.mariotaku.twidere.util.Utils
/**
* Created by mariotaku on 2016/12/9.
*/
class AddUserListMembersTask(
context: Context,
private val accountKey: UserKey,
private val listId: String,
private val users: Array<ParcelableUser>
) : ManagedAsyncTask<Any, Any, SingleResponse<ParcelableUserList>>(context) {
override fun doInBackground(vararg params: Any): SingleResponse<ParcelableUserList> {
val microBlog = MicroBlogAPIFactory.getInstance(context, accountKey) ?: return SingleResponse.getInstance<ParcelableUserList>()
try {
val userIds = users.map(ParcelableUser::key).toTypedArray()
val result = microBlog.addUserListMembers(listId, UserKey.getIds(userIds))
val list = ParcelableUserListUtils.from(result, accountKey)
return SingleResponse.getInstance(list)
} catch (e: MicroBlogException) {
return SingleResponse.getInstance<ParcelableUserList>(e)
}
}
override fun onPostExecute(result: SingleResponse<ParcelableUserList>) {
if (result.data != null) {
val message: String
if (users.size == 1) {
val user = users.first()
val nameFirst = preferences.getBoolean(KEY_NAME_FIRST)
val displayName = userColorNameManager.getDisplayName(user.key, user.name,
user.screen_name, nameFirst)
message = context.getString(R.string.added_user_to_list, displayName, result.data.name)
} else {
val res = context.resources
message = res.getQuantityString(R.plurals.added_N_users_to_list, users.size, users.size,
result.data.name)
}
Utils.showOkMessage(context, message, false)
bus.post(UserListMembersChangedEvent(UserListMembersChangedEvent.Action.ADDED, result.data,
users))
} else {
Utils.showErrorMessage(context, R.string.action_adding_member, result.exception, true)
}
super.onPostExecute(result)
}
}

View File

@ -0,0 +1,64 @@
package org.mariotaku.twidere.task
import android.content.Context
import android.text.TextUtils
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.twitter.model.User
import org.mariotaku.twidere.Constants
import org.mariotaku.twidere.R
import org.mariotaku.twidere.TwidereConstants.USER_TYPE_FANFOU_COM
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.message.FriendshipTaskEvent
import org.mariotaku.twidere.util.Utils
/**
* Created by mariotaku on 16/3/11.
*/
class CreateFriendshipTask(context: Context) : AbsFriendshipOperationTask(context, FriendshipTaskEvent.Action.FOLLOW), Constants {
@Throws(MicroBlogException::class)
override fun perform(twitter: MicroBlog, details: AccountDetails, args: AbsFriendshipOperationTask.Arguments): User {
when (details.type) {
AccountType.FANFOU -> {
return twitter.createFanfouFriendship(args.userKey.id)
}
}
return twitter.createFriendship(args.userKey.id)
}
override fun succeededWorker(twitter: MicroBlog, details: AccountDetails, args: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
user.is_following = true
Utils.setLastSeen(context, user.key, System.currentTimeMillis())
}
override fun showErrorMessage(params: AbsFriendshipOperationTask.Arguments, exception: Exception?) {
if (USER_TYPE_FANFOU_COM == params.accountKey.host) {
// Fanfou returns 403 for follow request
if (exception is MicroBlogException) {
if (exception.statusCode == 403 && !TextUtils.isEmpty(exception.errorMessage)) {
Utils.showErrorMessage(context, exception.errorMessage, false)
return
}
}
}
Utils.showErrorMessage(context, R.string.action_following, exception, false)
}
override fun showSucceededMessage(params: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
val nameFirst = kPreferences[nameFirstKey]
val message: String
if (user.is_protected) {
message = context.getString(R.string.sent_follow_request_to_user,
manager.getDisplayName(user, nameFirst))
} else {
message = context.getString(R.string.followed_user,
manager.getDisplayName(user, nameFirst))
}
Utils.showOkMessage(context, message, false)
}
}

View File

@ -0,0 +1,78 @@
package org.mariotaku.twidere.task
import android.content.ContentValues
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.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.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.message.FriendshipTaskEvent
import org.mariotaku.twidere.provider.TwidereDataStore.*
import org.mariotaku.twidere.util.DataStoreUtils
import org.mariotaku.twidere.util.Utils
/**
* Created by mariotaku on 16/3/11.
*/
open class CreateUserBlockTask(context: Context) : AbsFriendshipOperationTask(context, FriendshipTaskEvent.Action.BLOCK), Constants {
@Throws(MicroBlogException::class)
override fun perform(twitter: MicroBlog, details: AccountDetails,
args: AbsFriendshipOperationTask.Arguments): User {
when (details.type) {
AccountType.FANFOU -> {
return twitter.createFanfouBlock(args.userKey.id)
}
}
return twitter.createBlock(args.userKey.id)
}
override fun succeededWorker(twitter: MicroBlog,
details: AccountDetails,
args: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
val resolver = context.contentResolver
Utils.setLastSeen(context, args.userKey, -1)
for (uri in DataStoreUtils.STATUSES_URIS) {
val where = Expression.and(
Expression.equalsArgs(Statuses.ACCOUNT_KEY),
Expression.equalsArgs(Statuses.USER_KEY)
)
val whereArgs = arrayOf(args.accountKey.toString(), args.userKey.toString())
resolver.delete(uri, where.sql, whereArgs)
}
for (uri in DataStoreUtils.ACTIVITIES_URIS) {
val where = Expression.and(
Expression.equalsArgs(Activities.ACCOUNT_KEY),
Expression.equalsArgs(Activities.STATUS_USER_KEY)
)
val whereArgs = arrayOf(args.accountKey.toString(), args.userKey.toString())
resolver.delete(uri, where.sql, whereArgs)
}
// I bet you don't want to see this user in your auto complete list.
val values = ContentValues()
values.put(CachedRelationships.ACCOUNT_KEY, args.accountKey.toString())
values.put(CachedRelationships.USER_KEY, args.userKey.toString())
values.put(CachedRelationships.BLOCKING, true)
values.put(CachedRelationships.FOLLOWING, false)
values.put(CachedRelationships.FOLLOWED_BY, false)
resolver.insert(CachedRelationships.CONTENT_URI, values)
}
override fun showSucceededMessage(params: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
val nameFirst = kPreferences[nameFirstKey]
val message = context.getString(R.string.blocked_user, manager.getDisplayName(user,
nameFirst))
Utils.showInfoMessage(context, message, false)
}
override fun showErrorMessage(params: AbsFriendshipOperationTask.Arguments, exception: Exception?) {
Utils.showErrorMessage(context, R.string.action_blocking, exception, true)
}
}

View File

@ -0,0 +1,71 @@
package org.mariotaku.twidere.task
import android.content.ContentValues
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.sqliteqb.library.Expression
import org.mariotaku.twidere.R
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.message.FriendshipTaskEvent
import org.mariotaku.twidere.provider.TwidereDataStore.*
import org.mariotaku.twidere.util.DataStoreUtils
import org.mariotaku.twidere.util.Utils
/**
* Created by mariotaku on 16/3/11.
*/
class CreateUserMuteTask(context: Context) : 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 succeededWorker(twitter: MicroBlog,
details: AccountDetails,
args: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
val resolver = context.contentResolver
Utils.setLastSeen(context, args.userKey, -1)
for (uri in DataStoreUtils.STATUSES_URIS) {
val where = Expression.and(
Expression.equalsArgs(Statuses.ACCOUNT_KEY),
Expression.equalsArgs(Statuses.USER_KEY)
)
val whereArgs = arrayOf(args.accountKey.toString(), args.userKey.toString())
resolver.delete(uri, where.sql, whereArgs)
}
if (!user.is_following) {
for (uri in DataStoreUtils.ACTIVITIES_URIS) {
val where = Expression.and(
Expression.equalsArgs(Activities.ACCOUNT_KEY),
Expression.equalsArgs(Activities.STATUS_USER_KEY)
)
val whereArgs = arrayOf(args.accountKey.toString(), args.userKey.toString())
resolver.delete(uri, where.sql, whereArgs)
}
}
// I bet you don't want to see this user in your auto complete list.
val values = ContentValues()
values.put(CachedRelationships.ACCOUNT_KEY, args.accountKey.toString())
values.put(CachedRelationships.USER_KEY, args.userKey.toString())
values.put(CachedRelationships.MUTING, true)
resolver.insert(CachedRelationships.CONTENT_URI, values)
}
override fun showSucceededMessage(params: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
val nameFirst = kPreferences[nameFirstKey]
val message = context.getString(R.string.muted_user, manager.getDisplayName(user,
nameFirst))
Utils.showInfoMessage(context, message, false)
}
override fun showErrorMessage(params: AbsFriendshipOperationTask.Arguments, exception: Exception?) {
Utils.showErrorMessage(context, R.string.action_muting, exception, true)
}
}

View File

@ -0,0 +1,45 @@
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.R
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.message.FriendshipTaskEvent
import org.mariotaku.twidere.util.Utils
/**
* Created by mariotaku on 16/3/11.
*/
class DenyFriendshipTask(context: Context) : AbsFriendshipOperationTask(context, FriendshipTaskEvent.Action.DENY) {
@Throws(MicroBlogException::class)
override fun perform(twitter: MicroBlog, details: AccountDetails, args: AbsFriendshipOperationTask.Arguments): User {
when (details.type) {
AccountType.FANFOU -> {
return twitter.denyFanfouFriendship(args.userKey.id)
}
}
return twitter.denyFriendship(args.userKey.id)
}
override fun succeededWorker(twitter: MicroBlog, details: AccountDetails, args: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
Utils.setLastSeen(context, user.key, -1)
}
override fun showErrorMessage(params: AbsFriendshipOperationTask.Arguments, exception: Exception?) {
Utils.showErrorMessage(context, R.string.action_denying_follow_request, exception, false)
}
override fun showSucceededMessage(params: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
val nameFirst = kPreferences[nameFirstKey]
val message = context.getString(R.string.denied_users_follow_request,
manager.getDisplayName(user, nameFirst))
Utils.showOkMessage(context, message, false)
}
}

View File

@ -0,0 +1,54 @@
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.sqliteqb.library.Expression
import org.mariotaku.twidere.R
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.message.FriendshipTaskEvent
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses
import org.mariotaku.twidere.util.Utils
/**
* Created by mariotaku on 16/3/11.
*/
class DestroyFriendshipTask(context: Context) : AbsFriendshipOperationTask(context, FriendshipTaskEvent.Action.UNFOLLOW) {
@Throws(MicroBlogException::class)
override fun perform(twitter: MicroBlog, details: AccountDetails, args: AbsFriendshipOperationTask.Arguments): User {
when (details.type) {
AccountType.FANFOU -> {
return twitter.destroyFanfouFriendship(args.userKey.id)
}
}
return twitter.destroyFriendship(args.userKey.id)
}
override fun succeededWorker(twitter: MicroBlog, details: AccountDetails, args: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
user.is_following = false
Utils.setLastSeen(context, user.key, -1)
val where = Expression.and(Expression.equalsArgs(Statuses.ACCOUNT_KEY),
Expression.or(Expression.equalsArgs(Statuses.USER_KEY),
Expression.equalsArgs(Statuses.RETWEETED_BY_USER_KEY)))
val whereArgs = arrayOf(args.userKey.toString(), args.userKey.toString(), args.userKey.toString())
val resolver = context.contentResolver
resolver.delete(Statuses.CONTENT_URI, where.sql, whereArgs)
}
override fun showErrorMessage(params: AbsFriendshipOperationTask.Arguments, exception: Exception?) {
Utils.showErrorMessage(context, R.string.action_unfollowing, exception, false)
}
override fun showSucceededMessage(params: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
val nameFirst = kPreferences[nameFirstKey]
val message = context.getString(R.string.unfollowed_user,
manager.getDisplayName(user, nameFirst))
Utils.showInfoMessage(context, message, false)
}
}

View File

@ -0,0 +1,79 @@
package org.mariotaku.twidere.task
import android.accounts.AccountManager
import android.content.Context
import org.mariotaku.microblog.library.MicroBlog
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.microblog.library.twitter.model.ErrorInfo
import org.mariotaku.twidere.R
import org.mariotaku.twidere.extension.model.newMicroBlogInstance
import org.mariotaku.twidere.model.ParcelableStatus
import org.mariotaku.twidere.model.SingleResponse
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.message.StatusDestroyedEvent
import org.mariotaku.twidere.model.message.StatusListChangedEvent
import org.mariotaku.twidere.model.util.AccountUtils
import org.mariotaku.twidere.model.util.ParcelableStatusUtils
import org.mariotaku.twidere.util.AsyncTwitterWrapper
import org.mariotaku.twidere.util.DataStoreUtils
import org.mariotaku.twidere.util.Utils
/**
* Created by mariotaku on 2016/12/9.
*/
class DestroyStatusTask(
context: Context,
private val accountKey: UserKey,
private val statusId: String
) : ManagedAsyncTask<Any, Any, SingleResponse<ParcelableStatus>>(context) {
override fun doInBackground(vararg params: Any): SingleResponse<ParcelableStatus> {
val details = AccountUtils.getAccountDetails(AccountManager.get(context), accountKey)
?: return SingleResponse()
val microBlog = details.newMicroBlogInstance(context, cls = MicroBlog::class.java)
var status: ParcelableStatus? = null
var deleteStatus: Boolean = false
try {
status = ParcelableStatusUtils.fromStatus(microBlog.destroyStatus(statusId),
accountKey, false)
ParcelableStatusUtils.updateExtraInformation(status, details,
userColorNameManager)
deleteStatus = true
return SingleResponse(status)
} catch (e: MicroBlogException) {
deleteStatus = e.errorCode == ErrorInfo.STATUS_NOT_FOUND
return SingleResponse(exception = e)
} finally {
if (deleteStatus) {
DataStoreUtils.deleteStatus(context.contentResolver, accountKey, statusId, status)
DataStoreUtils.deleteActivityStatus(context.contentResolver, accountKey, statusId, status)
}
}
}
override fun onPreExecute() {
super.onPreExecute()
val hashCode = AsyncTwitterWrapper.calculateHashCode(accountKey, statusId)
if (!asyncTwitterWrapper.destroyingStatusIds.contains(hashCode)) {
asyncTwitterWrapper.destroyingStatusIds.add(hashCode)
}
bus.post(StatusListChangedEvent())
}
override fun onPostExecute(result: SingleResponse<ParcelableStatus>) {
asyncTwitterWrapper.destroyingStatusIds.removeElement(AsyncTwitterWrapper.calculateHashCode(accountKey, statusId))
if (result.hasData()) {
val status = result.data!!
if (status.retweet_id != null) {
Utils.showInfoMessage(context, R.string.retweet_cancelled, false)
} else {
Utils.showInfoMessage(context, R.string.status_deleted, false)
}
bus.post(StatusDestroyedEvent(status))
} else {
Utils.showErrorMessage(context, R.string.action_deleting, result.exception, true)
}
super.onPostExecute(result)
}
}

View File

@ -0,0 +1,58 @@
package org.mariotaku.twidere.task
import android.content.ContentValues
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.R
import org.mariotaku.twidere.annotation.AccountType
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.message.FriendshipTaskEvent
import org.mariotaku.twidere.provider.TwidereDataStore.CachedRelationships
import org.mariotaku.twidere.util.Utils
/**
* Created by mariotaku on 16/3/11.
*/
class DestroyUserBlockTask(context: Context) : AbsFriendshipOperationTask(context, FriendshipTaskEvent.Action.UNBLOCK) {
@Throws(MicroBlogException::class)
override fun perform(twitter: MicroBlog, details: AccountDetails,
args: AbsFriendshipOperationTask.Arguments): User {
when (details.type) {
AccountType.FANFOU -> {
return twitter.destroyFanfouBlock(args.userKey.id)
}
}
return twitter.destroyBlock(args.userKey.id)
}
override fun succeededWorker(twitter: MicroBlog,
details: AccountDetails,
args: AbsFriendshipOperationTask.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()
values.put(CachedRelationships.ACCOUNT_KEY, args.accountKey.toString())
values.put(CachedRelationships.USER_KEY, args.userKey.toString())
values.put(CachedRelationships.BLOCKING, false)
values.put(CachedRelationships.FOLLOWING, false)
values.put(CachedRelationships.FOLLOWED_BY, false)
resolver.insert(CachedRelationships.CONTENT_URI, values)
}
override fun showSucceededMessage(params: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
val nameFirst = kPreferences[nameFirstKey]
val message = context.getString(R.string.unblocked_user, manager.getDisplayName(user,
nameFirst))
Utils.showInfoMessage(context, message, false)
}
override fun showErrorMessage(params: AbsFriendshipOperationTask.Arguments, exception: Exception?) {
Utils.showErrorMessage(context, R.string.action_unblocking, exception, true)
}
}

View File

@ -0,0 +1,50 @@
package org.mariotaku.twidere.task
import android.content.ContentValues
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.R
import org.mariotaku.twidere.constant.nameFirstKey
import org.mariotaku.twidere.model.AccountDetails
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.message.FriendshipTaskEvent
import org.mariotaku.twidere.provider.TwidereDataStore.CachedRelationships
import org.mariotaku.twidere.util.Utils
/**
* Created by mariotaku on 16/3/11.
*/
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 succeededWorker(twitter: MicroBlog,
details: AccountDetails,
args: AbsFriendshipOperationTask.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()
values.put(CachedRelationships.ACCOUNT_KEY, args.accountKey.toString())
values.put(CachedRelationships.USER_KEY, args.userKey.toString())
values.put(CachedRelationships.MUTING, false)
resolver.insert(CachedRelationships.CONTENT_URI, values)
}
override fun showSucceededMessage(params: AbsFriendshipOperationTask.Arguments, user: ParcelableUser) {
val nameFirst = kPreferences[nameFirstKey]
val message = context.getString(R.string.unmuted_user, manager.getDisplayName(user,
nameFirst))
Utils.showInfoMessage(context, message, false)
}
override fun showErrorMessage(params: AbsFriendshipOperationTask.Arguments, exception: Exception?) {
Utils.showErrorMessage(context, R.string.action_unmuting, exception, true)
}
}

View File

@ -0,0 +1,76 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 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.task
import android.content.Context
import android.os.AsyncTask
import com.squareup.otto.Bus
import org.mariotaku.twidere.model.message.TaskStateChangedEvent
import org.mariotaku.twidere.util.AsyncTaskManager
import org.mariotaku.twidere.util.AsyncTwitterWrapper
import org.mariotaku.twidere.util.SharedPreferencesWrapper
import org.mariotaku.twidere.util.UserColorNameManager
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper
import javax.inject.Inject
abstract class ManagedAsyncTask<Params, Progress, Result> @JvmOverloads constructor(
val context: Context,
val tag: String? = null
) : AsyncTask<Params, Progress, Result>() {
@Inject
lateinit var manager: AsyncTaskManager
@Inject
lateinit var bus: Bus
@Inject
lateinit var userColorNameManager: UserColorNameManager
@Inject
lateinit var preferences: SharedPreferencesWrapper
@Inject
lateinit var asyncTwitterWrapper: AsyncTwitterWrapper
init {
@Suppress("UNCHECKED_CAST")
GeneralComponentHelper.build(context).inject(this as ManagedAsyncTask<Any, Any, Any>)
}
override fun onCancelled() {
super.onCancelled()
bus.post(TaskStateChangedEvent())
}
override fun onPostExecute(result: Result) {
super.onPostExecute(result)
bus.post(TaskStateChangedEvent())
}
override fun onPreExecute() {
super.onPreExecute()
bus.post(TaskStateChangedEvent())
}
protected fun finalize() {
manager.remove(hashCode())
}
}

View File

@ -0,0 +1,20 @@
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.model.AccountDetails
/**
* Created by mariotaku on 16/3/11.
*/
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)
}
}

View File

@ -0,0 +1,77 @@
package org.mariotaku.twidere.task
import android.content.Context
import android.net.Uri
import android.util.Log
import com.squareup.otto.Bus
import org.mariotaku.abstask.library.AbstractTask
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.twidere.Constants
import org.mariotaku.twidere.R
import org.mariotaku.twidere.TwidereConstants.LOGTAG
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.SingleResponse
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.message.ProfileUpdatedEvent
import org.mariotaku.twidere.model.util.ParcelableUserUtils
import org.mariotaku.twidere.util.MicroBlogAPIFactory
import org.mariotaku.twidere.util.TwitterWrapper
import org.mariotaku.twidere.util.Utils
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper
import java.io.IOException
import javax.inject.Inject
/**
* Created by mariotaku on 16/3/11.
*/
open class UpdateProfileBackgroundImageTask<ResultHandler>(
private val context: Context,
private val accountKey: UserKey,
private val imageUri: Uri,
private val tile: Boolean,
private val deleteImage: Boolean
) : AbstractTask<Any, SingleResponse<ParcelableUser>, ResultHandler>(), Constants {
@Inject
lateinit var bus: Bus
init {
@Suppress("UNCHECKED_CAST")
GeneralComponentHelper.build(context).inject(this as UpdateProfileBackgroundImageTask<Any>)
}
override fun afterExecute(handler: ResultHandler?, result: SingleResponse<ParcelableUser>) {
super.afterExecute(handler, result)
if (result.hasData()) {
Utils.showOkMessage(context, R.string.profile_banner_image_updated, false)
bus.post(ProfileUpdatedEvent(result.data!!))
} else {
Utils.showErrorMessage(context, R.string.action_updating_profile_background_image,
result.exception, true)
}
}
override fun doLongOperation(params: Any): SingleResponse<ParcelableUser> {
try {
val twitter = MicroBlogAPIFactory.getInstance(context, accountKey)!!
TwitterWrapper.updateProfileBackgroundImage(context, twitter, imageUri, tile,
deleteImage)
// Wait for 5 seconds, see
// https://dev.twitter.com/docs/api/1.1/post/account/update_profile_image
try {
Thread.sleep(5000L)
} catch (e: InterruptedException) {
Log.w(LOGTAG, e)
}
val user = twitter.verifyCredentials()
return SingleResponse(ParcelableUserUtils.fromUser(user, accountKey))
} catch (e: MicroBlogException) {
return SingleResponse(exception = e)
} catch (e: IOException) {
return SingleResponse(exception = e)
}
}
}

View File

@ -0,0 +1,75 @@
package org.mariotaku.twidere.task
import android.content.Context
import android.net.Uri
import android.util.Log
import com.squareup.otto.Bus
import org.mariotaku.abstask.library.AbstractTask
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.twidere.Constants
import org.mariotaku.twidere.R
import org.mariotaku.twidere.TwidereConstants.LOGTAG
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.SingleResponse
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.message.ProfileUpdatedEvent
import org.mariotaku.twidere.model.util.ParcelableUserUtils
import org.mariotaku.twidere.util.MicroBlogAPIFactory
import org.mariotaku.twidere.util.TwitterWrapper
import org.mariotaku.twidere.util.Utils
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper
import java.io.IOException
import javax.inject.Inject
/**
* Created by mariotaku on 16/3/11.
*/
open class UpdateProfileBannerImageTask<ResultHandler>(
private val context: Context,
private val accountKey: UserKey,
private val imageUri: Uri,
private val deleteImage: Boolean
) : AbstractTask<Any, SingleResponse<ParcelableUser>, ResultHandler>(), Constants {
@Inject
lateinit var mBus: Bus
init {
@Suppress("UNCHECKED_CAST")
GeneralComponentHelper.build(context).inject(this as UpdateProfileBannerImageTask<Any>)
}
override fun afterExecute(handler: ResultHandler?, result: SingleResponse<ParcelableUser>?) {
super.afterExecute(handler, result)
if (result!!.hasData()) {
Utils.showOkMessage(context, R.string.profile_banner_image_updated, false)
mBus.post(ProfileUpdatedEvent(result.data!!))
} else {
Utils.showErrorMessage(context, R.string.action_updating_profile_banner_image, result.exception,
true)
}
}
override fun doLongOperation(params: Any): SingleResponse<ParcelableUser> {
try {
val twitter = MicroBlogAPIFactory.getInstance(context, accountKey)!!
TwitterWrapper.updateProfileBannerImage(context, twitter, imageUri, deleteImage)
// Wait for 5 seconds, see
// https://dev.twitter.com/docs/api/1.1/post/account/update_profile_image
try {
Thread.sleep(5000L)
} catch (e: InterruptedException) {
Log.w(LOGTAG, e)
}
val user = twitter.verifyCredentials()
return SingleResponse(ParcelableUserUtils.fromUser(user, accountKey))
} catch (e: MicroBlogException) {
return SingleResponse(exception = e)
} catch (e: IOException) {
return SingleResponse(exception = e)
}
}
}

View File

@ -0,0 +1,73 @@
package org.mariotaku.twidere.task
import android.content.Context
import android.net.Uri
import android.util.Log
import com.squareup.otto.Bus
import org.mariotaku.abstask.library.AbstractTask
import org.mariotaku.microblog.library.MicroBlogException
import org.mariotaku.twidere.R
import org.mariotaku.twidere.TwidereConstants
import org.mariotaku.twidere.model.ParcelableUser
import org.mariotaku.twidere.model.SingleResponse
import org.mariotaku.twidere.model.UserKey
import org.mariotaku.twidere.model.message.ProfileUpdatedEvent
import org.mariotaku.twidere.model.util.ParcelableUserUtils
import org.mariotaku.twidere.util.MicroBlogAPIFactory
import org.mariotaku.twidere.util.TwitterWrapper
import org.mariotaku.twidere.util.Utils
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper
import java.io.IOException
import javax.inject.Inject
/**
* Created by mariotaku on 2016/12/9.
*/
open class UpdateProfileImageTask<ResultHandler>(
private val context: Context,
private val accountKey: UserKey,
private val imageUri: Uri,
private val deleteImage: Boolean
) : AbstractTask<Any, SingleResponse<ParcelableUser>, ResultHandler>() {
@Inject
lateinit var bus: Bus
init {
@Suppress("UNCHECKED_CAST")
GeneralComponentHelper.build(context).inject(this as UpdateProfileImageTask<Any>)
}
override fun doLongOperation(params: Any): SingleResponse<ParcelableUser> {
try {
val microBlog = MicroBlogAPIFactory.getInstance(context, accountKey)!!
TwitterWrapper.updateProfileImage(context, microBlog, imageUri, deleteImage)
// Wait for 5 seconds, see
// https://dev.twitter.com/rest/reference/post/account/update_profile_image
try {
Thread.sleep(5000L)
} catch (e: InterruptedException) {
Log.w(TwidereConstants.LOGTAG, e)
}
val user = microBlog.verifyCredentials()
return SingleResponse(ParcelableUserUtils.fromUser(user, accountKey))
} catch (e: MicroBlogException) {
return SingleResponse(exception = e)
} catch (e: IOException) {
return SingleResponse(exception = e)
}
}
override fun afterExecute(handler: ResultHandler?, result: SingleResponse<ParcelableUser>) {
super.afterExecute(handler, result)
if (result.hasData()) {
Utils.showOkMessage(context, R.string.profile_image_updated, false)
bus.post(ProfileUpdatedEvent(result.data!!))
} else {
Utils.showErrorMessage(context, R.string.action_updating_profile_image, result.exception, true)
}
}
}

View File

@ -129,7 +129,7 @@ interface GeneralComponent {
fun inject(task: UpdateProfileBannerImageTask<Any>)
fun inject(task: AsyncTwitterWrapper.UpdateProfileImageTask<Any>)
fun inject(task: UpdateProfileImageTask<Any>)
fun inject(loader: APIEditorActivity.LoadDefaultsChooserDialogFragment.DefaultAPIConfigLoader)