/*
* Copyright (C) 2010-2013 The SINA WEIBO Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.sina.weibo.sdk.widget;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.AttributeSet;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.sina.weibo.sdksupport.R;
import com.sina.weibo.sdk.auth.AuthInfo;
import com.sina.weibo.sdk.auth.WeiboAuthListener;
import com.sina.weibo.sdk.auth.sso.SsoHandler;
import com.sina.weibo.sdk.utils.LogUtil;
/**
* 该类提供了一个简单的登录控件。
* 该登陆控件只提供登录功能(SSO 登陆授权),它有三种内置的样式。
*
* @author SINA
* @since 2013-11-04
*/
public class LoginButton extends Button implements OnClickListener {
private static final String TAG = "LoginButton";
/** 默认样式,同时带有新浪微博图标和文字的图标 */
public static final int LOGIN_INCON_STYLE_1 = 1;
/** 样式二,带边框的新浪微博图标 */
public static final int LOGIN_INCON_STYLE_2 = 2;
/** 样式三,不带边框的新浪微博图标 */
public static final int LOGIN_INCON_STYLE_3 = 3;
/** 微博授权时,启动 SSO 界面的 Activity */
private Context mContext;
/** 授权认证所需要的信息 */
private AuthInfo mAuthInfo;
/** SSO 授权认证实例 */
private SsoHandler mSsoHandler;
/** 微博授权认证回调 */
private WeiboAuthListener mAuthListener;
/** 点击 Button 时,额外的 Listener */
private OnClickListener mExternalOnClickListener;
/**
* 创建一个登录按钮。
*
* @see View#View(Context)
*/
public LoginButton(Context context) {
this(context, null);
}
/**
* 从 XML 配置文件中创建一个按钮。
*
* @see View#View(Context, AttributeSet)
*/
public LoginButton(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
/**
* 从 XML 配置文件以及样式中创建一个按钮。
*
* @see View#View(Context, AttributeSet, int)
*/
public LoginButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initialize(context);
}
/**
* 设置微博授权所需信息以及回调函数。
*
* @param authInfo 用于保存授权认证所需要的信息
* @param authListener 微博授权认证回调接口
*/
public void setWeiboAuthInfo(AuthInfo authInfo, WeiboAuthListener authListener) {
mAuthInfo = authInfo;
mAuthListener = authListener;
}
/**
* 设置微博授权所需信息。
*
* @param appKey 第三方应用的 APP_KEY
* @param redirectUrl 第三方应用的回调页
* @param scope 第三方应用申请的权限
* @param authListener 微博授权认证回调接口
*/
public void setWeiboAuthInfo(String appKey, String redirectUrl, String scope, WeiboAuthListener authListener) {
mAuthInfo = new AuthInfo(mContext, appKey, redirectUrl, scope);
mAuthListener = authListener;
}
/**
* 设置微博登陆按钮显示的样式,默认为同时带有新浪微博图标和文字的样式。
*
* @param style 登录按钮的样式。可以是以下几种样式中的一种:
* {@link #LOGIN_INCON_STYLE_1},
* {@link #LOGIN_INCON_STYLE_2},
* {@link #LOGIN_INCON_STYLE_3}
*/
public void setStyle(int style) {
int iconResId = R.drawable.com_sina_weibo_sdk_login_button_with_account_text;
switch (style) {
case LOGIN_INCON_STYLE_1:
iconResId = R.drawable.com_sina_weibo_sdk_login_button_with_account_text;
break;
case LOGIN_INCON_STYLE_2:
iconResId = R.drawable.com_sina_weibo_sdk_login_button_with_frame_logo;
break;
case LOGIN_INCON_STYLE_3:
iconResId = R.drawable.com_sina_weibo_sdk_login_button_with_original_logo;
break;
default:
break;
}
setBackgroundResource(iconResId);
}
/**
* 设置一个额外的 Button 点击时的 Listener。
* 当触发 Button 点击事件时,会先调用该 Listener,给使用者一个可访问的机会,
* 然后再调用内部默认的处理。
* <p><b>注意:一般情况下,使用者不需要调用该方法,除非有其它必要性。<b></p>
*
* @param listener Button 点击时的 Listener
*/
public void setExternalOnClickListener(OnClickListener listener) {
mExternalOnClickListener = listener;
}
/**
* 按钮被点击时,调用该函数。
*/
@Override
public void onClick(View v) {
// Give a chance to external listener
if (mExternalOnClickListener != null) {
mExternalOnClickListener.onClick(v);
}
if (null == mSsoHandler && mAuthInfo != null) {
mSsoHandler = new SsoHandler((Activity)mContext, mAuthInfo);
}
if (mSsoHandler != null) {
mSsoHandler.authorize(mAuthListener);
} else {
LogUtil.e(TAG, "Please setWeiboAuthInfo(...) for first");
}
}
/**
* 使用该控件进行授权登陆时,需要手动调用该函数。
* <p>
* 重要:使用该控件的 Activity 必须重写 {@link Activity#onActivityResult(int, int, Intent)},
* 并在内部调用该函数,否则无法授权成功。</p>
* <p>Sample Code:</p>
* <pre class="prettyprint">
* protected void onActivityResult(int requestCode, int resultCode, Intent data) {
* super.onActivityResult(requestCode, resultCode, data);
*
* // 在此处调用
* mLoginButton.onActivityResult(requestCode, resultCode, data);
* }
* </pre>
* @param requestCode 请查看 {@link Activity#onActivityResult(int, int, Intent)}
* @param resultCode 请查看 {@link Activity#onActivityResult(int, int, Intent)}
* @param data 请查看 {@link Activity#onActivityResult(int, int, Intent)}
*/
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (mSsoHandler != null) {
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
}
}
/**
* 按钮初始化函数。
*
* @param context 上下文环境,一般为放置该 Button 的 Activity
*/
private void initialize(Context context) {
mContext = context;
setOnClickListener(this);
setStyle(LOGIN_INCON_STYLE_1);
}
}