18034727885
2026-09-10 9404fc9fce1d2f8678a5d1e6da2374b7a67783fe
app/src/main/java/com/driver/igotrip/base/MyApplication.kt
@@ -12,6 +12,8 @@
import android.os.*
import android.util.Log
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import cn.sinata.rxnetty.LogHelper.initLogs
@@ -24,16 +26,31 @@
import com.driver.igotrip.bean.OrderSimpleData
import com.driver.igotrip.bean.websocket.HeartBean
import com.driver.igotrip.netUtls.*
import com.driver.igotrip.service.LocationForegroundService
import com.driver.igotrip.ui.main.MainActivity
import com.driver.igotrip.ui.main.small_cargo.SmallCargoActivity
import com.driver.igotrip.ui.pub.LoginActivity
import com.driver.igotrip.utils.AudioRecoderUtils
import com.driver.igotrip.utils.Cache.CacheKey
import com.driver.igotrip.utils.Cache.CacheUtil
import com.driver.igotrip.utils.LanguageSP
import com.driver.igotrip.utils.LanguageSP.LanguageConst
import com.driver.igotrip.utils.LogUtils
import com.driver.igotrip.utils.crash.CrashHandler
import com.driver.igotrip.utils.glide.GlideUtil
import com.google.android.gms.maps.model.LatLng
import com.google.cloud.texttospeech.v1.*
import com.google.gson.Gson
import com.petterp.floatingx.app.AppHost
import com.petterp.floatingx.core.FloatingX
import com.petterp.floatingx.core.FxControl
import com.petterp.floatingx.core.FxListener
import com.petterp.floatingx.core.layout.FxAdsorb
import com.petterp.floatingx.core.layout.FxEdge
import com.petterp.floatingx.core.layout.FxGravity
import com.petterp.floatingx.core.storage.FxSpStorage
import com.petterp.floatingx.system.permission.FxPermissionStrategy
import com.petterp.floatingx.system.systemHost
import com.xuexiang.xui.XUI
import org.greenrobot.eventbus.EventBus
import org.jetbrains.anko.startActivity
@@ -92,7 +109,7 @@
    private val MSG_ORDER_CANCEL = 1002
    @SuppressLint("HandlerLeak")
    private val mHandler: Handler = object : Handler() {
    private val mHandler: Handler = object : Handler(Looper.getMainLooper()) {
        override fun handleMessage(msg: Message) {
            super.handleMessage(msg)
            when (msg.what) {
@@ -158,32 +175,6 @@
        }
    }
//    private val mAliasCallback =
//        TagAliasCallback { code, alias, tags ->
//            val logs: String
//            when (code) {
//                0 -> {
//                    logs = "Set tag and alias success"
//                    Log.i("TAG", logs)
//                }
//
//                6002 -> {
//                    logs = "Failed to set alias and tags due to timeout. Try again after 60s."
//                    Log.i("TAG", logs)
//                    // 延迟 60 秒来调用 Handler 设置别名
//                    var alisa = "DRIVER" + CacheKey.getUserId()
//                    Handler().postDelayed({
//                        JPushInterface.setAliasAndTags(this, alisa, null, null)
//                    }, 60 * 1000)
//                }
//
//                else -> {
//                    logs = "Failed with errorCode = $code"
//                    Log.e("TAG", logs)
//                }
//            }
//        }
    private fun initSocket() {
        NettyClient.getInstance().init(this, Api.SOCKET_SERVER, Api.SOCKET_PORT, true)
        NettyClient.getInstance().addOnMessageListener { message: String ->
@@ -220,6 +211,8 @@
                        CacheUtil.get().clear()
                        CacheKey.putKeyStr("isAgreen", "1")
                        NettyClient.getInstance().stopService()
                        couldShowFloatingWindow = false
                        LocationForegroundService.stop()
                        isLogin = false
                        val intent = Intent()
                        intent.setClass(this, LoginActivity::class.java)
@@ -391,18 +384,15 @@
                        logRecord("socket==>订单超时:$jsob")
                        val act = getTopActivity()
                        /**
                         * 司机超时推送
                         * @param timeOutType  超时类型(1=用户可免费取消提醒,2=预约单接单提醒,3=超时循环提醒)
                         * @param orderId  订单id
                         * @param orderType  订单类型(1=打车,4=包裹)
                         * @param describe  展示内容
                         * @param audioUrl  语音播报音频地址
                         */
                        //超时类型(1=用户可免费取消提醒,2=预约单接单提醒,3=超时循环提醒)
                        val timeOutType = jsob.optString("timeOutType")
                        //订单id
                        val orderId = jsob.optString("orderId")
                        //订单类型(1=打车,4=包裹)
                        val orderType = jsob.optString("orderType")
                        //展示内容
                        val describe = jsob.optString("describe")
                        //语音播报音频地址
                        val audioUrl = jsob.optString("audioUrl")
                        if (timeOutType == "1" || timeOutType == "3") { // 仅提示
@@ -528,6 +518,31 @@
        var lastPlayTime = 0L //上次提示播放时间
        var hasAutoGoTripping = false //true 本次启动已经自动跳转过
        var isLogin: Boolean = true
        //是否在上班
        var isWorking = false
            set(value) {
                field = value
                refreshFloatingWindow()
            }
        private var aMapLocation: LatLng? = null
        var currentOrderId: String = ""
        var currentOrderType: String = ""
        var orderStatueViews: MutableList<OrderStatueView> = mutableListOf()
        //悬浮窗tag
        private const val FLOATING_X_TAG = "GO POST DRIVER"
        //是否能显示悬浮窗
        @JvmStatic
        var couldShowFloatingWindow = false
            set(value) {
                field = value
                if (!value) {
                    dismissFloatingWindow()
                }
            }
        fun getInstance(): MyApplication? {
            if (appContext == null) {
                appContext = MyApplication()
@@ -545,11 +560,6 @@
        fun getLocation(): LatLng? {
            return aMapLocation
        }
        private var aMapLocation: LatLng? = null
        var currentOrderId: String = ""
        var currentOrderType: String = ""
        var orderStatueViews: MutableList<OrderStatueView> = mutableListOf()
        //设置定位
        fun setLocation(latLng: LatLng) {
@@ -570,12 +580,94 @@
        fun removeOrderView(view: OrderStatueView?) {
            orderStatueViews.remove(view)
        }
        //显示悬浮窗
        fun showFloatingWindow() {
            (FloatingX.controlOrNull(FLOATING_X_TAG) ?: FloatingX.install(FLOATING_X_TAG) {
                view { ctx ->
                    View.inflate(ctx, R.layout.fx_card, null).apply {
                        findViewById<TextView>(R.id.tv1).apply {
                            val language = LanguageSP.getLanguage(ctx)
                            text = when (language) {
                                LanguageConst.ZH_CN -> {
                                    if (isWorking) "听单中" else "休息中"
                                }
                                LanguageConst.EN_US -> {
                                    if (isWorking) "GO" else "On break"
                                }
                                else -> {
                                    if (isWorking) "Aller" else "En pause"
                                }
                            }
                        }
                        findViewById<ImageView>(R.id.iv_logo).apply {
                            GlideUtil.loadResource(this, R.mipmap.ic_launcher, true)
                        }
                    }
                }
                anchor(FxGravity.CENTER_START)
                adsorb(FxAdsorb.Edges(setOf(FxEdge.START, FxEdge.END)))
                persist(FxSpStorage(appContext!!))
                enableLog("GO POST floating")
                systemHost(appContext!!) {
                    theme(R.style.Theme_FloatingX)
                    permission(FxPermissionStrategy.auto())
                    // this. 消歧:这里的 fallback / keyboard 既是 Builder 方法名也是本函数的参数名
                    this.fallback(AppHost.builder(appContext!!).theme(R.style.Theme_FloatingX).build())
                }
            }.also {
                it.addListener(object : FxListener {
                    override fun onClick(control: FxControl, view: View) {
                        dismissFloatingWindow()
                        val activity = appContext?.getTopActivity()
                        if (activity == null) {
                            view.context.startActivity(Intent(view.context, MainActivity::class.java).apply {
                                addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                            })
                        } else {
                            activity.startActivity<MainActivity>()
                        }
                    }
                    override fun onLongClick(control: FxControl, view: View) {
                    }
                })
            }).show()
        }
        //隐藏悬浮窗
        @JvmStatic
        fun dismissFloatingWindow() {
            FloatingX.controlOrNull(FLOATING_X_TAG)?.hide()
        }
        //刷新悬浮窗
        fun refreshFloatingWindow() {
            val language = LanguageSP.getLanguage(appContext)
            FloatingX.controlOrNull(FLOATING_X_TAG)?.contentView?.findViewById<TextView>(R.id.tv1)?.text =
                when (language) {
                    LanguageConst.ZH_CN -> {
                        if (isWorking) "听单中" else "休息中"
                    }
                    LanguageConst.EN_US -> {
                        if (isWorking) "GO" else "On break"
                    }
                    else -> {
                        if (isWorking) "Aller" else "En pause"
                    }
                }
        }
    }
    private val activities = ArrayList<Activity?>()
    //获取顶部activity
    private fun getTopActivity(): Activity? {
    fun getTopActivity(): Activity? {
        return activities.lastOrNull()
    }
@@ -621,6 +713,7 @@
    override fun onActivityStarted(activity: Activity) {
        showNum++
        dismissFloatingWindow()
    }
    override fun onActivityResumed(activity: Activity) {
@@ -643,15 +736,27 @@
            }
            isPlayVoice = true
        }, 600)
        if (showNum == 0 && couldShowFloatingWindow) {
            showFloatingWindow()
        }
    }
    override fun onActivityDestroyed(activity: Activity) {
        logRecord("onActivityDestroyed: " + activity.javaClass.name)
        activities.remove(activity)
        if (activities.isEmpty()) {
            couldShowFloatingWindow = false
            dismissFloatingWindow()
        }
    }
    override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
//        logRecord("onActivitySaveInstanceState: " + activity.javaClass.name)
    }
    override fun onTerminate() {
        super.onTerminate()
        couldShowFloatingWindow = false
        LocationForegroundService.stop()
    }
}