From 237bd0e7494cb73bc351b2e6002831fa593eec4c Mon Sep 17 00:00:00 2001
From: 18034727885 <973609879@qq.com>
Date: 星期五, 07 八月 2026 14:17:58 +0800
Subject: [PATCH] 修复问题

---
 app/src/main/res/values-fr/strings.xml                                    |    5 
 app/src/main/java/com/igo/user/IGoApplication.kt                          |    5 
 app/src/main/java/com/igo/user/ui/trip/ComplainActivity.kt                |   19 
 app/src/main/java/com/igo/user/ui/login/LoginActivity.kt                  |  290 ++++++------
 app/src/main/java/com/igo/user/ui/mine/ChangePwdActivity.kt               |   11 
 app/src/main/java/com/igo/user/utils/crash/CrashHandler.kt                |  160 +++++++
 app/src/main/res/layout/fragment_logistics.xml                            |    2 
 app/src/main/java/com/igo/user/network/ApiService.kt                      |    6 
 app/src/main/java/com/igo/user/ui/trip/MapTripFragment.kt                 |   16 
 app/src/main/java/com/igo/user/network/LoggingInterceptor.java            |   15 
 app/src/main/java/com/igo/user/ui/trip/TripActivity.kt                    |  181 +++++--
 app/src/main/java/com/igo/user/ui/trip/OrderDetailActivity.kt             |   41 +
 app/src/main/java/com/igo/user/utils/Const.kt                             |    2 
 app/build.gradle                                                          |    4 
 app/src/main/java/com/igo/user/utils/crash/CrashInfo.kt                   |   39 +
 app/src/main/java/com/igo/user/ui/mine/FeedbackActivity.kt                |    4 
 app/src/main/java/com/igo/user/ui/mine/VerifyPhoneForUpdatePwdActivity.kt |   69 +-
 app/src/main/java/com/igo/user/ui/mine/TripOrderFragment.kt               |    8 
 app/src/main/java/com/igo/user/network/RRetrofit.kt                       |   87 ++-
 app/src/main/java/com/igo/user/ui/trip/OrderDetailWithMapActivity.kt      |   15 
 app/src/main/res/values/strings.xml                                       |    1 
 rxnetty/src/main/java/cn/sinata/rxnetty/LogHelper.java                    |   13 
 app/src/main/java/com/igo/user/utils/crash/LogUploader.kt                 |  124 +++++
 app/src/main/java/com/igo/user/ui/trip/CancelOrderActivity.kt             |   63 +-
 app/src/main/java/com/igo/user/ui/MainActivity.kt                         |    1 
 app/src/main/java/com/igo/user/ui/HomeActivity.kt                         |   37 +
 app/src/main/java/com/igo/user/network/HttpManager.kt                     |    6 
 app/src/main/res/layout/activity_login.xml                                |    8 
 app/src/main/java/com/igo/user/ui/logistics/LogisticsGuideActivity.kt     |   22 
 app/src/main/res/values-en/strings.xml                                    |   13 
 app/src/main/java/com/igo/user/extension/StringExtension.kt               |    5 
 app/src/main/java/com/igo/user/network/Apis.kt                            |    1 
 app/src/main/res/layout/activity_receiver.xml                             |    5 
 33 files changed, 885 insertions(+), 393 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index f718a1f..2fb6339 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -21,8 +21,8 @@
         applicationId "com.gopost.user"
         minSdkVersion 23
         targetSdkVersion 35
-        versionCode 21
-        versionName "1.21"
+        versionCode 22
+        versionName "1.22"
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
     }
 
diff --git a/app/src/main/java/com/igo/user/IGoApplication.kt b/app/src/main/java/com/igo/user/IGoApplication.kt
index c964dbe..24a4389 100644
--- a/app/src/main/java/com/igo/user/IGoApplication.kt
+++ b/app/src/main/java/com/igo/user/IGoApplication.kt
@@ -14,7 +14,6 @@
 import androidx.fragment.app.FragmentManager
 import androidx.lifecycle.lifecycleScope
 import cn.sinata.rxnetty.LogHelper
-import cn.sinata.rxnetty.LogHelper.initLogs
 import cn.sinata.rxnetty.NettyClient
 import cn.sinata.xldutils.activity.BaseActivity
 import cn.sinata.xldutils.application.BaseApplication
@@ -40,6 +39,7 @@
 import com.igo.user.ui.login.LoginActivity
 import com.igo.user.ui.trip.TripActivity
 import com.igo.user.utils.Const
+import com.igo.user.utils.crash.CrashHandler
 import com.sinata.download.DownloadLibrary
 import io.reactivex.Flowable
 import io.reactivex.disposables.Disposable
@@ -66,7 +66,7 @@
             null,
             packageName
         )
-        initLogs()
+        LogHelper.initLogs(this)
         initNetty()
         Places.initialize(this, Const.google_key)
         MapsInitializer.initialize(
@@ -74,6 +74,7 @@
         ) { renderer ->
             Log.e(Const.GoogleTag, "LATEST renderer:${renderer.name}")
         }
