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.text.TextUtils
|
import android.util.Log
|
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.initLogs
|
import cn.sinata.rxnetty.LogHelper.logRecord
|
import cn.sinata.rxnetty.NettyClient
|
import cn.sinata.xldutils.activity.BaseActivity
|
import cn.sinata.xldutils.application.BaseApplication
|
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.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.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 {
|
private val TAG = "IGoApplication"
|
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
|
// initializeRecaptchaClient()
|
registerActivityLifecycleCallbacks(this)
|
setDefaultLanguage()
|
DownloadLibrary.init(
|
this,
|
resources.getIdentifier("ic_launcher", "mipmap", packageName),
|
null,
|
packageName
|
)
|
initLogs()
|
initNetty()
|
// UMConfigure.init(this, Const.UMENG_KEY, "", UMConfigure.DEVICE_TYPE_PHONE, "")
|
// PlatformConfig.setWeixin(Const.WX_APP_ID, Const.WX_SECRET)
|
// PlatformConfig.setWXFileProvider("com.igo.user.FileProvider")
|
// UMConfigure.setLogEnabled(true)
|
Places.initialize(this, Const.google_key)
|
MapsInitializer.initialize(
|
this, MapsInitializer.Renderer.LATEST
|
) { renderer ->
|
Log.e(Const.GoogleTag, "LATEST renderer:${renderer.name}")
|
// initializeConsumerSdk()
|
}
|
}
|
|
//设置默认语言
|
private fun setDefaultLanguage() {
|
val language = SPUtils.instance().getString("language")
|
if (TextUtils.isEmpty(language)) {
|
SPUtils.instance().put("language", Const.Language.DEFAULT_LANGUAGE).apply()
|
}
|
}
|
|
private fun initNetty() {
|
NettyClient.getInstance().init(this, Apis.SOCKET_SERVER, Apis.SOCKET_PORT, true)
|
NettyClient.getInstance().addOnMessageListener { message ->
|
intervalCount = 0
|
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")
|
order?.let {
|
listeners.forEach {
|
runOnUiThread {
|
it.onStateChanged(
|
order.optInt("orderId"),
|
order.optInt("state")
|
)
|
}
|
}
|
}
|
}
|
|
Const.Method.DIFFERENCE -> {//物流需要补差价
|
Log.e("zmc-socket", "物流需要补差价")
|
payTheDifference(json.optJSONObject("data"))
|
// val order = json.optJSONObject("data")
|
// val data = Gson().fromJson(order.toString(), TrippingInfo::class.java)
|
//
|
// order?.let {
|
// val topAct = activities[activities.lastIndex]
|
// val tipDialog = TipDialog()
|
// tipDialog.arguments = bundleOf(
|
// "msg" to topAct.getString(R.string.补差价提示)
|
// .format(data.orderId, data.money),
|
// "ok" to topAct.getString(R.string.同意),
|
// "cancel" to topAct.getString(R.string.不同意)
|
// )
|
// tipDialog.setCallback(object : TipDialog.OnClickCallback {
|
// override fun onOk() {
|
// HttpManager.confirmDifferencePrice(
|
// data.orderId,
|
// data.money,
|
// 2
|
// ).request(topAct as BaseActivity) { _, _ ->
|
// }
|
// }
|
//
|
// override fun onCancel() {
|
// HttpManager.confirmDifferencePrice(
|
// data.orderId,
|
// data.money,
|
// 3
|
// ).request(topAct as BaseActivity) { _, _ ->
|
// }
|
// }
|
// })
|
// tipDialog.show(
|
// (topAct as BaseActivity).supportFragmentManager,
|
// "diff"
|
// )
|
// }
|
}
|
|
Const.Method.REASSIGN -> {//订单改派
|
val order = json.optJSONObject("data")
|
order?.let {
|
listeners.forEach {
|
runOnUiThread {
|
it.onStateChanged(order.optInt("orderId"), 15)
|
}
|
}
|
}
|
}
|
|
Const.Method.DRIVER_POSITION -> {//司机位置
|
logRecord(
|
TAG,
|
"received DRIVER_POSITION message $json, listeners size ${listeners.size}"
|
)
|
val jb = json.optJSONObject("data")
|
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")
|
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")
|
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]
|
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(lat, lon, 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 -> {//强制下线
|
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 = SPUtils.instance().getString("language")
|
val l = when (language) {
|
Const.Language.CHINESE -> "1"
|
Const.Language.FRENCH -> "3"
|
else -> "2"
|
}
|
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 {
|
val mainActivity = it as MainActivity
|
mainActivity.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 {
|
var lat = 6.833333
|
var lon = -5.25
|
|
var currentLatLng: LatLng = LatLng(lat, lon) // 实际定位 永远不变 上那个会被修改
|
|
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 = ""
|
|
// var recaptchaClient: RecaptchaClient?=null
|
}
|
|
override fun onActivityPaused(p0: Activity) {
|
|
}
|
|
override fun onActivityStarted(activity: Activity) {
|
Log.d("zmc-pageA", "onActivityStarted: " + activity.javaClass.name)
|
}
|
|
override fun onActivityDestroyed(activity: Activity) {
|
activities.remove(activity)
|
Log.d("zmc-pageA", "onActivityDestroyed: " + activity.javaClass.name)
|
}
|
|
override fun onActivitySaveInstanceState(p0: Activity, p1: Bundle) {
|
}
|
|
override fun onActivityStopped(activity: Activity) {
|
Log.e("zmc-pageA", "onActivityStopped: " + activity.javaClass.name)
|
}
|
|
override fun onActivityCreated(activity: Activity, p1: Bundle?) {
|
activities.add(activity)
|
Log.i("zmc-pageA", "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)
|
Log.i("zmc-pageF", "onFragmentCreated: " + f.javaClass.name)
|
}
|
|
override fun onFragmentDestroyed(fm: FragmentManager, f: Fragment) {
|
super.onFragmentDestroyed(fm, f)
|
Log.e("zmc-pageF", "onFragmentDestroyed: " + f.javaClass.name)
|
}
|
}, true)
|
}
|
}
|
|
override fun onActivityResumed(p0: Activity) {
|
}
|
}
|