/*
* Copyright (C) 2013 Chris Lacy
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.tweetalib.android;
import android.util.Log;
import org.appdotnet4j.model.AdnPost;
import org.asynctasktex.AsyncTaskEx;
import org.socialnetlib.android.AppdotnetApi;
import org.tweetalib.android.TwitterConstant.StatusesType;
import org.tweetalib.android.model.TwitterStatus;
import org.tweetalib.android.model.TwitterStatuses;
import java.util.HashMap;
import twitter4j.Twitter;
import twitter4j.TwitterException;
public class TwitterModifyStatuses {
private ModifyStatusesWorkerCallbacks mCallbacks;
private Integer mModifyStatusesCallbackHandle;
private final HashMap<Integer, FinishedCallback> mFinishedCallbackMap;
/*
*
*/
public void clearCallbacks() {
if (mFinishedCallbackMap != null) {
mFinishedCallbackMap.clear();
}
}
/*
*
*/
public interface ModifyStatusesWorkerCallbacks {
public Twitter getTwitterInstance();
public AppdotnetApi getAppdotnetApi();
}
/*
*
*/
public interface FinishedCallbackInterface {
public void finished(boolean successful, TwitterStatuses statuses, Integer value);
}
/*
*
*/
public abstract class FinishedCallback implements FinishedCallbackInterface {
static final int kInvalidHandle = -1;
public FinishedCallback() {
mHandle = kInvalidHandle;
}
private int mHandle;
}
/*
*
*/
public abstract class FinishedDeleteCallback extends FinishedCallback {
static final int kInvalidHandle = -1;
private final TwitterStatuses mStatuses;
public FinishedDeleteCallback(TwitterStatuses statuses) {
mStatuses = statuses;
mHandle = kInvalidHandle;
}
void setHandle(int handle) {
mHandle = handle;
}
private int mHandle;
public TwitterStatuses getStatuses() {
return mStatuses;
}
}
/*
*
*/
public TwitterModifyStatuses() {
mFinishedCallbackMap = new HashMap<Integer, FinishedCallback>();
mModifyStatusesCallbackHandle = 0;
}
/*
*
*/
public void setWorkerCallbacks(ModifyStatusesWorkerCallbacks callbacks) {
mCallbacks = callbacks;
}
/*
*
*/
/*
*
*/
FinishedCallback getModifyStatusesCallback(Integer callbackHandle) {
return mFinishedCallbackMap.get(callbackHandle);
}
/*
*
*/
void removeModifyStatusesCallback(FinishedCallback callback) {
if (mFinishedCallbackMap.containsValue(callback)) {
mFinishedCallbackMap.remove(callback.mHandle);
}
}
/*
*
*/
Twitter getTwitterInstance() {
return mCallbacks.getTwitterInstance();
}
public void cancel(FinishedCallback callback) {
removeModifyStatusesCallback(callback);
}
/*
*
*/
public void setFavorite(TwitterStatus status, boolean isFavorite, FinishedCallback callback) {
setFavorite(new TwitterStatuses(status), isFavorite, callback);
}
/*
*
*/
public void setFavorite(TwitterStatuses statuses, boolean isFavorite, FinishedCallback callback) {
mFinishedCallbackMap.put(mModifyStatusesCallbackHandle, callback);
new ModifyStatusesTask().execute(AsyncTaskEx.PRIORITY_HIGH, "Set Favorite",
new ModifyStatusesTaskInput(mModifyStatusesCallbackHandle, StatusesType.SET_FAVORITE, statuses,
isFavorite ? 1 : 0));
mModifyStatusesCallbackHandle += 1;
}
/*
*
*/
public void deleteTweets(TwitterStatuses statuses, FinishedCallback callback) {
mFinishedCallbackMap.put(mModifyStatusesCallbackHandle, callback);
new ModifyStatusesTask().execute(AsyncTaskEx.PRIORITY_HIGH, "Delete",
new ModifyStatusesTaskInput(mModifyStatusesCallbackHandle, StatusesType.DELETE, statuses, 1));
mModifyStatusesCallbackHandle += 1;
}
AppdotnetApi getAppdotnetApi() {
return mCallbacks.getAppdotnetApi();
}
/*
*
*/
class ModifyStatusesTaskInput {
public ModifyStatusesTaskInput(Integer callbackHandle, StatusesType statusesType, TwitterStatuses statuses,
Integer value) {
mCallbackHandle = callbackHandle;
mStatusesType = statusesType;
mStatuses = new TwitterStatuses(statuses);
mValue = value;
}
final Integer mCallbackHandle;
final StatusesType mStatusesType;
final TwitterStatuses mStatuses;
final Integer mValue;
}
/*
*
*/
class ModifyStatusesTaskOutput {
ModifyStatusesTaskOutput(TwitterFetchResult result, Integer callbackHandle, TwitterStatuses feed,
Integer outputValue) {
mCallbackHandle = callbackHandle;
mFeed = feed;
mValue = outputValue;
mResult = result;
}
final Integer mCallbackHandle;
final TwitterStatuses mFeed;
final Integer mValue;
final TwitterFetchResult mResult;
}
/*
*
*/
class ModifyStatusesTask extends AsyncTaskEx<ModifyStatusesTaskInput, Void, ModifyStatusesTaskOutput> {
@Override
protected ModifyStatusesTaskOutput doInBackground(ModifyStatusesTaskInput... inputArray) {
TwitterStatuses contentFeed = new TwitterStatuses();
ModifyStatusesTaskInput input = inputArray[0];
Twitter twitter = getTwitterInstance();
String errorDescription = null;
AppdotnetApi appdotnetApi = getAppdotnetApi();
if (appdotnetApi != null) {
switch (input.mStatusesType) {
case DELETE: {
if (input.mStatuses != null) {
for (int i = 0; i < input.mStatuses.getStatusCount(); i++) {
TwitterStatus twitterStatus = input.mStatuses.getStatus(i);
AdnPost post = appdotnetApi.deleteTweet(twitterStatus.mId);
if (post == null) {
errorDescription = "Unable to delete status";
}
}
}
break;
}
case SET_FAVORITE: {
boolean favorite = input.mValue == 1;
if (input.mStatuses != null) {
for (int i = 0; i < input.mStatuses.getStatusCount(); i++) {
TwitterStatus twitterStatus = input.mStatuses.getStatus(i);
AdnPost post = appdotnetApi.setAdnFavorite(twitterStatus.mId, favorite);
if (post != null) {
twitterStatus = new TwitterStatus(post);
twitterStatus.setFavorite(favorite);
contentFeed.add(twitterStatus);
}
}
}
break;
}
}
} else if (twitter != null) {
try {
switch (input.mStatusesType) {
case DELETE: {
if (input.mStatuses != null) {
for (int i = 0; i < input.mStatuses.getStatusCount(); i++) {
TwitterStatus twitterStatus = input.mStatuses.getStatus(i);
twitter.destroyStatus(twitterStatus.mId);
}
}
break;
}
case SET_FAVORITE: {
boolean favorite = input.mValue == 1;
if (input.mStatuses != null) {
for (int i = 0; i < input.mStatuses.getStatusCount(); i++) {
TwitterStatus twitterStatus = input.mStatuses.getStatus(i);
try {
twitter4j.Status status;
if (favorite) {
status = twitter.createFavorite(twitterStatus.mId);
} else {
status = twitter.destroyFavorite(twitterStatus.mId);
}
// Yuck: See the comment for
// TwitterStatus.setFavorite() for
// reasons for this
twitterStatus = new TwitterStatus(status);
twitterStatus.setFavorite(favorite);
contentFeed.add(twitterStatus);
} catch (TwitterException e) {
e.printStackTrace();
errorDescription = e.getErrorMessage();
Log.e("api-call", errorDescription, e);
if (e.getRateLimitStatus() != null && e.getRateLimitStatus().getRemaining() <= 0) {
throw e;
}
}
}
}
break;
}
}
} catch (TwitterException e) {
e.printStackTrace();
errorDescription = e.getErrorMessage();
Log.e("api-call", errorDescription, e);
if (e.getRateLimitStatus() != null && e.getRateLimitStatus().getRemaining() <= 0) {
errorDescription +=
"\nTry again in " + e.getRateLimitStatus().getSecondsUntilReset() + " " + "seconds";
}
}
}
return new ModifyStatusesTaskOutput(
new TwitterFetchResult(errorDescription == null, errorDescription),
input.mCallbackHandle, contentFeed, null);
}
@Override
protected void onPostExecute(ModifyStatusesTaskOutput output) {
FinishedCallback callback = getModifyStatusesCallback(output.mCallbackHandle);
if (callback != null) {
callback.finished(output.mResult.mErrorMessage == null, output.mFeed, output.mValue);
removeModifyStatusesCallback(callback);
}
super.onPostExecute(output);
}
}
}