package com.emop.client.web; import static com.emop.client.Constants.TAG_EMOP; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import org.json.JSONObject; import org.json.JSONTokener; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.Message; import android.view.View; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ProgressBar; import com.emop.client.Constants; import com.emop.client.WebLoginActivity; import com.emop.client.WebViewActivity; import com.emop.client.io.ApiResult; import com.emop.client.io.FmeiClient; import com.taobao.top.android.TOPUtils; import com.taobao.top.android.TopAndroidClient; import com.taobao.top.android.auth.AccessToken; import com.taobao.top.android.auth.AuthError; import com.taobao.top.android.auth.AuthException; import com.taobao.top.android.auth.AuthorizeListener; import com.tencent.mm.sdk.platformtools.Log; import com.weibo.net.Utility; import com.weibo.net.Weibo; import com.weibo.net.WeiboException; import com.weibo.net.WeiboParameters; public class TaobaoLoginWebClient extends WebViewClient { private FmeiClient client = null; //FmeiClient.getInstance(); private WebViewActivity web = null; private ProgressBar processBar = null; public TaobaoLoginWebClient(WebViewActivity web, ProgressBar processBar){ this.web = web; client = FmeiClient.getInstance(web); this.processBar = processBar; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); //mSpinner.show(); processBar.setVisibility(View.VISIBLE); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); processBar.setVisibility(View.INVISIBLE); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.d(TAG_EMOP, "Taobao URL: " + url); if(url != null && url.startsWith("callback:")){ Message msg = web.handler.obtainMessage(WebViewActivity.WEB_LOADING); web.handler.sendMessage(msg); processTaobaoCallBack(url); return true; } return false; } private void processTaobaoCallBack(String callback){ final TopAndroidClient client = TopAndroidClient.getAndroidClientByAppKey(Constants.TAOBAO_APPID); Uri uri = Uri.parse(callback); if (uri.getScheme().equals("callback")) { String errorStr = uri.getQueryParameter("error"); //AuthorizeListener listener = getAuthorizeListener(); if (errorStr == null) {// 授权成功 // String ret = url.substring(url.indexOf("#") + 1); String ret = uri.getFragment(); String[] kv = ret.split("&"); Bundle values = new Bundle(); for (String each : kv) { String[] ss = each.split("="); if (ss != null && ss.length == 2) { values.putString(ss[0], ss[1]); } } final AccessToken token = TOPUtils.convertToAccessToken(values); // Android3.0后ui主线程中同步访问网络会有限制。 // 使用ExecutorService.invokeAll()阻塞主线程的方式起一个线程再去调用api Callable<Date> task = new Callable<Date>() { @Override public Date call() throws Exception { Date date = client.getTime(); return date; } }; List<Callable<Date>> tasks = new ArrayList<Callable<Date>>(); tasks.add(task); ExecutorService es = Executors.newSingleThreadExecutor(); try { List<Future<Date>> results = es.invokeAll(tasks); Future<Date> future = results.get(0); token.setStartDate(future.get()); client.addAccessToken(token); } catch (Exception e) { listener.onAuthException(new AuthException(e)); } listener.onComplete(token); } else {// 授权失败 String errorDes = uri.getQueryParameter("error_description"); AuthError error = new AuthError(); error.setError(errorStr); error.setErrorDescription(errorDes); listener.onError(error); } } } private AuthorizeListener listener = new AuthorizeListener(){ @Override public void onComplete(AccessToken accessToken) { Log.d(Constants.TAG_EMOP, "callback"); String id=accessToken.getAdditionalInformation().get(AccessToken.KEY_SUB_TAOBAO_USER_ID); if(id==null){ id=accessToken.getAdditionalInformation().get(AccessToken.KEY_TAOBAO_USER_ID); } //MainActivity.this.userId=Long.parseLong(id); String nick=accessToken.getAdditionalInformation().get(AccessToken.KEY_SUB_TAOBAO_USER_NICK); if(nick==null){ nick=accessToken.getAdditionalInformation().get(AccessToken.KEY_TAOBAO_USER_NICK); } Log.e(Constants.TAG_EMOP, "user id:" + id + ", nick:" + nick); String r2_expires = accessToken.getAdditionalInformation().get( AccessToken.KEY_R2_EXPIRES_IN); Date start = accessToken.getStartDate(); Date end = new Date(start.getTime() + Long.parseLong(r2_expires) * 1000L); if(id != null && nick != null){ client.saveRefUser(web, Constants.AUTH_REF_TAOBAO, id, nick); new GetUserInfoTask(id, accessToken.getValue()).start(); }else { Message msg = web.handler.obtainMessage(WebViewActivity.WEB_DONE); msg.obj = "查询登录用户信息错误, 请稍后重试。"; web.handler.sendMessage(msg); } } @Override public void onError(AuthError e) { Log.e(Constants.TAG_EMOP, "error:" + e.getErrorDescription()); Message msg = web.handler.obtainMessage(WebViewActivity.WEB_DONE); msg.obj = "网络出错,无法登陆,请稍后重试。error:" + e.getErrorDescription(); web.handler.sendMessage(msg); } @Override public void onAuthException(AuthException e) { Log.e(Constants.TAG_EMOP, "Autha exception:" + e.getMessage()); Message msg = web.handler.obtainMessage(WebViewActivity.WEB_DONE); msg.obj = "网络出错,无法登陆,请稍后重试。error:" + e.getMessage(); web.handler.sendMessage(msg); }}; class GetUserInfoTask extends Thread{ private String uid = null; private String accessToken = null; public GetUserInfoTask(String uid, String accessToken){ this.uid = uid; this.accessToken = accessToken; } @Override public void run(){ ApiResult r = client.bindUserInfo("taobao", uid, accessToken); if(r != null && r.isOK){ String status = r.getString("data.user_status"); if(status != null && status.trim().equals("2001")){ client.saveLoginUser(web, r.getString("data.user_id")); }else { } Message msg = web.handler.obtainMessage(WebViewActivity.WEB_DONE); web.handler.sendMessage(msg); }else { Message msg = web.handler.obtainMessage(WebViewActivity.WEB_DONE); msg.obj = "网络出错,无法登陆,请稍后重试。"; web.handler.sendMessage(msg); } } } }