/*
* Copyright (c) 2012 Socialize Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.socialize.networks.twitter;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.net.Uri;
import com.socialize.SocializeActionProxy;
import com.socialize.api.SocializeSession;
import com.socialize.api.action.share.SocialNetworkShareListener;
import com.socialize.entity.Entity;
import com.socialize.error.SocializeException;
import com.socialize.listener.SocializeAuthListener;
import com.socialize.networks.SocialNetwork;
import com.socialize.networks.SocialNetworkListener;
import com.socialize.networks.SocialNetworkPostListener;
import java.io.IOException;
import java.lang.reflect.Proxy;
import java.util.Map;
/**
* @author Jason Polites
*
*/
public class TwitterUtils {
static TwitterUtilsProxy proxy;
static {
proxy = (TwitterUtilsProxy) Proxy.newProxyInstance(
TwitterUtilsProxy.class.getClassLoader(),
new Class[]{TwitterUtilsProxy.class},
new SocializeActionProxy("twitterUtils")); // Bean name
}
/**
* Links the current user to their Twitter account. This method will request authentication from the user if their credentials are not currently known.
* @param context The current activity.
* @param listener A listener to handle the result.
*/
public static void link (Activity context, SocializeAuthListener listener) {
proxy.link(context, listener);
}
/**
* Links the current user to their Twitter account using an existing Twitter oAuth token and secret.
* @param context The current activity.
* @param token The user's Twitter token.
* @param secret The user's Twitter token secret.
* @param listener A listener to handle the result.
*/
public static void link (Activity context, String token, String secret, SocializeAuthListener listener) {
proxy.link(context, token, secret, listener);
}
/**
* Removes the association between a user and their Twitter account.
* This method executes synchronously.
* @param context The current activity.
*/
public static void unlink (Context context) {
proxy.unlink(context);
}
/**
* Determines if the current user is linked to a Twitter account.
* @param context The current activity.
* @return True if the current user is already linked to a Twitter account. False otherwise.
*/
public static boolean isLinked(Context context) {
return proxy.isLinked(context);
}
/**
* Determines if Twitter has been configured correctly for the application.
* @param context The current activity.
* @return True if Twitter is configured correctly. False otherwise.
*/
public static boolean isAvailable(Context context) {
return proxy.isAvailable(context);
}
/**
* Sets the Twitter App credentials for the application. This sets the same configuration properties as twitter.consumer.key and twitter.consumer.secret
* @param context The current context.
* @param consumerKey The Twitter App Consumer Key
* @param consumerSecret The Twitter App Consumer Secret
*/
public static void setCredentials(Context context, String consumerKey, String consumerSecret) {
proxy.setCredentials(context, consumerKey, consumerSecret);
}
/**
* Returns the user's Twitter access token.
* @param context The current context.
* @return The user's Twitter access token or null if the user is not linked to a Twitter account.
*/
public static String getAccessToken(Context context) {
return proxy.getAccessToken(context);
}
/**
* Returns the user's Twitter access token secret.
* @param context The current context.
* @return The user's Twitter access token secret or null if the user is not linked to a Twitter account.
*/
public static String getTokenSecret(Context context) {
return proxy.getTokenSecret(context);
}
/**
* "Tweets" an entity. A "share" event will be recorded in Socialize and the entity URL generated by Socialize will be posted to the user's Twitter feed.
* If the user is not currently linked to a Twitter account they will be prompted to authenticate.
* @param context The current activity.
* @param entity The entity to be tweeted.
* @param text The text to be posted along with the tweet.
* @param listener A listener to handle the result.
*/
public static void tweetEntity(final Activity context, final Entity entity, final String text, final SocialNetworkShareListener listener) {
if(proxy.isLinked(context)) {
proxy.tweetEntity(context, entity, text, listener);
}
else {
proxy.link(context, new SocializeAuthListener() {
@Override
public void onError(SocializeException error) {
if(listener != null) {
listener.onNetworkError(context, SocialNetwork.TWITTER, error);
}
}
@Override
public void onCancel() {
if(listener != null) {
listener.onCancel();
}
}
@Override
public void onAuthSuccess(SocializeSession session) {
proxy.tweetEntity(context, entity, text, listener);
}
@Override
public void onAuthFail(SocializeException error) {
if(listener != null) {
listener.onNetworkError(context, SocialNetwork.TWITTER, error);
}
}
});
}
}
/**
* Performs a simple HTTP POST to the Twitter resource endpoint specified. If the user is not currently linked to a Twitter account they will be prompted to authenticate.
* @param context The current Activity.
* @param resource The resource to be called. NOTE: This should NOT include the full url (e.g. http://api.twitter.com) but just the resource.
* Changing the full URL endpoint can be done via the SocialNetworkPostListener onBeforePost callback.
* @param postData The parameters to be posted.
* @param listener A listener to handle the result.
*/
public static void post(final Activity context, final String resource, final Map<String, Object> postData, final SocialNetworkPostListener listener) {
if(proxy.isLinked(context)) {
proxy.post(context, resource, postData, listener);
}
else {
proxy.link(context, new SocializeAuthListener() {
@Override
public void onError(SocializeException error) {
if(listener != null) {
listener.onNetworkError(context, SocialNetwork.TWITTER, error);
}
}
@Override
public void onCancel() {
if(listener != null) {
listener.onCancel();
}
}
@Override
public void onAuthSuccess(SocializeSession session) {
proxy.post(context, resource, postData, listener);
}
@Override
public void onAuthFail(SocializeException error) {
if(listener != null) {
listener.onNetworkError(context, SocialNetwork.TWITTER, error);
}
}
});
}
}
/**
* Performs a simple HTTP GET to the Twitter resource endpoint specified. If the user is not currently linked to a Twitter account they will be prompted to authenticate.
* @param context The current Activity.
* @param resource The resource to be called. NOTE: This should NOT include the full url (e.g. http://api.twitter.com) but just the resource.
* Changing the full URL endpoint can be done via the SocialNetworkPostListener onBeforePost callback.
* @param params The parameters to be posted.
* @param listener A listener to handle the result.
*/
public static void get(final Activity context, final String resource, final Map<String, Object> params, final SocialNetworkPostListener listener) {
if(proxy.isLinked(context)) {
proxy.get(context, resource, params, listener);
}
else {
proxy.link(context, new SocializeAuthListener() {
@Override
public void onError(SocializeException error) {
if(listener != null) {
listener.onNetworkError(context, SocialNetwork.TWITTER, error);
}
}
@Override
public void onCancel() {
if(listener != null) {
listener.onCancel();
}
}
@Override
public void onAuthSuccess(SocializeSession session) {
proxy.get(context, resource, params, listener);
}
@Override
public void onAuthFail(SocializeException error) {
if(listener != null) {
listener.onNetworkError(context, SocialNetwork.TWITTER, error);
}
}
});
}
}
/**
* Performs a simple "tweet". If the user is not currently linked to a Twitter account they will be prompted to authenticate.
* @param context The current Activity.
* @param tweet The Tweet to be tweeted.
* @param listener A listener to handle the result.
*/
public static void tweet(final Activity context, final Tweet tweet, final SocialNetworkListener listener) {
if(proxy.isLinked(context)) {
proxy.tweet(context, tweet, listener);
}
else {
proxy.link(context, new SocializeAuthListener() {
@Override
public void onError(SocializeException error) {
if(listener != null) {
listener.onNetworkError(context, SocialNetwork.TWITTER, error);
}
}
@Override
public void onCancel() {
if(listener != null) {
listener.onCancel();
}
}
@Override
public void onAuthSuccess(SocializeSession session) {
proxy.tweet(context, tweet, listener);
}
@Override
public void onAuthFail(SocializeException error) {
if(listener != null) {
listener.onNetworkError(context, SocialNetwork.TWITTER, error);
}
}
});
}
}
/**
* Publishes a photo to a user's Twitter feed. If the user is not currently linked to a Twitter account they will be prompted to authenticate.
* @param context The current Activity.
* @param photo The image to be tweeted.
* @param listener A listener to handle the result.
*/
public static void tweetPhoto(final Activity context, final PhotoTweet photo, final SocialNetworkPostListener listener) {
if(proxy.isLinked(context)) {
proxy.tweetPhoto(context, photo, listener);
}
else {
proxy.link(context, new SocializeAuthListener() {
@Override
public void onError(SocializeException error) {
if(listener != null) {
listener.onNetworkError(context, SocialNetwork.TWITTER, error);
}
}
@Override
public void onCancel() {
if(listener != null) {
listener.onCancel();
}
}
@Override
public void onAuthSuccess(SocializeSession session) {
proxy.tweetPhoto(context, photo, listener);
}
@Override
public void onAuthFail(SocializeException error) {
if(listener != null) {
listener.onNetworkError(context, SocialNetwork.TWITTER, error);
}
}
});
}
}
/**
* Returns image data suitable for posting to twitter.
* @param context The current context.
* @param imagePath The path to the image.
* @return A byte array containing the bytes to be posted.
* @throws IOException
*/
public static byte[] getImageForPost(Activity context, Uri imagePath) throws IOException {
return proxy.getImageForPost(context, imagePath);
}
/**
* Returns image data suitable for posting to twitter.
* @param context The current context.
* @param image The image to be compressed.
* @param format The compression format to use (one of JPEG or PNG).
* @return A byte array containing the bytes to be posted.
* @throws IOException
*/
public static byte[] getImageForPost(Activity context, Bitmap image, CompressFormat format) throws IOException {
return proxy.getImageForPost(context, image, format);
}
}