package com.wuxiaolong.wochat.ui; import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import com.avos.avoscloud.AVException; import com.avos.avoscloud.AVFile; import com.avos.avoscloud.AVUser; import com.avos.avoscloud.LogInCallback; import com.avos.avoscloud.SaveCallback; import com.avoscloud.leanchatlib.controller.LeanchatUser; import com.avoscloud.leanchatlib.controller.UserCacheUtils; import com.tencent.connect.UserInfo; import com.tencent.connect.common.Constants; import com.tencent.tauth.IUiListener; import com.tencent.tauth.Tencent; import com.tencent.tauth.UiError; import com.wuxiaolong.wochat.R; import com.wuxiaolong.wochat.leancloud.ChatManager; import com.wuxiaolong.wochat.ui.chat.ChatRoomActivity; import com.wuxiaolong.wochat.util.AppConstant; import com.wuxiaolong.wochat.util.AppUtil; import org.json.JSONException; import org.json.JSONObject; /** * A login screen that offers login via email/password. */ public class LoginActivity extends BaseActivity { public static Tencent mTencent; private TencentLoginListener mTencentLoginListener; private String token, openid, expires_in; private String nickname, avatar; private ProgressDialog mProgressDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); // Tencent类是SDK的主要实现类,开发者可通过Tencent类访问腾讯开放的OpenAPI。其中APP_ID是分配给第三方应用的appid,类型为String。 mTencent = Tencent.createInstance(AppConstant.TENCENT_APP_ID, LoginActivity.this); LeanchatUser currentUser = LeanchatUser.getCurrentUser(); if (currentUser != null) { gotoChatRoomActivity(); } } public void onLogin(View view) { mProgressDialog = AppUtil.showProgressDialog(LoginActivity.this); if (!mTencent.isSessionValid()) { mTencentLoginListener = new TencentLoginListener(); mTencentLoginListener.setIsLogin(true); mTencent.login(this, "all", mTencentLoginListener); } else { UserInfo userInfo = new UserInfo(getApplicationContext(), mTencent.getQQToken()); mTencentLoginListener.setIsLogin(false); userInfo.getUserInfo(mTencentLoginListener); } } class TencentLoginListener implements IUiListener { boolean isLogin; public void setIsLogin(boolean isLogin) { this.isLogin = isLogin; } @Override public void onComplete(Object object) { if (isLogin) { tencentLoginonComplete(object); } else { loginByLeancloud(object); } } @Override public void onError(UiError uiError) { mProgressDialog.dismiss(); Log.e("wxl", " mTencent.onError==" + uiError); } @Override public void onCancel() { mProgressDialog.dismiss(); Log.e("wxl", " mTencent.onCancel=="); } } public void tencentLoginonComplete(Object object) { JSONObject jsonObject = (JSONObject) object; try { token = jsonObject.getString(Constants.PARAM_ACCESS_TOKEN); openid = jsonObject.getString(Constants.PARAM_OPEN_ID); expires_in = jsonObject.getString(Constants.PARAM_EXPIRES_IN); mTencent.setAccessToken(token, expires_in); mTencent.setOpenId(openid); } catch (JSONException e) { e.printStackTrace(); } UserInfo userInfo = new UserInfo(getApplicationContext(), mTencent.getQQToken()); mTencentLoginListener.setIsLogin(false); userInfo.getUserInfo(mTencentLoginListener); } public void loginByLeancloud(Object object) { JSONObject jsonObject = (JSONObject) object; try { nickname = jsonObject.getString("nickname"); avatar = jsonObject.getString("figureurl_qq_2"); } catch (JSONException e) { e.printStackTrace(); } AVUser.AVThirdPartyUserAuth auth = new AVUser.AVThirdPartyUserAuth(token, String.valueOf(expires_in), AVUser.AVThirdPartyUserAuth.SNS_TENCENT_WEIBO, openid); AVUser.loginWithAuthData(auth, new LeancloudLogInCallback()); } class LeancloudLogInCallback extends LogInCallback<AVUser> { @Override public void done(AVUser user, AVException e) { if (e == null) { boolean registerCompleted = user.getBoolean(LeanchatUser.REGISTER_COMPLETED); Log.i("wxl", "registerCompleted=" + registerCompleted); //恭喜你,已经和我们的 AVUser 绑定成功 if (registerCompleted) { gotoChatRoomActivity(); } else { //保存AVFile头像 final AVFile avFile = new AVFile(nickname, avatar, null); avFile.saveInBackground(new SaveCallback() { @Override public void done(AVException e) { if (filterException(e)) { saveUserAvatar(avFile, nickname); } else { showToast("loginWithAuthData fail"); } } }); } } else { mProgressDialog.dismiss(); e.printStackTrace(); Log.e("wxl", "loginWithAuthData fail"); } } } /** * 保存用户头像和昵称 */ private void saveUserAvatar(AVFile avFile, String nickname) { final LeanchatUser leanchatUser = LeanchatUser.getCurrentUser(); leanchatUser.put(LeanchatUser.AVATAR, avFile); leanchatUser.put(LeanchatUser.NICKNAME, nickname); leanchatUser.put(LeanchatUser.REGISTER_COMPLETED, true); leanchatUser.saveInBackground( new SaveCallback() { @Override public void done(AVException e) { mProgressDialog.dismiss(); if (filterException(e)) { gotoChatRoomActivity(); } else { showToast("loginFail"); } } } ); } void gotoChatRoomActivity() { ChatManager chatManager = ChatManager.getInstance(); chatManager.setupManagerWithUserId(LoginActivity.this, LeanchatUser.getCurrentUserId()); chatManager.openClient(null); UserCacheUtils.cacheUser(LeanchatUser.getCurrentUser()); ChatRoomActivity.openConversation(LoginActivity.this, getString(R.string.wewin)); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (mTencentLoginListener != null) Tencent.onActivityResultData(requestCode, resultCode, data, mTencentLoginListener); } }