+        CrashHandler.init(this)
     }
 
     private fun initNetty() {
diff --git a/app/src/main/java/com/igo/user/extension/StringExtension.kt b/app/src/main/java/com/igo/user/extension/StringExtension.kt
index 2bf968c..b737935 100644
--- a/app/src/main/java/com/igo/user/extension/StringExtension.kt
+++ b/app/src/main/java/com/igo/user/extension/StringExtension.kt
@@ -1,5 +1,10 @@
 package com.igo.user.extension
 
+//扩展函数 如果字符是null或者空字符串则返回block函数值
+fun String?.extIsEmptyOrNull(block: () -> String): String {
+    return if (isNullOrEmpty()) block.invoke() else this
+}
+
 //扩展函数 清除无效0
 fun String.extClearInvalidZero(): String {
     if (endsWith(".000")) {
diff --git a/app/src/main/java/com/igo/user/network/ApiService.kt b/app/src/main/java/com/igo/user/network/ApiService.kt
index 44ec9e2..92df1b9 100644
--- a/app/src/main/java/com/igo/user/network/ApiService.kt
+++ b/app/src/main/java/com/igo/user/network/ApiService.kt
@@ -408,8 +408,12 @@
 
 
     @POST(Apis.getOrderDrivingData)
-    fun getOrderDrivingData(@Query("orderId")orderId :Int,@Query("orderType")orderType :Int): Flowable<ResultData<Any>>
+    fun getOrderDrivingData(@Query("orderId")orderId :Int,@Query("orderType")orderType :Int): Flowable<ResultData<TrippingInfo>>
 
     @POST(Apis.queryHomeEntrance)
     fun queryHomeEntrance(): Flowable<ResultData<HomeDatas>>
+
+    @FormUrlEncoded
+    @POST(Apis.saveLog)
+    fun saveLog(@Field("url") url: String): Flowable<ResultData<HomeDatas>>
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/igo/user/network/Apis.kt b/app/src/main/java/com/igo/user/network/Apis.kt
index 5f5dc09..69d5981 100644
--- a/app/src/main/java/com/igo/user/network/Apis.kt
+++ b/app/src/main/java/com/igo/user/network/Apis.kt
@@ -161,5 +161,6 @@
 
 
     const val queryHomeEntrance = "base/driver/queryHomeEntrance" //新增-获取首页入口设置
+    const val saveLog = "api/appLog/save" //手机端日志记录
 
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/igo/user/network/HttpManager.kt b/app/src/main/java/com/igo/user/network/HttpManager.kt
index 25b7643..e2d1ec4 100644
--- a/app/src/main/java/com/igo/user/network/HttpManager.kt
+++ b/app/src/main/java/com/igo/user/network/HttpManager.kt
@@ -1347,11 +1347,15 @@
     }
 
 
-    fun getOrderDrivingData(orderId:Int,orderType:Int): Flowable<ResultData<Any>> {
+    fun getOrderDrivingData(orderId:Int,orderType:Int): Flowable<ResultData<TrippingInfo>> {
         return request().getOrderDrivingData(orderId,orderType)
     }
 
     fun queryHomeEntrance(): Flowable<ResultData<HomeDatas>> {
         return request().queryHomeEntrance()
     }
+
+    fun saveLog(url: String): Flowable<ResultData<HomeDatas>> {
+        return request().saveLog(url)
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/igo/user/network/LoggingInterceptor.java b/app/src/main/java/com/igo/user/network/LoggingInterceptor.java
index 6a9255e..e721381 100644
--- a/app/src/main/java/com/igo/user/network/LoggingInterceptor.java
+++ b/app/src/main/java/com/igo/user/network/LoggingInterceptor.java
@@ -18,21 +18,6 @@
 
     private static final String TAG = "zmc-Log";
 
-    private volatile Level level = Level.NONE;
-
-    public Level getLevel() {
-        return level;
-    }
-
-    public void setLevel(Level l) {
-        level = l;
-    }
-
-    public enum Level {
-        NONE,
-        BODY
-    }
-
     @Override
     public Response intercept(Chain chain) throws IOException {
         Request request = chain.request();
diff --git a/app/src/main/java/com/igo/user/network/RRetrofit.kt b/app/src/main/java/com/igo/user/network/RRetrofit.kt
index 82639c1..6101add 100644
--- a/app/src/main/java/com/igo/user/network/RRetrofit.kt
+++ b/app/src/main/java/com/igo/user/network/RRetrofit.kt
@@ -17,10 +17,7 @@
 class RRetrofit private constructor() {
 
     private val loggingInterceptor by lazy {
-        LoggingInterceptor().apply {
-            level =
-                if (BuildConfig.DEBUG) LoggingInterceptor.Level.BODY else LoggingInterceptor.Level.NONE
-        }
+        LoggingInterceptor()
     }
 
     private val retrofit: Retrofit = Retrofit.Builder()
@@ -29,49 +26,53 @@
         .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
         .client(
             OkHttpClient.Builder()
-            .addInterceptor(HttpLoggingInterceptor().apply {
-                level = HttpLoggingInterceptor.Level.BODY
-            })
-            .addInterceptor { chain ->
-                var request = chain.request()
-                if (request.method() == "POST" && !request.url().toString()
-                        .contains("base/user/image")
-                ) {
-                    val bodyBuilder = FormBody.Builder()
-                    var formBody: FormBody
-                    if (request.body() is FormBody) {
-                        formBody = request.body() as FormBody
-                        (0 until formBody.size()).forEach {
-                            bodyBuilder.addEncoded(
-                                formBody.encodedName(it), formBody.encodedValue(
-                                    it
+                .addInterceptor(HttpLoggingInterceptor().apply {
+                    level = HttpLoggingInterceptor.Level.BODY
+                })
+                .addInterceptor { chain ->
+                    var request = chain.request()
+                    if (request.method() == "POST" && !request.url().toString()
+                            .contains("base/user/image")
+                    ) {
+                        val bodyBuilder = FormBody.Builder()
+                        var formBody: FormBody
+                        if (request.body() is FormBody) {
+                            formBody = request.body() as FormBody
+                            (0 until formBody.size()).forEach {
+                                bodyBuilder.addEncoded(
+                                    formBody.encodedName(it), formBody.encodedValue(
+                                        it
+                                    )
                                 )
-                            )
+                            }
                         }
+                        var language = request.header("language")
+                        language = if (language.isNullOrEmpty()) {
+                            LanguageUtil.getLanguage()!!
+                        } else {
+                            language
+                        }
+                        //1=简体中文,2=英语,3=法语
+                        formBody = bodyBuilder.addEncoded("language", getLanguageType(language)).build()
+                        request = request.newBuilder().post(formBody).build()
                     }
-                    var language = request.header("language")
-                    language = if (language.isNullOrEmpty()) {
-                        LanguageUtil.getLanguage()!!
-                    } else {
-                        language
-                    }
-                    //1=简体中文,2=英语,3=法语
-                    formBody = bodyBuilder.addEncoded("language", getLanguageType(language)).build()
-                    request = request.newBuilder().post(formBody).build()
+                    chain.proceed(request)
                 }
-                chain.proceed(request)
-            }
-            .addInterceptor { chain ->
-                val token = SPUtils.instance().getString(Const.User.TOKEN)
-                val request =
-                    if (token.isEmpty()) chain.request() else
-                        chain.request().newBuilder().addHeader("Authorization", "Bearer $token")
-                            .build()
-                Log.e(Const.Tag, request.headers().toString())
-                chain.proceed(request)
-            }
-            .addInterceptor(loggingInterceptor)
-            .build())
+                .addInterceptor { chain ->
+                    val token = SPUtils.instance().getString(Const.User.TOKEN)
+                    val request =
+                        if (token.isEmpty()) chain.request() else
+                            chain.request().newBuilder().addHeader("Authorization", "Bearer $token")
+                                .build()
+                    Log.e(Const.Tag, request.headers().toString())
+                    chain.proceed(request)
+                }
+                .apply {
+                    if (BuildConfig.DEBUG) {
+                        addInterceptor(loggingInterceptor)
+                    }
+                }
+                .build())
         .build()
 
     companion object {
diff --git a/app/src/main/java/com/igo/user/ui/HomeActivity.kt b/app/src/main/java/com/igo/user/ui/HomeActivity.kt
index a64b27c..afdfcb7 100644
--- a/app/src/main/java/com/igo/user/ui/HomeActivity.kt
+++ b/app/src/main/java/com/igo/user/ui/HomeActivity.kt
@@ -37,6 +37,7 @@
 import com.igo.user.ui.mine.SettingActivity
 import com.igo.user.ui.mine.ShareAppActivity
 import com.igo.user.ui.mine.UserInfoActivity
+import com.igo.user.ui.mine.VerifyPhoneForUpdatePwdActivity
 import com.igo.user.ui.mine.WalletActivity
 import com.igo.user.utils.Const
 import com.igo.user.utils.ImageUtils
@@ -265,6 +266,12 @@
             ImageUtils.load(bind.img1, data?.imgUrlTaxi)
             ImageUtils.load(bind.img3, data?.imgUrlLogistics)
         }
+        showNoticeSetPasswordDialog()
+    }
+
+    override fun onNewIntent(intent: Intent?) {
+        super.onNewIntent(intent)
+        showNoticeSetPasswordDialog()
     }
 
     //刷新广告
@@ -327,4 +334,34 @@
         }
         block.invoke(IGoApplication.getCurrentLocation())
     }
+
+    //显示提示设置密码弹窗
+    private fun showNoticeSetPasswordDialog() {
+        if (SPUtils.instance().getString(Const.User.NEED_SET_PASSWORD) == "1") {
+            HttpManager.queryUserInfo().request(this) { _, data ->
+                data?.also {
+                    SPUtils.instance().put(Const.User.PHONE, it.phone).apply()
+                    val tipDialog = TipDialog()
+                    tipDialog.arguments = bundleOf(
+                        "msg" to getString(R.string.请设置密码),
+                        "ok" to getString(R.string.前往),
+                        "cancel" to getString(R.string.取消),
+                        "isNotifyRed" to true
+                    )
+                    tipDialog.setCallback(object : TipDialog.OnClickCallback {
+                        override fun onOk() {
+                            startActivity<VerifyPhoneForUpdatePwdActivity>(
+                                "phone" to it.phone,
+                                "title" to getString(R.string.set_password)
+                            )
+                        }
+
+                        override fun onCancel() {
+                        }
+                    })
+                    tipDialog.showAllowingStateLoss(supportFragmentManager, "setPassword")
+                }
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/igo/user/ui/MainActivity.kt b/app/src/main/java/com/igo/user/ui/MainActivity.kt
index 6038f76..270d617 100644
--- a/app/src/main/java/com/igo/user/ui/MainActivity.kt
+++ b/app/src/main/java/com/igo/user/ui/MainActivity.kt
@@ -435,7 +435,6 @@
      * 查询是否有进行中的订单
      */
     fun queryTripping() {
-        LogHelper.logRecord("查询是否有进行中的订单")
         HttpManager.queryServingOrder().request(this, false) { _, data ->
             data?.let {
                 if (isFinishing) return@let
diff --git a/app/src/main/java/com/igo/user/ui/login/LoginActivity.kt b/app/src/main/java/com/igo/user/ui/login/LoginActivity.kt
index a62547a..c656374 100644
--- a/app/src/main/java/com/igo/user/ui/login/LoginActivity.kt
+++ b/app/src/main/java/com/igo/user/ui/login/LoginActivity.kt
@@ -1,5 +1,9 @@
 package com.igo.user.ui.login
 
+//import com.umeng.socialize.UMAuthListener
+//import com.umeng.socialize.UMShareAPI
+//import com.umeng.socialize.UMShareConfig
+//import com.umeng.socialize.bean.SHARE_MEDIA
 import MainActivityViewModel
 import android.app.Activity
 import android.content.Intent
@@ -11,7 +15,6 @@
 import android.widget.EditText
 import android.widget.ImageView
 import android.widget.TextView
-import android.widget.Toast
 import androidx.activity.viewModels
 import androidx.core.os.bundleOf
 import androidx.lifecycle.lifecycleScope
@@ -37,20 +40,16 @@
 import com.flyco.tablayout.listener.OnTabSelectListener
 import com.google.android.gms.common.ConnectionResult
 import com.google.android.gms.common.GoogleApiAvailability
-import com.google.android.gms.recaptcha.Recaptcha
-import com.google.android.gms.recaptcha.RecaptchaAction
 import com.google.android.gms.recaptcha.RecaptchaClient
-import com.google.recaptcha.sample.RecaptchaVisual
 import com.google.recaptcha.sample.RecaptchaVisualException
 import com.igo.user.R
-import com.igo.user.dialog.ImageCodeDialog
 import com.igo.user.dialog.SingleWheelDialog
 import com.igo.user.interfaces.StringCallback
 import com.igo.user.network.HttpManager
 import com.igo.user.network.request
 import com.igo.user.ui.H5Activity
+import com.igo.user.ui.HomeActivity
 import com.igo.user.ui.TransparentStatusBarActivity
-import com.igo.user.ui.mine.FinishMailActivity
 import com.igo.user.utils.Const
 import com.twitter.sdk.android.core.Callback
 import com.twitter.sdk.android.core.Result
@@ -61,12 +60,6 @@
 import com.twitter.sdk.android.core.TwitterSession
 import com.twitter.sdk.android.core.identity.TwitterAuthClient
 import com.twitter.sdk.android.core.models.User
-//import com.umeng.socialize.UMAuthListener
-//import com.umeng.socialize.UMShareAPI
-//import com.umeng.socialize.UMShareConfig
-//import com.umeng.socialize.bean.SHARE_MEDIA
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
 import org.jetbrains.anko.find
 import org.jetbrains.anko.startActivity
@@ -77,6 +70,7 @@
 
     companion object {
         const val WEB_SITE_KEY = "6LdZdPErAAAAAM5YvB_2ElX5VR4bG2hcNhAOO5cU"
+
         //         const val BASE_URL = "https://www.google.com/recaptcha/api.js?onload=onLoad&render=explicit"
         const val BASE_URL = "https://gopost.ci"
     }
@@ -118,10 +112,10 @@
         }
     }
 
-    private var mTwitterAuthClient:TwitterAuthClient? = null //推特登录
+    private var mTwitterAuthClient: TwitterAuthClient? = null //推特登录
 
 
-    private var ip:String? = null   //登录id
+    private var ip: String? = null   //登录id
     private var callbackManager: CallbackManager? = null//脸书登录回调
     private lateinit var profileTracker: ProfileTracker
 
@@ -144,7 +138,7 @@
         val resultCode = googleApiAvailability.isGooglePlayServicesAvailable(this)
         if (resultCode != ConnectionResult.SUCCESS) {
             // 提示用户更新 Play 服务
-          println("谷歌服务不可用")
+            println("谷歌服务不可用")
         }
 
         areaCode.setOnClickListener {
@@ -171,16 +165,6 @@
         tab_type.setOnTabSelectListener(object : OnTabSelectListener {
             override fun onTabSelect(position: Int) {
                 if (position == 0) {
-                    tv_pwd.isChecked = true
-                    tv_pwd.text = getString(R.string.验证码)
-                    et_code.visible()
-                    tv_code.visible()
-                    tv_operator.gone()
-                    tv_op_title.gone()
-                    line.visible()
-                    et_pwd.gone()
-                    tv_forget.gone()
-                } else {
                     tv_pwd.isChecked = false
                     tv_pwd.text = getString(R.string.密码)
                     et_pwd.visible()
@@ -190,6 +174,16 @@
                     tv_op_title.gone()
                     line.gone()
                     tv_forget.visible()
+                } else {
+                    tv_pwd.isChecked = true
+                    tv_pwd.text = getString(R.string.验证码)
+                    et_code.visible()
+                    tv_code.visible()
+                    tv_operator.gone()
+                    tv_op_title.gone()
+                    line.visible()
+                    et_pwd.gone()
+                    tv_forget.gone()
                 }
             }
 
@@ -203,13 +197,13 @@
                 myToast(getString(R.string.请填写手机号))
                 return@setOnClickListener
             }
-            phone = areaCode.text.toString().replace("+","") + phone
+            phone = areaCode.text.toString().replace("+", "") + phone
             lifecycleScope.launch {
                 try {
                     val token = ""
                     viewModel.onLoginButtonClicked(token)
 
-                    HttpManager.sendSms(phone, "", 2,token).request(
+                    HttpManager.sendSms(phone, "", 2, token).request(
                         this@LoginActivity,
                         success = { _, _ ->
                             val start = timer.start()
@@ -224,24 +218,24 @@
             }
 
 
-           /* val imageCodeDialog = ImageCodeDialog()
-            imageCodeDialog.arguments = bundleOf("phone" to phone)
+            /* val imageCodeDialog = ImageCodeDialog()
+             imageCodeDialog.arguments = bundleOf("phone" to phone)
 
-            imageCodeDialog.setCallback(object : ImageCodeDialog.Callback {
-                override fun onOk(code: String) {
-                    tv_code.isEnabled = false
-                    HttpManager.sendSms(phone, code, 2).request(
-                        this@LoginActivity,
-                        success = { _, _ ->
-                            val start = timer.start()
-                            myToast(getString(R.string.发送成功))
-                        },
-                        error = { _, _ ->
-                            tv_code.isEnabled = true
-                        })
-                }
-            })
-            imageCodeDialog.show(supportFragmentManager, "code")*/
+             imageCodeDialog.setCallback(object : ImageCodeDialog.Callback {
+                 override fun onOk(code: String) {
+                     tv_code.isEnabled = false
+                     HttpManager.sendSms(phone, code, 2).request(
+                         this@LoginActivity,
+                         success = { _, _ ->
+                             val start = timer.start()
+                             myToast(getString(R.string.发送成功))
+                         },
+                         error = { _, _ ->
+                             tv_code.isEnabled = true
+                         })
+                 }
+             })
+             imageCodeDialog.show(supportFragmentManager, "code")*/
         }
 
         tv_forget.setOnClickListener {
@@ -251,86 +245,25 @@
         tv_action.setOnClickListener {
             if (!cb_rule.isChecked)
                 myToast(getString(R.string.please_agree))
-            else{
-               /* if (tab_type.currentTab == 0){
-                    val operator = tv_operator.text.toString()
-                    if (operator.isEmpty()){
-                        myToast(getString(R.string.请选择运营商))
-                        return@setOnClickListener
-                    }
-                }*/
+            else {
+                /* if (tab_type.currentTab == 0){
+                     val operator = tv_operator.text.toString()
+                     if (operator.isEmpty()){
+                         myToast(getString(R.string.请选择运营商))
+                         return@setOnClickListener
+                     }
+                 }*/
                 var phone = et_phone.text.toString()
                 if (!phone.isValidPhone()) {
                     myToast(getString(R.string.请填写手机号))
                     return@setOnClickListener
                 }
-                phone = areaCode.text.toString().replace("+","") + phone
+                phone = areaCode.text.toString().replace("+", "") + phone
 
-                if (tab_type.currentTab == 0){
-                   /* val operator = tv_operator.text.toString()
-                    if (operator.isEmpty()){
-                        myToast(getString(R.string.请选择运营商))
-                        return@setOnClickListener
-                    }*/
-                    val code = et_code.text.toString()
-                    if (code.isEmpty()){
-                        myToast(getString(R.string.请输入验证码))
-                        return@setOnClickListener
-                    }
-                    if (code.length<4) {
-                        myToast(getString(R.string.验证码输入有误))
-                        return@setOnClickListener
-                    }
-                    showDialog(getString(R.string.login_ing), false)
-                    tv_action.isEnabled = false
-                    HttpManager.codeLogin("", phone, code, ip).request(
-                        this,
-                        success = { _, data ->
-                            data?.let {
-                                SPUtils.instance().put(Const.User.APP_ID, it.optString("appid"))
-                                    .put(Const.User.TOKEN, it.optString("token"))
-                                    .put(Const.User.USER_ID, it.optInt("id"))
-                                    .put(Const.User.EMAIL, it.optString("email"))
-                                    .apply()
-                               /* if (it.optString("email").isEmpty()) {
-                                    startActivity<FinishMailActivity>("isRegister" to true)
-                                }*/
-                                finish()
-                            }
-                        },
-                        error = { _, _ ->
-                            tv_action.isEnabled = true
-                            dismissDialog()
-                        })
-                }else{
-//                    val operator = tv_operator.text.toString()
-//                    if (operator.isEmpty()){
-//                        myToast(getString(R.string.请选择运营商))
-//                        return@setOnClickListener
-//                    }
-                    val pwd = et_pwd.text.toString()
-                    if (pwd.length<6) {
-                        myToast(getString(R.string.请输入6到18位密码))
-                        return@setOnClickListener
-                    }
-                    showDialog(getString(R.string.login_ing), false)
-                    tv_action.isEnabled = false
-                    HttpManager.pwdLogin(phone, pwd).request(this, success = { _, data ->
-                        data?.let {
-                            SPUtils.instance().put(Const.User.APP_ID, it.optString("appid"))
-                                .put(Const.User.TOKEN, it.optString("token"))
-                                .put(Const.User.USER_ID, it.optInt("id"))
-                                .put(Const.User.EMAIL, it.optString("email"))
-                                .apply()
-                            /*if (it.optString("email").isEmpty()) {
-                                startActivity<FinishMailActivity>("isRegister" to true)
-                            }*/
-                            finish()
-                        }
-                    }, error = { _, _ ->
-                        tv_action.isEnabled = true
-                        dismissDialog()
-                    })
+                if (tab_type.currentTab == 0) {
+                    passwordLogin(phone)
+                } else {
+                    codeLogin(phone)
                 }
             }
         }
@@ -341,7 +274,7 @@
         tv_wx.setOnClickListener {
             if (!cb_rule.isChecked)
                 myToast(getString(R.string.please_agree))
-            else{
+            else {
 
 //                UMShareAPI.get(this).getPlatformInfo(this, SHARE_MEDIA.WEIXIN, this)
             }
@@ -350,8 +283,8 @@
         tv_fb.setOnClickListener {
             if (!cb_rule.isChecked)
                 myToast(getString(R.string.please_agree))
-            else{
-                if (callbackManager == null){
+            else {
+                if (callbackManager == null) {
                     callbackManager = CallbackManager.Factory.create()
                     login_button.registerCallback(callbackManager, object :
                         FacebookCallback<LoginResult> {
@@ -377,9 +310,9 @@
                                             .put(Const.User.TOKEN, it.optString("token"))
                                             .put(Const.User.EMAIL, it.optString("email"))
                                             .put(Const.User.USER_ID, it.optInt("id")).apply()
-                                       /* if (it.optString("email").isEmpty()) {
-                                            startActivity<FinishMailActivity>("isRegister" to true)
-                                        }*/
+                                        /* if (it.optString("email").isEmpty()) {
+                                             startActivity<FinishMailActivity>("isRegister" to true)
+                                         }*/
                                         if (it.optInt("phone") != 2) { //没有手机号
                                             startActivityForResult<BindPhoneActivity>(1)
                                             SPUtils.instance().put(Const.User.NO_PHONE, true)
@@ -441,14 +374,14 @@
         tv_x.setOnClickListener {
             if (!cb_rule.isChecked)
                 myToast(getString(R.string.please_agree))
-            else{
+            else {
                 mTwitterAuthClient = TwitterAuthClient()
                 mTwitterAuthClient?.authorize(this, object : Callback<TwitterSession>() {
                     override fun success(result: Result<TwitterSession>?) {
                         val user_id = result!!.data.userId.toString()
-                        Log.e("X Login","login success:"+user_id)
+                        Log.e("X Login", "login success:" + user_id)
                         val user_name = result.data.userName
-                        var email:String?
+                        var email: String?
                         val activeSession = TwitterCore.getInstance().sessionManager.activeSession
                         val client = TwitterApiClient(activeSession)
                         val accountService = client.accountService
@@ -456,18 +389,18 @@
                         show.enqueue(object : Callback<User?>() {
                             override fun success(result: Result<User?>?) {
                                 email = result?.data?.email
-                                twitterLogin(user_id,user_name,email)
+                                twitterLogin(user_id, user_name, email)
                             }
 
                             override fun failure(exception: TwitterException?) {
-                                twitterLogin(user_id,user_name,null)
+                                twitterLogin(user_id, user_name, null)
                             }
 
                         })
                     }
 
                     override fun failure(exception: TwitterException?) {
-                        Log.e("X Login","login failure:"+exception?.message)
+                        Log.e("X Login", "login failure:" + exception?.message)
                         mTwitterAuthClient = null
                     }
                 })
@@ -475,8 +408,82 @@
         }
     }
 
-    private fun twitterLogin(uid:String,name:String,mail:String?){
-        HttpManager.twitterLogin(uid,name, mail).request(this){_,data->
+    //验证码登录
+    private fun codeLogin(phone: String) {
+        /* val operator = tv_operator.text.toString()
+                    if (operator.isEmpty()){
+                        myToast(getString(R.string.请选择运营商))
+                        return@setOnClickListener
+                    }*/
+        val code = et_code.text.toString()
+        if (code.isEmpty()) {
+            myToast(getString(R.string.请输入验证码))
+            return
+        }
+        if (code.length < 4) {
+            myToast(getString(R.string.验证码输入有误))
+            return
+        }
+        showDialog(getString(R.string.login_ing), false)
+        tv_action.isEnabled = false
+        HttpManager.codeLogin("", phone, code, ip).request(
+            this,
+            success = { _, data ->
+                data?.let {
+                    SPUtils.instance().put(Const.User.APP_ID, it.optString("appid"))
+                        .put(Const.User.TOKEN, it.optString("token"))
+                        .put(Const.User.USER_ID, it.optInt("id"))
+                        .put(Const.User.EMAIL, it.optString("email"))
+                        .put(Const.User.NEED_SET_PASSWORD, it.optString("isSetPassword"))
+                        .apply()
+                    /* if (it.optString("email").isEmpty()) {
+                         startActivity<FinishMailActivity>("isRegister" to true)
+                     }*/
+                    startActivity<HomeActivity>("isOpen" to HomeActivity.isOpenHome, "func" to HomeActivity.funcHome)
+                    finish()
+                }
+            },
+            error = { _, _ ->
+                tv_action.isEnabled = true
+                dismissDialog()
+            })
+    }
+
+    //密码登录
+    private fun passwordLogin(phone: String) {
+        //                    val operator = tv_operator.text.toString()
+//                    if (operator.isEmpty()){
+//                        myToast(getString(R.string.请选择运营商))
+//                        return@setOnClickListener
+//                    }
+        val pwd = et_pwd.text.toString()
+        if (pwd.length < 6) {
+            myToast(getString(R.string.请输入6到18位密码))
+            return
+        }
+        showDialog(getString(R.string.login_ing), false)
+        tv_action.isEnabled = false
+        HttpManager.pwdLogin(phone, pwd).request(this, success = { _, data ->
+            data?.let {
+                SPUtils.instance().put(Const.User.APP_ID, it.optString("appid"))
+                    .put(Const.User.TOKEN, it.optString("token"))
+                    .put(Const.User.USER_ID, it.optInt("id"))
+                    .put(Const.User.EMAIL, it.optString("email"))
+                    .apply()
+                /*if (it.optString("email").isEmpty()) {
+                    startActivity<FinishMailActivity>("isRegister" to true)
+                }*/
+                startActivity<HomeActivity>("isOpen" to HomeActivity.isOpenHome, "func" to HomeActivity.funcHome)
+                finish()
+            }
+        }, error = { _, _ ->
+            tv_action.isEnabled = true
+            dismissDialog()
+        })
+    }
+
+    private fun twitterLogin(uid: String, name: String, mail: String?) {
+        HttpManager.twitterLogin(uid, name, mail).request(this) { _, data ->
             data?.let {
                 SPUtils.instance()
                     .put(Const.User.APP_ID, it.optString("appid"))
@@ -496,7 +503,7 @@
     override fun initView() {
 //        recaptcha = RecaptchaVisual(supportFragmentManager, WEB_SITE_KEY, BASE_URL)
 
-      //  viewModel.responseText.observe(this) { response -> myToast(response) }
+        //  viewModel.responseText.observe(this) { response -> myToast(response) }
 
 //        val reads = getString(R.string.我已阅读并同意)
 //        val rule = getString(R.string.IGO出行用户服务协议)
@@ -506,23 +513,23 @@
         tab_type.setTabData(arrayListOf(object : CustomTabEntity {
             override fun getTabUnselectedIcon() = 0
             override fun getTabSelectedIcon() = 0
-            override fun getTabTitle() = getString(R.string.验证码登录)
+            override fun getTabTitle() = getString(R.string.密码登录)
         }, object : CustomTabEntity {
             override fun getTabUnselectedIcon() = 0
             override fun getTabSelectedIcon() = 0
-            override fun getTabTitle() = getString(R.string.密码登录)
+            override fun getTabTitle() = getString(R.string.验证码登录)
         }))
 
-        tv_rule.setOnClickListener { _->
-            if(urlxieyi.isNotEmpty()){
+        tv_rule.setOnClickListener { _ ->
+            if (urlxieyi.isNotEmpty()) {
                 startActivity<H5Activity>(
                     "title" to getString(R.string.用户服务协议), "url" to urlxieyi
                 )
                 return@setOnClickListener
             }
-            HttpManager.getH5(2).request(this){ _, data->
+            HttpManager.getH5(2).request(this) { _, data ->
                 data?.let {
-                    urlxieyi=it.optString(
+                    urlxieyi = it.optString(
                         "content"
                     )
                     startActivity<H5Activity>(
@@ -535,8 +542,7 @@
         }
     }
 
-    var urlxieyi=""
-
+    var urlxieyi = ""
 
 
 //    override fun onStart(p0: SHARE_MEDIA?) {
@@ -581,7 +587,7 @@
                 areaCode.text = it
             }
         }
-        if (requestCode == TwitterAuthConfig.DEFAULT_AUTH_REQUEST_CODE){
+        if (requestCode == TwitterAuthConfig.DEFAULT_AUTH_REQUEST_CODE) {
             mTwitterAuthClient?.onActivityResult(requestCode, resultCode, data)
         }
     }
diff --git a/app/src/main/java/com/igo/user/ui/logistics/LogisticsGuideActivity.kt b/app/src/main/java/com/igo/user/ui/logistics/LogisticsGuideActivity.kt
index fd00044..0074c8d 100644
--- a/app/src/main/java/com/igo/user/ui/logistics/LogisticsGuideActivity.kt
+++ b/app/src/main/java/com/igo/user/ui/logistics/LogisticsGuideActivity.kt
@@ -28,7 +28,6 @@
 import com.igo.user.network.HttpManager
 import com.igo.user.network.entity.Order
 import com.igo.user.network.request
-import com.igo.user.ui.H5Activity
 import com.igo.user.ui.TransparentStatusBarActivity
 import com.igo.user.ui.crosscity.PayCrossActivity
 import com.igo.user.ui.mine.OrderActivity
@@ -179,12 +178,15 @@
             this,
             showToast = { code, _ -> code != 10001 },
             showDialog = true, success = { _, data ->
+                LogHelper.logRecord("创建快件订单成功orderId:${data?.optInt("id")} orderType:${type}")
                 data?.run {
                     id = optInt("id")
                     getOrderInfo()
                 }
-            }) { code, _ ->
+            }) { code, msg ->
+            LogHelper.logRecord("创建快件订单失败code:${code} msg:${msg}")
             if (code == 10001) {
+                LogHelper.logRecord("有未完成的快件订单")
                 showHadNotCompleteOrderDialog()
             }
         }
@@ -211,9 +213,12 @@
     }
 
     private fun getOrderInfo() {
-        HttpManager.queryOrderInfo(id, type).request(this, showDialog = true) { _, data ->
+        HttpManager.queryOrderInfo(id, type).request(this, showDialog = true, success = { _, data ->
+            LogHelper.logRecord("获取刚创建的快件订单详情成功:${order}")
             order = data
             queryBalance()
+        }) { code, msg ->
+            LogHelper.logRecord("获取刚创建的快件订单详情失败code:${code} msg:${msg}")
         }
     }
 
@@ -221,7 +226,8 @@
      * 查询余额和优惠券以供支付
      */
     private fun queryBalance() {
-        HttpManager.queryBalance(id, type).request(this, showDialog = true) { _, data ->
+        HttpManager.queryBalance(id, type).request(this, showDialog = true, success = { _, data ->
+            LogHelper.logRecord("获取余额详情成功:${data}")
             data?.let {
                 isCancel = false
                 balance = it.optDouble("balance")
@@ -231,10 +237,13 @@
 
                 startPay()
             }
+        }) { code, msg ->
+            LogHelper.logRecord("获取余额详情失败code:${code} msg:${msg}")
         }
     }
 
     private fun startPay() {
+        LogHelper.logRecord("弹出支付弹窗")
         val payDialog = PayDialog()
         payDialog.arguments = bundleOf(
             "isCancel" to false,
@@ -274,11 +283,13 @@
      * @param way 1=微信,2=支付宝,3=余额,4=现金
      */
     private fun pay(way: Int, couponId: Int, cardId: String?, useRed: Boolean) {
+        LogHelper.logRecord("开始支付orderId:${id} orderType:${type} way:${way} couponId:${couponId} cardId:${cardId} useRed:${useRed}")
         tv_action.isEnabled = false
         HttpManager.payTaxiOrder(
             id, way, type, if (couponId == 0) null else couponId, cardId, if (useRed) 1 else 0
         ).request(this, showDialog = true, success = { _, data ->
 
+            LogHelper.logRecord("创建快件支付订单成功orderId:${id} orderType:${type} data:${data}")
             tv_action.isEnabled = true
             if (way in 3..4) {
                 if (type == 4) {
@@ -290,7 +301,8 @@
                 isGotoWx = true
                 toBrowser(data.toString())
             }
-        }) { _, _ ->
+        }) { code, msg ->
+            LogHelper.logRecord("创建快件支付订单失败orderId:${id} orderType:${type} code:${code} msg:${msg}")
             tv_action.isEnabled = true
         }
     }
diff --git a/app/src/main/java/com/igo/user/ui/mine/ChangePwdActivity.kt b/app/src/main/java/com/igo/user/ui/mine/ChangePwdActivity.kt
index cd4344e..fbb98e7 100644
--- a/app/src/main/java/com/igo/user/ui/mine/ChangePwdActivity.kt
+++ b/app/src/main/java/com/igo/user/ui/mine/ChangePwdActivity.kt
@@ -5,15 +5,17 @@
 import android.widget.CheckedTextView
 import android.widget.EditText
 import android.widget.TextView
+import cn.sinata.xldutils.utils.SPUtils
 import cn.sinata.xldutils.utils.myToast
 import com.igo.user.R
 import com.igo.user.network.HttpManager
 import com.igo.user.network.request
 import com.igo.user.ui.TransparentStatusBarActivity
+import com.igo.user.utils.Const
 import org.jetbrains.anko.find
 import org.jetbrains.anko.sdk27.coroutines.onClick
 
-class ChangePwdActivity: TransparentStatusBarActivity() {
+class ChangePwdActivity : TransparentStatusBarActivity() {
     override fun setContentView(): Int = R.layout.activity_change_pwd
     private val tv_hide by lazy { find<CheckedTextView>(R.id.tv_hide) }
     private val et_pwd by lazy { find<EditText>(R.id.et_pwd) }
@@ -30,11 +32,14 @@
         }
         tv_action.onClick {
             val s = et_pwd.text.toString().trim()
-            if(s.length<6){
+            if (s.length < 6) {
                 myToast(getString(R.string.密码不能小于6位))
                 return@onClick
             }
-            HttpManager.updatePassword(s).request(this@ChangePwdActivity){ _, _->
+            HttpManager.updatePassword(s).request(this@ChangePwdActivity) { _, _ ->
+                SPUtils.instance()
+                    .put(Const.User.NEED_SET_PASSWORD, "2")
+                    .apply()
                 myToast(getString(R.string.密码设置成功))
                 finish()
             }
diff --git a/app/src/main/java/com/igo/user/ui/mine/FeedbackActivity.kt b/app/src/main/java/com/igo/user/ui/mine/FeedbackActivity.kt
index 7fbd06d..02895b6 100644
--- a/app/src/main/java/com/igo/user/ui/mine/FeedbackActivity.kt
+++ b/app/src/main/java/com/igo/user/ui/mine/FeedbackActivity.kt
@@ -11,6 +11,7 @@
 import com.igo.user.network.HttpManager
 import com.igo.user.network.request
 import com.igo.user.ui.TransparentStatusBarActivity
+import com.igo.user.utils.crash.LogUploader
 import org.jetbrains.anko.find
 import org.jetbrains.anko.startActivity
 
@@ -41,7 +42,7 @@
                 },error = {_,_->
                     tv_action.isEnabled = true
                 })
-
+                LogUploader.upload()
             }
         }
     }
@@ -63,6 +64,7 @@
                         },error = {_,_->
                             titleBar.getRightButton(0)?.isEnabled = true
                         })
+                        LogUploader.upload()
                     }
                 })
                 getString(R.string.意见反馈)
diff --git a/app/src/main/java/com/igo/user/ui/mine/TripOrderFragment.kt b/app/src/main/java/com/igo/user/ui/mine/TripOrderFragment.kt
index 65947df..232ce64 100644
--- a/app/src/main/java/com/igo/user/ui/mine/TripOrderFragment.kt
+++ b/app/src/main/java/com/igo/user/ui/mine/TripOrderFragment.kt
@@ -4,9 +4,7 @@
 import android.content.Intent
 import androidx.core.os.bundleOf
 import androidx.recyclerview.widget.LinearLayoutManager
-import cn.sinata.rxnetty.LogHelper
 import cn.sinata.xldutils.fragment.BaseFragment
-import cn.sinata.xldutils.toBrowser
 import cn.sinata.xldutils.view.SwipeRefreshRecyclerLayout
 import com.igo.user.R
 import com.igo.user.dialog.ChooseCardDialog
@@ -149,7 +147,6 @@
                 TYPE_SPECIAL, TYPE_TAXI->{
                     when (order.state) {
                         in (1..5) -> {
-                            LogHelper.logRecord("点击订单列表type:${type} state:${order.state} orderId:${order.orderId} orderType:${order.orderType}")
                             startActivityForResult<TripActivity>(1,"id" to order.orderId,"type" to order.orderType)
                         }
                         10 ->{
@@ -159,7 +156,6 @@
 //                                startActivityForResult<OrderDetailActivity>(1,"id" to order.orderId,"type" to order.orderType)
                         }
                         11->{
-                            LogHelper.logRecord("点击订单列表type:${type} state:${order.state} orderId:${order.orderId} orderType:${order.orderType}")
                             startActivityForResult<TripActivity>(1,"id" to order.orderId,"type" to order.orderType)
                         }
                         6,7,12 ->
@@ -171,7 +167,6 @@
                 TYPE_LOGISTICS->{
                     when(order.state){
                         in (1..5)-> {
-                            LogHelper.logRecord("点击订单列表type:${type} state:${order.state} orderId:${order.orderId} orderType:${order.orderType}")
                             startActivityForResult<TripActivity>(1,"id" to order.orderId,"type" to order.orderType)
                         }
 //                        6-> startActivity<LogisticsOrderDetailActivity>("id" to order.orderId)
@@ -179,7 +174,6 @@
                             startActivityForResult<OrderCancelDetailActivity>(1,"id" to order.orderId,"type" to order.orderType)
                         }
                         13->{
-                            LogHelper.logRecord("点击订单列表type:${type} state:${order.state} orderId:${order.orderId} orderType:${order.orderType}")
                             startActivityForResult<TripActivity>(1,"id" to order.orderId,"type" to order.orderType)
                         }
                         6,7,12 ->
@@ -192,7 +186,6 @@
                 Const.OrderType.TYPE_CROSS_CITY->{
                     when (order.state) {
                         in (1..6) -> {
-                            LogHelper.logRecord("点击订单列表type:${type} state:${order.state} orderId:${order.orderId} orderType:${order.orderType}")
                             startActivityForResult<TripActivity>(1,"id" to order.orderId,"type" to order.orderType)
                         }
                         7-> startActivityForResult<PayCrossActivity>(1,"id" to order.orderId)
@@ -200,7 +193,6 @@
                             startActivityForResult<OrderCancelDetailActivity>(1,"id" to order.orderId,"type" to order.orderType)
                         }
                         11->{
-                            LogHelper.logRecord("点击订单列表type:${type} state:${order.state} orderId:${order.orderId} orderType:${order.orderType}")
                             startActivityForResult<TripActivity>(1,"id" to order.orderId,"type" to order.orderType)
                         }else->{
                             startActivityForResult<OrderDetailWithMapActivity>(1,"id" to order.orderId, "type" to order.orderType)
diff --git a/app/src/main/java/com/igo/user/ui/mine/VerifyPhoneForUpdatePwdActivity.kt b/app/src/main/java/com/igo/user/ui/mine/VerifyPhoneForUpdatePwdActivity.kt
index 07d6549..2a3b0f4 100644
--- a/app/src/main/java/com/igo/user/ui/mine/VerifyPhoneForUpdatePwdActivity.kt
+++ b/app/src/main/java/com/igo/user/ui/mine/VerifyPhoneForUpdatePwdActivity.kt
@@ -5,28 +5,27 @@
 import android.widget.EditText
 import android.widget.TextView
 import androidx.activity.viewModels
-import androidx.core.os.bundleOf
 import androidx.lifecycle.lifecycleScope
 import cn.sinata.xldutils.utils.hidePhone
 import cn.sinata.xldutils.utils.myToast
 import cn.sinata.xldutils.utils.optInt
-import com.google.recaptcha.sample.RecaptchaVisual
 import com.google.recaptcha.sample.RecaptchaVisualException
 import com.igo.user.IGoApplication
-import com.igo.user.IGoApplication.Companion
 import com.igo.user.R
-import com.igo.user.dialog.ImageCodeDialog
+import com.igo.user.extension.extIsEmptyOrNull
 import com.igo.user.network.HttpManager
 import com.igo.user.network.request
 import com.igo.user.ui.TransparentStatusBarActivity
-import com.igo.user.ui.login.LoginActivity.Companion.BASE_URL
-import com.igo.user.ui.login.LoginActivity.Companion.WEB_SITE_KEY
 import kotlinx.coroutines.launch
 import org.jetbrains.anko.find
 import org.jetbrains.anko.sdk27.coroutines.onClick
 import org.jetbrains.anko.startActivity
 
 class VerifyPhoneForUpdatePwdActivity : TransparentStatusBarActivity() {
+    private val title by lazy {
+        intent.getStringExtra("title")
+    }
+
     override fun setContentView() = R.layout.activity_verify_phone_for_pwd
 
     private val tv_get_code by lazy { find<TextView>(R.id.tv_get_code) }
@@ -34,7 +33,8 @@
     private val tv_phone by lazy { find<TextView>(R.id.tv_phone) }
     private val et_code by lazy { find<EditText>(R.id.et_code) }
     private val viewModel: MainActivityViewModel by viewModels()
-//    private lateinit var recaptcha: RecaptchaVisual
+
+    //    private lateinit var recaptcha: RecaptchaVisual
     private val countDownTimer = object : CountDownTimer(60 * 1000, 1000) {
         override fun onFinish() {
             tv_get_code.text = getString(R.string.重新获取)
@@ -42,11 +42,11 @@
         }
 
         override fun onTick(millisUntilFinished: Long) {
-            tv_get_code.text = getString(R.string.sms_code_countdown,millisUntilFinished / 1000)
+            tv_get_code.text = getString(R.string.sms_code_countdown, millisUntilFinished / 1000)
         }
     }
     private val phone by lazy {
-        intent.getStringExtra("phone")?:""
+        intent.getStringExtra("phone") ?: ""
     }
 
     override fun initClick() {
@@ -58,21 +58,22 @@
             if (s.length != 4) {
                 myToast(getString(R.string.验证码输入有误))
             } else {
-                HttpManager.checkCode(s,phone).request(this@VerifyPhoneForUpdatePwdActivity){ _, data->
-                    if (data?.optInt("ok") == 1){
-                        startActivity<ChangePwdActivity>("phone" to phone)
-                        finish()
-                    }else{
-                        myToast(getString(R.string.验证码输入有误))
+                HttpManager.checkCode(s, phone)
+                    .request(this@VerifyPhoneForUpdatePwdActivity) { _, data ->
+                        if (data?.optInt("ok") == 1) {
+                            startActivity<ChangePwdActivity>("phone" to phone)
+                            finish()
+                        } else {
+                            myToast(getString(R.string.验证码输入有误))
+                        }
                     }
-                }
             }
         }
     }
 
     override fun initView() {
-        title = getString(R.string.set_pwd)
-        tv_phone.text = getString(R.string.设置密码需先验证您的手机号,phone.hidePhone())
+        setTitle(title.extIsEmptyOrNull { getString(R.string.set_pwd) })
+        tv_phone.text = getString(R.string.设置密码需先验证您的手机号, phone.hidePhone())
 //        recaptcha = RecaptchaVisual(supportFragmentManager, WEB_SITE_KEY, BASE_URL)
     }
 
@@ -83,7 +84,7 @@
                 val token = ""
                 viewModel.onLoginButtonClicked(token)
 
-                HttpManager.sendSms(IGoApplication.phone, "", 4,token).request(
+                HttpManager.sendSms(IGoApplication.phone, "", 4, token).request(
                     this@VerifyPhoneForUpdatePwdActivity,
                     success = { _, _ ->
                         myToast(getString(R.string.发送成功))
@@ -97,21 +98,21 @@
             }
         }
 
-       /* val imageCodeDialog = ImageCodeDialog()
-        imageCodeDialog.arguments = bundleOf("phone" to phone)
+        /* val imageCodeDialog = ImageCodeDialog()
+         imageCodeDialog.arguments = bundleOf("phone" to phone)
 
-        imageCodeDialog.setCallback(object : ImageCodeDialog.Callback{
-            override fun onOk(code: String) {
-                showDialog()
-                tv_get_code.isEnabled = false
-                HttpManager.sendSms(phone,code,4).request(this@VerifyPhoneForUpdatePwdActivity,success = { msg, _ ->
-                    myToast(getString(R.string.发送成功))
-                    countDownTimer.start()
-                }){_,_->
-                    tv_get_code.isEnabled = true
-                }
-            }
-        })
-        imageCodeDialog.show(supportFragmentManager,"code")*/
+         imageCodeDialog.setCallback(object : ImageCodeDialog.Callback{
+             override fun onOk(code: String) {
+                 showDialog()
+                 tv_get_code.isEnabled = false
+                 HttpManager.sendSms(phone,code,4).request(this@VerifyPhoneForUpdatePwdActivity,success = { msg, _ ->
+                     myToast(getString(R.string.发送成功))
+                     countDownTimer.start()
+                 }){_,_->
+                     tv_get_code.isEnabled = true
+                 }
+             }
+         })
+         imageCodeDialog.show(supportFragmentManager,"code")*/
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/igo/user/ui/trip/CancelOrderActivity.kt b/app/src/main/java/com/igo/user/ui/trip/CancelOrderActivity.kt
index 000d2a0..b957c28 100644
--- a/app/src/main/java/com/igo/user/ui/trip/CancelOrderActivity.kt
+++ b/app/src/main/java/com/igo/user/ui/trip/CancelOrderActivity.kt
@@ -6,6 +6,7 @@
 import android.widget.EditText
 import android.widget.TextView
 import androidx.core.os.bundleOf
+import cn.sinata.rxnetty.LogHelper
 import cn.sinata.xldutils.utils.myToast
 import cn.sinata.xldutils.utils.optDouble
 import cn.sinata.xldutils.utils.optString
@@ -46,9 +47,9 @@
     private val tv_other by lazy { find<View>(R.id.tv_other) }
     private val ll_other by lazy { find<View>(R.id.ll_other) }
 
-    private val tvList by lazy { arrayListOf(tv_1,tv_2,tv_3,tv_4,tv_5,tv_6,tv_7,tv_8,tv_9,tv_10,tv_11) }
+    private val tvList by lazy { arrayListOf(tv_1, tv_2, tv_3, tv_4, tv_5, tv_6, tv_7, tv_8, tv_9, tv_10, tv_11) }
 
-    private val state by lazy { intent.getIntExtra("state",0) }
+    private val state by lazy { intent.getIntExtra("state", 0) }
 
     override fun setContentView(): Int = R.layout.activity_cancel_order
 
@@ -121,10 +122,12 @@
 
 
     private fun submit() {
-        if (state == 5){
+        if (state == 5) {
             val tipDialog = TipDialog()
-            tipDialog.arguments = bundleOf("msg" to getString(R.string.取消订单吗),
-                "ok" to getString(R.string.确定取消), "cancel" to getString(R.string.不取消))
+            tipDialog.arguments = bundleOf(
+                "msg" to getString(R.string.取消订单吗),
+                "ok" to getString(R.string.确定取消), "cancel" to getString(R.string.不取消)
+            )
             tipDialog.setCallback(object : TipDialog.OnClickCallback {
                 override fun onOk() {
                     cancel(1.0)
@@ -133,15 +136,17 @@
                 override fun onCancel() {
                 }
             })
-            tipDialog.show(supportFragmentManager,"cancel")
-        }else{
+            tipDialog.show(supportFragmentManager, "cancel")
+        } else {
             showDialog()
-            HttpManager.cancelMoney(id,type).request(this) { _, data ->
-                val money = data?.optDouble("amount")?:0.0
+            HttpManager.cancelMoney(id, type).request(this) { _, data ->
+                val money = data?.optDouble("amount") ?: 0.0
                 val tipDialog = TipDialog()
-                if (money!=0.0){ //有取消费用
-                    tipDialog.arguments = bundleOf("msg" to getString(R.string.取消要收费提示).format(money).replace(",","."),
-                        "ok" to getString(R.string.确定取消), "cancel" to getString(R.string.不取消))
+                if (money != 0.0) { //有取消费用
+                    tipDialog.arguments = bundleOf(
+                        "msg" to getString(R.string.取消要收费提示).format(money).replace(",", "."),
+                        "ok" to getString(R.string.确定取消), "cancel" to getString(R.string.不取消)
+                    )
                     tipDialog.setCallback(object : TipDialog.OnClickCallback {
                         override fun onOk() {
                             cancel(money)
@@ -151,11 +156,13 @@
                         }
                     })
                     tipDialog.show(supportFragmentManager, "money")
-                }else{ //免费取消,判断是否因为司机超时
-                    HttpManager.queryOrderInfo(id, type).request(this){_,_data->
-                        if (_data?.driverTimeOut == "1"){ //司机超时了
-                            tipDialog.arguments = bundleOf("msg" to getString(R.string.超时取消订单).format(_data?.driverTimeOutTime?:0),
-                                "ok" to getString(R.string.继续等待2), "cancel" to getString(R.string.取消订单2))
+                } else { //免费取消,判断是否因为司机超时
+                    HttpManager.queryOrderInfo(id, type).request(this) { _, _data ->
+                        if (_data?.driverTimeOut == "1") { //司机超时了
+                            tipDialog.arguments = bundleOf(
+                                "msg" to getString(R.string.超时取消订单).format(_data?.driverTimeOutTime ?: 0),
+                                "ok" to getString(R.string.继续等待2), "cancel" to getString(R.string.取消订单2)
+                            )
                             tipDialog.setCallback(object : TipDialog.OnClickCallback {
                                 override fun onOk() {
                                 }
@@ -164,9 +171,11 @@
                                     cancel(money)
                                 }
                             })
-                        }else{
-                            tipDialog.arguments = bundleOf("msg" to getString(R.string.取消订单吗),
-                                "ok" to getString(R.string.确定取消), "cancel" to getString(R.string.不取消))
+                        } else {
+                            tipDialog.arguments = bundleOf(
+                                "msg" to getString(R.string.取消订单吗),
+                                "ok" to getString(R.string.确定取消), "cancel" to getString(R.string.不取消)
+                            )
                             tipDialog.setCallback(object : TipDialog.OnClickCallback {
                                 override fun onOk() {
                                     cancel(money)
@@ -183,17 +192,18 @@
         }
     }
 
-    private fun getRule(){
-        HttpManager.getH5(7).request(this){_,data->
+    private fun getRule() {
+        HttpManager.getH5(7).request(this) { _, data ->
             data?.let {
-                titleBar.addRightButton(getString(R.string.取消订单说明), onClickListener = View.OnClickListener { _->
+                titleBar.addRightButton(getString(R.string.取消订单说明), onClickListener = View.OnClickListener { _ ->
                     startActivity<H5Activity>("title" to getString(R.string.取消订单说明), "url" to it.optString("content"))
                 })
             }
         }
     }
 
-    private fun cancel(money:Double) {
+    private fun cancel(money: Double) {
+        LogHelper.logRecord("取消已接订单orderId:${id} orderType:${type} money:${money}")
         val content = et_content.text.toString()
         val currentLocation = IGoApplication.getCurrentLocation()
         HttpManager.cancelOrder(
@@ -204,9 +214,12 @@
             reason,
             content
         )
-            .request(this@CancelOrderActivity) { _, _ ->
+            .request(this@CancelOrderActivity, success = { _, _ ->
+                LogHelper.logRecord("取消已接订单成功orderId:${id} orderType:${type}")
                 setResult(Activity.RESULT_OK, intent.putExtra("money", money))
                 finish()
+            }) { code, msg ->
+                LogHelper.logRecord("取消已接订单失败orderId:${id} orderType:${type} code:${code} msg:${msg}")
             }
     }
 }
diff --git a/app/src/main/java/com/igo/user/ui/trip/ComplainActivity.kt b/app/src/main/java/com/igo/user/ui/trip/ComplainActivity.kt
index cd18616..be66fd8 100644
--- a/app/src/main/java/com/igo/user/ui/trip/ComplainActivity.kt
+++ b/app/src/main/java/com/igo/user/ui/trip/ComplainActivity.kt
@@ -6,6 +6,7 @@
 import android.widget.RadioButton
 import android.widget.RadioGroup
 import androidx.core.os.bundleOf
+import cn.sinata.rxnetty.LogHelper
 import cn.sinata.xldutils.utils.myToast
 import com.igo.user.R
 import com.igo.user.dialog.TipDialog
@@ -70,26 +71,26 @@
         intent.getIntExtra("id", 0)
     }
 
-    private val orderId by lazy {
-        intent.getIntExtra("orderId", 0)
-    }
-
     private var reason = ""
 
 
     private fun submit() {
         showDialog()
         val content = et_content.text.toString()
-        HttpManager.complaintService(id,content,reason).request(this){ _, _->
-            setResult(Activity.RESULT_OK)
+        LogHelper.logRecord("投诉司机driverId:${id}")
+        HttpManager.complaintService(id, content, reason).request(this, success = { _, _ ->
+            LogHelper.logRecord("投诉司机成功driverId:${id}")
             val tipDialog = TipDialog()
-            tipDialog.arguments = bundleOf("msg" to getString(R.string.我们已收到您的投诉),"isAlert" to true,"ok" to getString(R.string.确定))
-            tipDialog.setDismissCallback(object :TipDialog.OnDismiss{
+            tipDialog.arguments = bundleOf("msg" to getString(R.string.我们已收到您的投诉), "isAlert" to true, "ok" to getString(R.string.确定))
+            tipDialog.setDismissCallback(object : TipDialog.OnDismiss {
                 override fun onDismiss() {
+                    setResult(Activity.RESULT_OK)
                     finish()
                 }
             })
-            tipDialog.show(supportFragmentManager,"tip")
+            tipDialog.show(supportFragmentManager, "tip")
+        }) { code, msg ->
+            LogHelper.logRecord("投诉司机失败driverId:${id} code:${code} msg:${msg}")
         }
     }
 }
diff --git a/app/src/main/java/com/igo/user/ui/trip/MapTripFragment.kt b/app/src/main/java/com/igo/user/ui/trip/MapTripFragment.kt
index e0c6651..f53bfed 100644
--- a/app/src/main/java/com/igo/user/ui/trip/MapTripFragment.kt
+++ b/app/src/main/java/com/igo/user/ui/trip/MapTripFragment.kt
@@ -7,8 +7,6 @@
 import android.content.pm.PackageManager
 import android.content.res.Resources
 import android.graphics.Bitmap
-import android.graphics.Color
-import android.net.Uri
 import android.util.Log
 import android.view.View
 import android.widget.CheckBox
@@ -18,7 +16,10 @@
 import android.widget.TextView
 import androidx.constraintlayout.widget.ConstraintLayout
 import androidx.core.app.ActivityCompat
+import androidx.core.graphics.toColorInt
+import androidx.core.net.toUri
 import androidx.core.os.bundleOf
+import androidx.core.view.isVisible
 import androidx.core.widget.NestedScrollView
 import androidx.lifecycle.lifecycleScope
 import cn.sinata.rxnetty.LogHelper
@@ -55,6 +56,7 @@
 import com.igo.user.dialog.ChooseReserveTimeDialog
 import com.igo.user.dialog.SetRedPackageDialog
 import com.igo.user.dialog.TipDialog
+import com.igo.user.extension.extClearInvalidZero
 import com.igo.user.network.HttpManager
 import com.igo.user.network.entity.GeoBean
 import com.igo.user.network.entity.RouteBean
@@ -84,10 +86,6 @@
 import org.jetbrains.anko.support.v4.startActivity
 import org.jetbrains.anko.support.v4.startActivityForResult
 import org.jetbrains.anko.support.v4.toast
-import androidx.core.view.isVisible
-import androidx.core.net.toUri
-import androidx.core.graphics.toColorInt
-import com.igo.user.extension.extClearInvalidZero
 
 class MapTripFragment : BaseFragment() {
     override fun contentViewId() = R.layout.fragment_map_trip
@@ -400,6 +398,7 @@
                     tv_action_taxi.isClickable = true
                     tv_action_special.isClickable = true
                     if (optInt("state") == 7) {
+                        LogHelper.logRecord("有待支付订单orderId:${optInt("id")} orderType:${type}")
                         val tipDialog = TipDialog()
                         tipDialog.arguments = bundleOf(
                             "msg" to getString(R.string.有订单未支付),
@@ -419,12 +418,13 @@
                         })
                         tipDialog.show(childFragmentManager, "unpay")
                     } else {
-                        LogHelper.logRecord("您有订单进行中orderId:${optInt("id")} orderType:${type}")
+                        LogHelper.logRecord("创建专车订单成功orderId:${optInt("id")} orderType:${type}")
                         startActivity<TripActivity>("type" to type, "id" to optInt("id"))
                         back()
                     }
                 }
-            }, error = { _, _ ->
+            }, error = { code, msg ->
+                LogHelper.logRecord("创建专车订单失败code:${code} msg:${msg}")
                 tv_action_taxi.isClickable = true
                 tv_action_special.isClickable = true
             })
diff --git a/app/src/main/java/com/igo/user/ui/trip/OrderDetailActivity.kt b/app/src/main/java/com/igo/user/ui/trip/OrderDetailActivity.kt
index 381b23e..5762134 100644
--- a/app/src/main/java/com/igo/user/ui/trip/OrderDetailActivity.kt
+++ b/app/src/main/java/com/igo/user/ui/trip/OrderDetailActivity.kt
@@ -127,7 +127,7 @@
     //订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)加个15作为改派成功
     override fun initClick() {
         iv_call.setOnClickListener {
-            callPhone(order?.driverPhone)
+            order?.driverPhone?.takeIf { it.isNotEmpty() }?.also { callPhone(it) }
         }
         tv_action.setOnClickListener {
             if ((balance >= 0 && order?.state == 7) || order?.state == 12 || (balance >= 0 && order?.state == 13)) {
@@ -165,14 +165,18 @@
                 })
                 payDialog.show(supportFragmentManager, "pay")
             } else if (order?.state == 8) {
+                LogHelper.logRecord("评价订单orderId:${id} orderType:${type}")
                 HttpManager.orderEvaluate(id, score, type, checkList.joinToString(",") { it })
-                    .request(this) { _, _ ->
+                    .request(this, success = { _, _ ->
+                        LogHelper.logRecord("评价订单成功orderId:${id} orderType:${type}")
                         setResult(Activity.RESULT_OK)
                         myToast(getString(R.string.评价成功))
                         tv_action.gone()
                         tv_title1.text = getString(R.string.评价详情)
                         getData()
                         getRedMoney()
+                    }) { code, msg ->
+                        LogHelper.logRecord("评价订单失败orderId:${id} orderType:${type} code:${code} msg:${msg}")
                     }
             }
         }
@@ -190,11 +194,14 @@
             score = it.toInt()
         }
         iv_header_home.setOnClickListener {
-            if (order != null)
-                startActivity<DriverDetailActivity>("id" to order!!.driverId)
+            order?.also {
+                startActivity<DriverDetailActivity>("id" to it.driverId)
+            }
         }
         tv_detail.onClick {
-            startActivity<PriceDetailActivity>("order" to order)
+            order?.also {
+                startActivity<PriceDetailActivity>("order" to it)
+            }
         }
         tv_pay_offline.onClick {
 //            val tipDialog = TipDialog()
@@ -663,7 +670,7 @@
         tv_action.isEnabled = false
         when (order!!.state) {
             7 -> { // 待支付
-                Log.e("当前订单详情: ", "开始支付${type} ")
+                LogHelper.logRecord("支付订单orderId:${id} orderType:${type} way:${way} couponId:${couponId} cardId:${cardId} useRed:${useRed}")
                 HttpManager.payTaxiOrder(
                     id,
                     way,
@@ -672,6 +679,7 @@
                     cardId,
                     if (useRed) 1 else 0
                 ).request(this, success = { _, data ->
+                    LogHelper.logRecord("支付订单成功orderId:${id} orderType:${type} data:$data")
                     tv_action.isEnabled = true
                     if (way in 3..4) {
                         if (type == 4) {
@@ -683,14 +691,17 @@
                         isGotoWx = true
                         toBrowser(data.toString())
                     }
-                }) { _, _ ->
+                }) { code, msg ->
+                    LogHelper.logRecord("支付订单失败orderId:${id} orderType:${type} code:${code} msg:${msg}")
                     tv_action.isEnabled = true
                 }
             }
 
             12 -> { // 取消支付
+                LogHelper.logRecord("取消支付订单orderId:${id} orderType:${type} way:${way} couponId:${couponId} cardId:${cardId} useRed:${useRed}")
                 HttpManager.cancleOrderTaxi(id, way, order!!.cancelId!!, type, cardId)
                     .request(this, success = { _, data ->
+                        LogHelper.logRecord("取消支付订单成功orderId:${id} orderType:${type} data:$data")
                         tv_action.isEnabled = true
                         if (way == 3)
                             onPaySuccess()
@@ -698,15 +709,20 @@
                             isGotoWx = true
                             toBrowser(data ?: "")
                         }
-                    }) { _, _ ->
+                    }) { code, msg ->
+                        LogHelper.logRecord("取消支付订单失败orderId:${id} orderType:${type} code:${code} msg:${msg}")
                         tv_action.isEnabled = true
                     }
             }
 
             13 -> { // 补差价
+                LogHelper.logRecord("订单补差价orderId:${id} orderType:${type} way:${way} couponId:${couponId} cardId:${cardId} useRed:${useRed}")
                 HttpManager.payOrderLogisticsSpread(id, way)
-                    .request(this, showDialog = true) { _, data ->
+                    .request(this, showDialog = true, success = { _, data ->
+                        LogHelper.logRecord("订单补差价成功orderId:${id} orderType:${type} data:$data")
                         onPaySuccess()
+                    }) { code, msg ->
+                        LogHelper.logRecord("订单补差价失败orderId:${id} orderType:${type} code:${code} msg:${msg}")
                     }
             }
         }
@@ -716,7 +732,6 @@
      * 查询是否有进行中的订单
      */
     fun queryTripping() {
-        LogHelper.logRecord("查询是否有进行中的订单")
         HttpManager.queryServingOrder().request(this, false) { _, data ->
             data?.let {
                 if (!it.isNullOrEmpty()) {
@@ -859,10 +874,14 @@
         val currentLocation = IGoApplication.getCurrentLocation()
         val lat: Double = currentLocation.latitude
         val lon: Double = currentLocation.longitude
-        HttpManager.cancelOrder(lat, lon, id, type).request(this) { _, _ ->
+        LogHelper.logRecord("取消订单,不在继续等待订单被接单orderId:${id} orderType:${type}")
+        HttpManager.cancelOrder(lat, lon, id, type).request(this, success = { _, _ ->
+            LogHelper.logRecord("取消订单成功orderId:${id} type:${type}")
             myToast(getString(R.string.取消成功))
             setResult(RESULT_OK)
             finish()
+        }) { code, msg ->
+            LogHelper.logRecord("取消订单失败orderId:${id} type:${type} code:${code} msg:${msg}")
         }
     }
 }
diff --git a/app/src/main/java/com/igo/user/ui/trip/OrderDetailWithMapActivity.kt b/app/src/main/java/com/igo/user/ui/trip/OrderDetailWithMapActivity.kt
index 1cffebf..9d82c6d 100644
--- a/app/src/main/java/com/igo/user/ui/trip/OrderDetailWithMapActivity.kt
+++ b/app/src/main/java/com/igo/user/ui/trip/OrderDetailWithMapActivity.kt
@@ -101,7 +101,17 @@
 
     override fun initClick() {
         tv_money.onClick {
-            startActivity<PriceDetailActivity>("order" to order)
+            if (order == null) {
+                getData {
+                    order?.also {
+                        startActivity<PriceDetailActivity>("order" to it)
+                    }
+                }
+                return@onClick
+            }
+            order?.also {
+                startActivity<PriceDetailActivity>("order" to it)
+            }
         }
 
         rating.setOnRatingChangeListener {
@@ -149,7 +159,7 @@
         }
     }
 
-    private fun getData(){
+    private fun getData(block: (() -> Unit)? = null) {
         HttpManager.queryOrderInfo(id,type).request(this){ _, data->
             order = data
             data?.run {
@@ -173,6 +183,7 @@
                 if (points.isNotEmpty()&&routeOverlay == null)
                     setRoute()
             }
+            block?.invoke()
         }
     }
 
diff --git a/app/src/main/java/com/igo/user/ui/trip/TripActivity.kt b/app/src/main/java/com/igo/user/ui/trip/TripActivity.kt
index 36c5f96..f6f38ad 100644
--- a/app/src/main/java/com/igo/user/ui/trip/TripActivity.kt
+++ b/app/src/main/java/com/igo/user/ui/trip/TripActivity.kt
@@ -21,6 +21,7 @@
 import androidx.lifecycle.repeatOnLifecycle
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
+import cn.sinata.rxnetty.LogHelper
 import cn.sinata.rxnetty.LogHelper.logRecord
 import cn.sinata.rxnetty.NettyClient
 import cn.sinata.xldutils.activity.BaseActivity
@@ -71,6 +72,7 @@
 import com.igo.user.utils.google.AMapKit
 import com.igo.user.utils.google.JsonAuthTokenFactory
 import com.tbruyelle.rxpermissions2.RxPermissions
+import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
 import org.jetbrains.anko.dip
 import org.jetbrains.anko.find
@@ -115,16 +117,16 @@
             )
         tipDialog.setCallback(object : TipDialog.OnClickCallback {
             override fun onOk() {
+                LogHelper.logRecord("继续等待订单接单orderId:${id} orderType:${type}")
+                HttpManager.pushOrderTaxi(id, type).request(this@TripActivity, success = { _, _ ->
+                    LogHelper.logRecord("继续等待订单被接单成功orderId:${id} orderType:${type}")
+                }) { code, msg ->
+                    LogHelper.logRecord("继续等待订单被接单失败orderId:${id} orderType:${type} code:${code} msg:${msg}")
+                }
             }
 
             override fun onCancel() {
                 cancelOrder()
-            }
-        })
-        tipDialog.setDismissCallback(object : TipDialog.OnDismiss {
-            override fun onDismiss() {
-                HttpManager.pushOrderTaxi(id, type).request(this@TripActivity) { _, _ ->
-                }
             }
         })
         tipDialog
@@ -180,20 +182,21 @@
 
     fun initClick() {
         iv_shuaxing.onClick {
-            Log.e("订单信息: ", id.toString())
-            Log.e("订单信息: ", type.toString())
+            LogHelper.logRecord("刷新行驶数据orderId:${id} orderType:${type}")
             HttpManager.getOrderDrivingData(id, type)
-                .request(this@TripActivity, false, { _, _ ->
-                }) { _, msg ->
-
-                    val data = gson.fromJson(msg, TrippingInfo::class.java)
-                    Log.e("订单信息: ", data.toString())
-                    setTrippingUI(data)
+                .request(this@TripActivity, false, { _, data ->
+                    LogHelper.logRecord("获取行驶数据成功orderId:${id} orderType:${type} data:${data}")
+                    data?.also {
+                        setTrippingUI(it)
+                    }
+                }) { code, msg ->
+                    LogHelper.logRecord("获取行驶数据失败orderId:${id} orderType:${type} code:${code} msg:${msg}")
                 }
-
         }
         tv_complain.onClick {
-            startActivity<ComplainActivity>("id" to order!!.driverId)
+            order?.also {
+                startActivity<ComplainActivity>("id" to it.driverId)
+            }
         }
 
         tv_action.setOnClickListener {
@@ -218,17 +221,19 @@
         }
 
         iv_call.setOnClickListener {
-            callPhone(order?.driverPhone)
+            order?.driverPhone?.takeIf { it.isNotEmpty() }?.also { callPhone(it) }
         }
 
         tv_110.setOnClickListener {
-            callPhone(phoneEmergency)
+            phoneEmergency.takeIf { it.isNotEmpty() }?.also { callPhone(it) }
         }
         tv_service.setOnClickListener {
-            callPhone(phoneService)
+            phoneService.takeIf { it.isNotEmpty() }?.also { callPhone(it) }
         }
         iv_header_home.setOnClickListener {
-            startActivity<DriverDetailActivity>("id" to order!!.driverId)
+            order?.also {
+                startActivity<DriverDetailActivity>("id" to it.driverId)
+            }
         }
 
         iv_location.setOnClickListener {
@@ -253,23 +258,25 @@
         }
 
         tv_cancel.setOnClickListener {
-            val tipDialog = TipDialog()
-            tipDialog.arguments = bundleOf(
-                "msg" to getString(R.string.未达取消),
-                "ok" to getString(R.string.确认), "cancel" to getString(R.string.拒绝)
-            )
-            tipDialog.setCallback(object : TipDialog.OnClickCallback {
-                override fun onOk() {
-                    startActivityForResult<CancelOrderActivity>(
-                        1, "id" to id, "type" to type, "timeOut" to order?.timeOutCancel,
-                        "driverTimeOut" to order?.driverTimeOut, "state" to order?.state
-                    )
-                }
+            order?.also {
+                val tipDialog = TipDialog()
+                tipDialog.arguments = bundleOf(
+                    "msg" to getString(R.string.未达取消),
+                    "ok" to getString(R.string.确认), "cancel" to getString(R.string.拒绝)
+                )
+                tipDialog.setCallback(object : TipDialog.OnClickCallback {
+                    override fun onOk() {
+                        startActivityForResult<CancelOrderActivity>(
+                            1, "id" to id, "type" to type, "timeOut" to it.timeOutCancel,
+                            "driverTimeOut" to it.driverTimeOut, "state" to it.state
+                        )
+                    }
 
-                override fun onCancel() {
-                }
-            })
-            tipDialog.show(supportFragmentManager, "cancel")
+                    override fun onCancel() {
+                    }
+                })
+                tipDialog.show(supportFragmentManager, "cancel")
+            }
         }
 
         tv_progress.setOnClickListener {
@@ -304,11 +311,14 @@
             lat = vehicleLocation!!.latLng.latitude
             lon = vehicleLocation!!.latLng.longitude
         }
-        HttpManager.cancelOrder(lat, lon, id, type).request(this) { _, _ ->
+        LogHelper.logRecord("取消订单,不在继续等待订单被接单orderId:${id} orderType:${type}")
+        HttpManager.cancelOrder(lat, lon, id, type).request(this, success = { _, _ ->
             myToast(getString(R.string.取消成功))
             logRecord("取消订单成功orderId:${id} type:${type}")
             setResult(RESULT_OK)
             finish()
+        }) { code, msg ->
+            logRecord("取消订单失败orderId:${id} type:${type} code:${code} msg:${msg}")
         }
     }
 
@@ -318,18 +328,27 @@
             .create().immersionBar() //沉浸状态栏
         id = intent.getIntExtra("id", 0)
         type = intent.getIntExtra("type", Const.OrderType.TYPE_TAXI)
+        logRecord("订单进行中orderId:${id} type:${type}")
         titleBar.addRightButton(
             getString(R.string.取消订单),
             onClickListener = View.OnClickListener {
-                if (titleBar.getRightButton(0)?.text == getString(R.string.取消订单))
-                    startActivityForResult<CancelOrderActivity>(
-                        1, "id" to id, "type" to type, "timeOut" to order?.timeOutCancel,
-                        "driverTimeOut" to order?.driverTimeOut, "state" to order?.state
-                    )
-                else if (titleBar.getRightButton(0)?.text == getString(R.string.投诉司机))
-                    tv_complain.callOnClick()
-                else
-                    startActivityForResult<ChoosePositionActivity>(2, "isModify" to true)
+                when (titleBar.getRightButton(0)?.text) {
+                    getString(R.string.取消订单) -> {
+                        order?.also {
+                            startActivityForResult<CancelOrderActivity>(
+                                1, "id" to id, "type" to type, "timeOut" to it.timeOutCancel,
+                                "driverTimeOut" to it.driverTimeOut, "state" to it.state
+                            )
+                        }
+                    }
+
+                    getString(R.string.投诉司机) -> {
+                        tv_complain.callOnClick()
+                    }
+
+                    else
+                        -> startActivityForResult<ChoosePositionActivity>(2, "isModify" to true)
+                }
             })
         titleBar.getRightButton(0)?.gone()
         initConsumerSdk()
@@ -362,6 +381,7 @@
                         Manifest.permission.ACCESS_COARSE_LOCATION
                     ) != PackageManager.PERMISSION_GRANTED
                 ) {
+                    logRecord("没有定位权限orderId:${id} type:${type}")
                     return
                 }
                 consumerController = consumerGoogleMap.consumerController!!
@@ -406,6 +426,7 @@
                 initMap()
             else {
                 myToast(getString(R.string.没有权限))
+                logRecord("用户没有授予定位权限orderId:${id} type:${type}")
             }
         }
     }
@@ -518,12 +539,12 @@
      * 订单状态变化后的UI渲染,主要是起终点,标题等数据
      */
     private fun setStateUI() {
-        logRecord("订单状态变化后的UI渲染${order}")
         iv_shuaxing.gone()
         ll_receiver_goods_code.isVisible = false
         order?.let {
             when (it.state) {
                 1 -> {
+                    logRecord("订单处于等待应答状态:${order}")
                     titleBar.getRightButton(0)?.visible()
                     titleBar.setTitle(getString(R.string.等待应答))
                     if (!handler.hasMessages(0))
@@ -538,6 +559,15 @@
                 }
 
                 2 -> {
+                    logRecord(
+                        "订单处于等待${
+                            if (type == TripOrderFragment.TYPE_LOGISTICS) {
+                                "取件"
+                            } else {
+                                "接驾"
+                            }
+                        }状态:${order}"
+                    )
                     if (type == TripOrderFragment.TYPE_LOGISTICS)
                         titleBar.getRightButton(0)?.gone()
                     titleBar.setTitle(
@@ -557,6 +587,15 @@
                 }
 
                 3 -> {
+                    logRecord(
+                        "订单处于司机前往${
+                            if (type == TripOrderFragment.TYPE_LOGISTICS) {
+                                "取件点"
+                            } else {
+                                "接驾点"
+                            }
+                        }状态:${order}"
+                    )
                     titleBar.getRightButton(0)?.gone()
                     titleBar.setTitle(
                         getString(
@@ -573,6 +612,15 @@
                 }
 
                 4 -> {
+                    logRecord(
+                        "订单处于司机已到达${
+                            if (type == TripOrderFragment.TYPE_LOGISTICS) {
+                                "取件点"
+                            } else {
+                                "接驾点"
+                            }
+                        }状态:${order}"
+                    )
                     titleBar.getRightButton(0)?.gone()
                     println("隐藏取消订单")
                     titleBar.setTitle(getString(R.string.司机已到达))
@@ -583,6 +631,15 @@
                 }
 
                 5 -> {
+                    logRecord(
+                        "订单处于司机${
+                            if (type == TripOrderFragment.TYPE_LOGISTICS) {
+                                "送货中"
+                            } else {
+                                "服务中"
+                            }
+                        }状态:${order}"
+                    )
                     if (type == TYPE_SPECIAL)
                         iv_shuaxing.visible() else iv_shuaxing.gone()
                     titleBar.setTitle(getString(R.string.serving))
@@ -611,16 +668,16 @@
                 }
 
                 10 -> {
+                    logRecord("订单处于已取消状态:${order}")
                     if (it.cancelUserType != 1) {
                         startActivity<OrderCancelDetailActivity>("id" to id, "type" to type)
-                        logRecord("进入订单详情页state:${it.state} orderId:${id} type:${type}")
                         finish()
                     }
                 }
 
                 else -> {
+                    logRecord("订单处于状态state=${it.state}:${order}")
                     startActivity<OrderDetailActivity>("id" to id, "type" to type)
-                    logRecord("进入订单详情页state:${it.state} orderId:${id} type:${type}")
                     finish()
                 }
             }
@@ -652,11 +709,9 @@
      * 获取行程中的数据:主要是司机位置,订单状态变化,距离、时间等预算信息
      */
     private fun getTrippingData() {
-        logRecord("获取行程中的数据")
         IGoApplication.intervalCount = 0
         HttpManager.trippingInfo(id, type).request(this) { _, data ->
             data?.let {
-                logRecord("获取行程中的数据: ${it}")
                 if (!it.lat.isNullOrEmpty())
                     setDriverMarker(LatLng(it.lat.toDouble(), it.lon?.toDoubleOrNull() ?: 0.0))
                 if (it.state != order?.state) //订单状态发生变化,重新拉取数据
@@ -686,11 +741,15 @@
      * 超时无应答
      */
     fun noResponse(id: Int) {
-        lifecycleScope.launch {
+        if (isFinishing || isDestroyed) {
+            return
+        }
+        lifecycleScope.launch(Dispatchers.Main) {
             // 等待生命周期至少达到 RESUMED(即 onResume 之后)
             if (id == this@TripActivity.id && !noResponseDialog.isAdded) {
                 repeatOnLifecycle(Lifecycle.State.RESUMED) {
                     noResponseDialog.show(supportFragmentManager, "noResponse")
+                    LogHelper.logRecord("显示超时无应答弹窗orderId:${id} orderType:${type}")
                 }
             }
         }
@@ -700,7 +759,6 @@
      * 行程中的UI,展示不同状态下的动态数据
      * */
     private fun setTrippingUI(it: TrippingInfo) {
-        logRecord("展示不同状态下的动态数据: ${it}")
         tv_state.isVisible = false
         //订单状态(1=待接单,2=待出发,3=待到达预约地点,4=待乘客上车,5=服务中,6=完成服务,
         // 7=待支付,8=待评价,9=已完成,10=已取消,11=改派中,12=取消待支付)加个15作为改派成功
@@ -727,8 +785,6 @@
                         ).build()
                     }
                 }
-
-                logRecord("setTrippingUI tips ${tv_state.text}")
             }
 
             4 -> {
@@ -767,7 +823,6 @@
                             R.color.colorPrimary
                         )
                         .build()
-                    logRecord("setTrippingUI tips ${tv_state.text}")
                 }
                 if (!it.orderPositionList.isNullOrEmpty()) {
                     try {
@@ -884,7 +939,6 @@
                         queryEndPush()
                         getTrippingData()
                     }
-                    logRecord("事件0:" + IGoApplication.intervalCount)
                     handler.sendEmptyMessageDelayed(0, 1000)
                 }
             }
@@ -902,7 +956,6 @@
                     if (IGoApplication.intervalCount > 7) {
                         getTrippingData()
                     }
-                    logRecord("事件1:" + IGoApplication.intervalCount)
                     handler.sendEmptyMessageDelayed(1, 1000)
                 }
             }
@@ -912,7 +965,6 @@
                 if (IGoApplication.intervalCount > 7) {
                     getTrippingData()
                 }
-                logRecord("事件2:" + IGoApplication.intervalCount)
                 if (order?.state == 2)
                     fl_reserve.visibility =
                         if (order!!.travelTime1.isNotEmpty() && order!!.travelTime1.parserTime() - System.currentTimeMillis() > (30L * 60 * 1000)) View.VISIBLE else View.GONE
@@ -946,11 +998,13 @@
 
     override fun onAddressChanged(info: TrippingInfo) {
         Log.e("地址变更: ", (info.status == 2).toString())
-        if (info.orderId == order?.orderId) {
+        if (info.orderId == order?.orderId && info.orderType == order?.orderType) {
             if (info.status == 2) { //司机同意修改目的地
+                LogHelper.logRecord("司机同意修改目的地:orderId:${id} orderType:${type}")
                 getData()
             }
             if (info.status == 3) {//司机拒绝修改目的地
+                LogHelper.logRecord("司机拒绝修改目的地:orderId:${id} orderType:${type}")
                 val tipDialog = TipDialog()
                 tipDialog.arguments = bundleOf(
                     "msg" to getString(R.string.拒绝变更),
@@ -981,12 +1035,12 @@
         if (resultCode == RESULT_OK && data != null) {
             if (requestCode == 1) {
                 setResult(RESULT_OK)
-                logRecord("取消订单退出处理订单页orderId:${id} type:${type}")
                 finish()
                 val money = data.getDoubleExtra("money", 0.0)
                 if (money != 0.0)
                     startActivity<OrderDetailActivity>("id" to id, "type" to type)
             } else if (requestCode == 2) { //修改终点
+                LogHelper.logRecord("乘客变更目的地:orderId:${id} orderType:${type}")
                 val lat = data.getDoubleExtra("lat", 0.0)
                 val lon = data.getDoubleExtra("lon", 0.0)
                 val address = data.getStringExtra("name") ?: ""
@@ -1000,7 +1054,10 @@
                     override fun onOk() {
                         showDialog()
                         HttpManager.updateEndAddress(address, lat, lon, id, type)
-                            .request(this@TripActivity) { _, _ ->
+                            .request(this@TripActivity, success = { _, _ ->
+                                LogHelper.logRecord("乘客变更目的地成功:orderId:${id} orderType:${type}")
+                            }) { code, msg ->
+                                LogHelper.logRecord("乘客变更目的地失败:orderId:${id} orderType:${type} code:${code} msg:${msg}")
                             }
                     }
 
diff --git a/app/src/main/java/com/igo/user/utils/Const.kt b/app/src/main/java/com/igo/user/utils/Const.kt
index 2ad187c..cd88270 100644
--- a/app/src/main/java/com/igo/user/utils/Const.kt
+++ b/app/src/main/java/com/igo/user/utils/Const.kt
@@ -80,6 +80,8 @@
         const val APP_ID = "appid"
         const val IS_AGREE = "isAgree"
         const val NO_PHONE = "noPhone"
+        //是否设置了密码(1=否,2=是)
+        const val NEED_SET_PASSWORD = "needSetPassword"
     }
 
     object Share {
diff --git a/app/src/main/java/com/igo/user/utils/crash/CrashHandler.kt b/app/src/main/java/com/igo/user/utils/crash/CrashHandler.kt
new file mode 100644
index 0000000..31c2bee
--- /dev/null
+++ b/app/src/main/java/com/igo/user/utils/crash/CrashHandler.kt
@@ -0,0 +1,160 @@
+package com.igo.user.utils.crash
+
+import android.content.Context
+import android.os.Build
+import android.util.Log
+import com.google.gson.GsonBuilder
+import com.igo.user.BuildConfig
+import java.io.File
+
+/**
+ * 全局崩溃捕获器
+ * 通过替换系统默认的 UncaughtExceptionHandler 来拦截所有未处理异常
+ */
+object CrashHandler : Thread.UncaughtExceptionHandler {
+    private const val TAG = "CrashHandler"
+
+    // 最大保留日志数,防止文件无限增长
+    private const val maxLogFileCount = 3
+
+    // 系统原有的异常处理器,需要在处理完后委托给它,保证系统行为不被破坏
+    private var defaultHandler: Thread.UncaughtExceptionHandler? = null
+
+    // 日志保存文件夹
+    lateinit var crashDir: File
+
+    //是否已经初始化
+    private var hadInit = false;
+
+    /**
+     * 初始化方法
+     * @param context Context,用于获取应用和设备信息
+     *
+     * 必须在 Application.onCreate() 中最早调用
+     */
+    fun init(context: Context) {
+        if (hadInit) {
+            return
+        }
+        hadInit = true
+        // 保存系统默认的异常处理器
+        defaultHandler = Thread.getDefaultUncaughtExceptionHandler()
+
+        // 设置自定义的异常处理器为全局默认
+        Thread.setDefaultUncaughtExceptionHandler(this)
+
+        // 初始化本地存储和上报模块
+        crashDir = File(context.filesDir, "crash_logs").apply { if (!exists()) mkdirs() }
+
+        Log.d(TAG, "崩溃捕获器初始化完成")
+    }
+
+    /**
+     * 核心回调:当线程因未捕获异常而即将终止时,系统会调用此方法
+     *
+     * @param thread 发生异常的线程
+     * @param throwable 未捕获的异常
+     */
+    override fun uncaughtException(thread: Thread, throwable: Throwable) {
+        try {
+            // 1. 收集崩溃信息
+            val crashInfo = collectCrashInfo(thread, throwable)
+
+            // 2. 写入本地文件(立即持久化,避免丢失)
+            saveCrashLog(crashInfo)
+
+            // 3. 打印到 Logcat(方便开发调试)
+            Log.e(TAG, "捕获到崩溃: ${crashInfo.exceptionType}")
+
+        } catch (e: Exception) {
+            e.printStackTrace()
+            // 捕获处理器自身的异常,避免二次崩溃
+            Log.e(TAG, "处理崩溃时发生错误")
+        } finally {
+            // 4. 委托给系统原有的处理器
+            // 系统处理器会执行默认的崩溃对话框或进程退出逻辑
+            defaultHandler?.uncaughtException(thread, throwable)
+        }
+    }
+
+    /**
+     * 收集崩溃相关的全部信息
+     */
+    private fun collectCrashInfo(thread: Thread, throwable: Throwable): CrashInfo {
+        return CrashInfo(
+            threadName = thread.name,
+            exceptionType = throwable.javaClass.name,
+            exceptionMessage = throwable.message,
+            stackTrace = Log.getStackTraceString(throwable), // 将 Throwable 转为字符串堆栈
+            deviceInfo = CrashInfo.DeviceInfo(
+                manufacturer = Build.MANUFACTURER,
+                model = Build.MODEL,
+                sdkVersion = Build.VERSION.SDK_INT,
+                osVersion = Build.VERSION.RELEASE
+            ),
+            appInfo = CrashInfo.AppInfo(
+                packageName = BuildConfig.APPLICATION_ID,
+                versionName = BuildConfig.VERSION_NAME,
+                versionCode = BuildConfig.VERSION_CODE.toLong()
+            )
+        )
+    }
+
+    /**
+     * 保存一次崩溃日志
+     * @param crashInfo 崩溃信息对象
+     *
+     * 以 "crash_时间戳_id.json" 命名,便于排序和查找
+     */
+    fun saveCrashLog(crashInfo: CrashInfo) {
+        val gson = GsonBuilder().setPrettyPrinting().create()
+        val json = gson.toJson(crashInfo)
+
+        val fileName = "crash_${crashInfo.timestamp}_${crashInfo.id}.json"
+        val file = File(crashDir, fileName)
+
+        try {
+            file.writeText(json)
+            Log.d(TAG, "崩溃日志已保存: $fileName")
+
+            // 清理旧日志,避免占用过多空间
+            cleanupOldLogs()
+        } catch (e: Exception) {
+            e.printStackTrace()
+            Log.e(TAG, "保存崩溃日志失败")
+        }
+    }
+
+    /**
+     * 读取所有待上报的崩溃日志
+     * @return 崩溃日志文件列表
+     */
+    fun getAllCrashLogs(): List<File> {
+        return crashDir.listFiles { file ->
+            file.name.startsWith("crash_") && file.name.endsWith(".json")
+        }?.sortedByDescending { it.lastModified() } ?: emptyList()
+    }
+
+    /**
+     * 删除指定的崩溃日志文件
+     * @param file 要删除的文件
+     */
+    fun deleteCrashLog(file: File) {
+        if (file.exists()) {
+            file.delete()
+            Log.d(TAG, "已删除崩溃日志: ${file.name}")
+        }
+    }
+
+    /**
+     * 清理最旧的日志文件,保持总数不超过 maxLogFileCount
+     */
+    private fun cleanupOldLogs() {
+        val files = crashDir.listFiles() ?: return
+        if (files.size > maxLogFileCount) {
+            files.sortedBy { it.lastModified() }
+                .take(files.size - maxLogFileCount)
+                .forEach { it.delete() }
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/igo/user/utils/crash/CrashInfo.kt b/app/src/main/java/com/igo/user/utils/crash/CrashInfo.kt
new file mode 100644
index 0000000..67057b3
--- /dev/null
+++ b/app/src/main/java/com/igo/user/utils/crash/CrashInfo.kt
@@ -0,0 +1,39 @@
+package com.igo.user.utils.crash
+
+import android.app.ActivityManager
+import java.util.UUID
+
+/**
+ * 崩溃信息数据类
+ * 封装一次崩溃所需的全部上下文
+ */
+data class CrashInfo(
+    val id: String = UUID.randomUUID().toString(),        // 崩溃唯一ID,便于去重
+    val timestamp: Long = System.currentTimeMillis(),     // 崩溃发生时间
+    val threadName: String,                               // 发生崩溃的线程名
+    val exceptionType: String,                            // 异常类型(如 NullPointerException)
+    val exceptionMessage: String?,                        // 异常消息
+    val stackTrace: String,                               // 完整堆栈信息
+    val deviceInfo: DeviceInfo,                           // 设备信息
+    val appInfo: AppInfo,                                 // 应用信息
+    val memoryInfo: ActivityManager.MemoryInfo? = null                    // 内存快照(可选)
+) {
+    /**
+     * 设备信息子数据类
+     */
+    data class DeviceInfo(
+        val manufacturer: String,  // 厂商,如 "Xiaomi"
+        val model: String,          // 型号,如 "Redmi K60"
+        val sdkVersion: Int,        // Android SDK 版本
+        val osVersion: String       // Android 系统版本
+    )
+
+    /**
+     * 应用信息子数据类
+     */
+    data class AppInfo(
+        val packageName: String,    // 应用包名
+        val versionName: String,    // 版本名,如 "1.2.0"
+        val versionCode: Long       // 版本号
+    )
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/igo/user/utils/crash/LogUploader.kt b/app/src/main/java/com/igo/user/utils/crash/LogUploader.kt
new file mode 100644
index 0000000..76f0bb9
--- /dev/null
+++ b/app/src/main/java/com/igo/user/utils/crash/LogUploader.kt
@@ -0,0 +1,124 @@
+package com.igo.user.utils.crash
+
+import android.content.Context
+import android.util.Log
+import androidx.core.content.edit
+import cn.sinata.rxnetty.LogHelper
+import cn.sinata.xldutils.data.ResultData
+import com.igo.user.IGoApplication
+import com.igo.user.network.HttpManager
+import io.reactivex.Observable
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.schedulers.Schedulers
+import java.io.File
+import java.io.IOException
+import java.io.RandomAccessFile
+
+/**
+ * 日志上传管理器
+ * 处理日志文件正在写入时的安全上传
+ */
+object LogUploader {
+    private const val TAG = "LogUploader"
+
+    //上传历史文件名
+    private const val HISTORY_NAME = "logUploadHistory"
+
+    //复制文件时的缓冲区大小:8KB
+    private const val BUFFER_SIZE = 8192
+
+    /**
+     * 将正在写入的日志文件复制到临时文件
+     * 使用文件通道,支持大文件且高效
+     *
+     * @param source 源日志文件
+     * @return 复制后的临时文件,失败返回null
+     */
+    private fun copyToTempFile(context: Context, source: File): File? {
+        if (!source.exists()) {
+            Log.e(TAG, "源文件不存在: ${source.absolutePath}")
+            return null
+        }
+
+        val tempFile = File(context.cacheDir, "temp_${source.name}")
+
+        return try {
+            // 使用 RandomAccessFile 而非直接 InputStream
+            // 这样可以处理文件在复制过程中变化的情况
+            RandomAccessFile(source, "r").use { src ->
+                RandomAccessFile(tempFile, "rw").use { dest ->
+                    val buffer = ByteArray(BUFFER_SIZE)
+                    var bytesRead: Int
+
+                    while (src.read(buffer).also { bytesRead = it } != -1) {
+                        dest.write(buffer, 0, bytesRead)
+                    }
+                }
+            }
+
+            Log.d(TAG, "文件复制成功: ${source.name} -> ${tempFile.name}")
+            tempFile
+        } catch (e: IOException) {
+            Log.e(TAG, "文件复制失败", e)
+            tempFile.delete() // 清理可能的不完整文件
+            null
+        }
+    }
+
+    //上传
+    fun upload() {
+        val sp = IGoApplication.appContext!!.getSharedPreferences(HISTORY_NAME, Context.MODE_PRIVATE)
+        val data = mutableListOf<File>()
+        if (LogHelper.saveLogDir != null && LogHelper.saveLogDir.exists()) {
+            val files = LogHelper.saveLogDir.listFiles()
+            if (!files.isNullOrEmpty()) {
+                data.addAll(files)
+            }
+        }
+        if (CrashHandler.crashDir.exists()) {
+            val files = CrashHandler.crashDir.listFiles()
+            if (!files.isNullOrEmpty()) {
+                data.addAll(files)
+            }
+        }
+        if (data.isEmpty()) {
+            Log.e(TAG, "没有需要上传的日志文件")
+            return
+        }
+        val needUploadFiles = data.filter { sp.getString(it.absolutePath, null).isNullOrEmpty() }
+        Log.e(TAG, "needUploadFiles: ${needUploadFiles.joinToString { it.absolutePath }}")
+        val subscribe = Observable.fromIterable(needUploadFiles)
+            .flatMap { file ->
+                val tempFile = copyToTempFile(IGoApplication.appContext!!, file)
+                if (tempFile == null || !tempFile.exists() || !tempFile.canRead()) {
+                    return@flatMap Observable.just(Pair<File, String?>(file, null))
+                }
+                HttpManager.uploadFile(tempFile)
+                    .onErrorReturn { e ->
+                        e.printStackTrace()
+                        return@onErrorReturn ResultData<String>(0)
+                    }
+                    .map { data -> Pair<File, String?>(file, data.data) }
+                    .toObservable()
+            }
+            .toList()
+            .toObservable()
+            .flatMap { list ->
+                Log.e(TAG, "uploadResult: ${list.joinToString { "${it.first.absolutePath}==>${it.second}" }}")
+                sp.edit {
+                    list.filter { !it.second.isNullOrEmpty() }.forEach { pair ->
+                        putString(pair.first.absolutePath, pair.second)
+                    }
+                }
+                val filter = data.mapNotNull { sp.getString(it.absolutePath, null) }
+                return@flatMap HttpManager.saveLog(filter.joinToString(separator = ",") { it }).map { filter }.toObservable()
+            }
+            .subscribeOn(Schedulers.io())
+            .observeOn(AndroidSchedulers.mainThread())
+            .subscribe({
+                Log.e(TAG, "upload success")
+            }, { throwable ->
+                throwable.printStackTrace()
+            })
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
index 14da8da..621d14f 100644
--- a/app/src/main/res/layout/activity_login.xml
+++ b/app/src/main/res/layout/activity_login.xml
@@ -138,10 +138,10 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_margin="23dp"
-        android:checked="true"
+        android:checked="false"
         android:drawableStart="@drawable/selector_ic_pwd_code"
         android:drawablePadding="10dp"
-        android:text="@string/验证码"
+        android:text="@string/密码"
         app:layout_constraintTop_toBottomOf="@id/et_phone" />
 
     <EditText
@@ -157,7 +157,6 @@
         android:maxLength="18"
         android:paddingTop="12dp"
         android:paddingBottom="8dp"
-        android:visibility="gone"
         app:layout_constraintTop_toBottomOf="@id/tv_pwd" />
 
     <EditText
@@ -173,6 +172,7 @@
         android:maxLength="4"
         android:paddingTop="12dp"
         android:paddingBottom="8dp"
+        android:visibility="gone"
         app:layout_constraintTop_toBottomOf="@id/tv_pwd" />
 
     <TextView
@@ -184,7 +184,6 @@
         android:text="@string/忘记密码"
         android:textColor="@color/textColor66"
         android:textSize="13sp"
-        android:visibility="gone"
         app:layout_constraintEnd_toEndOf="@id/tv_action"
         app:layout_constraintTop_toBottomOf="@id/et_pwd"
         tools:visibility="visible" />
@@ -198,6 +197,7 @@
         android:text="@string/获取验证码"
         android:textColor="@color/colorPrimary"
         android:textSize="14sp"
+        android:visibility="gone"
         app:layout_constraintBottom_toBottomOf="@id/et_code"
         app:layout_constraintEnd_toEndOf="@id/et_code" />
 
diff --git a/app/src/main/res/layout/activity_receiver.xml b/app/src/main/res/layout/activity_receiver.xml
index cb8e1ae..0376280 100644
--- a/app/src/main/res/layout/activity_receiver.xml
+++ b/app/src/main/res/layout/activity_receiver.xml
@@ -41,13 +41,14 @@
 
         <TextView
             style="@style/style_common_text"
-            android:layout_width="wrap_content"
+            android:layout_width="0dp"
             android:layout_height="wrap_content"
             android:layout_marginStart="14dp"
             android:drawablePadding="8dp"
             android:text="@string/receipt_name"
             app:layout_constraintBaseline_toBaselineOf="@id/et_name"
-            app:layout_constraintStart_toStartOf="parent" />
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toStartOf="@id/et_name"/>
 
         <LinearLayout
             android:id="@+id/phoneLayout"
diff --git a/app/src/main/res/layout/fragment_logistics.xml b/app/src/main/res/layout/fragment_logistics.xml
index dd5047f..2c591a3 100644
--- a/app/src/main/res/layout/fragment_logistics.xml
+++ b/app/src/main/res/layout/fragment_logistics.xml
@@ -237,7 +237,7 @@
             <TextView
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:text="预估金额"
+                android:text="@string/预估金额"
                 android:textColor="@color/black"
                 android:textSize="12sp" />
 
diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml
index 84b2b02..e36448b 100644
--- a/app/src/main/res/values-en/strings.xml
+++ b/app/src/main/res/values-en/strings.xml
@@ -991,7 +991,7 @@
 
     <string name="邀请记录">Invitation record</string>
 
-    <string name="专车">Premium ride / Private ride</string>
+    <string name="专车">Rides</string>
 
     <string name="城际出行">Intercity travel</string>
 
@@ -1289,7 +1289,7 @@
 
 
     <string name="物流费用是多少">Delivery Fee FCFA%1$.2f</string>
-    <string name="查看快件指南">Check the express guide</string>
+    <string name="查看快件指南">Check the Flash guide</string>
     <string name="邮寄快件指南">Package guidelines</string>
     <string name="邮寄快件指南协议">《Package guidelines》</string>
     <string name="完善收货人信息">Complete recipient information</string>
@@ -1726,7 +1726,7 @@
 
     <string name="please_input_sms_code">Please enter the verification code</string>
 
-    <string name="set_pwd">Set Password</string>
+    <string name="set_pwd">Change Password</string>
 
     <string name="set_password">Set Password</string>
 
@@ -1892,7 +1892,7 @@
     <string name="充值领券规则">Top-up &amp; coupon rules</string>
 
     <string name="计价规则">Pricing rules</string>
-    <string name="可用于打车和快件">can be used for ride hailing and express parcels</string>
+    <string name="可用于打车和快件">can be used for ride hailing and Flash parcels</string>
 
     <string name="请完善邮箱地址包裹提示">"In order to receive package pickup code and payment receipt, you must complete your email address, or you will not be able to place the order. "</string>
     <string name="可用于打车和包裹">Available for Ride and Package Delivery</string>
@@ -2032,8 +2032,8 @@
 
     <string name="订单号">Order No.:%1$s</string>
 
-    <string name="快件">Express</string>
-    <string name="物流">Logistics</string>
+    <string name="快件">Flash</string>
+    <string name="物流">Express</string>
     <string name="呼叫司机">Call Driver</string>
     <string name="运营公司客服电话">Operator Customer Service</string>
 
@@ -2049,5 +2049,6 @@
     <string name="请选择乘车人">Please select your passenger</string>
     <string name="有未完成订单是否前往查看">Do you have an unfinished order? Would you like to check it out?</string>
     <string name="去开启相机权限">Please enable camera permissions on the app permissions page</string>
+    <string name="请设置密码">You haven\'t set a password yet, please set a password!</string>
 
 </resources>
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 806108d..0dee2db 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -1702,7 +1702,7 @@
 
     <string name="please_input_sms_code">Veuillez saisir le code de vérification</string>
 
-    <string name="set_pwd">Définir le mot de passe</string>
+    <string name="set_pwd">Modifier le mot de passe</string>
 
     <string name="set_password">Définir le mot de passe</string>
 
@@ -2003,7 +2003,7 @@
     <string name="订单号">N° de commande : %1$s</string>
 
     <string name="快件">Livraison</string>
-    <string name="物流">Logistique</string>
+    <string name="物流">Express</string>
     <string name="呼叫司机">Appeler le chauffeur</string>
     <string name="运营公司客服电话">Service client de l’opérateur</string>
 
@@ -2020,5 +2020,6 @@
     <string name="请选择乘车人">Veuillez sélectionner les passagers</string>
     <string name="有未完成订单是否前往查看">Vous avez une commande inachevée, allez - vous la voir?</string>
     <string name="去开启相机权限">Veuillez activer l\'autorisation de l\'appareil photo sur la page des permissions de l\'application</string>
+    <string name="请设置密码">Vous n\'avez pas encore défini de mot de passe, veuillez en définir un !</string>
 
 </resources>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d8525d7..000075e 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1073,5 +1073,6 @@
     <string name="请选择乘车人">请选择乘车人</string>
     <string name="有未完成订单是否前往查看">您有未完成订单,是否前往查看?</string>
     <string name="去开启相机权限">请在应用权限页面开启相机权限</string>
+    <string name="请设置密码">您还没有设置密码,请设置密码!</string>
 
 </resources>
diff --git a/rxnetty/src/main/java/cn/sinata/rxnetty/LogHelper.java b/rxnetty/src/main/java/cn/sinata/rxnetty/LogHelper.java
index 82a5aba..d59e01c 100644
--- a/rxnetty/src/main/java/cn/sinata/rxnetty/LogHelper.java
+++ b/rxnetty/src/main/java/cn/sinata/rxnetty/LogHelper.java
@@ -1,17 +1,24 @@
 package cn.sinata.rxnetty;
 
+import android.content.Context;
+
 import com.blankj.utilcode.util.LogUtils;
 
-public class LogHelper {
+import java.io.File;
 
-    public static void initLogs() {
+public class LogHelper {
+    public static File saveLogDir;
+
+    public static void initLogs(Context context) {
         LogUtils.Config config = LogUtils.getConfig();
         config.setSaveDays(7);
-        config.setFilePrefix("gopost");
+        config.setFilePrefix("user");
         config.setConsoleSwitch(true);
         config.setLog2FileSwitch(true);
         config.setSingleTagSwitch(true);
         config.setLogHeadSwitch(false);
+        saveLogDir = new File(context.getFilesDir(), "logs");
+        config.setDir(saveLogDir);
 
         logRecord("initLogs");
     }

--
Gitblit v1.7.1