package com.gnod.geekr.tool; import java.io.IOException; import org.json.JSONObject; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import com.gnod.geekr.app.AppConfig; import com.gnod.geekr.model.AccountModel; import com.gnod.geekr.tool.manager.AccountManager; import com.gnod.geekr.weibo.api.RemindAPI; import com.gnod.geekr.weibo.api.RemindAPI.UNREAD_TYPE; 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.CommentsAPI; import com.weibo.sdk.android.api.FavoritesAPI; import com.weibo.sdk.android.api.StatusesAPI; import com.weibo.sdk.android.api.UsersAPI; import com.weibo.sdk.android.api.WeiboAPI.COMMENTS_TYPE; import com.weibo.sdk.android.net.RequestListener; import com.weibo.sdk.android.sso.SsoHandler; public class WeiboBaseTool { public static final String APP_KEY = "1969002064"; public static final String APP_SECRET = "d67cd9c2384e4abfde9a2ae72205d4bc"; public static final String REDIRECT_URL = "http://api.weibo.com/oauth2/default.html"; public static final String OAUTH2_ACCESS_AUTHORIZE_URL = "https://api.weibo.com/oauth2/authorize"; public static final String ID = "SinaWeiboID"; public static final String TOKEN = "SinaWeiboToken"; public static final String EXPIRES_TIME = "SinaWeiboExpiresTime"; private AppConfig config; private SsoHandler ssoHandler; private static WeiboBaseTool instance; private Weibo weibo; private WeiboBaseTool(AppConfig config) { this.config = config; } public static void init(AppConfig config) { if(instance == null) { instance = new WeiboBaseTool(config); instance.getWeibo(); } } public static WeiboBaseTool getInstance() { if(instance == null) throw new NullPointerException("Instance didn't initialized."); return instance; } public Weibo getWeibo() { if(weibo == null) weibo = Weibo.getInstance(APP_KEY, REDIRECT_URL); return weibo; } public boolean isAuthValid(AccountModel account) { if(account == null) { return false; } String token = account.token; if(StringUtils.isNullOrEmpty(token)) { return false; } Long expiresTime = account.expTime; if(expiresTime < 0 || expiresTime < System.currentTimeMillis()) { return false; } return true; } public Oauth2AccessToken getOauth2AccessToken(AccountModel account) { if(isAuthValid(account) == false){ return null; } String token = account.token; Long expiresTime = account.expTime; Oauth2AccessToken oauthToken = new Oauth2AccessToken(); oauthToken.setExpiresTime(expiresTime); oauthToken.setToken(token); return oauthToken; } public void authorize(Activity activity, final SinaWeiboAuthorizedListener listener){ try { Class.forName("com.weibo.sdk.android.sso.SsoHandler"); } catch (ClassNotFoundException e) { e.printStackTrace(); } ssoHandler = new SsoHandler(activity, getWeibo()); ssoHandler.authorize(new WeiboAuthListener() { @Override public void onWeiboException(WeiboException e) { listener.onFailed(); } @Override public void onError(WeiboDialogError e) { listener.onFailed(); } @Override public void onComplete(Bundle values) { try { final String id = values.getString("uid"); String token = values.getString("access_token"); String expires_in = values.getString("expires_in"); long exp = System.currentTimeMillis() + Long.parseLong(expires_in) * 1000; final AccountModel account = new AccountModel(); account.uID = id; account.token = token; account.expTime = exp; account.type = AccountManager.TYPE_SINA_WEIBO; final Oauth2AccessToken oauth2AccessToken = new Oauth2AccessToken(); oauth2AccessToken.setToken(token); oauth2AccessToken.setExpiresTime(exp); new Thread(new Runnable() { @Override public void run() { final Message msg = new Message(); UsersAPI usersAPI=new UsersAPI(oauth2AccessToken); long lID = Long.parseLong(id); usersAPI.show(lID, new RequestListener() { @Override public void onIOException(IOException arg0) { msg.arg1 = -1; handler.sendMessage(msg); } @Override public void onError(WeiboException arg0) { msg.arg1 = -1; handler.sendMessage(msg); } @Override public void onComplete(String arg0) { try{ JSONObject user = new JSONObject(arg0); account.name = user.optString("name"); account.iconURL = user.optString("profile_image_url"); AccountManager.addAccount(account); msg.arg1 = 1; handler.sendMessage(msg); }catch (Exception e) { msg.arg1 = -1; handler.sendMessage(msg); } } }); } }).start(); } catch (Exception e) { listener.onFailed(); } } @Override public void onCancel() { listener.onCancel(); } private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { if(msg.arg1 > 0) { listener.onSuccessed(); } else { listener.onFailed(); } } }; }); } /** * 发起认证的Activity必须重写onActivityResult, 这个方法必须在 onActivityResult 方法内调用 */ public void authorizeCallBack(int requestCode, int resultCode, Intent data){ if (ssoHandler != null) { ssoHandler.authorizeCallBack(requestCode, resultCode, data); } } /** * 收藏一条微博 * */ public void favoriteStatus(String id) { Oauth2AccessToken oa = getOauth2AccessToken(AccountManager.getActivityAccount()); if(oa == null) { ToastHelper.show("验证失败或已过期", 2); return; } FavoritesAPI favoritesAPI = new FavoritesAPI(oa); if(!StringUtils.isNullOrEmpty(id)){ favoritesAPI.create(Long.parseLong(id), new RequestListener() { @Override public void onIOException(IOException arg0) { ToastHelper.show("收藏失败", 2); } @Override public void onError(WeiboException arg0) { if(arg0.getMessage().contains("20704")){ ToastHelper.show("该微博已收藏过", 2); } } @Override public void onComplete(String arg0) { ToastHelper.show("收藏成功", 0); } }); } } /** * 清零指定类型的未读消息数目 */ public void resetUnRead(UNREAD_TYPE type, RequestListener listener) { Oauth2AccessToken oa = getOauth2AccessToken(AccountManager.getActivityAccount()); RemindAPI remindAPI = new RemindAPI(oa); if(listener == null) listener = emptyListener; remindAPI.resetCount(type, listener); } public interface SinaWeiboAuthorizedListener { public void onSuccessed(); public void onFailed(); public void onCancel(); } private RequestListener emptyListener = new RequestListener() { @Override public void onIOException(IOException arg0) { } @Override public void onError(WeiboException arg0) { } @Override public void onComplete(String arg0) { } }; }