/** * $id$ * Copyright 2011-2012 Renren Inc. All rights reserved. */ package com.renren.api.connect.android; import android.os.Bundle; import android.util.Log; import android.webkit.CookieSyncManager; import com.renren.api.connect.android.exception.RenrenAuthError; import com.renren.api.connect.android.exception.RenrenError; import com.renren.api.connect.android.view.RenrenAuthListener; import com.renren.api.connect.android.view.RenrenDialogListener; import com.renren.api.connect.android.view.RenrenFeedListener; import com.renren.api.connect.android.view.RenrenWidgetListener; /** * 构造RenrenDialogListener的工厂;开发者不会直接使用该类。 * * @author 李勇(yong.li@opi-corp.com) 2011-2-25 */ class RenrenListenerFactory { static RenrenDialogListener genFeedRenrenDialogListener(final Renren renren, final RenrenFeedListener listener) { return new AbstractRenrenDialogListener() { @Override public void onReceivedError(int errorCode, String description, String failingUrl) { listener.onError(new RenrenAuthError(String.valueOf(errorCode), description, failingUrl)); } @Override public int onPageBegin(String url) { if (url.startsWith(Renren.SUCCESS_URI)) { Bundle values = Util.parseUrl(url); String error = values.getString("error_reason"); if (error == null) { listener.onComplete(values); } else { listener.onRenrenError(new RenrenError(error)); } return RenrenDialogListener.ACTION_PROCCESSED; } else if (url.startsWith(Renren.CANCEL_URI)) { Bundle values = Util.parseUrl(url); String errMsg = values.getString("errMsg"); if (errMsg != null) { listener.onRenrenError(new RenrenError(errMsg)); } else { listener.onCancel(); } return RenrenDialogListener.ACTION_PROCCESSED; } return RenrenDialogListener.ACTION_UNPROCCESS; } }; } static RenrenDialogListener genRenrenWidgetDialogListener(final Renren renren, final RenrenWidgetListener listener) { return new AbstractRenrenDialogListener() { @Override public void onReceivedError(int errorCode, String description, String failingUrl) { Bundle params = new Bundle(); params.putInt("code", errorCode); params.putString("desc", description); params.putString("failUrl", failingUrl); listener.onError(params); } @Override public int onPageBegin(String url) { if (url.startsWith(Renren.WIDGET_CALLBACK_URI)) { Bundle values = Util.parseUrl(url); String error = values.getString("error"); if (error == null) { listener.onComplete(values); } else if ("access_denied".equals(error)) { listener.onCancel(values); } else { listener.onError(values); } return RenrenDialogListener.ACTION_PROCCESSED; } return RenrenDialogListener.ACTION_DIALOG_PROCCESS; } }; } /** * User-Agent Flow * * @param renren * @param listener * @return */ static RenrenDialogListener genUserAgentFlowRenrenDialogListener(final Renren renren, final RenrenAuthListener listener, final String redirectUrl) { return new AbstractRenrenDialogListener() { @Override public void onReceivedError(int errorCode, String description, String failingUrl) { listener.onRenrenAuthError(new RenrenAuthError(String.valueOf(errorCode), description, failingUrl)); } @Override public int onPageBegin(String url) { int i = super.onPageBegin(url); if (i == RenrenDialogListener.ACTION_UNPROCCESS) { if (url.startsWith("http://graph.renren.com/login_deny/")) { return RenrenDialogListener.ACTION_DIALOG_PROCCESS; } else { i = this.checkUrl(url); } } return i; } @Override public boolean onPageStart(String url) { boolean b = false; //在授权完成的时候不调用onPageBegin方法,原因未知。有时候装入页面的时候会先调用onPageStart再调onPageBegin,原因未知难道是BUG。 // if (url.startsWith(redirectUrl)) { // Bundle values = Util.parseUrl(url); // String accessToken = values.getString("access_token"); // if (accessToken != null) { // this.authComplete(values); // b = true; // } // } return b; } private int checkUrl(String url) { if (url.startsWith(redirectUrl)) { Bundle values = Util.parseUrl(url); String error = values.getString("error");//OAuth返回的错误代码 if (error != null) { if ("access_denied".equalsIgnoreCase(error)) { listener.onCancelAuth(values); } else if ("login_denied".equalsIgnoreCase(error)) { listener.onCancelLogin(); } else { String desc = values.getString("error_description"); String errorUri = values.getString("error_uri"); listener.onRenrenAuthError(new RenrenAuthError(error, desc, errorUri)); } } else { this.authComplete(values); } return RenrenDialogListener.ACTION_PROCCESSED; } return RenrenDialogListener.ACTION_UNPROCCESS; } private void authComplete(Bundle values) { CookieSyncManager.getInstance().sync(); String accessToken = values.getString("access_token"); if (accessToken != null) { Log.d(Util.LOG_TAG, "Success obtain access_token=" + accessToken); try { renren.updateAccessToken(accessToken); listener.onComplete(values); } catch (Exception e) { e.printStackTrace(); listener.onRenrenAuthError(new RenrenAuthError(e.getClass().getName(), e .getMessage(), e.toString())); } } } }; } /** * Web Server Flow * * @param renren * @param listener * @param redirectUrl * @return */ static RenrenDialogListener genWebServerFlowRenrenDialogListener(final Renren renren, final RenrenAuthListener listener, final String redirectUrl) { return new AbstractRenrenDialogListener() { @Override public void onReceivedError(int errorCode, String description, String failingUrl) { listener.onRenrenAuthError(new RenrenAuthError(String.valueOf(errorCode), description, failingUrl)); } @Override public int onPageBegin(String url) { int i = super.onPageBegin(url); if (url.startsWith("http://graph.renren.com/login_deny/")) { return RenrenDialogListener.ACTION_DIALOG_PROCCESS; } if (url.startsWith(redirectUrl)) { return RenrenDialogListener.ACTION_DIALOG_PROCCESS; } if (this.check(url)) { return RenrenDialogListener.ACTION_PROCCESSED; } return i; } @Override public boolean onPageStart(String url) { //return this.check(url); //将所有的操作交给onPageBegin默认的onPageStart不做任何操作 return false; } private boolean check(String url) { if (url.startsWith(Renren.CANCEL_URI)) { Bundle values = Util.parseUrl(url); String action = values.getString("action"); if ("auth".equalsIgnoreCase(action)) { listener.onCancelAuth(values); } else { listener.onCancelLogin(); } return true; } else if (url.startsWith(Renren.SUCCESS_URI)) { Bundle values = Util.parseUrl(url); listener.onComplete(values); return true; } return false; } }; } } abstract class AbstractRenrenDialogListener implements RenrenDialogListener { @Override public int onPageBegin(String url) { if (url.contains("display")) {//参数中带有display参数的页面;在该WebView中显示。 return RenrenDialogListener.ACTION_DIALOG_PROCCESS; } return 0; } @Override public void onPageFinished(String url) { } @Override public boolean onPageStart(String url) { return false; } }