/*
* 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 org.asynctasktex.AsyncTaskEx;
import org.socialnetlib.android.AppdotnetApi;
import org.tweetalib.android.TwitterConstant.BooleanType;
import org.tweetalib.android.model.TwitterUser;
import java.util.ArrayList;
import java.util.HashMap;
import twitter4j.Friendship;
import twitter4j.ResponseList;
import twitter4j.Twitter;
import twitter4j.TwitterException;
public class TwitterFetchBooleans {
private FetchBooleansWorkerCallbacks mCallbacks;
private Integer mFetchBooleanCallbackHandle;
private final HashMap<Integer, FinishedCallback> mFinishedCallbackMap;
/*
*
*/
public void clearCallbacks() {
if (mFinishedCallbackMap != null) {
mFinishedCallbackMap.clear();
}
}
/*
*
*/
public interface FetchBooleansWorkerCallbacks {
public Twitter getTwitterInstance();
public AppdotnetApi getAppdotnetInstance();
}
/*
*
*/
public interface FinishedCallbackInterface {
public void finished(TwitterFetchResult result,
ArrayList<Boolean> returnValues);
}
/*
*
*/
public abstract class FinishedCallback implements FinishedCallbackInterface {
static final int kInvalidHandle = -1;
public FinishedCallback() {
mHandle = kInvalidHandle;
}
private int mHandle;
}
/*
*
*/
public TwitterFetchBooleans() {
mFinishedCallbackMap = new HashMap<Integer, FinishedCallback>();
mFetchBooleanCallbackHandle = 0;
}
/*
*
*/
public void setWorkerCallbacks(FetchBooleansWorkerCallbacks callbacks) {
mCallbacks = callbacks;
}
/*
*
*/
/*
*
*/
FinishedCallback getFetchBooleanCallback(Integer callbackHandle) {
return mFinishedCallbackMap.get(callbackHandle);
}
/*
*
*/
void removeFetchBooleanCallback(FinishedCallback callback) {
if (mFinishedCallbackMap.containsValue(callback)) {
mFinishedCallbackMap.remove(callback.mHandle);
}
}
/*
*
*/
Twitter getTwitterInstance() {
return mCallbacks.getTwitterInstance();
}
AppdotnetApi getAppdotnetInstance() {
return mCallbacks.getAppdotnetInstance();
}
/*
*
*/
public void getFriendshipExists(String userScreenName,
String userScreenNameToCheck, FinishedCallback callback,
ConnectionStatus connectionStatus) {
triggerFetchBooleanTask(new FetchBooleanTaskInput(
mFetchBooleanCallbackHandle, connectionStatus,
BooleanType.FRIENDSHIP_EXISTS, userScreenName,
userScreenNameToCheck), callback, connectionStatus);
}
/*
*
*/
void triggerFetchBooleanTask(FetchBooleanTaskInput taskInput,
FinishedCallback callback, ConnectionStatus connectionStatus) {
if (connectionStatus != null && !connectionStatus.isOnline()) {
if (callback != null) {
callback.finished(new TwitterFetchResult(false,
connectionStatus.getErrorMessageNoConnection()), null);
}
return;
}
mFinishedCallbackMap.put(mFetchBooleanCallbackHandle, callback);
new FetchBooleanTask().execute(AsyncTaskEx.PRIORITY_MEDIUM,
"Fetch Bools", taskInput);
mFetchBooleanCallbackHandle += 1;
}
/*
*
*/
public void cancel(FinishedCallback callback) {
removeFetchBooleanCallback(callback);
}
/*
*
*/
class FetchBooleanTaskInput {
FetchBooleanTaskInput(Integer callbackHandle,
ConnectionStatus connectionStatus, BooleanType booleanType,
String userScreenName, String userScreenNameToCheck) {
mCallbackHandle = callbackHandle;
mConnectionStatus = connectionStatus;
mBooleanType = booleanType;
mUserScreenName = userScreenName;
mUserScreenNameToCheck = userScreenNameToCheck;
}
final Integer mCallbackHandle;
final ConnectionStatus mConnectionStatus;
final BooleanType mBooleanType;
final String mUserScreenName;
final String mUserScreenNameToCheck;
}
/*
*
*/
class FetchBooleanTaskOutput {
FetchBooleanTaskOutput(TwitterFetchResult result,
Integer callbackHandle, ArrayList<Boolean> returnValues) {
mResult = result;
mCallbackHandle = callbackHandle;
if (returnValues != null) {
mReturnValues = new ArrayList<Boolean>(returnValues);
}
}
final TwitterFetchResult mResult;
final Integer mCallbackHandle;
ArrayList<Boolean> mReturnValues;
}
/*
*
*/
class FetchBooleanTask extends
AsyncTaskEx<FetchBooleanTaskInput, Void, FetchBooleanTaskOutput> {
@Override
protected FetchBooleanTaskOutput doInBackground(
FetchBooleanTaskInput... inputArray) {
ArrayList<Boolean> result = new ArrayList<Boolean>();
FetchBooleanTaskInput input = inputArray[0];
Twitter twitter = getTwitterInstance();
AppdotnetApi appdotnet = getAppdotnetInstance();
String errorDescription = null;
if (input.mConnectionStatus != null && !input.mConnectionStatus.isOnline()) {
return new FetchBooleanTaskOutput(new TwitterFetchResult(false,
input.mConnectionStatus.getErrorMessageNoConnection()),
input.mCallbackHandle, null);
}
if (twitter != null) {
try {
switch (input.mBooleanType) {
case FRIENDSHIP_EXISTS: {
if (!input.mUserScreenName.toLowerCase().equals(
input.mUserScreenNameToCheck.toLowerCase())) {
ResponseList<Friendship> response = twitter
.lookupFriendships(new String[]{input.mUserScreenName});
if (response != null && response.size() == 1) {
result.add(response.get(0).isFollowedBy());
result.add(response.get(0).isFollowing());
}
}
break;
}
default:
break;
}
} catch (TwitterException e) {
e.printStackTrace();
errorDescription = e.getErrorMessage();
}
} else if (appdotnet != null) {
switch (input.mBooleanType) {
case FRIENDSHIP_EXISTS: {
if (!input.mUserScreenName.toLowerCase().equals(
input.mUserScreenNameToCheck.toLowerCase())) {
TwitterUser user = appdotnet
.getAdnUser(input.mUserScreenName);
if (user != null) {
result.add(user.getFollowsCurrentUser());
result.add(user.getCurrentUserFollows());
}
}
break;
}
default:
break;
}
}
if (result.size() == 0) {
result = null;
}
return new FetchBooleanTaskOutput(new TwitterFetchResult(
errorDescription == null, errorDescription),
input.mCallbackHandle, result);
}
@Override
protected void onPostExecute(FetchBooleanTaskOutput output) {
FinishedCallback callback = getFetchBooleanCallback(output.mCallbackHandle);
if (callback != null) {
callback.finished(output.mResult, output.mReturnValues);
removeFetchBooleanCallback(callback);
}
super.onPostExecute(output);
}
}
}