package com.fuban.user
|
|
import android.app.Activity
|
import android.app.Application
|
import android.os.Bundle
|
import androidx.core.os.bundleOf
|
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.gson.Gson
|
import com.fuban.user.interfaces.OrderStateChangeListener
|
import com.fuban.user.network.Apis
|
import com.fuban.user.network.HttpManager
|
import com.fuban.user.network.entity.TrippingInfo
|
import com.fuban.user.network.request
|
import com.fuban.user.ui.MainActivity
|
import com.fuban.user.dialog.TipDialog
|
import com.fuban.user.ui.login.LoginActivity
|
import com.fuban.user.ui.trip.TripActivity
|
import com.fuban.user.utils.Const
|
import com.sinata.download.DownloadLibrary
|
import com.umeng.commonsdk.UMConfigure
|
import com.umeng.socialize.PlatformConfig
|
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.lang.Exception
|
import java.util.concurrent.TimeUnit
|
|
class FBApplication :BaseApplication(), Application.ActivityLifecycleCallbacks {
|
override fun getSPName() = "OkSp"
|
private var heartSubscribe: Disposable? = null
|
private val listeners = ArrayList<OrderStateChangeListener>()
|
private val activities = ArrayList<Activity>()
|
override fun onCreate() {
|
super.onCreate()
|
registerActivityLifecycleCallbacks(this)
|
DownloadLibrary.init(this, resources.getIdentifier("ic_launcher", "mipmap", packageName),null, packageName)
|
// initNetty()
|
// UMConfigure.init(this, Const.UMENG_KEY, "", UMConfigure.DEVICE_TYPE_PHONE, "")
|
// PlatformConfig.setWeixin(Const.WX_APP_ID, Const.WX_SECRET)
|
}
|
|
fun initUm(){
|
UMConfigure.init(this, Const.UMENG_KEY, "", UMConfigure.DEVICE_TYPE_PHONE, "")
|
PlatformConfig.setWeixin(Const.WX_APP_ID, Const.WX_SECRET)
|
PlatformConfig.setQQZone(Const.QQ_APP_ID, Const.QQ_SECRET)
|
initNetty()
|
}
|
|
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 (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.REASSIGN -> {//订单改派
|
val order = json.optJSONObject("data")
|
order?.let {
|
listeners.forEach {
|
runOnUiThread {
|
it.onStateChanged(order.optInt("orderId"),15)
|
}
|
}
|
}
|
}
|
Const.Method.DRIVER_POSITION -> {//司机位置
|
val jb = json.optJSONObject("data")
|
jb?.let {
|
val data = Gson().fromJson(jb.toString(), TrippingInfo::class.java)
|
listeners.forEach {
|
runOnUiThread {
|
it.onTrippingChanged(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 "附近暂无司机接单,您是否继续等待?","ok" to "继续等待","cancel" to "取消订单")
|
tipDialog.setCallback(object :TipDialog.OnClickCallback{
|
override fun onOk() {
|
|
}
|
|
override fun onCancel() {
|
HttpManager.cancelOrder(id,type).request(topAct as BaseActivity){ _, _->
|
myToast("取消成功")
|
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 "您的账号已在其他地方登陆,请重新登陆","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 sendHeart() {
|
val userId = SPUtils.instance().getInt(Const.User.USER_ID)
|
val token = SPUtils.instance().getString(Const.User.TOKEN)
|
if (userId != -1) {
|
NettyClient.getInstance()
|
.sendMessage("{\"data\":{\"userId\":$userId,\"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()
|
}
|
}
|
}
|
|
companion object{
|
var lat = 0.0
|
var lon = 0.0
|
var cityName = "" //定位城市
|
var cityCode = "" //定位城市编码
|
var address = "" //定位地址
|
var chooseCityCode = "" //
|
var chooseCityName = "未选择" //选择城市
|
var intervalCount = 0 //计数器,收到消息时置零;在TripActivity中检测改值:如果6秒钟没收到socket 就调取接口查订单实时状态
|
var emergency = "" //紧急联系人
|
var phone = "" //我的手机号
|
var phoneService = "" //客服电话号
|
}
|
|
override fun onActivityPaused(p0: Activity) {
|
|
}
|
|
override fun onActivityStarted(p0: Activity) {
|
}
|
|
override fun onActivityDestroyed(p0: Activity) {
|
activities.remove(p0)
|
}
|
|
override fun onActivitySaveInstanceState(p0: Activity, p1: Bundle) {
|
}
|
|
override fun onActivityStopped(p0: Activity) {
|
}
|
|
override fun onActivityCreated(p0: Activity, p1: Bundle?) {
|
activities.add(p0)
|
}
|
|
override fun onActivityResumed(p0: Activity) {
|
}
|
}
|