package com.igo.user
|
|
//import com.umeng.commonsdk.UMConfigure
|
//import com.umeng.socialize.PlatformConfig
|
import android.app.Activity
|
import android.app.Application
|
import android.content.Intent
|
import android.os.Bundle
|
import android.util.Log
|
import android.view.View
|
import androidx.appcompat.app.AppCompatActivity
|
import androidx.core.os.bundleOf
|
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.FragmentManager
|
import androidx.lifecycle.lifecycleScope
|
import cn.sinata.rxnetty.LogHelper
|
import cn.sinata.rxnetty.NettyClient
|
import cn.sinata.xldutils.activity.BaseActivity
|
import cn.sinata.xldutils.application.BaseApplication
|
import cn.sinata.xldutils.utils.LanguageUtil
|
import cn.sinata.xldutils.utils.SPUtils
|
import cn.sinata.xldutils.utils.myToast
|
import com.google.android.gms.maps.MapsInitializer
|
import com.google.android.gms.maps.model.LatLng
|
import com.google.android.libraries.places.api.Places
|
import com.google.gson.Gson
|
import com.igo.user.dialog.ChooseCardDialog
|
import com.igo.user.dialog.PayDialog
|
import com.igo.user.dialog.TipDialog
|
import com.igo.user.interfaces.OrderStateChangeListener
|
import com.igo.user.interfaces.StringCallback
|
import com.igo.user.network.Apis
|
import com.igo.user.network.HttpManager
|
import com.igo.user.network.RRetrofit
|
import com.igo.user.network.entity.TrippingInfo
|
import com.igo.user.network.request
|
import com.igo.user.ui.MainActivity
|
import com.igo.user.ui.SplashActivity
|
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
|
import org.jetbrains.anko.runOnUiThread
|
import org.jetbrains.anko.startActivity
|
import org.json.JSONObject
|
import java.util.concurrent.TimeUnit
|
|
class IGoApplication : BaseApplication(), Application.ActivityLifecycleCallbacks {
|
override fun getSPName() = "IgoSp"
|
private var heartSubscribe: Disposable? = null
|
private val listeners = ArrayList<OrderStateChangeListener>()
|
private val activities = ArrayList<Activity>()
|
|
|
override fun onCreate() {
|
super.onCreate()
|
appContext = this
|
registerActivityLifecycleCallbacks(this)
|
LanguageUtil.setDefaultLanguage(Const.Language.DEFAULT_LANGUAGE)
|
DownloadLibrary.init(
|
this,
|
resources.getIdentifier("ic_launcher", "mipmap", packageName),
|
null,
|
packageName
|
)
|
LogHelper.initLogs(this)
|
initNetty()
|
Places.initialize(this, Const.google_key)
|
MapsInitializer.initialize(
|
this, MapsInitializer.Renderer.LATEST
|
) { renderer ->
|
Log.e(Const.GoogleTag, "LATEST renderer:${renderer.name}")
|
}
|
CrashHandler.init(this)
|
}
|
|
private fun initNetty() {
|
NettyClient.getInstance().init(this, BuildConfig.SOCKET_SERVER, BuildConfig.SOCKET_PORT, true)
|
NettyClient.getInstance().addOnMessageListener { message ->
|
try {
|
val json = JSONObject(message)
|
val method = json.optString("method")
|
val code = json.optString("code")
|
if (method != "OK") {
|
Log.d("zmc-socket", message)
|
}
|
|
if (code == "200") {
|
when (method) {
|
|
Const.Method.PING_RECEIVE -> {//心跳
|
//延时发送心跳
|
if (heartSubscribe != null && !heartSubscribe?.isDisposed!!) {
|
heartSubscribe?.dispose()
|
}
|
heartSubscribe =
|
Flowable.just("").delay(5000, TimeUnit.MILLISECONDS).subscribe {
|
sendHeart()
|
}
|
}
|
|
Const.Method.ORDER_STATUS -> {//订单状态改变
|
val order = json.optJSONObject("data")
|
LogHelper.logRecord("socket==>订单状态改变:${order}")
|
order?.let {
|
listeners.forEach {
|
runOnUiThread {
|
it.onStateChanged(
|
order.optInt("orderId"),
|
order.optInt("orderType"),
|
order.optInt("state")
|
)
|
}
|
}
|
}
|
}
|
|
Const.Method.DIFFERENCE -> {//物流需要补差价
|
Log.e("zmc-socket", "物流需要补差价")
|
payTheDifference(json.optJSONObject("data"))
|
LogHelper.logRecord("socket==>物流需要补差价:${json.optJSONObject("data")}")
|
}
|
|
Const.Method.REASSIGN -> {//订单改派
|
val order = json.optJSONObject("data")
|
LogHelper.logRecord("socket==>订单改派:${order}")
|
order?.let {
|
listeners.forEach {
|
runOnUiThread {
|
it.onStateChanged(
|
order.optInt("orderId"),
|
order.optInt("orderType"),
|
15
|
)
|
}
|
}
|
}
|
}
|
|
Const.Method.DRIVER_POSITION -> {//司机位置
|
val jb = json.optJSONObject("data")
|
LogHelper.logRecord("socket==>司机位置:${jb}")
|
jb?.let {
|
val data = Gson().fromJson(jb.toString(), TrippingInfo::class.java)
|
listeners.forEach {
|
runOnUiThread {
|
it.onTrippingChanged(data)
|
}
|
}
|
}
|
}
|
|
Const.Method.MODIFY_ADDRESS -> {//司机操作目的地变更事件
|
val jb = json.optJSONObject("data")
|
LogHelper.logRecord("socket==>司机操作目的地变更事件:${jb}")
|
jb?.let {
|
val data = Gson().fromJson(jb.toString(), TrippingInfo::class.java)
|
listeners.forEach {
|
runOnUiThread {
|
it.onAddressChanged(data)
|
}
|
}
|
}
|
}
|
|
Const.Method.FERRY -> {//摆渡车被接单
|
val jb = json.optJSONObject("data")
|
LogHelper.logRecord("socket==>摆渡车被接单:${jb}")
|
jb?.let {
|
listeners.forEach {
|
runOnUiThread {
|
it.onShuttleConfirm(
|
jb.optInt("orderId"),
|
jb.optInt("orderType")
|
)
|
}
|
}
|
}
|
}
|
|
Const.Method.END_PUSH -> {//无司机接单
|
val jb = json.optJSONObject("data")
|
val id = jb?.optInt("orderId") ?: 0
|
val type = jb?.optInt("orderType") ?: 0
|
val topAct = activities[activities.lastIndex]
|
LogHelper.logRecord("socket==>无司机接单:${jb}")
|
if (topAct is TripActivity) {
|
topAct.noResponse(id)
|
} else {
|
val tipDialog = TipDialog()
|
tipDialog.arguments = bundleOf(
|
"msg" to topAct.getString(R.string.附近暂无司机接单),
|
"ok" to topAct.getString(R.string.继续等待),
|
"cancel" to topAct.getString(R.string.取消订单)
|
)
|
tipDialog.setCallback(object : TipDialog.OnClickCallback {
|
override fun onOk() {
|
|
}
|
|
override fun onCancel() {
|
HttpManager.cancelOrder(
|
_currentLatLng.latitude,
|
_currentLatLng.longitude,
|
id,
|
type
|
)
|
.request(topAct as BaseActivity) { _, _ ->
|
myToast(topAct.getString(R.string.取消成功))
|
if (activities[0] is MainActivity) {
|
(activities[0] as MainActivity).queryTripping()
|
}
|
}
|
}
|
})
|
tipDialog.setDismissCallback(object : TipDialog.OnDismiss {
|
override fun onDismiss() {
|
HttpManager.pushOrderTaxi(id, type)
|
.request(topAct as BaseActivity) { _, _ ->
|
}
|
}
|
})
|
tipDialog.show(
|
(topAct as BaseActivity).supportFragmentManager,
|
"noResponse"
|
)
|
}
|
}
|
|
Const.Method.OFFLINE -> {//强制下线
|
LogHelper.logRecord("socket==>强制下线")
|
val topAct = activities[activities.lastIndex]
|
SPUtils.instance().remove(Const.User.TOKEN).remove(Const.User.USER_ID)
|
.remove(Const.User.NO_PHONE).apply()
|
val tipDialog = TipDialog()
|
tipDialog.arguments = bundleOf(
|
"msg" to topAct.getString(R.string.您的账号已在其他地方登陆),
|
"isAlert" to true
|
)
|
tipDialog.setDismissCallback(object : TipDialog.OnDismiss {
|
override fun onDismiss() {
|
exit()
|
topAct.startActivity<LoginActivity>()
|
}
|
})
|
tipDialog.show(
|
(topAct as BaseActivity).supportFragmentManager,
|
"logout"
|
)
|
}
|
}
|
}
|
} catch (e: Exception) {
|
e.printStackTrace()
|
}
|
}
|
NettyClient.getInstance().setOnConnectListener {
|
//连接成功,发送一次心跳
|
sendHeart()
|
}
|
}
|
|
private fun payTheDifference(data: JSONObject?) {
|
data?.let { data ->
|
val topAct = activities[activities.lastIndex] as BaseActivity
|
topAct.lifecycleScope.launchWhenResumed {
|
val orderId = data.optInt("orderId")
|
val money = data.optDouble("money")
|
val tipDialog = TipDialog()
|
tipDialog.arguments = bundleOf(
|
"msg" to topAct.getString(R.string.补差价提示).format(orderId, money),
|
"ok" to topAct.getString(R.string.同意),
|
"cancel" to topAct.getString(R.string.不同意)
|
)
|
tipDialog.setCallback(object : TipDialog.OnClickCallback {
|
override fun onOk() {
|
confirmDifferencePrice(topAct, orderId, money, 2) {
|
getUserInfoWhenPay(topAct, orderId, money)
|
}
|
}
|
|
override fun onCancel() {
|
confirmDifferencePrice(topAct, orderId, money, 3)
|
}
|
})
|
tipDialog.show((topAct).supportFragmentManager, "diff")
|
}
|
}
|
}
|
|
private fun getUserInfoWhenPay(topAct: BaseActivity, orderId: Int, money: Double) {
|
HttpManager.queryUserInfo().request(topAct, showDialog = true) { _, data ->
|
data?.let {
|
val payDialog = PayDialog()
|
payDialog.arguments = bundleOf(
|
"money" to money,
|
"isLogistics" to true,
|
"balance" to it.balance
|
)
|
payDialog.setCallback(object : PayDialog.Callback {
|
override fun onOk(way: Int, couponId: Int, useRed: Boolean) {
|
if (way == 2) {
|
val dialog = ChooseCardDialog()
|
dialog.setCallback(object : StringCallback {
|
override fun onRlt(rlt: String) {
|
pay(topAct, orderId, way, money)
|
}
|
})
|
dialog.show(topAct.supportFragmentManager, "card")
|
} else {
|
pay(topAct, orderId, way, money)
|
}
|
payDialog.dismiss()
|
}
|
|
override fun onClose() {
|
confirmDifferencePrice(topAct, orderId, money, 3)
|
}
|
})
|
payDialog.show(topAct.supportFragmentManager, "pay")
|
}
|
}
|
|
}
|
|
private fun pay(act: BaseActivity, orderId: Int, way: Int, money: Double) {
|
HttpManager.payOrderLogisticsSpread(orderId, way)
|
.request(act, showDialog = true) { _, data ->
|
myToast(getString(R.string.支付成功))
|
}
|
}
|
|
private fun confirmDifferencePrice(
|
act: BaseActivity,
|
orderId: Int,
|
money: Double,
|
state: Int,
|
block: (() -> Unit)? = null
|
) {
|
HttpManager.confirmDifferencePrice(orderId, money, state)
|
.request(act, showDialog = true) { _, _ ->
|
block?.invoke()
|
}
|
}
|
|
private fun sendHeart() {
|
val userId = SPUtils.instance().getInt(Const.User.USER_ID)
|
val token = SPUtils.instance().getString(Const.User.TOKEN)
|
if (userId != -1) {
|
val language = LanguageUtil.getLanguage()
|
val l = RRetrofit.getLanguageType(language)
|
NettyClient.getInstance()
|
.sendMessage("{\"data\":{\"userId\":$userId,\"language\":$l,\"token\":\"$token\",\"type\":1},\"method\":\"PING\",\"code\":200,\"msg\":\"SUCCESS\"}")
|
}
|
}
|
|
fun addTripStateListener(changedListener: OrderStateChangeListener) {
|
listeners.add(changedListener)
|
}
|
|
fun removeTripStateListener(changedListener: OrderStateChangeListener) {
|
listeners.remove(changedListener)
|
}
|
|
fun exit() {
|
activities.forEach {
|
if (it !is MainActivity)
|
it.finish()
|
else {
|
it.resetLogin()
|
}
|
}
|
}
|
|
fun reLaunch() {
|
activities.forEach {
|
it.finish()
|
}
|
val intent = Intent(this, SplashActivity::class.java)
|
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
startActivity(intent)
|
}
|
|
companion object {
|
private val defaultLocation = LatLng(6.833333, -5.25)
|
private var _hadInitLocation = false//是否初始化过定位
|
private var _currentLatLng: LatLng = defaultLocation // 实际定位
|
|
var cityCode = "" //定位城市编码
|
var address = "" //定位地址
|
var chooseCityName = "——" //选择城市
|
var chooseCityLat = 0.0 //选择城市精度
|
var chooseCityLon = 0.0 //选择城市维度
|
var chooseCountry = "" //选择国家代码
|
var intervalCount = 0 //计数器,收到消息时置零;在TripActivity中检测改值:如果6秒钟没收到socket 就调取接口查订单实时状态
|
var emergency = "" //紧急联系人
|
var phone = "" //我的手机号
|
var phoneOperator = "" //手机运营商
|
var phoneService = "" //客服电话号
|
var appContext: IGoApplication? = null
|
var isNotifyEmail = false
|
var hasAutoGoTripping = false //true 本次启动已经自动跳转过
|
var mainActivity: MainActivity? = null
|
var tripId = ""
|
|
//设置定位
|
fun setLocation(latLng: LatLng) {
|
setLocation(latLng.latitude, latLng.longitude)
|
}
|
|
//设置定位
|
fun setLocation(latitude: Double, longitude: Double) {
|
this._currentLatLng = LatLng(latitude, longitude)
|
this._hadInitLocation = true
|
}
|
|
//是否初始化过定位
|
fun hadInitLocation(): Boolean {
|
return _hadInitLocation
|
}
|
|
//获取实际定位
|
fun getCurrentLocation(): LatLng {
|
return _currentLatLng
|
}
|
// var recaptchaClient: RecaptchaClient?=null
|
}
|
|
override fun onActivityPaused(p0: Activity) {
|
}
|
|
override fun onActivityStarted(activity: Activity) {
|
}
|
|
override fun onActivityDestroyed(activity: Activity) {
|
activities.remove(activity)
|
LogHelper.logRecord("onActivityDestroyed: " + activity.javaClass.name)
|
}
|
|
override fun onActivitySaveInstanceState(p0: Activity, p1: Bundle) {
|
}
|
|
override fun onActivityStopped(activity: Activity) {
|
LogHelper.logRecord("onActivityStopped: " + activity.javaClass.name)
|
}
|
|
override fun onActivityCreated(activity: Activity, p1: Bundle?) {
|
activities.add(activity)
|
LogHelper.logRecord("onActivityCreated: " + activity.javaClass.name)
|
if (activity is AppCompatActivity) {
|
activity.supportFragmentManager.registerFragmentLifecycleCallbacks(object :
|
FragmentManager.FragmentLifecycleCallbacks() {
|
override fun onFragmentCreated(
|
fm: FragmentManager,
|
f: Fragment,
|
savedInstanceState: Bundle?
|
) {
|
super.onFragmentCreated(fm, f, savedInstanceState)
|
LogHelper.logRecord("onFragmentCreated: " + f.javaClass.name)
|
}
|
|
override fun onFragmentViewCreated(
|
fm: FragmentManager,
|
f: Fragment,
|
v: View,
|
savedInstanceState: Bundle?
|
) {
|
super.onFragmentViewCreated(fm, f, v, savedInstanceState)
|
LogHelper.logRecord("onFragmentViewCreated: " + f.javaClass.name)
|
}
|
|
override fun onFragmentViewDestroyed(fm: FragmentManager, f: Fragment) {
|
super.onFragmentViewDestroyed(fm, f)
|
LogHelper.logRecord("onFragmentViewDestroyed: " + f.javaClass.name)
|
}
|
|
override fun onFragmentDestroyed(fm: FragmentManager, f: Fragment) {
|
super.onFragmentDestroyed(fm, f)
|
LogHelper.logRecord("onFragmentDestroyed: " + f.javaClass.name)
|
}
|
}, true)
|
}
|
}
|
|
override fun onActivityResumed(activity: Activity) {
|
LogHelper.logRecord("onActivityResumed: " + activity.javaClass.name)
|
}
|
}
|