package com.gnod.geekr.ui.activity; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.json.JSONObject; import android.app.ProgressDialog; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.webkit.CookieManager; import android.webkit.CookieSyncManager; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import com.gnod.geekr.R; import com.gnod.geekr.model.AccountModel; import com.gnod.geekr.tool.WeiboBaseTool; import com.gnod.geekr.tool.StringUtils; import com.gnod.geekr.tool.ToastHelper; import com.gnod.geekr.tool.URLTool; import com.gnod.geekr.tool.manager.AccountManager; import com.gnod.geekr.weibo.api.OAuthAPI; import com.weibo.sdk.android.Oauth2AccessToken; import com.weibo.sdk.android.WeiboException; import com.weibo.sdk.android.WeiboParameters; import com.weibo.sdk.android.api.UsersAPI; import com.weibo.sdk.android.api.WeiboAPI; import com.weibo.sdk.android.net.AsyncWeiboRunner; import com.weibo.sdk.android.net.RequestListener; import com.weibo.sdk.android.util.Utility; public class OAuthActivity extends BaseActivity { private WebView webView; private MenuItem refreshItem; private ProgressDialog progressDialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_oauth); setTitle("登录"); webView = (WebView) findViewById(R.id.webView); webView.setWebViewClient(new WeiboWebViewClient()); WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); settings.setSaveFormData(false); settings.setSavePassword(false); settings.setCacheMode(WebSettings.LOAD_NO_CACHE); settings.setRenderPriority(WebSettings.RenderPriority.HIGH); CookieSyncManager.createInstance(this); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.removeAllCookie(); progressDialog = new ProgressDialog(this); progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); } @Override protected void onDestroy() { super.onDestroy(); webView.clearCache(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.menu_oauth, menu); refreshItem = menu.findItem(R.id.menu_oauth_refresh); onRefresh(); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; case R.id.menu_oauth_refresh: onRefresh(); return true; default: return super.onOptionsItemSelected(item); } } public void onRefresh() { webView.clearView(); webView.loadUrl("about:blank"); refreshItem.setActionView(R.layout.layout_loading); webView.loadUrl(getWeiboOAuthURL()); } private void completeRefresh() { if (refreshItem.getActionView() != null) { refreshItem.setActionView(null); } } private String getWeiboOAuthURL() { Map<String, String> params = new HashMap<String, String>(); params.put("client_id", WeiboBaseTool.APP_KEY); params.put("response_type", "code"); params.put("redirect_uri", WeiboBaseTool.REDIRECT_URL); params.put("display", "mobile"); return WeiboBaseTool.OAUTH2_ACCESS_AUTHORIZE_URL + "?" + URLTool.encodeURL(params) + "&scope=friendships_groups_read"; } private class WeiboWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { if (url.startsWith(WeiboBaseTool.REDIRECT_URL)) { handleRedirectUrl(view, url); view.stopLoading(); return; } super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); if (!url.equals("about:blank")) completeRefresh(); } } private void handleRedirectUrl(WebView view, String url) { final Bundle values = Utility.parseUrl(url); String error = values.getString("error"); String error_code = values.getString("error_code"); Intent intent = new Intent(); intent.putExtras(values); final Message msg = new Message(); if (error == null && error_code == null) { progressDialog.setMessage("初始化用户信息中..."); progressDialog.show(); setResult(RESULT_OK, intent); new Thread(new Runnable() { @Override public void run() { getAccessToken(msg, values.getString("code")); } }).start(); } else { ToastHelper.show("授权失败"); finish(); } } private void getAccessToken(final Message msg, String code) { OAuthAPI oauthAPI = new OAuthAPI(); oauthAPI.getToken(code, 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{ if(StringUtils.isNullOrEmpty(arg0)) { msg.arg1 = -1; handler.sendMessage(msg); return; } JSONObject values = new JSONObject(arg0); String id = values.optString("uid"); String token = values.optString("access_token"); String expires_in = values.optString("expires_in"); long exp = System.currentTimeMillis() + Long.parseLong(expires_in) * 1000; AccountModel account = new AccountModel(); account.uID = id; account.token = token; account.expTime = exp; account.type = AccountManager.TYPE_SINA_WEIBO; fetchAccountInfo(account, msg); }catch (Exception e) { msg.arg1 = -1; handler.sendMessage(msg); } } }); } private void fetchAccountInfo(final AccountModel account, final Message msg) { Oauth2AccessToken oauth2AccessToken = new Oauth2AccessToken(); oauth2AccessToken.setToken(account.token); oauth2AccessToken.setExpiresTime(account.expTime); UsersAPI usersAPI=new UsersAPI(oauth2AccessToken); long lID = Long.parseLong(account.uID); 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); } } }); } private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { progressDialog.dismiss(); if(msg.arg1 > 0) { Intent intent = new Intent(OAuthActivity.this, TimeLineActivity.class); startActivity(intent); } else { ToastHelper.show("获取信息过程发生错误"); } } }; @Override public void onBackPressed() { super.onBackPressed(); if (webView.canGoBack()) { webView.goBack(); } else { ToastHelper.show("您取消了授权"); finish(); } } @Override protected void onPause() { super.onPause(); if (isFinishing()) webView.stopLoading(); } }