/*
* 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.asynctasktex.AsyncTaskEx;
import org.tweetalib.android.TwitterConstant.StatusesType;
import org.tweetalib.android.model.TwitterDirectMessage;
import org.tweetalib.android.model.TwitterDirectMessages;
import java.util.ArrayList;
import java.util.HashMap;
import twitter4j.Twitter;
import twitter4j.TwitterException;
public class TwitterModifyDirectMessages {
private ModifyDirectMessagesWorkerCallbacks mCallbacks;
private Integer mModifyDirectMessagesCallbackHandle;
private final HashMap<Integer, FinishedCallback> mFinishedCallbackMap;
/*
*
*/
public void clearCallbacks() {
if (mFinishedCallbackMap != null) {
mFinishedCallbackMap.clear();
}
}
/*
*
*/
public interface ModifyDirectMessagesWorkerCallbacks {
public Twitter getTwitterInstance();
}
/*
*
*/
public interface FinishedCallbackInterface {
public void finished(boolean successful, Integer value);
}
/*
*
*/
public abstract class FinishedCallback implements FinishedCallbackInterface {
static final int kInvalidHandle = -1;
public FinishedCallback() {
mHandle = kInvalidHandle;
}
private int mHandle;
}
/*
*
*/
public TwitterModifyDirectMessages() {
mFinishedCallbackMap = new HashMap<Integer, FinishedCallback>();
mModifyDirectMessagesCallbackHandle = 0;
}
/*
*
*/
public void setWorkerCallbacks(ModifyDirectMessagesWorkerCallbacks callbacks) {
mCallbacks = callbacks;
}
/*
*
*/
/*
*
*/
FinishedCallback getModifyDirectMessagesCallback(Integer callbackHandle) {
return mFinishedCallbackMap.get(callbackHandle);
}
/*
*
*/
void removeModifyDirectMessagesCallback(FinishedCallback callback) {
if (mFinishedCallbackMap.containsValue(callback)) {
mFinishedCallbackMap.remove(callback.mHandle);
}
}
/*
*
*/
Twitter getTwitterInstance() {
return mCallbacks.getTwitterInstance();
}
public void cancel(FinishedCallback callback) {
removeModifyDirectMessagesCallback(callback);
}
/*
*
*/
public void deleteDirectMessages(TwitterDirectMessages statuses, FinishedCallback callback) {
mFinishedCallbackMap.put(mModifyDirectMessagesCallbackHandle, callback);
new ModifyDirectMessagesTask().execute(AsyncTaskEx.PRIORITY_HIGH, "Delete",
new ModifyDirectMessagesTaskInput(mModifyDirectMessagesCallbackHandle, StatusesType.DELETE, statuses, 1));
mModifyDirectMessagesCallbackHandle += 1;
}
/*
*
*/
class ModifyDirectMessagesTaskInput {
public ModifyDirectMessagesTaskInput(Integer callbackHandle, StatusesType statusesType, TwitterDirectMessages messages,
Integer value) {
mCallbackHandle = callbackHandle;
mStatusesType = statusesType;
mMessages = new TwitterDirectMessages(0);
mMessages.add(messages);
mValue = value;
}
final Integer mCallbackHandle;
final StatusesType mStatusesType;
final TwitterDirectMessages mMessages;
final Integer mValue;
}
/*
*
*/
class ModifyDirectMessagesTaskOutput {
ModifyDirectMessagesTaskOutput(TwitterFetchResult result, Integer callbackHandle,
Integer outputValue) {
mCallbackHandle = callbackHandle;
mValue = outputValue;
mResult = result;
}
final Integer mCallbackHandle;
final Integer mValue;
final TwitterFetchResult mResult;
}
/*
*
*/
class ModifyDirectMessagesTask extends AsyncTaskEx<ModifyDirectMessagesTaskInput, Void, ModifyDirectMessagesTaskOutput> {
@Override
protected ModifyDirectMessagesTaskOutput doInBackground(ModifyDirectMessagesTaskInput... inputArray) {
ModifyDirectMessagesTaskInput input = inputArray[0];
Twitter twitter = getTwitterInstance();
String errorDescription = null;
if (twitter != null) {
try {
switch (input.mStatusesType) {
case DELETE: {
if (input.mMessages != null) {
ArrayList<TwitterDirectMessage> messages = input.mMessages.getAllMessages();
for (int i = 0; i < input.mMessages.getAllMessages().size(); i++) {
TwitterDirectMessage directMessage = messages.get(i);
try {
twitter.directMessages().destroyDirectMessage(directMessage.getId());
} catch (TwitterException e) {
String errorMessage = e.getErrorMessage();
Log.d("api-call", errorMessage);
if (errorMessage.toLowerCase().equals("sorry, that page does not exist")) {
Log.d("api-call", "Delete found page doesn't exist, just carry on.");
} else {
throw e;
}
}
}
}
break;
}
}
} catch (TwitterException e) {
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 ModifyDirectMessagesTaskOutput(
new TwitterFetchResult(errorDescription == null, errorDescription),
input.mCallbackHandle, null);
}
@Override
protected void onPostExecute(ModifyDirectMessagesTaskOutput output) {
FinishedCallback callback = getModifyDirectMessagesCallback(output.mCallbackHandle);
if (callback != null) {
callback.finished(output.mResult.mErrorMessage == null, output.mValue);
removeModifyDirectMessagesCallback(callback);
}
super.onPostExecute(output);
}
}
}