Browse Source

[new]增加网易易盾一键登录

zk 4 months ago
parent
commit
4d8407a23d

+ 5 - 0
app/build.gradle

@@ -76,6 +76,7 @@ android {
             buildConfigField "String", "UMENG_APP_KEY", "\"$umeng_app_key\""
             buildConfigField "String", "QIYU_APP_KEY", "\"$qiyu_app_key\""
             buildConfigField "String", "ATMOB_CENTRAL_KEY", "\"$atmob_central_key\""
+            buildConfigField "String", "QUICK_LOGIN_ID", "\"$quick_login_id\""
         }
 
         debug {
@@ -96,6 +97,7 @@ android {
             buildConfigField "String", "UMENG_APP_KEY", "\"$umeng_app_key\""
             buildConfigField "String", "QIYU_APP_KEY", "\"$qiyu_app_key\""
             buildConfigField "String", "ATMOB_CENTRAL_KEY", "\"$atmob_central_key\""
+            buildConfigField "String", "QUICK_LOGIN_ID", "\"$quick_login_id\""
         }
     }
     compileOptions {
@@ -241,4 +243,7 @@ dependencies {
                 exclude group: 'com.google.zxing', module: 'core'
             }
     releaseImplementation("io.github.didi.dokit:dokitx-no-op:$rootProject.dokit_version")
+
+    //网易一键登录
+    implementation 'io.github.yidun:quicklogin:3.4.8'
 }

+ 31 - 0
app/proguard-rules.pro

@@ -147,3 +147,34 @@ public <methods>;
 -dontwarn org.slf4j.**
 -keep class org.slf4j.** { *; }
 
+
+
+#网易易盾一键登录
+-dontwarn com.cmic.gen.sdk.**
+-keep class com.cmic.gen.sdk.**{*;}
+-dontwarn com.unicom.online.account.shield.**
+-keep class com.unicom.online.account.shield.** {*;}
+-dontwarn com.unicom.online.account.kernel.**
+-keep class com.unicom.online.account.kernel.** {*;}
+-keep class cn.com.chinatelecom.account.**{*;}
+-keep public class * extends android.view.View
+-keep class com.netease.nis.quicklogin.entity.**{*;}
+-keep class com.netease.nis.quicklogin.listener.**{*;}
+-keep class com.netease.nis.quicklogin.QuickLogin{
+    public <methods>;
+    public <fields>;
+}
+-keep class com.netease.nis.quicklogin.helper.UnifyUiConfig{*;}
+-keep class com.netease.nis.quicklogin.helper.UnifyUiConfig$Builder{
+     public <methods>;
+     public <fields>;
+ }
+-keep class com.netease.nis.quicklogin.utils.LoginUiHelper$CustomViewListener{
+     public <methods>;
+     public <fields>;
+}
+-keep class com.netease.nis.basesdk.**{
+    public *;
+    protected *;
+}
+

+ 2 - 0
app/src/main/java/com/datarecovery/master/App.java

@@ -12,6 +12,7 @@ import com.datarecovery.master.data.consts.Constants;
 import com.datarecovery.master.sdk.bugly.BuglyHelper;
 import com.datarecovery.master.sdk.central.AtmobCentralHelper;
 import com.datarecovery.master.sdk.qiyu.QiYuHelper;
+import com.datarecovery.master.sdk.quicklogin.QuickLoginHelper;
 import com.datarecovery.master.sdk.umeng.UmengHelper;
 import com.datarecovery.master.utils.ToastUtil;
 import com.didichuxing.doraemonkit.DoKit;
