/* * 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.appdotnet4j.model.AdnPostCompose; import org.asynctasktex.AsyncTaskEx; import org.socialnetlib.android.AppdotnetApi; import org.tweetalib.android.TwitterConstant.StatusType; import org.tweetalib.android.model.TwitterStatus; import org.tweetalib.android.model.TwitterStatusUpdate; import java.util.HashMap; import twitter4j.StatusUpdate; import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.User; public class TwitterFetchStatus { private FetchStatusWorkerCallbacks mCallbacks; private Integer mFetchStatusCallbackHandle; private final HashMap<Integer, FinishedCallback> mFinishedCallbackMap; /* * */ public void clearCallbacks() { if (mFinishedCallbackMap != null) { mFinishedCallbackMap.clear(); } } /* * */ public interface FetchStatusWorkerCallbacks { public Twitter getTwitterInstance(); public AppdotnetApi getAppdotnetApi(); public void addUser(User user); } /* * */ public interface FinishedCallbackInterface { public void finished(TwitterFetchResult result, TwitterStatus status); } /* * */ public abstract class FinishedCallback implements FinishedCallbackInterface { static final int kInvalidHandle = -1; public FinishedCallback() { mHandle = kInvalidHandle; } private int mHandle; } /* * */ public TwitterFetchStatus() { mFinishedCallbackMap = new HashMap<Integer, FinishedCallback>(); mFetchStatusCallbackHandle = 0; } /* * */ public void setWorkerCallbacks(FetchStatusWorkerCallbacks callbacks) { mCallbacks = callbacks; } /* * */ /* * */ FinishedCallback getFetchStatusCallback(Integer callbackHandle) { return mFinishedCallbackMap.get(callbackHandle); } /* * */ void removeFetchStatusCallback(FinishedCallback callback) { if (mFinishedCallbackMap.containsValue(callback)) { mFinishedCallbackMap.remove(callback.mHandle); } } /* * */ Twitter getTwitterInstance() { return mCallbacks.getTwitterInstance(); } AppdotnetApi getAppdotnetApi() { return mCallbacks.getAppdotnetApi(); } /* * */ public TwitterStatus getStatus(long statusId, FinishedCallback callback, ConnectionStatus connectionStatus) { triggerFetchStatusTask(new FetchStatusTaskInput( mFetchStatusCallbackHandle, StatusType.GET_STATUS, statusId, connectionStatus), callback, connectionStatus); return null; } /* * */ public void setStatus(TwitterStatusUpdate statusUpdate, FinishedCallback callback, ConnectionStatus connectionStatus) { triggerFetchStatusTask(new FetchStatusTaskInput( mFetchStatusCallbackHandle, statusUpdate, connectionStatus), callback, connectionStatus); } /* * */ public void setRetweet(long statusId, FinishedCallback callback, ConnectionStatus connectionStatus) { triggerFetchStatusTask(new FetchStatusTaskInput( mFetchStatusCallbackHandle, StatusType.SET_RETWEET, statusId, connectionStatus), callback, connectionStatus); } /* * */ void triggerFetchStatusTask(FetchStatusTaskInput taskInput, FinishedCallback callback, ConnectionStatus connectionStatus) { if (connectionStatus != null && !connectionStatus.isOnline()) { if (callback != null) { callback.finished(new TwitterFetchResult(false, connectionStatus.getErrorMessageNoConnection()), null); } return; } mFinishedCallbackMap.put(mFetchStatusCallbackHandle, callback); new FetchStatusTask().execute(AsyncTaskEx.PRIORITY_HIGHEST, "Fetch Status", taskInput); mFetchStatusCallbackHandle += 1; } /* * */ public void cancel(FinishedCallback callback) { removeFetchStatusCallback(callback); } /* * */ class FetchStatusTaskInput { FetchStatusTaskInput(Integer callbackHandle, TwitterStatusUpdate statusUpdate, ConnectionStatus connectionStatus) { mCallbackHandle = callbackHandle; mStatusUpdate = statusUpdate; mStatusType = StatusType.SET_STATUS; mConnectionStatus = connectionStatus; } FetchStatusTaskInput(Integer callbackHandle, StatusType statusType, long existingStatus, ConnectionStatus connectionStatus) { mCallbackHandle = callbackHandle; mExistingStatusId = existingStatus; mStatusType = statusType; mConnectionStatus = connectionStatus; } final Integer mCallbackHandle; final StatusType mStatusType; TwitterStatusUpdate mStatusUpdate; Long mExistingStatusId; final ConnectionStatus mConnectionStatus; } /* * */ class FetchStatusTaskOutput { FetchStatusTaskOutput(TwitterFetchResult result, Integer callbackHandle, TwitterStatus status) { mResult = result; mCallbackHandle = callbackHandle; mStatus = status; } final TwitterFetchResult mResult; final Integer mCallbackHandle; final TwitterStatus mStatus; } /* * */ class FetchStatusTask extends AsyncTaskEx<FetchStatusTaskInput, Void, FetchStatusTaskOutput> { @Override protected FetchStatusTaskOutput doInBackground( FetchStatusTaskInput... inputArray) { FetchStatusTaskInput input = inputArray[0]; Twitter twitter = getTwitterInstance(); TwitterStatus twitterStatus = null; String errorDescription = null; if (input.mConnectionStatus != null && !input.mConnectionStatus.isOnline()) { return new FetchStatusTaskOutput(new TwitterFetchResult(false, input.mConnectionStatus.getErrorMessageNoConnection()), input.mCallbackHandle, null); } AppdotnetApi appdotnetApi = getAppdotnetApi(); if (appdotnetApi != null) { AdnPost status = null; switch (input.mStatusType) { case SET_STATUS: AdnPostCompose post = input.mStatusUpdate.getAdnComposePost(); appdotnetApi.setAdnStatus(post); break; case GET_STATUS: { status = appdotnetApi.getAdnPost(input.mExistingStatusId); break; } case SET_RETWEET: { status = appdotnetApi.setAdnRepost(input.mExistingStatusId); break; } default: break; } if (status != null) { twitterStatus = new TwitterStatus(status); } } else if (twitter != null) { twitter4j.Status status = null; try { switch (input.mStatusType) { case GET_STATUS: { Log.d("api-call", "showStatus"); status = twitter.showStatus(input.mExistingStatusId); break; } case SET_STATUS: { Log.d("api-call", "updateStatus"); StatusUpdate statusUpdate = input.mStatusUpdate .getT4JStatusUpdate(); status = twitter.updateStatus(statusUpdate); /* * Configuration conf = getConfiguration(); * ImageUploadFactory factory = new * ImageUploadFactory(conf); ImageUpload upload = * factory.getInstance(MediaProvider.YFROG); try { File * imageFile = input.mStatusUpdate.getMediaFile(); * upload.upload(imageFile); } catch (Exception e) { * e.printStackTrace(); } */ /* * WORKS String url = null; String mMediaFilePath = * input.mStatusUpdate.getMediaFilePath(); try { * InputStream mediaInputStream = new * BufferedInputStream(new * FileInputStream(mMediaFilePath)); ImageUploadFactory * factory = new ImageUploadFactory(getConfiguration()); * ImageUpload upload = * factory.getInstance(MediaProvider.TWITTER); url = * upload.upload(input.mStatusUpdate.getMediaFilePath(), * mediaInputStream, "blerg"); } catch * (FileNotFoundException e) { e.printStackTrace(); } */ /* * InputStream is = * getClass().getResourceAsStream(input. * mStatusUpdate.getMediaFilePath()); try { * ImageUploadFactory factory = new * ImageUploadFactory(); ImageUpload upload = * factory.getInstance(MediaProvider.TWITTER); url = * upload.upload(input.mStatusUpdate.getMediaFilePath(), * is, "blerg"); } finally { try { is.close(); } catch * (IOException e) { // TODO Auto-generated catch block * e.printStackTrace(); } } */ // status = twitter.showStatus(181681943774117888L); break; } case SET_RETWEET: { Log.d("api-call", "retweetStatus"); status = twitter.retweetStatus(input.mExistingStatusId); 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"; } } catch (OutOfMemoryError e) { e.printStackTrace(); errorDescription = e.getMessage(); Log.e("api-call", errorDescription, e); } if (status != null) { twitterStatus = new TwitterStatus(status); } } return new FetchStatusTaskOutput(new TwitterFetchResult( errorDescription == null, errorDescription), input.mCallbackHandle, twitterStatus); } @Override protected void onPostExecute(FetchStatusTaskOutput output) { FinishedCallback callback = getFetchStatusCallback(output.mCallbackHandle); if (callback != null) { callback.finished(output.mResult, output.mStatus); removeFetchStatusCallback(callback); } super.onPostExecute(output); } } }