| | |
| | | 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 |
| | |
| | | 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 |
| | |
| | | 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) { |
| | |
| | | } |
| | | } |
| | | |
| | | // 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 -> |
| | |
| | | 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) |
| | |
| | | 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") { // 仅提示 |
| | |
| | | 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() |
| | |
| | | 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) { |
| | |
| | | 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() |
| | | } |
| | | |
| | |
| | | |
| | | override fun onActivityStarted(activity: Activity) { |
| | | showNum++ |
| | | dismissFloatingWindow() |
| | | } |
| | | |
| | | override fun onActivityResumed(activity: Activity) { |
| | |
| | | } |
| | | 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() |
| | | } |
| | | } |