@@ -104,6 +105,7 @@ public class App extends BaseApplication {
     public void initAfterGrant(boolean isMainProcess) {
         if (isMainProcess) {
             QiYuHelper.init(this);
+            QuickLoginHelper.init(this);
         }
     }
 

+ 4 - 0
app/src/main/java/com/datarecovery/master/data/api/AtmobApi.java

@@ -11,6 +11,7 @@ import com.datarecovery.master.data.api.request.MemberPayRequest;
 import com.datarecovery.master.data.api.request.OrderPageRequest;
 import com.datarecovery.master.data.api.request.OrderRequest;
 import com.datarecovery.master.data.api.request.PaymentStatusRequest;
+import com.datarecovery.master.data.api.request.QuickLoginRequest;
 import com.datarecovery.master.data.api.request.SendCodeRequest;
 import com.datarecovery.master.data.api.response.CustomerUrlResponse;
 import com.datarecovery.master.data.api.response.FindOrderResponse;
@@ -68,4 +69,7 @@ public interface AtmobApi {
 
     @POST("/project/recover/v1/user/info")
     Single<BaseResponse<UserInfoResponse>> getUserInfo(@Body BaseRequest request);
+
+    @POST("/central/open/v1/user/login/oneclick")
+    Single<BaseResponse<LoginResponse>> quickLogin(@Body QuickLoginRequest request);
 }

+ 21 - 0
app/src/main/java/com/datarecovery/master/data/api/request/QuickLoginRequest.java

@@ -0,0 +1,21 @@
+package com.datarecovery.master.data.api.request;
+
+import com.google.gson.annotations.SerializedName;
+
+public class QuickLoginRequest extends BaseRequest {
+
+
+    @SerializedName("token")
+    private String token;
+
+    @SerializedName("accessToken")
+    private String accessToken;
+
+
+    public QuickLoginRequest(String token, String accessToken) {
+        this.token = token;
+        this.accessToken = accessToken;
+    }
+
+
+}

+ 8 - 0
app/src/main/java/com/datarecovery/master/data/api/response/UserInfoResponse.java

@@ -7,7 +7,15 @@ public class UserInfoResponse {
     @SerializedName("ssid")
     private String userId;
 
+    @SerializedName("phone")
+    private String phone;
+
     public String getUserId() {
         return userId;
     }
+
+
+    public String getPhone() {
+        return phone;
+    }
 }

+ 22 - 2
app/src/main/java/com/datarecovery/master/data/repositories/AccountRepository.java

@@ -12,6 +12,7 @@ import com.datarecovery.master.R;
 import com.datarecovery.master.data.api.AtmobApi;
 import com.datarecovery.master.data.api.request.BaseRequest;
 import com.datarecovery.master.data.api.request.LoginRequest;
+import com.datarecovery.master.data.api.request.QuickLoginRequest;
 import com.datarecovery.master.data.api.request.SendCodeRequest;
 import com.datarecovery.master.data.api.response.LoginResponse;
 import com.datarecovery.master.data.api.response.UserInfoResponse;
@@ -21,6 +22,8 @@ import com.datarecovery.master.utils.BoxingUtil;
 import com.datarecovery.master.utils.RxHttpHandler;
 import com.datarecovery.master.utils.ToastUtil;
 
+import java.util.concurrent.TimeUnit;
+
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
@@ -76,15 +79,23 @@ public class AccountRepository {
 
     private void onLoginSuccess(String phoneNum, String token) {
         AccountRepository.token = token;
-        this.loginPhoneNum.setValue(phoneNum);
+        setLoginPhoneNum(phoneNum);
         deviceFuncRepository.refreshFuncAuths();
         payRepository.refreshOrderPageList();
-        KVUtils.getDefault().putString(KEY_LOGIN_PHONE_NUM, phoneNum);
         KVUtils.getDefault().putString(KEY_LOGIN_TOKEN, token);
         //查找并存储userId
         refreshUserInfo();
     }
 
+    private void setLoginPhoneNum(String phoneNum) {
+        if (TextUtils.isEmpty(phoneNum)) {
+            return;
+        }
+        loginPhoneNum.setValue(phoneNum);
+        KVUtils.getDefault().putString(KEY_LOGIN_PHONE_NUM, phoneNum);
+
+    }
+
 
     public Single<?> requestUserCode(String phoneNum) {
         long currentTime = System.currentTimeMillis();
@@ -114,6 +125,7 @@ public class AccountRepository {
             @Override
             public void onSuccess(@NonNull UserInfoResponse userInfoResponse) {
                 requestUserInfoDisabled = false;
+                setLoginPhoneNum(userInfoResponse.getPhone());
                 QiYuHelper.setUserInfo(getKeyLoginPhoneNum(), userInfoResponse.getUserId(), token);
                 KVUtils.getDefault().putString(KEY_LOGIN_USER_ID, userInfoResponse.getUserId());
             }
@@ -195,6 +207,14 @@ public class AccountRepository {
                 .compose(RxJavaUtil.SingleSchedule.io2Main());
     }
 
+    public Single<LoginResponse> quickLogin(String token, String accessToken) {
+        return atmobApi.quickLogin(new QuickLoginRequest(token, accessToken))
+                .compose(RxHttpHandler.handle(false))
+                .retryWhen(RxJavaUtil.retryWhen(null, 3, 500, TimeUnit.MILLISECONDS))
+                .compose(RxJavaUtil.SingleSchedule.io2Main())
+                .doOnSuccess((response) -> onLoginSuccess(null, response.getToken()));
+    }
+
     public static String getUserId() {
         return KVUtils.getDefault().getString(KEY_LOGIN_USER_ID, "");
     }

+ 15 - 0
app/src/main/java/com/datarecovery/master/module/login/LoginActivity.java

@@ -6,9 +6,11 @@ import android.content.Intent;
 import android.os.Bundle;
 import android.view.View;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
 import com.atmob.app.lib.base.BaseActivity;
+import com.atmob.common.logging.AtmobLog;
 import com.atmob.common.runtime.ContextUtil;
 import com.datarecovery.master.R;
 import com.datarecovery.master.data.consts.Constants;
@@ -17,6 +19,9 @@ import com.datarecovery.master.databinding.ActivityLoginBinding;
 import com.datarecovery.master.handler.EventHelper;
 import com.datarecovery.master.module.browser.BrowserActivity;
 import com.datarecovery.master.utils.SpannableUtil;
+import com.gyf.immersionbar.ImmersionBar;
+import com.netease.nis.quicklogin.QuickLogin;
+import com.netease.nis.quicklogin.listener.QuickLoginPreMobileListener;
 
 import dagger.hilt.android.AndroidEntryPoint;
 
@@ -83,4 +88,14 @@ public class LoginActivity extends BaseActivity<ActivityLoginBinding> {
         loginViewModel = getViewModelProvider().get(LoginViewModel.class);
         binding.setLoginViewModel(loginViewModel);
     }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+    }
+
+    @Override
+    protected void configImmersion(@NonNull ImmersionBar immersionBar) {
+        immersionBar.statusBarDarkFont(true);
+    }
 }

+ 58 - 0
app/src/main/java/com/datarecovery/master/module/login/LoginViewModel.java

@@ -9,15 +9,21 @@ import androidx.lifecycle.MutableLiveData;
 
 import com.atmob.app.lib.base.BaseViewModel;
 import com.atmob.app.lib.livedata.SingleLiveEvent;
+import com.atmob.common.logging.AtmobLog;
+import com.atmob.common.runtime.ContextUtil;
 import com.datarecovery.master.R;
+import com.datarecovery.master.data.api.response.LoginResponse;
 import com.datarecovery.master.data.consts.ErrorCode;
 import com.datarecovery.master.data.consts.EventId;
 import com.datarecovery.master.data.repositories.AccountRepository;
 import com.datarecovery.master.handler.EventHelper;
+import com.datarecovery.master.sdk.quicklogin.QuickLoginHelper;
 import com.datarecovery.master.utils.BoxingUtil;
 import com.datarecovery.master.utils.Maps;
 import com.datarecovery.master.utils.RxHttpHandler;
 import com.datarecovery.master.utils.ToastUtil;
+import com.netease.nis.quicklogin.helper.UnifyUiConfig;
+import com.netease.nis.quicklogin.listener.QuickLoginPreMobileListener;
 
 import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
@@ -34,6 +40,8 @@ import dagger.hilt.android.lifecycle.HiltViewModel;
 @HiltViewModel
 public class LoginViewModel extends BaseViewModel {
 
+    private final String TAG = "LoginViewModel";
+
     private final SingleLiveEvent<Boolean> showLoading = new SingleLiveEvent<>();
     private final MutableLiveData<String> phoneNum = new MutableLiveData<>();
     private final MutableLiveData<Boolean> isRequestCodeCountdown = new MutableLiveData<>(false);
@@ -91,7 +99,57 @@ public class LoginViewModel extends BaseViewModel {
 
 
     private void init() {
+        getPreMobileNumber();
+    }
+
+    private void getPreMobileNumber() {
+        QuickLoginHelper.openQuickLoginActivity(new QuickLoginHelper.QuickLoginListener() {
+
+            @Override
+            public void onGetTokenSuccess(String YDToken, String accessToken) {
+                quickLogin(YDToken, accessToken);
+            }
+
+            @Override
+            public void onGetTokenError(String msg) {
+
+            }
+
+            @Override
+            public void onOpenQuickLoginActivity() {
 
+            }
+        });
+    }
+
+    private void quickLogin(String YDToken, String accessToken) {
+        accountRepository.quickLogin(YDToken, accessToken)
+                .subscribe(new SingleObserver<LoginResponse>() {
+                    @Override
+                    public void onSubscribe(@atmob.reactivex.rxjava3.annotations.NonNull Disposable d) {
+                        addDisposable(d);
+                    }
+
+                    @Override
+                    public void onSuccess(@atmob.reactivex.rxjava3.annotations.NonNull LoginResponse loginResponse) {
+                        finishEvent.call();
+                    }
+
+                    @Override
+                    public void onError(@atmob.reactivex.rxjava3.annotations.NonNull Throwable e) {
+                        if (e instanceof NetworkErrorException) {
+                            ToastUtil.show(R.string.net_error, ToastUtil.LENGTH_SHORT);
+                            return;
+                        }
+                        if (e instanceof RxHttpHandler.ServerErrorException) {
+                            RxHttpHandler.ServerErrorException serverErrorException = (RxHttpHandler.ServerErrorException) e;
+                            ToastUtil.show(serverErrorException.getMsg(), ToastUtil.LENGTH_SHORT);
+                        } else {
+                            AtmobLog.e(TAG, "QuickLogin Error: " + e.getMessage());
+                            ToastUtil.show(R.string.login_failed_toast, ToastUtil.LENGTH_SHORT);
+                        }
+                    }
+                });
     }
 
 

+ 116 - 0
app/src/main/java/com/datarecovery/master/sdk/quicklogin/QuickLoginHelper.java

@@ -0,0 +1,116 @@
+package com.datarecovery.master.sdk.quicklogin;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.graphics.Color;
+
+import com.atmob.common.logging.AtmobLog;
+import com.atmob.common.runtime.ContextUtil;
+import com.datarecovery.master.BuildConfig;
+import com.datarecovery.master.R;
+import com.datarecovery.master.data.consts.Constants;
+import com.netease.nis.quicklogin.QuickLogin;
+import com.netease.nis.quicklogin.helper.UnifyUiConfig;
+import com.netease.nis.quicklogin.listener.QuickLoginPreMobileListener;
+import com.netease.nis.quicklogin.listener.QuickLoginTokenListener;
+
+public class QuickLoginHelper {
+
+    private static final String TAG = "QuickLoginHelper";
+
+    private static final String BUSINESS_ID = BuildConfig.QUICK_LOGIN_ID;
+    private static final String USER_AGREEMENT = Constants.USER_AGREEMENT;
+    private static final String PRIVACY_POLICY = Constants.PRIVACY_POLICY;
+
+    private QuickLoginHelper() {
+    }
+
+
+    public static void init(Context context) {
+        QuickLogin quickLogin = QuickLogin.getInstance();
+        quickLogin.init(context, BUSINESS_ID);
+    }
+
+
+    @SuppressLint("UseCompatLoadingForDrawables")
+    private static UnifyUiConfig getUnifyUiConfig() {
+        return new UnifyUiConfig.Builder()
+                .setStatusBarDarkColor(true)
+                .setHideNavigation(false)
+                .setHideNavigationBackIcon(false)
+                .setNavigationIconDrawable(ContextUtil.getContext().getDrawable(R.drawable.icon_back))
+                .setNavigationBackIconWidth(24)
+                .setNavigationBackIconHeight(24)
+                .setNavigationHeight(56)
+                .setLogoIconDrawable(ContextUtil.getContext().getDrawable(R.mipmap.ic_launcher))
+                .setLogoWidth(65)
+                .setLogoHeight(65)
+                .setLogoTopYOffset(50)
+                .setNavigationTitle(" ")
+                .setLoginBtnText("本机号码一键登录")
+                .setLoginBtnTextColor(Color.parseColor("#FFFFFF"))
+                .setLoginBtnTextSize(16)
+                .setLoginBtnBackgroundDrawable(ContextUtil.getContext().getDrawable(R.drawable.bg_common_btn))
+                .setCheckedImageDrawable(ContextUtil.getContext().getDrawable(R.drawable.icon_login_check_box_checked))
+                .setUnCheckedImageDrawable(ContextUtil.getContext().getDrawable(R.drawable.icon_login_check_box_unchecked))
+                .setPrivacyState(false)
+                .setPrivacyTextStart("我已阅读并同意")
+                .setProtocolText("《用户协议》")
+                .setProtocolLink(USER_AGREEMENT)
+                .setProtocol2Text("《隐私政策》")
+                .setProtocol2Link(PRIVACY_POLICY)
+                .setPrivacyTextColor(Color.parseColor("#121313"))
+                .setPrivacyProtocolColor(Color.parseColor("#2B66FE"))
+                .setPrivacyMarginLeft(12)
+                .setPrivacyMarginRight(12)
+                .setPrivacyBottomYOffset(20)
+                .setPrivacyDialogAuto(true)
+                .build(ContextUtil.getContext());
+    }
+
+
+    public static void openQuickLoginActivity(QuickLoginListener listener) {
+        if (listener == null) {
+            return;
+        }
+        QuickLogin quickLogin = QuickLogin.getInstance();
+        quickLogin.prefetchMobileNumber(new QuickLoginPreMobileListener() {
+            @Override
+            public void onGetMobileNumberSuccess(String s, String s1) {
+                AtmobLog.d(TAG, "onGetMobileNumberSuccess: " + s + ", " + s1);
+                quickLogin.setUnifyUiConfig(getUnifyUiConfig());
+                listener.onOpenQuickLoginActivity();
+                quickLogin.onePass(new QuickLoginTokenListener() {
+                    @Override
+                    public void onGetTokenSuccess(String YDToken, String accessCode) {
+                        quickLogin.quitActivity();
+                        listener.onGetTokenSuccess(YDToken, accessCode);
+                    }
+
+                    @Override
+                    public void onGetTokenError(String YDToken, int code, String msg) {
+                        AtmobLog.e(TAG, "onGetTokenError: " + code + ", " + msg);
+                        quickLogin.quitActivity();
+                        listener.onGetTokenError(msg);
+                    }
+                });
+            }
+
+            @Override
+            public void onGetMobileNumberError(String YDToken, String msg) {
+                AtmobLog.e(TAG, "onGetMobileNumberError: " + msg);
+                listener.onGetTokenError(msg);
+            }
+        });
+    }
+
+    public interface QuickLoginListener {
+
+        void onGetTokenSuccess(String YDToken, String accessToken);
+
+        void onGetTokenError(String msg);
+
+        void onOpenQuickLoginActivity();
+    }
+
+}

+ 2 - 1
gradle.properties

@@ -31,4 +31,5 @@ gravity_access_token=q5ljPyuEtIpixdlrwSf1orFqeuAGsbVi
 bugly_app_id=0a6e00ae03
 umeng_app_key=6597816395b14f599d10cd58
 qiyu_app_key=09ea6e0a6d006e25462906fbf6758c99
-atmob_central_key=9011cf0d82454014b2fc4009afbba6fb
+atmob_central_key=9011cf0d82454014b2fc4009afbba6fb
+quick_login_id=b9c1262b19b14c6c8f34e6922f1cc223