/** * $id$ * Copyright 2011-2012 Renren Inc. All rights reserved. */ package com.renren.api.connect.android; import java.util.concurrent.Executor; import org.json.JSONObject; import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.os.Handler; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import com.renren.api.connect.android.exception.RenrenAuthError; import com.renren.api.connect.android.exception.RenrenError; import com.renren.api.connect.android.exception.RenrenException; import com.renren.api.connect.android.view.RenrenAuthListener; /** * 用于发送密码验证请求 * * @author hecao (he.cao@renren-inc.com) * */ public class PasswordFlowHelper { private static final String PASSWORD_FLOW_URL = "https://graph.renren.com/oauth/token"; /** * 同步方法,使用用户名和密码登陆 * * @param param * 请求的参数 * @return 返回{@link PasswordFlowResponseBean}对象 * @throws RenrenException * @throws Throwable */ public PasswordFlowResponseBean login(PasswordFlowRequestParam param) throws RenrenException, Throwable { String url = PASSWORD_FLOW_URL; String method = "POST"; Bundle bundle = param.getParams(); try { String response = Util.openUrl(url, method, bundle); if (response != null) { JSONObject obj = new JSONObject(response); if (obj != null) { if (!TextUtils.isEmpty(obj.optString("error"))) { String message = obj.optString("error_description"); throw new RenrenException(RenrenError.ERROR_CODE_AUTH_FAILED, message, message); } } PasswordFlowResponseBean passwordFlow = new PasswordFlowResponseBean(response); return passwordFlow; } else { Util.logger("null response"); throw new RenrenException(RenrenError.ERROR_CODE_UNKNOWN_ERROR, "null response", "null response"); } } catch (RuntimeException e) { Util.logger("runtime exception" + e.getMessage()); throw new Throwable(e); } } /** * 异步方法,使用用户名和密码登陆 * * @param param * 请求的参数 * @param listener * 登陆状态的监听器 * @param renren * Renren对象 */ public void login(Executor pool, final PasswordFlowRequestParam param, final RenrenAuthListener listener, final Renren renren) { pool.execute(new Runnable() { @Override public void run() { try { PasswordFlowResponseBean passwordFlow = login(param); if (passwordFlow != null) { Bundle values = new Bundle(); values.putString(PasswordFlowResponseBean.KEY_ACCESS_TOKEN, passwordFlow.getAccessToken()); values.putLong(PasswordFlowResponseBean.KEY_EXPIRES_IN, passwordFlow.getExpire()); values.putString(PasswordFlowResponseBean.KEY_REFRESH_TOKEN, passwordFlow.getRefreshToken()); values.putString(PasswordFlowResponseBean.KEY_SCOPE, passwordFlow.getScope()); renren.updateAccessToken(passwordFlow.getAccessToken()); if (listener != null) { listener.onComplete(values); } } else { Util.logger("null response"); throw new RenrenException(RenrenError.ERROR_CODE_UNKNOWN_ERROR, "null response", "null response"); } } catch (RenrenException e) { Util.logger("renren exception " + e.getMessage()); if (listener != null) { listener.onRenrenAuthError(new RenrenAuthError(String.valueOf(e.getErrorCode()), e.getOrgResponse(), PASSWORD_FLOW_URL)); } e.printStackTrace(); } catch (Throwable e) { Util.logger("on renren fault " + e.getMessage()); if (listener != null) { listener.onRenrenAuthError(new RenrenAuthError("on falut", e.getMessage(), PASSWORD_FLOW_URL)); } e.printStackTrace(); } } }); } /** * 弹出输入框,使用用户名和密码登陆 * * @param activity * 当前的显示的Activity * @param param * 请求的参数 * @param listener * 登陆状态的监听器 * @param renren * Renren对象 */ public void login(final Activity activity, PasswordFlowRequestParam param, final RenrenAuthListener listener, final Renren renren) { LoginEntryDialog dialog = new LoginEntryDialog(activity, param, listener, this, renren); dialog.show(); } /** * 登陆的弹窗 * * @author hecao (he.cao@renren-inc.com) * */ class LoginEntryDialog extends Dialog { private PasswordFlowRequestParam param; private RenrenAuthListener listener; private ProgressDialog dialog; private Handler handler; private Renren renren; public LoginEntryDialog(Context context) { super(context); } public LoginEntryDialog(Activity activity, PasswordFlowRequestParam param, RenrenAuthListener listener, PasswordFlowHelper helper, Renren renren) { super(activity); this.param = param; this.listener = listener; this.handler = new Handler(); this.renren = renren; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); final LinearLayout loginEntryView = (LinearLayout) getLayoutInflater() .inflate(R.layout.renren_sdk_login_entry, null); loginEntryView.setOnClickListener(null); loginEntryView.setOnTouchListener(null); loginEntryView.setOnLongClickListener(null); loginEntryView.setOnKeyListener(null); ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); addContentView(loginEntryView, params); initViews(loginEntryView); } private void initViews(LinearLayout loginEntryView) { final EditText userNameEditText = (EditText) loginEntryView.findViewById(R.id.renren_sdk_login_entry_username); final EditText passwordEditText = (EditText) loginEntryView.findViewById(R.id.renren_sdk_login_entry_password); Button button = (Button) loginEntryView.findViewById(R.id.renren_sdk_login_confirm_button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String userName = userNameEditText.getText().toString(); String password = passwordEditText.getText().toString(); if (!TextUtils.isEmpty(userName) && !TextUtils.isEmpty(password)) { param.setUserName(userName); param.setPassword(password); login(); } } }); this.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { if (listener != null) { listener.onCancelLogin(); } } }); } private void login() { dialog = new ProgressDialog(getContext()); dialog.setMessage("正在登陆"); dialog.show(); AsyncRenren asyncRenren = new AsyncRenren(renren); RenrenAuthListener authListener = new RenrenAuthListener() { @Override public void onRenrenAuthError(RenrenAuthError renrenAuthError) { if (listener != null) { listener.onRenrenAuthError(renrenAuthError); } handler.post(new Runnable() { @Override public void run() { dialog.dismiss(); } }); } @Override public void onComplete(Bundle values) { if (listener != null) { listener.onComplete(values); } handler.post(new Runnable() { @Override public void run() { dialog.dismiss(); LoginEntryDialog.this.dismiss(); } }); } @Override public void onCancelLogin() { if (listener != null) { listener.onCancelLogin(); } handler.post(new Runnable() { @Override public void run() { dialog.dismiss(); } }); } @Override public void onCancelAuth(Bundle values) { if (listener != null) { listener.onCancelAuth(values); } handler.post(new Runnable() { @Override public void run() { dialog.dismiss(); } }); } }; asyncRenren.authorize(param, authListener); } } }