ソースを参照

feat: 完成登录

DoggyZhang 4 ヶ月 前
コミット
e999af5976

+ 5 - 1
app/build.gradle

@@ -122,6 +122,9 @@ android {
         buildConfigField("Integer", "TRTC_APP_ID_DEBUG", "1600073604")
         buildConfigField("String", "TRTC_SECRET_KEY_DEBUG", '"f7c992cc3b8fc0273716da5ad59745cf188594c695c9191806d80532914f2aa1"')
 
+        //sign key
+        buildConfigField("String", "SIGN_KEY", '"abc|abc|edg|9527|1234"')
+        buildConfigField("String", "SIGN_KEY_DEBUG", '"abc|abc|edg|9527|1234"')
     }
 
     signingConfigs {
@@ -427,7 +430,8 @@ dependencies {
     api libs.frame.util
     api libs.frame.zero
     api libs.frame.base
-    api libs.frame.network
+    //api libs.frame.network
+    api project(":frame:network")
     api libs.frame.retrofit
     api libs.frame.oss
     api libs.frame.download

+ 1 - 2
app/dependencies/releaseRuntimeClasspath.txt

@@ -252,7 +252,6 @@ com.wenext.android:frame-locale:6.0.4
 com.wenext.android:frame-log:6.0.3
 com.wenext.android:frame-media:6.0.5
 com.wenext.android:frame-mvvm:6.0.0
-com.wenext.android:frame-network:6.0.12
 com.wenext.android:frame-oss:6.0.3
 com.wenext.android:frame-push:6.0.0
 com.wenext.android:frame-router-annotation:6.0.0
@@ -281,7 +280,7 @@ io.github.scwang90:refresh-layout-kernel:3.0.0-alpha
 io.reactivex.rxjava3:rxjava:3.0.4
 javax.inject:javax.inject:1
 org.checkerframework:checker-qual:3.43.0
-org.conscrypt:conscrypt-android:2.5.3
+org.conscrypt:conscrypt-android:2.5.2
 org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.9.0
 org.jetbrains.kotlin:kotlin-annotations-jvm:1.3.72
 org.jetbrains.kotlin:kotlin-bom:1.8.22

+ 3 - 3
app/src/main/java/com/adealink/weparty/debug/DebugPrefs.kt

@@ -3,8 +3,8 @@ package com.adealink.weparty.debug
 import android.content.Context
 import com.adealink.frame.storage.sp.TypeDelegationPrefs
 import com.adealink.frame.util.AppUtil
-import com.adealink.weparty.network.getLocalHost
 import com.adealink.weparty.module.profile.ProfileModule
+import com.adealink.weparty.network.getLocalHost
 
 /**
  * Created by sunxiaodong on 2021/5/25.
@@ -18,9 +18,9 @@ object DebugPrefs : TypeDelegationPrefs(
     }
 ) {
 
-    var httpUrl: String by PrefKey("key_http_url", "http://${getLocalHost()}/api/")
+    var httpUrl: String by PrefKey("key_http_url", "http://${getLocalHost()}/")
 
-    var socketUrl: String by PrefKey("key_socket_url", "ws://${getLocalHost()}/api/websocket")
+    var socketUrl: String by PrefKey("key_socket_url", "ws://${getLocalHost()}/websocket")
 
     var webHttpUrl: String by PrefKey("key_web_http_url", "")
 

+ 23 - 23
app/src/main/java/com/adealink/weparty/deviceidservice/DeviceIdServiceConfig.kt

@@ -1,7 +1,5 @@
 package com.adealink.weparty.deviceidservice
 
-import com.adealink.frame.base.AppBase
-import com.adealink.frame.base.CommonDataNullError
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.deviceid.IDeviceIdServiceConfig
 import com.adealink.frame.util.AppUtil
@@ -29,27 +27,29 @@ class DeviceIdServiceConfig : IDeviceIdServiceConfig {
         normalDeviceInfo: String,
         advanceDeviceInfo: String
     ): Rlt<String> {
-        return when (val result = deviceIdHttpService.updateDeviceId(
-            UpdateDeviceIdRequest(
-                deviceId,
-                oldDeviceId,
-                AppBase.platform,
-                gAid,
-                androidId,
-                mac,
-                normalDeviceInfo,
-                advanceDeviceInfo
-            )
-        )) {
-            is Rlt.Success -> {
-                val newDeviceId = result.data.data
-                if (newDeviceId.isNullOrEmpty()) {
-                    return Rlt.Failed(CommonDataNullError())
-                }
-                return Rlt.Success(newDeviceId)
-            }
-            is Rlt.Failed -> result
-        }
+//        return when (val result = deviceIdHttpService.updateDeviceId(
+//            UpdateDeviceIdRequest(
+//                deviceId,
+//                oldDeviceId,
+//                AppBase.platform,
+//                gAid,
+//                androidId,
+//                mac,
+//                normalDeviceInfo,
+//                advanceDeviceInfo
+//            )
+//        )) {
+//            is Rlt.Success -> {
+//                val newDeviceId = result.data.data
+//                if (newDeviceId.isNullOrEmpty()) {
+//                    return Rlt.Failed(CommonDataNullError())
+//                }
+//                return Rlt.Success(newDeviceId)
+//            }
+//            is Rlt.Failed -> result
+//        }
+        // TODO:
+        return Rlt.Success("不支持")
     }
 
     override fun onDeviceIdGot() {

+ 7 - 2
app/src/main/java/com/adealink/weparty/module/profile/data/ProfileData2.kt

@@ -84,9 +84,9 @@ data class GetUserInRoomInfoRes(
 data class UserInfo(
     @SerializedName("uid") val uid: Long,
     @GsonNullable
-    @SerializedName("name") var name: String? = null,
+    @SerializedName("nickname") var name: String? = null,
     @GsonNullable
-    @SerializedName("url") var url: String? = null,
+    @SerializedName("avatar") var url: String? = null,
     @GsonNullable
     @SerializedName("birthday") var birthday: Long? = null,
     @GsonNullable
@@ -182,6 +182,11 @@ data class UserInfo(
     @GsonNullable
     @SerializedName("homeTab") var homeTab: Int? = null, //用户注册默认打开哪一个首页标签
 
+
+    @SerializedName("id") val id: String = "",
+    @GsonNullable
+    @SerializedName("userNo") val userNo: String = "",
+
 ) : Parcelable, RoomData {
 
     //本地使用

+ 98 - 0
app/src/main/java/com/adealink/weparty/network/HeaderInterceptor.kt

@@ -0,0 +1,98 @@
+package com.adealink.weparty.network
+
+import com.adealink.frame.locale.language.languageManager
+import com.adealink.frame.network.NetworkService
+import com.adealink.frame.network.ext.safeAdd
+import com.adealink.frame.util.getNetworkType
+import com.adealink.frame.util.md5
+import com.adealink.weparty.BuildConfig
+import com.adealink.weparty.storage.AppPref
+import okhttp3.Headers
+import okhttp3.Interceptor
+import okhttp3.Request
+import okhttp3.RequestBody
+import okhttp3.Response
+import okio.Buffer
+import java.nio.charset.StandardCharsets
+import java.util.UUID
+
+/**
+ * @author  null
+ * @date    2022/8/31 13:51
+ * @desc    请求头拦截器工具
+ *
+ */
+class HeaderInterceptor : Interceptor {
+
+    override fun intercept(chain: Interceptor.Chain): Response {
+
+        var request: Request = chain.request()
+        val requestBuilder: Request.Builder = request.newBuilder()
+        val headerBuilder: Headers.Builder = request.headers.newBuilder()
+        val config = NetworkService.innerService.config
+
+        // TODO: 转移到frame库里
+        headerBuilder.safeAdd("api", "1")
+            .safeAdd("platform", "1")
+            .safeAdd("version", config.versionCode)
+
+            // TODO: 转移到frame库里
+            .safeAdd("channel", "official")
+            .safeAdd("app", config.packageName)
+            .safeAdd("udid", config.deviceId)
+            .safeAdd("device", config.deviceId)
+            .safeAdd("network", getNetworkType())
+            .safeAdd("time", System.currentTimeMillis().toString())
+            .safeAdd("sign", getHeaderSign(request))
+            .safeAdd("id", UUID.randomUUID().toString())
+
+        if (config.loggedIn) {
+            headerBuilder
+                .safeAdd("token", AppPref.token)
+                .safeAdd("Accept-Language", languageManager?.getLanguageCode() ?: "")
+        }
+
+        requestBuilder.headers(headerBuilder.build())
+        request = requestBuilder.build()
+        return chain.proceed(request)
+    }
+
+    /**
+     * 签名,签名算法:
+     * MD5(id+udid+app+device+platform+channel+api+version+network+time+token+secret[后端约定的密钥], body[请求体数据]) ,示例值(md5)
+     */
+    private fun getHeaderSign(request: Request): String {
+        val mBuilder = kotlin.text.StringBuilder()
+        val bodyString = getBodyString(request.body)
+        return request.headers.let {
+            mBuilder.append(it["id"] ?: "")
+            mBuilder.append(it["udid"] ?: "")
+            mBuilder.append(it["app"] ?: "")
+            mBuilder.append(it["device"] ?: "")
+            mBuilder.append(it["platform"] ?: "")
+            mBuilder.append(it["channel"] ?: "")
+            mBuilder.append(it["api"] ?: "")
+            mBuilder.append(it["version"] ?: "")
+            mBuilder.append(it["network"] ?: "")
+            mBuilder.append(it["time"] ?: "")
+            mBuilder.append(it["token"] ?: "")
+            mBuilder.append(BuildConfig.SIGN_KEY)
+            mBuilder.append(bodyString)
+            mBuilder.toString().md5()
+        }
+    }
+
+    private fun getBodyString(requestBody: RequestBody?): String {
+        return requestBody?.let {
+            val buffer = Buffer()
+            it.writeTo(buffer)
+            var charset = StandardCharsets.UTF_8
+            val contentType = it.contentType()
+            if (contentType != null) {
+                charset = contentType.charset(charset)
+            }
+            buffer.readString(charset)
+        } ?: ""
+    }
+
+}

+ 13 - 5
app/src/main/java/com/adealink/weparty/network/NetworkConfig.kt

@@ -21,7 +21,6 @@ import com.adealink.frame.util.getHost
 import com.adealink.frame.util.getNetworkOperator
 import com.adealink.weparty.App
 import com.adealink.weparty.BuildConfig
-import com.adealink.weparty.module.account.AccountModule
 import com.adealink.weparty.channel.getChannel
 import com.adealink.weparty.debug.DebugPrefs
 import com.adealink.weparty.error.CommonFunctionBlockError
@@ -31,6 +30,7 @@ import com.adealink.weparty.error.CommonOperationLimitError
 import com.adealink.weparty.error.InvisibleForbiddenError
 import com.adealink.weparty.error.TokenExpireError
 import com.adealink.weparty.error.UserBannedError
+import com.adealink.weparty.module.account.AccountModule
 import com.adealink.weparty.module.network.data.ServerCode
 import com.adealink.weparty.module.profile.ProfileModule
 import com.adealink.weparty.stat.datasource.remote.ServerStatHttpService
@@ -50,15 +50,15 @@ class NetworkConfig : INetworkConfig {
     override val baseUrl: String
         get() {
             return when {
-                AppBase.isRelease -> "https://${getLocalHost()}/api/"
+                AppBase.isRelease -> "https://${getLocalHost()}/"
                 else -> DebugPrefs.httpUrl
             }
         }
-    override val reportUrl: String = "http://8.134.14.165/"
+    override val reportUrl: String = "http://${getLocalHost()}/"
     override val wssUrl: String
         get() {
             return when {
-                AppBase.isRelease -> "wss://${getLocalHost()}/api/websocket"
+                AppBase.isRelease -> "wss://${getLocalHost()}/websocket"
                 else -> DebugPrefs.socketUrl
             }
         }
@@ -127,13 +127,21 @@ class NetworkConfig : INetworkConfig {
 
     override val loggedIn: Boolean
         get() = AccountModule.isLogin()
+    override val signKey: String
+        get() = if (AppBase.isProdEnv) {
+            BuildConfig.SIGN_KEY
+        } else {
+            BuildConfig.SIGN_KEY_DEBUG
+        }
 
     override fun getNetworkInterceptors(): List<Interceptor> {
         return listOf()
     }
 
     override fun getInterceptors(): List<Interceptor> {
-        return listOf()
+        return listOf(
+            HeaderInterceptor()
+        )
     }
 
     override fun getErrorByServerCode(

+ 3 - 3
app/src/main/java/com/adealink/weparty/network/NetworkEnv.kt

@@ -7,10 +7,10 @@ import com.adealink.frame.base.AppBase
  * Created by sunxiaodong on 2021/7/5.
  */
 
-val RELEASE_HOSTS = listOf("api.yoki.chat") //主域名,优先访问
-val BACKUP_HOSTS = listOf("yokiback.wenext.website") //备用域名,主域名访问不通时使用
+val RELEASE_HOSTS = emptyList<String>() //listOf("api.yoki.chat") //主域名,优先访问
+val BACKUP_HOSTS = emptyList<String>() //listOf("yokiback.wenext.website") //备用域名,主域名访问不通时使用
 const val CDN_HOST = "yoki-user-cf.wenext.media"
-const val DEBUG_HOST_CN = "47.83.162.112"
+const val DEBUG_HOST_CN = "test-api.lanu.live"
 val WEB_PRIMARY_DOMAINS = listOf(
     "wenext.love",
     "appmisu.com",

+ 16 - 18
app/src/main/java/com/adealink/weparty/stat/StatConfig.kt

@@ -1,7 +1,6 @@
 package com.adealink.weparty.stat
 
 import android.content.Context
-import com.adealink.frame.coroutine.dispatcher.Dispatcher
 import com.adealink.frame.locale.country.getCountryCode
 import com.adealink.frame.locale.language.languageManager
 import com.adealink.frame.statistics.IStatConfig
@@ -12,10 +11,7 @@ import com.adealink.weparty.channel.getChannel
 import com.adealink.weparty.module.attribution.AttributionModule
 import com.adealink.weparty.module.profile.ProfileModule
 import com.adealink.weparty.module.room.RoomModule
-import com.adealink.weparty.stat.data.ClientFatalErrorReportReq
 import com.adealink.weparty.stat.datasource.remote.ServerStatHttpService
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.launch
 import okhttp3.OkHttpClient
 
 /**
@@ -51,7 +47,8 @@ class StatConfig : IStatConfig {
         get() = RoomModule.getJoinedRoomId()
     override val roomType: Int?
         get() = RoomModule.getRoomType()?.type
-    override val defaultReportChannels = listOf(ReportType.WENEXT, ReportType.FIREBASE)
+    override val defaultReportChannels = emptyList<ReportType>()
+        //listOf(ReportType.WENEXT, ReportType.FIREBASE)
     override val reportUrl: String = "https://api-log-upload.wenext.technology/api/log"
     override val statHtpClient: OkHttpClient
         get() = App.instance.networkService.statHttpClient
@@ -60,19 +57,20 @@ class StatConfig : IStatConfig {
         if (statClientError == null) {
             return
         }
-        CoroutineScope(Dispatcher.WENEXT_THREAD_POOL).launch {
-            val newDeviceId = App.instance.deviceIdService.getNewDeviceIdErrorEmpty()
-            statHttpService.reportClientError(
-                ClientFatalErrorReportReq(
-                    deviceId = newDeviceId,
-                    module = statClientError.module,
-                    errorInfo = statClientError.errorInfo,
-                    sid = ProfileModule.getMyUid(),
-                    region = ProfileModule.getMyUserInfo()?.region,
-                    country = ProfileModule.getMyUserInfo()?.country,
-                )
-            )
-        }
+        // TODO: 后期补齐
+//        CoroutineScope(Dispatcher.WENEXT_THREAD_POOL).launch {
+//            val newDeviceId = App.instance.deviceIdService.getNewDeviceIdErrorEmpty()
+//            statHttpService.reportClientError(
+//                ClientFatalErrorReportReq(
+//                    deviceId = newDeviceId,
+//                    module = statClientError.module,
+//                    errorInfo = statClientError.errorInfo,
+//                    sid = ProfileModule.getMyUid(),
+//                    region = ProfileModule.getMyUserInfo()?.region,
+//                    country = ProfileModule.getMyUserInfo()?.country,
+//                )
+//            )
+//        }
     }
 
 }

BIN
app/src/main/res/drawable-xhdpi/splash_top_ic.webp


+ 1 - 1
app/src/main/res/drawable/bg_splash.xml

@@ -8,6 +8,6 @@
     <item android:top="218dp">
         <bitmap
             android:gravity="top"
-            android:src="@drawable/splash_top_ic" />
+            android:src="@drawable/ic_launcher" />
     </item>
 </layer-list>

+ 1 - 0
gradle.properties

@@ -23,6 +23,7 @@ kotlin.code.style=official
 android.defaults.buildfeatures.buildconfig=true
 android.enableR8.fullMode=false
 channel_file=/channel/channel.txt
+
 LOG_LEVEL=INFO
 OFFICIAL=false
 

+ 2 - 2
module/account/src/main/java/com/adealink/weparty/account/constant/LoginConstants.kt

@@ -2,8 +2,8 @@ package com.adealink.weparty.account.constant
 
 
 // TODO: zhangfei 补充正式环境clientId
-const val GOOGLE_CLIENT_ID = "111172807665-lfjp1nsh9m7uftpd1r1rnq7a42qqtj1p.apps.googleusercontent.com"
-const val GOOGLE_CLIENT_ID_DEBUG = "111172807665-lfjp1nsh9m7uftpd1r1rnq7a42qqtj1p.apps.googleusercontent.com"
+const val GOOGLE_CLIENT_ID = "111172807665-6pqfdrdtepq2hbqcr0a05tahis6lr4fc.apps.googleusercontent.com"
+const val GOOGLE_CLIENT_ID_DEBUG = "111172807665-6pqfdrdtepq2hbqcr0a05tahis6lr4fc.apps.googleusercontent.com"
 val fbReadPermissionNeeds = listOf(
     "email", "public_profile"
 )

+ 9 - 3
module/account/src/main/java/com/adealink/weparty/account/login/data/LoginData.kt

@@ -17,8 +17,8 @@ import kotlinx.parcelize.Parcelize
  */
 
 enum class ThirdType(val value: String) {
-    FB("fb"),
     GOOGLE("google"),
+    FB("fb"),
     APPLE("apple"),
     PHONE("phone"),
     EMAIL("mail"),
@@ -26,8 +26,10 @@ enum class ThirdType(val value: String) {
 }
 
 data class LoginReq(
+    @SerializedName("data") val accessToken: String,
+
+    // TODO: 移除seqid,移除剩余的全部字段
     @SerializedName("seqid") val seqId: Long = 0,
-    @SerializedName("accessToken") val accessToken: String,
     @SerializedName("fbAccount") val fbAccount: String = AccountLocalService.fbAccount,
     @SerializedName("thirdType") val thirdType: String = "",
     @SerializedName("country") val country: String = "",
@@ -54,12 +56,16 @@ data class LoginReq(
     @SerializedName("shareScene") val shareScene: String? = null, // 参见: ShareLinkSource
 )
 
+data class GoogleLoginReq(
+    @SerializedName("data") val token: String,
+)
+
 @Parcelize
 data class LoginResult(
     @SerializedName("seqid") val seqId: Long = 0,
     @SerializedName("token") val token: String,
     @SerializedName("refreshToken") val refreshToken: String,
-    @SerializedName("userInfo") val userInfo: UserInfo,
+    @SerializedName("userProfile") val userInfo: UserInfo,
     @SerializedName("reason") val reason: String,
     @SerializedName("expire") val expire: Long,
 ) : Parcelable

+ 5 - 0
module/account/src/main/java/com/adealink/weparty/account/login/datasource/remote/LoginService.kt

@@ -12,6 +12,7 @@ import com.adealink.weparty.account.login.data.EmailLoginReq
 import com.adealink.weparty.account.login.data.EmailResetPwdReq
 import com.adealink.weparty.account.login.data.GetEmailReq
 import com.adealink.weparty.account.login.data.GetVerifyCodeReq
+import com.adealink.weparty.account.login.data.GoogleLoginReq
 import com.adealink.weparty.account.login.data.LoginReq
 import com.adealink.weparty.account.login.data.LoginResult
 import com.adealink.weparty.account.login.data.PhoneLoginReq
@@ -38,6 +39,10 @@ interface LoginService {
     @POST("account/login")
     suspend fun login(@Body req: LoginReq): Rlt<Res<LoginResult>>
 
+    @Core
+    @POST("user/login/google/enter")
+    suspend fun googleLogin(@Body req: GoogleLoginReq): Rlt<Res<LoginResult>>
+
     /**
      * 手机号登录
      */

+ 92 - 61
module/account/src/main/java/com/adealink/weparty/account/login/manager/LoginManager.kt

@@ -6,14 +6,12 @@ import com.adealink.frame.base.IError
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.coroutine.dispatcher.Dispatcher
 import com.adealink.frame.frame.BaseFrame
-import com.adealink.frame.locale.country.getSimCountryCode
 import com.adealink.frame.locale.language.languageManager
 import com.adealink.frame.log.Log
 import com.adealink.frame.network.ISocketNotify
 import com.adealink.frame.network.data.Res
 import com.adealink.frame.router.Router
 import com.adealink.frame.util.AppUtil
-import com.adealink.frame.util.getSimMmc
 import com.adealink.tcturing.TCTuringManager
 import com.adealink.weparty.App
 import com.adealink.weparty.account.ban.banManager
@@ -29,7 +27,7 @@ import com.adealink.weparty.account.login.data.EmailLoginReq
 import com.adealink.weparty.account.login.data.EmailResetPwdReq
 import com.adealink.weparty.account.login.data.GetEmailReq
 import com.adealink.weparty.account.login.data.GetVerifyCodeReq
-import com.adealink.weparty.account.login.data.LoginReq
+import com.adealink.weparty.account.login.data.GoogleLoginReq
 import com.adealink.weparty.account.login.data.LoginResult
 import com.adealink.weparty.account.login.data.PhoneLoginReq
 import com.adealink.weparty.account.login.data.RefreshTokenNotify
@@ -60,10 +58,10 @@ import com.adealink.weparty.module.attribution.AttributionModule
 import com.adealink.weparty.module.profile.ProfileModule
 import com.adealink.weparty.setting.data.EmailState
 import com.adealink.weparty.storage.AppPref
+import com.adealink.weparty.ui.home.util.HomeLocalService
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 import java.util.concurrent.atomic.AtomicBoolean
-import com.adealink.weparty.ui.home.util.HomeLocalService
 
 val loginManager: ILoginManager by lazy { LoginManager() }
 
@@ -196,38 +194,69 @@ class LoginManager : BaseFrame<ILoginListener>(), ILoginManager {
         tid: Long?,
         codeVerifier: String?
     ): Rlt<Res<LoginResult>> {
-        val newDeviceId = App.instance.deviceIdService.getNewDeviceIdErrorEmpty()
-        val isEmulator = App.instance.securityService.isEmulator()
-        val isVirtualApk = App.instance.securityService.isVirtualApk()
-        val appsflyerId = AttributionModule.getAppsFlyerUID()
-        val deviceToken = TCTuringManager.getDeviceToken()
-        var tidReq: Long? = null //用户登录tid
-        Log.i(TAG_ACCOUNT_LOGIN, "login, isVirtualApk:${isVirtualApk}, isEmulator${isEmulator}")
-        var loginReq = LoginReq(
-            accessToken = token,
-            thirdType = authType.value,
-            deviceId = getLoginDeviceId(),
-            newDeviceId = newDeviceId,
-            country = getSimCountryCode() ?: "",
-            simulator = isEmulator,
-            virtualApk = isVirtualApk,
-            appsflyerId = appsflyerId,
-            appLang = languageManager?.getLanguageCode() ?: "",
-            systemLang = languageManager?.getSystemLanguageCode() ?: "",
-            simMcc = getSimMmc(),
-            tid = tid,
-            deviceToken = deviceToken,
-            codeVerifier = codeVerifier,
-            inviter = inviteUidCode,
-            shareScene = shareScene
-        )
-        val rlt = loginService.login(
-            loginReq
+
+        when (authType) {
+            ThirdType.GOOGLE -> {
+                return googleLogin(token)
+            }
+
+            ThirdType.FB -> {}
+            ThirdType.APPLE -> {}
+            ThirdType.PHONE -> {}
+            ThirdType.EMAIL -> {}
+            ThirdType.TIKTOK -> {}
+        }
+
+//        val newDeviceId = App.instance.deviceIdService.getNewDeviceIdErrorEmpty()
+//        val isEmulator = App.instance.securityService.isEmulator()
+//        val isVirtualApk = App.instance.securityService.isVirtualApk()
+//        val appsflyerId = AttributionModule.getAppsFlyerUID()
+//        val deviceToken = TCTuringManager.getDeviceToken()
+//        var tidReq: Long? = null //用户登录tid
+//        Log.i(TAG_ACCOUNT_LOGIN, "login, isVirtualApk:${isVirtualApk}, isEmulator${isEmulator}")
+//        var loginReq = LoginReq(
+//            accessToken = token,
+//            thirdType = authType.value,
+//            deviceId = getLoginDeviceId(),
+//            newDeviceId = newDeviceId,
+//            country = getSimCountryCode() ?: "",
+//            simulator = isEmulator,
+//            virtualApk = isVirtualApk,
+//            appsflyerId = appsflyerId,
+//            appLang = languageManager?.getLanguageCode() ?: "",
+//            systemLang = languageManager?.getSystemLanguageCode() ?: "",
+//            simMcc = getSimMmc(),
+//            tid = tid,
+//            deviceToken = deviceToken,
+//            codeVerifier = codeVerifier,
+//            inviter = inviteUidCode,
+//            shareScene = shareScene
+//        )
+//        val rlt = loginService.login(
+//            loginReq
+//        )
+//        if (rlt is Rlt.Success) {
+//            val res = rlt.data.data
+//            if (res != null) {
+//                loginSuccess(res, authType)
+//                notifyLogin()
+//            }
+//        }
+//        return rlt
+        return Rlt.Failed(IError("不支持"))
+    }
+
+    private suspend fun googleLogin(token: String): Rlt<Res<LoginResult>> {
+        Log.d(TAG_ACCOUNT_LOGIN, "googleLogin, token:$token")
+        val rlt = loginService.googleLogin(
+            GoogleLoginReq(
+                token = token
+            )
         )
         if (rlt is Rlt.Success) {
             val res = rlt.data.data
             if (res != null) {
-                loginSuccess(res, authType)
+                loginSuccess(res, ThirdType.GOOGLE)
                 notifyLogin()
             }
         }
@@ -239,35 +268,37 @@ class LoginManager : BaseFrame<ILoginListener>(), ILoginManager {
         password: String,
         countryCode: String,
     ): Rlt<Res<LoginResult>> {
-        val newDeviceId = App.instance.deviceIdService.getNewDeviceIdErrorEmpty()
-        val isEmulator = App.instance.securityService.isEmulator()
-        val isVirtualApk = App.instance.securityService.isVirtualApk()
-        val appsflyerId = AttributionModule.getAppsFlyerUID()
-        val deviceToken = TCTuringManager.getDeviceToken()
-        val rlt = loginService.phoneLogin(
-            PhoneLoginReq(
-                phone,
-                password,
-                "",
-                getLoginDeviceId(),
-                newDeviceId,
-                countryCode,
-                simulator = isEmulator,
-                virtualApk = isVirtualApk,
-                appsflyerId = appsflyerId,
-                deviceToken = deviceToken,
-                inviter = inviteUidCode,
-                shareScene = shareScene
-            )
-        )
-        if (rlt is Rlt.Success) {
-            val res = rlt.data.data
-            if (res != null) {
-                loginSuccess(res, ThirdType.PHONE)
-                notifyLogin()
-            }
-        }
-        return rlt
+//        val newDeviceId = App.instance.deviceIdService.getNewDeviceIdErrorEmpty()
+//        val isEmulator = App.instance.securityService.isEmulator()
+//        val isVirtualApk = App.instance.securityService.isVirtualApk()
+//        val appsflyerId = AttributionModule.getAppsFlyerUID()
+//        val deviceToken = TCTuringManager.getDeviceToken()
+//        val rlt = loginService.phoneLogin(
+//            PhoneLoginReq(
+//                phone,
+//                password,
+//                "",
+//                getLoginDeviceId(),
+//                newDeviceId,
+//                countryCode,
+//                simulator = isEmulator,
+//                virtualApk = isVirtualApk,
+//                appsflyerId = appsflyerId,
+//                deviceToken = deviceToken,
+//                inviter = inviteUidCode,
+//                shareScene = shareScene
+//            )
+//        )
+//        if (rlt is Rlt.Success) {
+//            val res = rlt.data.data
+//            if (res != null) {
+//                loginSuccess(res, ThirdType.PHONE)
+//                notifyLogin()
+//            }
+//        }
+//        return rlt
+        return Rlt.Failed(IError("不支持"))
+
     }
 
     private fun loginSuccess(result: LoginResult, loginType: ThirdType) {

+ 10 - 8
module/account/src/main/java/com/adealink/weparty/account/login/viewmodel/LoginViewModel.kt

@@ -68,14 +68,16 @@ class LoginViewModel : BaseViewModel(), ILoginViewModel, ILoginListener {
     private var authStartTime = 0L
     private val authCallback = object : IAuthCallback {
         override fun onSuccess(authType: ThirdType, token: String, codeVerifier: String?) {
-//            AccountLoginStatEvent(CommonEventValue.Action.AUTH).apply {
-//                type to getReportLoginType(authType)
-//                result to CommonEventValue.Result.SUCCESS
-//                duration to SystemClock.elapsedRealtime() - authStartTime
-//                source to getLoginStatSource()
-//            }.send()
-//            cancelCountdown()
-//            authLogin(authType, token, codeVerifier = codeVerifier)
+            AccountLoginStatEvent(CommonEventValue.Action.AUTH).apply {
+                type to getReportLoginType(authType)
+                result to CommonEventValue.Result.SUCCESS
+                duration to SystemClock.elapsedRealtime() - authStartTime
+                source to getLoginStatSource()
+            }.send()
+            cancelCountdown()
+
+            Log.d("zhangfei", "authCallback.onSuccess, $authType, $token, $codeVerifier")
+            authLogin(authType, token, codeVerifier = codeVerifier)
         }
 
         override fun onFailed(authType: ThirdType, errorMsg: String, errorCode: Int?) {

+ 3 - 0
settings.gradle

@@ -95,6 +95,9 @@ include ':module:family'
 include ':module:attribution'
 
 
+include ':frame:network'
+project(':frame:network').projectDir = new File("D:\\Workspace\\Android\\android-frame\\frame\\network")
+
 //include ':xcrash_lib'
 //project(':xcrash_lib').projectDir = new File("third-party-libs/xcrash_lib")
 //include ':wenext_jni'