/*
* 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.model.TwitterLists;
import java.util.HashMap;
import twitter4j.ResponseList;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.UserList;
public class TwitterFetchLists {
private FetchListsWorkerCallbacks mCallbacks;
private final HashMap<Integer, TwitterLists> mListsHashMap;
private Integer mFetchListsCallbackHandle;
private final HashMap<Integer, FinishedCallback> mFinishedCallbackMap;
/*
*
*/
public void clearCallbacks() {
if (mFinishedCallbackMap != null) {
mFinishedCallbackMap.clear();
}
}
/*
*
*/
public interface FetchListsWorkerCallbacks {
public Twitter getTwitterInstance();
}
/*
*
*/
public interface FinishedCallbackInterface {
public void finished(boolean successful, TwitterLists lists);
}
/*
*
*/
public abstract class FinishedCallback implements FinishedCallbackInterface {
static final int kInvalidHandle = -1;
public FinishedCallback() {
mHandle = kInvalidHandle;
}
private int mHandle;
}
/*
*
*/
public TwitterFetchLists() {
mFinishedCallbackMap = new HashMap<Integer, FinishedCallback>();
mFetchListsCallbackHandle = 0;
mListsHashMap = new HashMap<Integer, TwitterLists>();
}
/*
*
*/
public void setWorkerCallbacks(FetchListsWorkerCallbacks callbacks) {
mCallbacks = callbacks;
}
/*
*
*/
FinishedCallback getFetchStatusesCallback(Integer callbackHandle) {
return mFinishedCallbackMap.get(callbackHandle);
}
/*
*
*/
void removeFetchStatusesCallback(FinishedCallback callback) {
if (mFinishedCallbackMap.containsValue(callback)) {
mFinishedCallbackMap.remove(callback.mHandle);
}
}
/*
*
*/
Twitter getTwitterInstance() {
return mCallbacks.getTwitterInstance();
}
/*
*
*/
public TwitterLists getLists(Integer userId, FinishedCallback callback) {
TwitterLists lists = mListsHashMap.get(userId);
if (callback != null) {
trigger(userId, callback);
}
return lists;
}
public TwitterLists getLists(String screenName, FinishedCallback callback) {
if (callback != null) {
trigger(screenName, callback);
}
return null;
}
/*
*
*/
private void trigger(Integer userId, FinishedCallback callback) {
assert (!mFinishedCallbackMap.containsValue(callback));
mFinishedCallbackMap.put(mFetchListsCallbackHandle, callback);
new FetchListsTask().execute(AsyncTaskEx.PRIORITY_MEDIUM,
"Fetch Lists", new FetchListsTaskInput(userId,
mFetchListsCallbackHandle));
mFetchListsCallbackHandle += 1;
}
private void trigger(String screenName, FinishedCallback callback) {
assert (!mFinishedCallbackMap.containsValue(callback));
mFinishedCallbackMap.put(mFetchListsCallbackHandle, callback);
new FetchListsTask().execute(AsyncTaskEx.PRIORITY_MEDIUM,
"Fetch Lists", new FetchListsTaskInput(screenName,
mFetchListsCallbackHandle));
mFetchListsCallbackHandle += 1;
}
/*
*
*/
public void cancel(FinishedCallback callback) {
removeFetchStatusesCallback(callback);
}
/*
*
*/
class FetchListsTaskInput {
FetchListsTaskInput(Integer userId, Integer callbackHandle) {
mCallbackHandle = callbackHandle;
mUserId = userId;
}
FetchListsTaskInput(String screenName, Integer callbackHandle) {
mCallbackHandle = callbackHandle;
mScreenName = screenName;
}
final Integer mCallbackHandle;
Integer mUserId;
String mScreenName;
}
/*
*
*/
class FetchListsTaskOutput {
FetchListsTaskOutput(Integer callbackHandle, TwitterLists lists) {
mCallbackHandle = callbackHandle;
mLists = lists;
}
final Integer mCallbackHandle;
final TwitterLists mLists;
}
/*
*
*/
class FetchListsTask extends
AsyncTaskEx<FetchListsTaskInput, Void, FetchListsTaskOutput> {
@Override
protected FetchListsTaskOutput doInBackground(
FetchListsTaskInput... inputArray) {
TwitterLists result = null;
FetchListsTaskInput input = inputArray[0];
Twitter twitter = getTwitterInstance();
if (twitter != null) {
try {
Log.d("api-call", "getUserLists");
if (input.mUserId != null) {
ResponseList<UserList> lists = twitter
.getUserLists(input.mUserId);
result = new TwitterLists(lists);
} else if (input.mScreenName != null) {
ResponseList<UserList> lists = twitter
.getUserLists(input.mScreenName);
result = new TwitterLists(lists);
}
} catch (TwitterException e) {
Log.e("api-call", e.getErrorMessage(), e);
e.printStackTrace();
}
}
return new FetchListsTaskOutput(input.mCallbackHandle, result);
}
@Override
protected void onPostExecute(FetchListsTaskOutput output) {
FinishedCallback callback = getFetchStatusesCallback(output.mCallbackHandle);
if (callback != null) {
callback.finished(true, output.mLists);
removeFetchStatusesCallback(callback);
}
super.onPostExecute(output);
}
}
}