feat:移除微信、QQ相关的登录分享功能(还未与接口联调测试)

feat:新增google登录、Line登录、Line分享、复制链接(还未与接口联调测试)
This commit is contained in:
Max
2024-01-12 19:15:59 +08:00
parent db6fdf3266
commit 8f0d723fba
22 changed files with 430 additions and 387 deletions

View File

@@ -212,7 +212,7 @@ public class XChatApplication extends BaseApp {
String channel;
channel = MetaDataUtils.INSTANCE.getStringData(Constants.CHANNEL_KEY, application);
if (TextUtils.isEmpty(channel)) {
channel = "official";
channel = com.nnbc123.library.common.Constants.CHANNEL_DEF;
}
Log.d("XChatApplication", "channel:" + channel);
BasicConfig.INSTANCE.setOriginalChannel(channel);

View File

@@ -17,12 +17,6 @@ import com.nnbc123.app.R;
import com.nnbc123.app.common.widget.OriginalDrawStatusClickSpan;
import com.nnbc123.app.ui.webview.CommonWebViewActivity;
import com.nnbc123.core.UriProvider;
import com.nnbc123.core.auth.AuthModel;
import com.nnbc123.core.statistic.StatisticManager;
import com.nnbc123.core.statistic.protocol.StatisticsProtocol;
import io.reactivex.SingleObserver;
import io.reactivex.disposables.Disposable;
public abstract class BaseLoginAct extends BaseActivity {
@@ -79,73 +73,6 @@ public abstract class BaseLoginAct extends BaseActivity {
tvProtocol.setMovementMethod(new LinkMovementMethod());
}
protected void wxLogin() {
// 易盾保护 token
// String yiDunToken = watchman.getToken(XChatConstants.YI_DUN_BUSINESS_ID);
// 数美天网 deviceId
// String shuMeiDeviceId = SmAntiFraud.getDeviceId();
getDialogManager().showProgressDialog(this, "请稍后");
AuthModel.get()
.wxLogin("", "")
.subscribe(new SingleObserver<String>() {
@Override
public void onSubscribe(Disposable d) {
mCompositeDisposable.add(d);
}
@Override
public void onSuccess(String s) {
getDialogManager().dismissDialog();
setResult(RESULT_OK);
finish();
}
@Override
public void onError(Throwable e) {
getDialogManager().dismissDialog();
dealWithLoginError(e);
}
});
StatisticManager.Instance().onEvent(this,
StatisticsProtocol.EVENT_LOGIN_WX_CLICK, "点击微信登录", null);
}
protected void qqLogin() {
// 易盾保护 token
// String yiDunToken = watchman.getToken(XChatConstants.YI_DUN_BUSINESS_ID);
// 数美天网 deviceId
// String shuMeiDeviceId = SmAntiFraud.getDeviceId();
String yiDunToken = "";
String shuMeiDeviceId = "";
getDialogManager().showProgressDialog(this, "请稍后");
AuthModel.get()
.qqLogin(yiDunToken, shuMeiDeviceId)
.subscribe(new SingleObserver<String>() {
@Override
public void onSubscribe(Disposable d) {
mCompositeDisposable.add(d);
}
@Override
public void onSuccess(String s) {
getDialogManager().dismissDialog();
setResult(RESULT_OK);
finish();
}
@Override
public void onError(Throwable e) {
getDialogManager().dismissDialog();
dealWithLoginError(e);
}
});
StatisticManager.Instance().onEvent(this,
StatisticsProtocol.EVENT_LOGIN_QQ_CLICK, "点击qq登录", null);
}
public abstract void dealWithLoginError(Throwable e);
@Override

View File

@@ -33,6 +33,8 @@ import com.nnbc123.core.auth.exception.IsSuperAdminException;
import com.nnbc123.core.code.CodeType;
import com.nnbc123.core.statistic.StatisticManager;
import com.nnbc123.core.statistic.protocol.StatisticsProtocol;
import com.nnbc123.library.common.SpConstants;
import com.nnbc123.library.common.util.SPUtils;
import com.nnbc123.library.utils.TextWatcherWrapper;
import com.trello.rxlifecycle3.android.ActivityEvent;
@@ -215,6 +217,7 @@ public class LoginCodeActivity extends BaseLoginAct {
@Override
public void onSuccess(String s) {
SPUtils.putString(SpConstants.LOGIN_TYPE, "");
getDialogManager().dismissDialog();
stopCountDownTimer();
setResult(RESULT_OK);

View File

@@ -24,6 +24,8 @@ import com.nnbc123.core.auth.exception.BanAccountException;
import com.nnbc123.core.auth.exception.IsSuperAdminException;
import com.nnbc123.core.statistic.StatisticManager;
import com.nnbc123.core.statistic.protocol.StatisticsProtocol;
import com.nnbc123.library.common.SpConstants;
import com.nnbc123.library.common.util.SPUtils;
import com.nnbc123.library.utils.TextWatcherWrapper;
import org.greenrobot.eventbus.EventBus;
@@ -106,6 +108,7 @@ public class LoginPasswordActivity extends BaseLoginAct {
@Override
public void onSuccess(String s) {
SPUtils.putString(SpConstants.LOGIN_TYPE, "");
getDialogManager().dismissDialog();
setResult(RESULT_OK);
finish();

View File

@@ -12,14 +12,11 @@ import android.widget.TextView;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.nnbc123.app.R;
import com.nnbc123.library.utils.SingleToastUtil;
import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.ShareSDK;
import cn.sharesdk.tencent.qq.QQ;
import cn.sharesdk.tencent.qzone.QZone;
import cn.sharesdk.wechat.friends.Wechat;
import cn.sharesdk.wechat.moments.WechatMoments;
import cn.sharesdk.google.GooglePlus;
import cn.sharesdk.line.Line;
/**
* @author xiaoyu
@@ -32,10 +29,8 @@ public class ShareDialog extends BottomSheetDialog implements View.OnClickListen
public static final int TYPE_SHARE_H5 = 4;
private final Context context;
private TextView tvWeixin;
private TextView tvWeixinpy;
private TextView tvQq;
private TextView tvQqZone;
private TextView tvLink;
private TextView tvLine;
private TextView tvCancel;
private static final String TAG = "ShareDialog";
private OnShareDialogItemClick onShareDialogItemClick;
@@ -56,16 +51,12 @@ public class ShareDialog extends BottomSheetDialog implements View.OnClickListen
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_share);
setCanceledOnTouchOutside(true);
tvWeixin = findViewById(R.id.tv_weixin);
tvWeixinpy = findViewById(R.id.tv_weixinpy);
tvQq = findViewById(R.id.tv_qq);
tvQqZone = findViewById(R.id.tv_qq_zone);
tvLine = findViewById(R.id.tv_line);
tvLink = findViewById(R.id.tv_share_link);
tvCancel = findViewById(R.id.tv_cancel);
tvWeixin.setOnClickListener(this);
tvWeixinpy.setOnClickListener(this);
tvQq.setOnClickListener(this);
tvQqZone.setOnClickListener(this);
tvLine.setOnClickListener(this);
tvLink.setOnClickListener(this);
tvCancel.setOnClickListener(this);
FrameLayout bottomSheet = findViewById(R.id.design_bottom_sheet);
if (bottomSheet != null) {
@@ -90,38 +81,15 @@ public class ShareDialog extends BottomSheetDialog implements View.OnClickListen
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.tv_erban:
case R.id.tv_line:
if (onShareDialogItemClick != null) {
if (type != TYPE_SHARE_H5) {
onShareDialogItemClick.onInAppSharingItemClick();
} else {
SingleToastUtil.showToast("该内容不能分享给音萌好友");
}
onShareDialogItemClick.onSharePlatformClick(ShareSDK.getPlatform(Line.NAME));
}
dismiss();
break;
case R.id.tv_weixin:
case R.id.tv_share_link:
if (onShareDialogItemClick != null) {
onShareDialogItemClick.onSharePlatformClick(ShareSDK.getPlatform(Wechat.NAME));
}
dismiss();
break;
case R.id.tv_weixinpy:
if (onShareDialogItemClick != null) {
onShareDialogItemClick.onSharePlatformClick(ShareSDK.getPlatform(WechatMoments.NAME));
}
dismiss();
break;
case R.id.tv_qq:
if (onShareDialogItemClick != null) {
onShareDialogItemClick.onSharePlatformClick(ShareSDK.getPlatform(QQ.NAME));
}
dismiss();
break;
case R.id.tv_qq_zone:
if (onShareDialogItemClick != null) {
onShareDialogItemClick.onSharePlatformClick(ShareSDK.getPlatform(QZone.NAME));
onShareDialogItemClick.onSharePlatformClick(ShareSDK.getPlatform(GooglePlus.NAME));
}
dismiss();
break;

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -3,6 +3,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@drawable/bg_dialog_share"
android:orientation="vertical">
@@ -34,60 +35,33 @@
android:weightSum="4">
<TextView
android:id="@+id/tv_weixinpy"
android:id="@+id/tv_line"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_17"
android:layout_marginBottom="19dp"
android:layout_weight="1"
android:drawableTop="@drawable/icon_weixinpy"
android:drawablePadding="9dp"
android:gravity="center"
android:text="微信朋友圈"
android:text="@string/share_line"
android:textColor="@color/color_999999"
android:textSize="@dimen/font_medium" />
android:textSize="@dimen/font_medium"
app:drawableTopCompat="@drawable/icon_line" />
<TextView
android:id="@+id/tv_weixin"
android:id="@+id/tv_share_link"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_17"
android:layout_marginBottom="19dp"
android:layout_weight="1"
android:drawableTop="@drawable/icon_weixin"
android:drawablePadding="9dp"
android:gravity="center"
android:text="@string/text_share_wechat_friends"
android:text="@string/share_link"
android:textColor="@color/color_999999"
android:textSize="@dimen/font_medium" />
android:textSize="@dimen/font_medium"
app:drawableTopCompat="@drawable/ic_share_link" />
<TextView
android:id="@+id/tv_qq_zone"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_17"
android:layout_marginBottom="19dp"
android:layout_weight="1"
android:drawableTop="@drawable/icon_qq_zone"
android:drawablePadding="9dp"
android:gravity="center"
android:text="QQ空间"
android:textColor="@color/color_999999"
android:textSize="@dimen/font_medium" />
<TextView
android:id="@+id/tv_qq"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_17"
android:layout_marginBottom="19dp"
android:layout_weight="1"
android:drawableTop="@drawable/icon_qq"
android:drawablePadding="9dp"
android:gravity="center"
android:text="@string/text_share_qq_friends"
android:textColor="@color/color_999999"
android:textSize="@dimen/font_medium" />
</LinearLayout>

View File

@@ -531,6 +531,8 @@
<string name="text_share_erban_friends">好友</string>
<string name="text_share_wechat_friends">微信好友</string>
<string name="text_share_qq_friends">QQ好友</string>
<string name="share_line">Line</string>
<string name="share_link">复制链接</string>
<string name="tab_title_team"></string>
<string name="text_team_join_auth_on">开启身份验证</string>
<string name="text_team_join_auth_off">关闭身份验证</string>

View File

@@ -17,7 +17,6 @@ import com.netease.nim.uikit.StatusBarUtil;
import com.nnbc123.app.R;
import com.nnbc123.app.base.BaseLoginAct;
import com.nnbc123.app.ui.login.LoginPasswordActivity;
import com.nnbc123.app.ui.login.LoginPhoneActivity;
import com.nnbc123.core.DemoCache;
import com.nnbc123.core.auth.AuthModel;
import com.nnbc123.core.auth.event.LoginEvent;
@@ -26,7 +25,12 @@ import com.nnbc123.core.auth.exception.BanAccountException;
import com.nnbc123.core.auth.exception.IsSuperAdminException;
import com.nnbc123.core.statistic.StatisticManager;
import com.nnbc123.core.statistic.protocol.StatisticsProtocol;
import com.nnbc123.library.common.Constants;
import com.nnbc123.library.common.SpConstants;
import com.nnbc123.library.common.util.SPUtils;
import com.nnbc123.library.utils.AppMetaDataUtil;
import com.nnbc123.library.utils.SingleToastUtil;
import com.trello.rxlifecycle3.android.ActivityEvent;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
@@ -37,6 +41,9 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import io.reactivex.SingleObserver;
import io.reactivex.disposables.Disposable;
public class QuickPassLoginAct extends BaseLoginAct implements View.OnClickListener {
private static final String NEED_CHECKED_PROTOCOL = "need_checked_protocol";
@@ -64,6 +71,20 @@ public class QuickPassLoginAct extends BaseLoginAct implements View.OnClickListe
private void onFindViews() {
tvProtocol = findViewById(R.id.tv_protocol);
tvProtocolHint = findViewById(R.id.tv_protocol_hint);
if (AppMetaDataUtil.getChannelID().equals(Constants.CHANNEL_GOOGLE)) {
findViewById(R.id.cs_google).setVisibility(View.VISIBLE);
} else {
findViewById(R.id.cs_google).setVisibility(View.GONE);
}
String loginType = SPUtils.getString(SpConstants.LOGIN_TYPE, "");
switch (loginType) {
case SpConstants.GOOGLE:
findViewById(R.id.tv_google_last_login).setVisibility(View.VISIBLE);
break;
case SpConstants.LINE:
findViewById(R.id.tv_line_last_login).setVisibility(View.VISIBLE);
break;
}
setProtocol();
}
@@ -99,10 +120,58 @@ public class QuickPassLoginAct extends BaseLoginAct implements View.OnClickListe
LoginPasswordActivity.start(QuickPassLoginAct.this);
break;
case R.id.cs_google:
SingleToastUtil.showToast("Google");
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_LOGIN_GOOGLE_CLICK);
getDialogManager().showProgressDialog(this);
AuthModel.get().googleLogin()
.compose(bindUntilEvent(ActivityEvent.DESTROY))
.subscribe(new SingleObserver<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onSuccess(String result) {
getDialogManager().dismissDialog();
SPUtils.putString(SpConstants.LOGIN_TYPE, SpConstants.GOOGLE);
setResult(RESULT_OK);
finish();
}
@Override
public void onError(Throwable e) {
getDialogManager().dismissDialog();
dealWithLoginError(e);
e.printStackTrace();
}
});
break;
case R.id.cs_line:
SingleToastUtil.showToast("Line");
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_LOGIN_LINE_CLICK);
getDialogManager().showProgressDialog(this);
AuthModel.get().lineLogin()
.compose(bindUntilEvent(ActivityEvent.DESTROY))
.subscribe(new SingleObserver<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onSuccess(String result) {
getDialogManager().dismissDialog();
SPUtils.putString(SpConstants.LOGIN_TYPE, SpConstants.LINE);
setResult(RESULT_OK);
finish();
}
@Override
public void onError(Throwable e) {
getDialogManager().dismissDialog();
dealWithLoginError(e);
e.printStackTrace();
}
});
break;
}
}
@@ -155,10 +224,8 @@ public class QuickPassLoginAct extends BaseLoginAct implements View.OnClickListe
spannableString, "我知道了", true, null);
} else if (e instanceof IOException) {
toast("网络异常,请检查您的网络再试~");
LoginPhoneActivity.startForResult(QuickPassLoginAct.this, quickPassRequestCode);
} else {
toast(e.getMessage());
LoginPhoneActivity.startForResult(QuickPassLoginAct.this, quickPassRequestCode);
}
}
@@ -188,6 +255,7 @@ public class QuickPassLoginAct extends BaseLoginAct implements View.OnClickListe
@Override
protected void onDestroy() {
super.onDestroy();
getDialogManager().dismissDialog();
EventBus.getDefault().unregister(this);
}

View File

@@ -2,6 +2,8 @@ package com.nnbc123.core.auth;
import android.text.TextUtils;
import android.util.Log;
import com.nnbc123.core.R;
import com.nnbc123.core.utils.LogUtils;
import com.netease.nim.uikit.api.NimUIKit;
import com.netease.nim.uikit.common.util.log.LogUtil;
@@ -17,6 +19,8 @@ import com.netease.nimlib.sdk.auth.AuthServiceObserver;
import com.netease.nimlib.sdk.auth.LoginInfo;
import com.netease.nimlib.sdk.mixpush.MixPushService;
import com.netease.nimlib.sdk.msg.MsgService;
import com.nnbc123.library.utils.DeviceUtils;
import com.nnbc123.library.utils.ResUtil;
import com.orhanobut.logger.Logger;
import com.nnbc123.core.DemoCache;
import com.nnbc123.core.auth.entity.AccountInfo;
@@ -58,8 +62,8 @@ import java.util.Map;
import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.PlatformActionListener;
import cn.sharesdk.framework.ShareSDK;
import cn.sharesdk.tencent.qq.QQ;
import cn.sharesdk.wechat.friends.Wechat;
import cn.sharesdk.google.GooglePlus;
import cn.sharesdk.line.Line;
import io.reactivex.Single;
import io.reactivex.SingleEmitter;
import io.reactivex.SingleOnSubscribe;
@@ -101,21 +105,13 @@ public class AuthModel extends BaseModel implements IAuthModel {
*/
public static final int CODE_BIG_HEAD_NUM = 25002;
private static final String TAG = "AuthModel";
/**
* 类型1、手机号/耳伴号登陆2、手机号/耳伴号登陆并绑定QQ
*/
private static final int TYPE_LOGIN_NORMAL = 1;
private static final int TYPE_LOGIN_BIND_QQ = 2;
/**
* 校验验证码
*/
private static final int CODE_SHOW_CODE = 107;
/**
* 超管登录校验验证码
*/
private static final int SUPER_CODE_SHOW_CODE = 136;
private static final int TYPE_WECHAT_LOGIN = 1;//微信登录类型
private static final int TYPE_QQ_LOGIN = 2;//QQ登录类型
public static final int TYPE_GOOGLE_LOGIN = 8;
public static final int TYPE_LINE_LOGIN = 9;
public static final int TYPE_FACEBOOK_LOGIN = 10;
private static volatile AuthModel instance = null;
/**
* 是否来源于登录
@@ -126,8 +122,6 @@ public class AuthModel extends BaseModel implements IAuthModel {
private AccountInfo currentAccountInfo;
private TicketInfo ticketInfo;
private ThirdUserInfo thirdUserInfo;
private Platform wechat;
private Platform qq;
/**
* *************************************************** IM ************************************************************
*/
@@ -299,142 +293,150 @@ public class AuthModel extends BaseModel implements IAuthModel {
}
/**
* 微信登录
* line
*
* @return
*/
@Override
public Single<String> wxLogin(String yiDunToken, String shuMeiDeviceId) {
public Single<String> lineLogin() {
return Single.create(new SingleOnSubscribe<Platform>() {
//<editor-fold defaultstate="collapsed" desc="delombok">
@Override
public void subscribe(SingleEmitter<Platform> e) throws Exception {
wechat = ShareSDK.getPlatform(Wechat.NAME);
if (wechat == null || !wechat.isClientValid()) {
e.onError(new Throwable("未安装微信"));
Platform line = ShareSDK.getPlatform(Line.NAME);
//是否安装客户端
if (!DeviceUtils.isAppInstalled(getContext(), "jp.naver.line.android")) {
e.onError(new Throwable(ResUtil.getString(R.string.core_auth_authmodel_06)));
return;
}
if (wechat.isAuthValid()) {
wechat.removeAccount(true);
if (line.isAuthValid()) {
line.removeAccount(true);
}
wechat.setPlatformActionListener(new PlatformActionListener() {
//</editor-fold>
@Override
public void onComplete(final Platform platform, int i, HashMap<String, Object> hashMap) {
if (i == Platform.ACTION_USER_INFOR) {
String openid = platform.getDb().getUserId();
String unionid = platform.getDb().get("unionid");
Logger.i("openid" + openid + "unionid" + unionid + platform.getDb().getUserIcon());
thirdUserInfo = new ThirdUserInfo();
thirdUserInfo.setPlatform("微信");
thirdUserInfo.setType(ThirdUserInfo.TYPE_WX);
thirdUserInfo.setUserName(platform.getDb().getUserName());
thirdUserInfo.setUserGender(platform.getDb().getUserGender());
thirdUserInfo.setUserIcon(platform.getDb().getUserIcon());
e.onSuccess(platform);
}
}
@Override
public void onError(Platform platform, int i, Throwable throwable) {
e.onError(new Throwable("获取微信信息失败"));
}
@Override
public void onCancel(Platform platform, int i) {
e.onError(new Throwable("微信登录取消"));
}
});
wechat.SSOSetting(false);
wechat.showUser(null);
}
}).flatMap(new Function<Platform, SingleSource<String>>() {
@Override
public SingleSource<String> apply(Platform platform) throws Exception {
String openid = platform.getDb().getUserId();
String unionid = platform.getDb().get("unionid");
return thirdLogin(openid, unionid, TYPE_WECHAT_LOGIN, yiDunToken, shuMeiDeviceId);
}
}).flatMap(new Function<String, SingleSource<String>>() {
@Override
public SingleSource<String> apply(String s) throws Exception {
return imLogin(currentAccountInfo);
}
}).subscribeOn(AndroidSchedulers.mainThread()).observeOn(AndroidSchedulers.mainThread()).doOnSuccess(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
//登录成功
EventBus.getDefault().post(new LoginEvent());
}
});
}
/**
* QQ登录
*
* @return
*/
@Override
public Single<String> qqLogin(String yiDunToken, String shuMeiDeviceId) {
return Single.create(new SingleOnSubscribe<Platform>() {
//<editor-fold defaultstate="collapsed" desc="delombok">
@Override
public void subscribe(SingleEmitter<Platform> e) throws Exception {
qq = ShareSDK.getPlatform(QQ.NAME);
if (qq == null || !qq.isClientValid()) {
e.onError(new Throwable("未安装腾讯QQ或TIM"));
return;
}
if (qq.isAuthValid()) {
qq.removeAccount(true);
}
qq.setPlatformActionListener(new PlatformActionListener() {
//</editor-fold>
line.setPlatformActionListener(new PlatformActionListener() {
@Override
public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
if (i == Platform.ACTION_USER_INFOR) {
String openid = platform.getDb().getUserId();
String unionid = platform.getDb().get("unionid");
Logger.i("openid:" + openid + " unionid:" + unionid + platform.getDb().getUserIcon());
thirdUserInfo = new ThirdUserInfo();
thirdUserInfo.setType(ThirdUserInfo.TYPE_QQ);
thirdUserInfo.setType(ThirdUserInfo.TYPE_LINE);
thirdUserInfo.setPlatform("LINE");
thirdUserInfo.setUserName(platform.getDb().getUserName());
thirdUserInfo.setUserGender(platform.getDb().getUserGender());
thirdUserInfo.setUserIcon(platform.getDb().getUserIcon());
e.onSuccess(platform);
}
}
@Override
public void onError(Platform platform, int i, Throwable throwable) {
e.onError(new Throwable("获取QQ登录信息错误"));
e.onError(new Throwable(ResUtil.getString(R.string.core_auth_authmodel_010) + i));
throwable.printStackTrace();
}
@Override
public void onCancel(Platform platform, int i) {
e.onError(new Throwable("QQ登录取消"));
e.onError(new Throwable(ResUtil.getString(R.string.core_auth_authmodel_011)));
}
});
//<editor-fold defaultstate="collapsed" desc="delombok">
qq.SSOSetting(false);
qq.showUser(null);
line.SSOSetting(false);
line.showUser(null);
}
}).flatMap(new Function<Platform, SingleSource<String>>() {
})
.flatMap(platform -> {
String openid = platform.getDb().getUserId();
String unionid = platform.getDb().getUserId();
String avatar = thirdUserInfo.getUserIcon();
if (avatar != null && avatar.equals("null")) {
avatar = null;
}
thirdUserInfo.setUserIcon(avatar);
String gender = thirdUserInfo.getUserGender();
if (gender != null && !gender.trim().isEmpty()) {
gender = gender.replace("m", "1").replace("f", "2");
}
thirdUserInfo.setUserGender(gender);
return thirdLogin(openid, unionid, TYPE_LINE_LOGIN, "", "");
})
.flatMap(s -> imLogin(currentAccountInfo))
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.compose(RxHelper.handleException())
.doOnSuccess(s -> EventBus.getDefault().post(new LoginEvent()));
}
@Override
public SingleSource<String> apply(Platform platform) throws Exception {
public Single<String> googleLogin() {
return Single.create(new SingleOnSubscribe<Platform>() {
@Override
public void subscribe(SingleEmitter<Platform> e) throws Exception {
Platform google = ShareSDK.getPlatform(GooglePlus.NAME);
//是否安装客户端
if (!DeviceUtils.isAppInstalled(getContext(), "com.android.vending")) {
e.onError(new Throwable(ResUtil.getString(R.string.core_auth_authmodel_09)));
return;
}
//判断指定平台是否已经完成授权
if (google.isAuthValid()) {
google.removeAccount(true);
}
google.setPlatformActionListener(new PlatformActionListener() {
@Override
public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
if (i == Platform.ACTION_USER_INFOR) {
String openid = platform.getDb().getUserId();
String unionid = platform.getDb().get("unionid");
return thirdLogin(openid, unionid, TYPE_QQ_LOGIN, yiDunToken, shuMeiDeviceId);
Logger.i("openid:" + openid + " unionid:" + unionid + platform.getDb().getUserIcon());
thirdUserInfo = new ThirdUserInfo();
thirdUserInfo.setType(ThirdUserInfo.TYPE_GOOGLE);
thirdUserInfo.setPlatform("Google");
thirdUserInfo.setUserName(platform.getDb().getUserName());
thirdUserInfo.setUserGender(platform.getDb().getUserGender());
thirdUserInfo.setUserIcon(platform.getDb().getUserIcon());
e.onSuccess(platform);
}
}).flatMap(new Function<String, SingleSource<String>>() {
@Override
public SingleSource<String> apply(String s) throws Exception {
return imLogin(currentAccountInfo);
}
}).subscribeOn(AndroidSchedulers.mainThread()).observeOn(AndroidSchedulers.mainThread()).doOnSuccess(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
//登录成功
EventBus.getDefault().post(new LoginEvent());
public void onError(Platform platform, int i, Throwable throwable) {
throwable.printStackTrace();
LogUtils.d("googleLogin" + i);
e.onError(new Throwable(ResUtil.getString(R.string.core_auth_authmodel_010) + i));
}
@Override
public void onCancel(Platform platform, int i) {
e.onError(new Throwable(ResUtil.getString(R.string.core_auth_authmodel_011)));
}
});
//</editor-fold>
google.SSOSetting(false);
google.showUser(null);
}
})
.flatMap(platform -> {
String openid = platform.getDb().getUserId();
String unionid = platform.getDb().getUserId();
String avatar = thirdUserInfo.getUserIcon();
if (avatar != null && avatar.equals("null")) {
avatar = null;
}
thirdUserInfo.setUserIcon(avatar);
String gender = thirdUserInfo.getUserGender();
if (gender != null && !gender.trim().isEmpty()) {
gender = gender.replace("m", "1").replace("f", "2");
}
thirdUserInfo.setUserGender(gender);
return thirdLogin(openid, unionid, TYPE_GOOGLE_LOGIN, "", "");
})
.flatMap(s -> imLogin(currentAccountInfo))
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(AndroidSchedulers.mainThread())
.compose(RxHelper.handleException())
.doOnSuccess(s -> EventBus.getDefault().post(new LoginEvent()));
}
/**

View File

@@ -49,9 +49,9 @@ public interface IAuthModel extends IModel{
*/
Single<String> login(String account, String password, String code, String yiDunToken, String shuMeiDeviceId);
Single<String> wxLogin(String yiDunToken, String shuMeiDeviceId);
Single<String> lineLogin();
Single<String> qqLogin(String yiDunToken, String shuMeiDeviceId);
Single<String> googleLogin();
Single<ServiceResult<String>> isExistsQQAccount(String qqOpenid);

View File

@@ -18,6 +18,10 @@ public class ThirdUserInfo implements Serializable {
public static final int TYPE_QQ = 2;
public static final int TYPE_ONEKEY = 3;
public static final int TYPE_FACEBOOK = 1;
public static final int TYPE_LINE = 2;
public static final int TYPE_GOOGLE = 3;
public int getType() {
return type;
}

View File

@@ -1,9 +1,15 @@
package com.nnbc123.core.share;
import android.annotation.SuppressLint;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage;
import com.nnbc123.core.R;
import com.nnbc123.library.common.util.Logger;
import com.nnbc123.library.utils.ResUtil;
import com.nnbc123.xchat_android_constants.XChatConstants;
import com.nnbc123.core.UriProvider;
import com.nnbc123.core.auth.AuthModel;
@@ -26,10 +32,8 @@ import java.util.HashMap;
import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.PlatformActionListener;
import cn.sharesdk.tencent.qq.QQ;
import cn.sharesdk.tencent.qzone.QZone;
import cn.sharesdk.wechat.friends.Wechat;
import cn.sharesdk.wechat.moments.WechatMoments;
import cn.sharesdk.google.GooglePlus;
import cn.sharesdk.line.Line;
import io.reactivex.Single;
import io.reactivex.SingleEmitter;
import io.reactivex.SingleOnSubscribe;
@@ -65,14 +69,6 @@ public class ShareModel extends BaseModel implements IShareModel {
@Override
public void subscribe(SingleEmitter<String> emitter) throws Exception {
if (null != webViewInfo && platform != null) {
Platform.ShareParams sp = new Platform.ShareParams();
sp.setText(webViewInfo.getDesc());
sp.setTitle(webViewInfo.getTitle());
if (httpsUrl) {
sp.setImageUrl(webViewInfo.getImgUrl().replace("http:", "https:"));
} else {
sp.setImageUrl(webViewInfo.getImgUrl());
}
String siteUrl = webViewInfo.getShowUrl();
String params = "shareUid=" + String.valueOf(AuthModel.get().getCurrentUid());
if (siteUrl.contains("?")) {
@@ -84,14 +80,21 @@ public class ShareModel extends BaseModel implements IShareModel {
} else {
siteUrl += "?" + params;
}
//QQ空间分享
sp.setSite(webViewInfo.getDesc());
sp.setSiteUrl(siteUrl);
//QQ分享
sp.setTitleUrl(siteUrl);
//微信朋友圈分享
sp.setUrl(siteUrl);
sp.setShareType(Platform.SHARE_WEBPAGE);
if (platform.getName().equals(GooglePlus.NAME)) {
copyLink(siteUrl, emitter);
return;
}
Platform.ShareParams sp = new Platform.ShareParams();
sp.setText(webViewInfo.getDesc());
sp.setTitle(webViewInfo.getTitle());
if (httpsUrl) {
sp.setImageUrl(webViewInfo.getImgUrl().replace("http:", "https:"));
} else {
sp.setImageUrl(webViewInfo.getImgUrl());
}
if (platform.getName().equals(Line.NAME)) {
sp.setText(webViewInfo.getDesc() + "[" + webViewInfo.getLink() + "]");
}
platform.setPlatformActionListener(new PlatformActionListener() {
@Override
public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
@@ -112,7 +115,11 @@ public class ShareModel extends BaseModel implements IShareModel {
@Override
public void onError(Platform platform, int i, Throwable throwable) {
emitter.onError(new Throwable(MSG.failed));
String errorMsg = MSG.failed;
if (throwable.getMessage().contains("not installed")) {
errorMsg = ResUtil.getString(R.string.not_install_app);
}
emitter.onError(new Throwable(errorMsg));
}
@Override
@@ -139,24 +146,21 @@ public class ShareModel extends BaseModel implements IShareModel {
UserModel.get().getUserInfo(roomUid).subscribe(userInfo -> {
//无UI API
if (userInfo != null && platform != null) {
Platform.ShareParams sp = new Platform.ShareParams();
sp.setText(title + XChatConstants.SHARE_ROOM_TEXT);
sp.setTitle(XChatConstants.SHARE_ROOM_TITLE);
sp.setImageUrl(userInfo.getAvatar());
final String siteUrl = UriProvider.WEB_URL + XChatConstants.SHARE_ROOM_URL +
AuthModel.get().getCurrentUid() + "&uid=" + roomUid + "&room_name=" +
URLEncoder.encode(title, "utf8") + "&room_id=" + roomId + "&room_avatar=" +
URLEncoder.encode(room_avatar, "utf8") + "&share_name=" +
URLEncoder.encode(UserModel.get().getCacheLoginUserInfo().getNick(), "utf8");
//QQ空间分享
sp.setSite(title + XChatConstants.SHARE_ROOM_TEXT);
sp.setSiteUrl(siteUrl);
//QQ分享
sp.setTitleUrl(siteUrl);
//微信朋友圈分享
sp.setUrl(siteUrl);
sp.setShareType(Platform.SHARE_WEBPAGE);
if (platform.getName().equals(GooglePlus.NAME)) {
copyLink(siteUrl, emitter);
} else {
Platform.ShareParams sp = new Platform.ShareParams();
sp.setText(title + XChatConstants.SHARE_ROOM_TEXT);
sp.setTitle(XChatConstants.SHARE_ROOM_TITLE);
sp.setImageUrl(userInfo.getAvatar());
if (platform.getName().equals(Line.NAME)) {
sp.setText(XChatConstants.SHARE_ROOM_TEXT + "[" + siteUrl + "]");
}
platform.setPlatformActionListener(new PlatformActionListener() {
@Override
public void onComplete(Platform platform1, int i, HashMap<String, Object> hashMap) {
@@ -168,7 +172,11 @@ public class ShareModel extends BaseModel implements IShareModel {
@Override
public void onError(Platform platform1, int i, Throwable throwable) {
emitter.onError(new Throwable(MSG.failed));
String errorMsg = MSG.failed;
if (throwable.getMessage().contains("not installed")) {
errorMsg = ResUtil.getString(R.string.not_install_app);
}
emitter.onError(new Throwable(errorMsg));
}
@Override
@@ -178,6 +186,7 @@ public class ShareModel extends BaseModel implements IShareModel {
});
platform.share(sp);
}
}
});
}
});
@@ -194,17 +203,12 @@ public class ShareModel extends BaseModel implements IShareModel {
*/
private void reportShare(String roomUid, int sharePageId, Platform platform, String shareUrl) {
int shareType = 0;
if (platform.getName().equals(Wechat.NAME)) {
if (platform.getName().equals(GooglePlus.NAME)) {
shareType = 1;
} else if (platform.getName().equals(WechatMoments.NAME)) {
} else if (platform.getName().equals(Line.NAME)) {
shareType = 2;
} else if (platform.getName().equals(QQ.NAME)) {
shareType = 3;
} else if (platform.getName().equals(QZone.NAME)) {
shareType = 4;
}
api.getShareRedPacket(
String.valueOf(AuthModel.get().getCurrentUid()),
roomUid,
@@ -229,14 +233,18 @@ public class ShareModel extends BaseModel implements IShareModel {
public void subscribe(SingleEmitter<String> emitter) throws Exception {
//无UI API
final String shareLink = UriProvider.WEB_URL + XChatConstants.SHARE_FAMILY_URL;
final String siteUrl = shareLink + "?shareUid=" + String.valueOf(AuthModel.get().getCurrentUid())
+ "&familyId=" + familyId;
if (platform.getName().equals(GooglePlus.NAME)) {
copyLink(siteUrl, emitter);
return;
}
Platform.ShareParams sp = new Platform.ShareParams();
sp.setText(XChatConstants.SHARE_FAMILY_TEXT);
sp.setTitle(XChatConstants.SHARE_FAMILY_TITLE + "" + title + "");
sp.setImageUrl(familyIcon);
//QQ空间分享
sp.setSite(XChatConstants.SHARE_FAMILY_TEXT);
final String siteUrl = shareLink + "?shareUid=" + String.valueOf(AuthModel.get().getCurrentUid())
+ "&familyId=" + familyId;
sp.setSiteUrl(siteUrl);
//QQ分享
sp.setTitleUrl(siteUrl);
@@ -274,14 +282,18 @@ public class ShareModel extends BaseModel implements IShareModel {
public void subscribe(SingleEmitter<String> emitter) throws Exception {
//无UI API
final String shareLink = UriProvider.WEB_URL + XChatConstants.SHARE_TEAM_URL;
final String siteUrl = shareLink + "?shareUid=" + String.valueOf(AuthModel.get().getCurrentUid())
+ "&familyId=" + familyId;
if (platform.getName().equals(GooglePlus.NAME)) {
copyLink(siteUrl, emitter);
return;
}
Platform.ShareParams sp = new Platform.ShareParams();
sp.setText(XChatConstants.SHARE_TEAM_TEXT);
sp.setTitle(XChatConstants.SHARE_TEAM_TITLE + "" + title + "");
sp.setImageUrl(teamIcon);
//QQ空间分享
sp.setSite(XChatConstants.SHARE_TEAM_TEXT);
final String siteUrl = shareLink + "?shareUid=" + String.valueOf(AuthModel.get().getCurrentUid())
+ "&familyId=" + familyId;
sp.setSiteUrl(siteUrl);
//QQ分享
sp.setTitleUrl(siteUrl);
@@ -316,6 +328,10 @@ public class ShareModel extends BaseModel implements IShareModel {
@Override
public Single<String> shareText(Platform platform, String text) {
return Single.create(emitter -> {
if (platform.getName().equals(GooglePlus.NAME)) {
copyLink(text, emitter);
return;
}
Platform.ShareParams sp = new Platform.ShareParams();
sp.setTitle("");
sp.setText(text);
@@ -376,6 +392,10 @@ public class ShareModel extends BaseModel implements IShareModel {
}
public void shareImage(Platform platform, String url) {
if (platform.getName().equals(GooglePlus.NAME)) {
copyLink(url, null);
return;
}
//无UI API
final String shareLink = UriProvider.WEB_URL + XChatConstants.SHARE_TEAM_URL;
Platform.ShareParams sp = new Platform.ShareParams();
@@ -411,6 +431,10 @@ public class ShareModel extends BaseModel implements IShareModel {
public Single<String> shareImageForSignIn(Platform platform, String url) {
return Single.create(emitter -> {
if (platform.getName().equals(GooglePlus.NAME)) {
copyLink(url, emitter);
return;
}
Platform.ShareParams sp = new Platform.ShareParams();
sp.setImageUrl(url);
@@ -442,19 +466,19 @@ public class ShareModel extends BaseModel implements IShareModel {
public Single<String> shareCommon(Platform platform, ShareCommonInfo info, boolean toast) {
return Single.create((SingleOnSubscribe<String>) emitter -> {
String siteUrl = info.getSiteUrl();
if (platform.getName().equals(GooglePlus.NAME)) {
copyLink(siteUrl, emitter);
return;
}
Platform.ShareParams sp = new Platform.ShareParams();
sp.setTitle(info.getTitle());
sp.setText(info.getContent());
sp.setImageUrl(info.getImageUrl());
String siteUrl = info.getSiteUrl();
//QQ空间分享
sp.setSite(info.getTitle());
sp.setSiteUrl(siteUrl);
//QQ分享
sp.setTitleUrl(siteUrl);
//微信朋友圈分享
sp.setUrl(siteUrl);
sp.setShareType(Platform.SHARE_WEBPAGE);
if (platform.getName().equals(Line.NAME)) {
sp.setText(info.getContent() + "[" + siteUrl + "]");
}
platform.setPlatformActionListener(new PlatformActionListener() {
@Override
public void onComplete(Platform platform1, int i, HashMap<String, Object> hashMap) {
@@ -463,7 +487,11 @@ public class ShareModel extends BaseModel implements IShareModel {
@Override
public void onError(Platform platform1, int i, Throwable throwable) {
emitter.onError(new Throwable(MSG.failed));
String errorMsg = MSG.failed;
if (throwable.getMessage().contains("not installed")) {
errorMsg = ResUtil.getString(R.string.not_install_app);
}
emitter.onError(new Throwable(errorMsg));
}
@Override
@@ -485,6 +513,21 @@ public class ShareModel extends BaseModel implements IShareModel {
});
}
private void copyLink(String url, SingleEmitter<String> emitter) {
try {
ClipboardManager cm = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE);
cm.setPrimaryClip(ClipData.newPlainText("text", url));
if (emitter != null) {
emitter.onSuccess("已复制");
}
} catch (Exception e) {
Logger.info("copyText", String.valueOf(e));
if (emitter != null) {
emitter.onError(new Throwable(String.valueOf(e)));
}
}
}
private interface MSG {
String success = "分享成功";
String failed = "分享失败,请重试";

View File

@@ -16,6 +16,8 @@ public interface StatisticsProtocol {
String EVENT_RECONNECTION_ROOM_CHAT = "String EVENT_reconnection_room_chat";//断网重连聊天室
String USER_KICKED_EVENT = "user_kicked_String EVENT";//用户被踢
String EVENT_LOGIN_GOOGLE_CLICK = "login_google_click";
String EVENT_LOGIN_LINE_CLICK = "login_line_click";
String EVENT_LOGIN_QQ_CLICK = "login_qq_click";//点击qq登录
String EVENT_LOGIN_WX_CLICK = "login_wx_click";//点击微信登录
String EVENT_LOGIN_PHONE_CLICK = "login_phone_click";//点击手机号登录

View File

@@ -1,3 +1,8 @@
<resources>
<string name="app_name">core</string>
<string name="core_auth_authmodel_06">未安装Line</string>
<string name="core_auth_authmodel_09">未安装gmail</string>
<string name="core_auth_authmodel_010">登录出错</string>
<string name="core_auth_authmodel_011">取消登录</string>
<string name="not_install_app">未安装该应用</string>
</resources>

View File

@@ -5,6 +5,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.text.TextUtils;
import com.nnbc123.library.common.Constants;
import com.nnbc123.library.utils.config.BasicConfig;
import com.nnbc123.library.utils.log.MLog;
@@ -26,7 +27,7 @@ public class AppMetaDataUtil {
*/
public static String getChannelID() {
String channelID = BasicConfig.INSTANCE.getChannel();
channelID = TextUtils.isEmpty(channelID) ? "official" : channelID;
channelID = TextUtils.isEmpty(channelID) ? Constants.CHANNEL_DEF : channelID;
return channelID;
}

View File

@@ -0,0 +1,41 @@
package com.nnbc123.library.utils;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import com.orhanobut.logger.Logger;
/**
* 设备信息工具类
*/
public class DeviceUtils {
private static final String TAG = "DeviceUtils";
/**
* 检查指定包名的APP是否已安装了
*
* @param context 上下文对象
* @param packageName 包名
* @return 是否有安装指定包名的APPtrue代表已安装false代表未安装
*/
public static boolean isAppInstalled(Context context, String packageName) {
if (context == null) {
return false;
} else {
boolean installed = false;
try {
PackageManager pm = context.getPackageManager();
ApplicationInfo info = pm.getApplicationInfo(packageName, 0);
if (info != null) {
installed = true;
}
} catch (Exception e) {
Logger.i("isAppInstalled packageName=" + packageName + " "+ e);
}
return installed;
}
}
}

View File

@@ -2,6 +2,8 @@ package com.nnbc123.library.common;
public class Constants {
public static final String CHANNEL_DEF = "official";
public static final String CHANNEL_GOOGLE = "google";
//上传的图片 默认大小不能超过大小 640KB
public static final int UPLOAD_IMAGE_MAX_FILE_LENGTH = 640;
//上传的图片 默认宽高最大值 2340

View File

@@ -2,4 +2,8 @@ package com.nnbc123.library.common
object SpConstants {
const val ORDER_RECORD = "order_record"
const val LOGIN_TYPE = "login_type"
const val GOOGLE = "google"
const val FACEBOOK = "facebook"
const val LINE = "line"
}

View File

@@ -12,31 +12,27 @@ MobSDK {
//平台配置信息
gui false
devInfo {
Wechat {
appId "wx4b772d5ebc964a38"
appSecret "f045979c311e13725cbb9aa87c265668"
}
WechatMoments {
appId "wx4b772d5ebc964a38"
appSecret "f045979c311e13725cbb9aa87c265668"
}
QQ {
appId "102044928"
appKey "12u585rSsAHEzc4K"
shareByAppClient true
}
QZone {
appId "102044928"
appKey "12u585rSsAHEzc4K"
shareByAppClient true
GooglePlus {
appId "-.apps.googleusercontent.com"
callbackUri "http://localhost"
officialVersion "default"
enable true
}
Line {
appId "16529"
appSecret "903d01"
enable true
}
}
}
permissions {
exclude "android.permission.READ_PHONE_STATE", "android.permission.ACCESS_FINE_LOCATION", "android.permission.ACCESS_COARSE_LOCATION", "android.permission.QUERY_ALL_PACKAGES"
}
exclude "android.permission.READ_PHONE_STATE", "android.permission.ACCESS_FINE_LOCATION",
"android.permission.ACCESS_COARSE_LOCATION", "android.permission.QUERY_ALL_PACKAGES",
"android.permission.GET_ACCOUNTS", "android.permission.ACCESS_WIFI_STATE",
"android.permission.READ_SMS", "android.permission.RECEIVE_SMS",
"android.permission.READ_CONTACTS"}
}

View File

@@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<DevInfor>
<Wechat AppId="wx4b772d5ebc964a38" AppSecret="f045979c311e13725cbb9aa87c265668" />
<WechatMoments AppId="wx4b772d5ebc964a38" AppSecret="f045979c311e13725cbb9aa87c265668" />
<QQ AppId="102044928" AppKey="12u585rSsAHEzc4K" ShareByAppClient="true" />
<QZone AppId="102044928" AppKey="12u585rSsAHEzc4K" ShareByAppClient="true" />
<GooglePlus Enable="true" OfficialVersion="default" ClientID="-.apps.googleusercontent.com" RedirectUrl="http://localhost" />
<Line Enable="true" ChannelID="16529" ChannelSecret="903d01" RedirectUri="null" />
</DevInfor>