Files
assistant-android/app/src/main/java/com/gh/common/util/LoginHelper.kt

197 lines
7.6 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.gh.common.util
import android.app.Activity
import android.content.Intent
import android.widget.Toast
import com.gh.common.constant.Config
import com.gh.gamecenter.R
import com.gh.gamecenter.user.LoginTag
import com.halo.assistant.HaloApp
import com.lightgame.utils.RuntimeUtils
import com.lightgame.utils.Utils
import com.sina.weibo.sdk.WbSdk
import com.sina.weibo.sdk.auth.AuthInfo
import com.sina.weibo.sdk.auth.Oauth2AccessToken
import com.sina.weibo.sdk.auth.WbAuthListener
import com.sina.weibo.sdk.auth.WbConnectErrorMessage
import com.sina.weibo.sdk.auth.sso.SsoHandler
import com.tencent.mm.opensdk.modelmsg.SendAuth
import com.tencent.mm.opensdk.openapi.IWXAPI
import com.tencent.mm.opensdk.openapi.WXAPIFactory
import com.tencent.tauth.IUiListener
import com.tencent.tauth.Tencent
import com.tencent.tauth.UiError
import org.json.JSONException
import org.json.JSONObject
import java.lang.ref.WeakReference
/**
* 第三方登录辅助类
*/
object LoginHelper {
const val WEIBO_SCOPE = (
"email,direct_messages_read,direct_messages_write,"
+ "friendships_groups_read,friendships_groups_write,statuses_to_me_read,"
+ "follow_app_official_microblog," + "invitation_write") // weiboCode
private var mTencent: Tencent // QQ
private var mIWXAPI: IWXAPI // 微信
private var mSsoHandler: WeakReference<SsoHandler>? = null // 微博
private var mQqLoginListener: IUiListener
private var mAccessToken: Oauth2AccessToken? = null // weibo
private var mLoginCallback: WeakReference<LoginCallback>? = null
init {
val context = HaloApp.getInstance().application.applicationContext
mTencent = Tencent.createInstance(Config.TENCENT_APPID, context) //初始化QQ分享
mIWXAPI = WXAPIFactory.createWXAPI(context, Config.WECHAT_APPID, true) //初始化微信分享
mQqLoginListener = object : IUiListener {
override fun onComplete(o: Any?) {
Utils.log("QQ 登录成功")
if (o is JSONObject) {
val s = o.toString()
Utils.log("QQLoginComplete::$s")
try {
mTencent.openId = o.getString("openid")
mTencent.setAccessToken(o.getString("access_token"), o.getString("expires_in"))
val content = JSONObject()
content.put("openid", o.getString("openid"))
content.put("access_token_expire", Utils.getTime(context) + o.getLong("expires_in"))
content.put("access_token", o.getString("access_token"))
mLoginCallback?.get()?.onLoginSuccess(LoginTag.qq, content) // 回调QQ登录成功
} catch (e: JSONException) {
val errorString = "QQ登录数据回调异常$e"
mLoginCallback?.get()?.onLoginFailure(LoginTag.qq, errorString) // 回调QQ登录失败
Utils.log(errorString)
e.printStackTrace()
}
}
}
override fun onCancel() {
mLoginCallback?.get()?.onLoginFailure(LoginTag.qq, "登录取消")
Utils.log("QQ 登录取消")
}
override fun onError(p0: UiError?) {
mLoginCallback?.get()?.onLoginFailure(LoginTag.qq, "登录失败")
Utils.log("QQ 登录失败")
}
}
WbSdk.install(context, AuthInfo(context, Config.WEIBO_APPKEY, "http://www.sina.com", WEIBO_SCOPE))
Utils.log("LoginHelper initialization")
}
@JvmStatic
fun onQQLoginCallback(requestCode: Int, resultCode: Int, data: Intent?) {
Tencent.onActivityResultData(requestCode, resultCode, data, mQqLoginListener);
}
@JvmStatic
fun onWechatLoginSuccess(content: JSONObject) {
mLoginCallback?.get()?.onLoginSuccess(LoginTag.wechat, content)
}
@JvmStatic
fun onWechatLoginFailure(error: String) {
mLoginCallback?.get()?.onLoginFailure(LoginTag.wechat, error)
}
@JvmStatic
fun onWeiboLoginCallback(requestCode: Int, resultCode: Int, data: Intent?) {
mSsoHandler?.get()?.authorizeCallBack(requestCode, resultCode, data)
}
// QQ登录
@JvmStatic
fun loginWithQQ(loginCallback: LoginCallback, activity: Activity) {
mLoginCallback = WeakReference(loginCallback)
if (!mTencent.isSessionValid) {
Utils.log("QQLogin")
mTencent.login(activity, "all", mQqLoginListener)
}
}
@JvmStatic
fun logoutWithQQ() {
if (mTencent.isSessionValid) {
mTencent.logout(HaloApp.getInstance().application.applicationContext)
}
}
// 微信登录
@JvmStatic
fun loginWithWechat(loginCallback: LoginCallback) {
mLoginCallback = WeakReference(loginCallback)
val register = mIWXAPI.registerApp(Config.WECHAT_APPID)
val req = SendAuth.Req()
req.scope = "snsapi_userinfo"
req.state = HaloApp.getInstance().application.getString(R.string.app_name)
val b = mIWXAPI.sendReq(req)
Utils.log("微信注册状态::$register\n 发送状态::$b")
if (!register || !b) {
loginCallback.onLoginFailure(LoginTag.wechat, "请检查是否安装微信客户端")
Utils.toast(HaloApp.getInstance().application, "请检查是否安装微信客户端")
}
}
// 微博登录
@JvmStatic
fun loginWithWeibo(loginCallback: LoginCallback, context: Activity) {
mLoginCallback = WeakReference(loginCallback)
mSsoHandler = WeakReference(SsoHandler(context))
mSsoHandler?.get()?.authorizeClientSso(object : WbAuthListener {
override fun onSuccess(token: Oauth2AccessToken?) {
token?.let {
RuntimeUtils.getInstance().runOnUiThread {
mAccessToken = token
if (mAccessToken?.isSessionValid == true) {
// 保存 Token 到 SharedPreferences
AccessTokenKeeper.writeAccessToken(context, mAccessToken)
Utils.toast(context, "授权成功")
}
}
val content = JSONObject()
tryWithDefaultCatch {
content.put("uid", token.uid)
content.put("access_token", token.token)
content.put("access_token_expire", Utils.getTime(context) + token.expiresTime)
content.put("refresh_token", token.refreshToken)
// content.put("refresh_token_expire", Utils.getTime(mContext) + 86400 * 30); // refresh_token 有效期30天
mLoginCallback?.get()?.onLoginSuccess(LoginTag.weibo, content)// 微博 登录回调
}
}
}
override fun onFailure(p0: WbConnectErrorMessage?) {
mLoginCallback?.get()?.onLoginFailure(LoginTag.weibo, "微博登录需要客户端支持,请先安装微博")
}
override fun cancel() {
mLoginCallback?.get()?.onLoginFailure(LoginTag.weibo, "取消授权")
}
})
// 第一次启动本应用AccessToken 不可用
mAccessToken = AccessTokenKeeper.readAccessToken(context)
}
interface LoginCallback {
fun onLoginSuccess(loginType: LoginTag, jsonContent: JSONObject)
fun onLoginFailure(loginType: LoginTag, error: String)
}
}