/**
* Copyright (c) 2013-2014, Rinc Liu (http://rincliu.com).
*
* 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 com.rincliu.library.common.reference.social.weibo;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import com.rincliu.library.R;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import com.weibo.sdk.android.Oauth2AccessToken;
import com.weibo.sdk.android.Weibo;
import com.weibo.sdk.android.WeiboAuthListener;
import com.weibo.sdk.android.WeiboDialogError;
import com.weibo.sdk.android.WeiboException;
import com.weibo.sdk.android.api.StatusesAPI;
import com.weibo.sdk.android.keep.AccessTokenKeeper;
import com.weibo.sdk.android.net.RequestListener;
import com.weibo.sdk.android.sso.SsoHandler;
public class RLWeiboHelper {
private static RLWeiboHelper helper;
private static Weibo weibo;
private static final String REDIRECT_URL = "http://open.weibo.com/apps/";
private RLWeiboHelper(Context context) {
if (weibo == null) {
String key = context.getString(R.string.weibo_key);
weibo = Weibo.getInstance(key, REDIRECT_URL + key);
}
}
/**
* @param context
* @return
*/
public static RLWeiboHelper getInstance(Context context) {
if (helper == null) {
helper = new RLWeiboHelper(context);
}
return helper;
}
/**
* @param context
* @return
*/
public boolean isTokenAvailable(Context context) {
Oauth2AccessToken token = AccessTokenKeeper.readAccessToken(context);
return token != null && token.isSessionValid();
}
/**
* @param activity
* @param handler
* @return
*/
public SsoHandler auth(final Activity activity, final ReqHandler handler) {
SsoHandler ssoHandler = new SsoHandler(activity, weibo);
ssoHandler.authorize(new WeiboAuthListener() {
@Override
public void onComplete(Bundle data) {
AccessTokenKeeper.clear(activity);
Oauth2AccessToken token = new Oauth2AccessToken(data.getString("access_token"),
data.getString("expires_in"));
AccessTokenKeeper.keepAccessToken(activity, token);
handler.onSucceed();
}
@Override
public void onCancel() {
handler.onFail(activity.getString(R.string.weibo_auth_cancel));
}
@Override
public void onError(WeiboDialogError error) {
handler.onFail(error.getMessage());
}
@Override
public void onWeiboException(WeiboException exception) {
handler.onFail(exception.getMessage());
}
});
return ssoHandler;
}
/**
* @param handler
* @param requestCode
* @param resultCode
* @param data
*/
public void onActivityResult(SsoHandler handler, int requestCode, int resultCode, Intent data) {
if (handler != null) {
handler.authorizeCallBack(requestCode, resultCode, data);
}
}
/**
*
*/
public interface ReqHandler {
public void onSucceed();
public void onFail(String error);
}
/**
* @param context
* @param content
* @param latitude
* @param longitude
* @param handler
*/
public void sendText(final Context context, String content, String latitude, String longitude,
final ReqHandler handler) {
new StatusesAPI(AccessTokenKeeper.readAccessToken(context)).update(content, latitude, longitude,
getRequestListener(context, handler));
}
/**
* @param context
* @param content
* @param imgFile
* @param latitude
* @param longitude
* @param handler
*/
public void sendImageText(final Context context, String content, File imgFile, String latitude, String longitude,
final ReqHandler handler) {
new StatusesAPI(AccessTokenKeeper.readAccessToken(context)).upload(content, imgFile.getPath(), latitude,
longitude, getRequestListener(context, handler));
}
/**
* @param context
* @param content
* @param imgUrl
* @param latitude
* @param longitude
* @param handler
*/
public void sendImageText(final Context context, String content, URL imgUrl, String latitude, String longitude,
final ReqHandler handler) {
new StatusesAPI(AccessTokenKeeper.readAccessToken(context)).uploadUrlText(content, imgUrl.toString(), latitude,
longitude, getRequestListener(context, handler));
}
private RequestListener getRequestListener(final Context context, final ReqHandler handler) {
return new RequestListener() {
@Override
public void onComplete(String arg0) {
handler.onSucceed();
}
@Override
public void onError(WeiboException exception) {
String msg = exception.getMessage();
if (msg != null && !msg.equals("")) {
try {
JSONObject obj = new JSONObject(msg);
if (obj != null && obj.has("error")) {
handler.onFail(obj.get("error").toString());
} else {
handler.onFail(context.getString(R.string.weibo_unknow_error));
}
} catch (JSONException e) {
handler.onFail(context.getString(R.string.weibo_unknow_error));
}
} else {
handler.onFail(context.getString(R.string.weibo_unknow_error));
}
}
@Override
public void onIOException(IOException arg0) {
handler.onFail(context.getString(R.string.weibo_io_error));
}
};
}
}