package com.igo.user.ui import android.Manifest import android.annotation.SuppressLint import android.app.Activity import android.content.Intent import android.graphics.Paint import android.net.Uri import android.os.Build import android.text.Spannable import android.util.Log import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.core.os.bundleOf import androidx.core.view.GravityCompat import androidx.core.view.isVisible import androidx.drawerlayout.widget.DrawerLayout import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentPagerAdapter import androidx.lifecycle.lifecycleScope import androidx.viewpager.widget.PagerAdapter import androidx.viewpager.widget.ViewPager import cn.sinata.rxnetty.LogHelper import cn.sinata.rxnetty.NettyClient import cn.sinata.xldutils.gone import cn.sinata.xldutils.invisible import cn.sinata.xldutils.utils.SPUtils import cn.sinata.xldutils.utils.SpanBuilder import cn.sinata.xldutils.utils.myToast import cn.sinata.xldutils.utils.optInt import cn.sinata.xldutils.utils.showAllowingStateLoss import cn.sinata.xldutils.visible import com.facebook.drawee.view.SimpleDraweeView import com.google.android.gms.maps.CameraUpdateFactory import com.google.android.gms.maps.model.LatLng import com.igo.user.BuildConfig import com.igo.user.IGoApplication import com.igo.user.R import com.igo.user.dialog.AlertDialog import com.igo.user.dialog.BannerDialog import com.igo.user.dialog.TipDialog import com.igo.user.extension.setOnDurationClickListener import com.igo.user.network.HttpManager import com.igo.user.network.entity.Function import com.igo.user.network.entity.UserInfo import com.igo.user.network.request import com.igo.user.ui.HomeActivity.Companion.funcHome import com.igo.user.ui.HomeActivity.Companion.latHome import com.igo.user.ui.HomeActivity.Companion.lonHome import com.igo.user.ui.crosscity.PayCrossActivity import com.igo.user.ui.logistics.LogisticsFragment import com.igo.user.ui.mine.FeedbackActivity import com.igo.user.ui.mine.InvokeListActivity import com.igo.user.ui.mine.MsgActivity import com.igo.user.ui.mine.MyCouponActivity import com.igo.user.ui.mine.OrderActivity import com.igo.user.ui.mine.RedPackageActivity import com.igo.user.ui.mine.SafetyActivity import com.igo.user.ui.mine.ScoreActivity import com.igo.user.ui.mine.ServiceActivity import com.igo.user.ui.mine.SettingActivity import com.igo.user.ui.mine.ShareAppActivity import com.igo.user.ui.mine.UserInfoActivity import com.igo.user.ui.mine.WalletActivity import com.igo.user.ui.trip.MapTripFragment import com.igo.user.ui.trip.OrderDetailActivity import com.igo.user.ui.trip.ScanActivity import com.igo.user.ui.trip.TripActivity import com.igo.user.utils.Const import com.igo.user.utils.google.AMapKit import com.tbruyelle.rxpermissions2.RxPermissions import org.jetbrains.anko.find import org.jetbrains.anko.startActivity import org.jetbrains.anko.startActivityForResult import org.jetbrains.anko.textColor import androidx.core.net.toUri class MainActivity : TransparentStatusBarActivity() { override fun setContentView() = R.layout.activity_main val isOpen by lazy { //当前城市是否开通,false需要强制选择城市 intent.getBooleanExtra("isOpen", false) } private var func = arrayListOf() val lat by lazy { intent.getDoubleExtra("lat", 0.0) } val lon by lazy { intent.getDoubleExtra("lon", 0.0) } private val taxiFragment by lazy { MapTripFragment() } // private val crossCityFragment by lazy { CrossCityFragment() } private val logisticsFragment by lazy { LogisticsFragment() } // private val charterFragment by lazy { CharterFragment() } //起点信息,传递给扫码下单页面 var startLat = 0.0 var startLon = 0.0 var startName = "" var userInfo: UserInfo? = null private val titles = arrayListOf() var phoneEmergency = "" //报警电话 var isTripping = false //是否有进行中的订单,如果没有 拖动地图才查询附近司机数量 private val imguserinto by lazy { find(R.id.imguserinto) } private val iv_mine by lazy { find(R.id.iv_mine) } private val mViewPager by lazy { find(R.id.mViewPager) } private val drawer_main by lazy { find(R.id.drawer_main) } private val tv_score by lazy { find(R.id.tv_score) } private val tv_order by lazy { find(R.id.tv_order) } private val tv_setting by lazy { find(R.id.tv_setting) } private val tv_city by lazy { find(R.id.tv_city) } private val tv_coupon by lazy { find(R.id.tv_coupon) } private val iv_header_home by lazy { find(R.id.iv_header_home) } private val tv_safe by lazy { find(R.id.tv_safe) } private val tv_wallet by lazy { find(R.id.tv_wallet) } private val tv_share by lazy { find(R.id.tv_share) } private val iv_msg by lazy { find(R.id.iv_msg) } private val tv_feed_back by lazy { find(R.id.tv_feed_back) } private val tv_service by lazy { find(R.id.tv_service) } private val iv_scan by lazy { find(R.id.iv_scan) } private val tv_invoice by lazy { find(R.id.tv_invoice) } private val tv_email by lazy { find(R.id.tv_email) } private val tv_tip by lazy { find(R.id.tv_tip) } private val tv_nickname by lazy { find(R.id.tv_nickname) } private val tabView by lazy { find(R.id.tabView) } private val fake_viewpager by lazy { find(R.id.fake_viewpager) } private val line_top by lazy { find(R.id.line_top) } private val iv_unread by lazy { find(R.id.iv_unread) } private val tv_logistics_title by lazy { find(R.id.tv_logistics_title) } private val cl_title by lazy { find(R.id.cl_title) } private val cl_right by lazy { find(R.id.cl_right) } private val tv_red by lazy { find(R.id.tv_red) } private val tabview1 by lazy { find(R.id.tabview1) } private val tabview2 by lazy { find(R.id.tabview2) } override fun initClick() { iv_mine.setOnClickListener { finish() } imguserinto.setOnClickListener { if (checkLogin()) if (!drawer_main.isDrawerOpen(GravityCompat.START)) drawer_main.openDrawer(GravityCompat.START) } tv_score.setOnClickListener { userInfo?.apply { startActivity("score" to integral) } } tv_order.setOnClickListener { startActivity() } tv_setting.setOnClickListener { startActivityForResult(500, "phone" to (userInfo?.phone ?: "")) } tv_city.setOnClickListener { startActivityForResult(501) } iv_header_home.setOnClickListener { userInfo?.let { startActivity( "nickName" to it.nickName, "avatar" to it.avatar, "birthday" to it.birthday, "sex" to it.sex, "mail" to it.email, "firstName" to it.firstName, "lastName" to it.lastName ) } } tv_coupon.setOnClickListener { startActivity() } tv_safe.setOnClickListener { userInfo?.let { startActivity( "state" to it.verified, "emergency" to it.emergencyContact, "phone" to it.emergencyContactNumber, "myPhone" to it.phone ) } } tv_wallet.setOnClickListener { userInfo?.let { startActivity( "balance" to it.balance, "rechargeTotal" to it.rechargeAmountSum ) } } tv_red.setOnClickListener { startActivity() } tv_share.setOnClickListener { startActivity() } iv_msg.setOnClickListener { if (checkLogin()) startActivity() } tv_feed_back.setOnClickListener { startActivity() } tv_service.setOnClickListener { startActivity() } iv_scan.setOnClickListener { if (checkLogin()) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { RxPermissions(this).request(Manifest.permission.CAMERA) } else { RxPermissions(this).request( Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, ) } .subscribe { if (it) startActivity( "startLat" to startLat, "startLon" to startLon, "startName" to startName ) else myToast("请在应用权限页面开启相机权限") } } tv_invoice.setOnClickListener { startActivity() } tv_email.setOnClickListener { // startActivity() myToast("功能开发中") } Log.e("选中下标: ", intent.getIntExtra("pos", 0).toString()) } private val fragments = arrayListOf() override fun initView() { titleBar.gone() tv_city.text = IGoApplication.chooseCityName val i = 0 val t = getString(R.string.当前附近有n辆车可用, i) val stringBuilder = SpanBuilder(t).bold( t.indexOf(i.toString()), t.indexOf(i.toString()) + i.toString().length ) .color( this, t.indexOf(i.toString()), t.indexOf(i.toString()) + i.toString().length, cn.sinata.xldutils.R.color.black ).build() tv_tip.text = stringBuilder tv_tip.isVisible = mViewPager.currentItem != 1 drawer_main.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED) showLocationDescDialog { fragments.clear() func.clear() funcHome.add(Function(1, getString(R.string.专车))) funcHome.add(Function(4, getString(R.string.快件))) IGoApplication.mainActivity = this checkNewVersion() getPhone() getAds() titles.addAll(arrayOf(getString(R.string.专车), getString(R.string.快件))) fragments.add(taxiFragment) fragments.add(logisticsFragment) taxiFragment.callback = { tv_tip.visibility = if (this) View.VISIBLE else View.GONE } mViewPager.adapter = object : FragmentPagerAdapter( supportFragmentManager, BEHAVIOR_SET_USER_VISIBLE_HINT ) { override fun getItem(position: Int) = fragments[position] override fun getCount() = fragments.size override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) { // super.destroyItem(container, position, `object`) } override fun getItemPosition(`object`: Any): Int { return PagerAdapter.POSITION_NONE } } initTab() NettyClient.getInstance().startService() // Facebook散列字符串 // try { // val info = getPackageManager().getPackageInfo( getPackageName(), PackageManager.GET_SIGNATURES) // info.signatures.forEach { // val md = MessageDigest.getInstance("SHA") // md.update(it.toByteArray()) // val encodeToString = Base64.encodeToString(md.digest(), Base64.DEFAULT); // Log.e("mmp",encodeToString) // } // } // catch (e:Exception) { // // } mViewPager.currentItem = intent.getIntExtra("pos", 0).apply { if (this == 0) { iv_scan.visible() tabview1.textColor = getColor(R.color.colorPrimary) tabview2.textColor = getColor(cn.sinata.xldutils.R.color.textColor99) } else { iv_scan.gone() tabview1.textColor = getColor(cn.sinata.xldutils.R.color.textColor99) tabview2.textColor = getColor(R.color.colorPrimary) } if (this == 1) tv_tip.gone() } } } private fun checkNewVersion() { HttpManager.queryNewData().request(this, false) { _, it -> it?.run { if (isFinishing) return@run if (version > BuildConfig.VERSION_NAME && mandatory.isNotEmpty()) { val tipDialog = TipDialog() tipDialog.arguments = bundleOf( "title" to getString(R.string.新版本更新), "msg" to content, "ok" to getString(R.string.确定), "isAlert" to true ) tipDialog.setCallback(object : TipDialog.OnClickCallback { override fun onOk() { val intent = Intent() intent.action = "android.intent.action.VIEW" intent.data = url.toUri() startActivity(intent) } override fun onCancel() { } }) tipDialog.setDismissCallback(object : TipDialog.OnDismiss { override fun onDismiss() { if (isMustUpgrade()) { closeAll() } else { finish() } } }) tipDialog.show(supportFragmentManager, "update") } } } } private fun showAlert() { val tipDialog = AlertDialog() tipDialog.setDismissCallback(object : AlertDialog.OnDismiss { override fun onDismiss() { startActivityForResult(501) } }) tipDialog.show(supportFragmentManager, "city") } var istaxi = true private fun initTab() { tabview1.setOnClickListener { istaxi = true updateTip(0) mViewPager.currentItem = 0 iv_scan.visible() taxiFragment.changeType(Const.OrderType.TYPE_SPECIAL) tabview1.textColor = getColor(R.color.colorPrimary) tabview2.textColor = getColor(cn.sinata.xldutils.R.color.textColor99) } tabview2.setOnClickListener { istaxi = false updateTip(1) mViewPager.currentItem = 1 iv_scan.gone() logisticsFragment.changeType(Const.OrderType.TYPE_SAME_CITY) tabview2.textColor = getColor(R.color.colorPrimary) tabview1.textColor = getColor(cn.sinata.xldutils.R.color.textColor99) } if (func.isEmpty()) return if (fragments[0] is MapTripFragment) taxiFragment.type = func[0].id else { line_top.visible() if (fragments[0] is LogisticsFragment) logisticsFragment.type = func[0].id } mViewPager.offscreenPageLimit = 2 } private fun getPhone() { val currentLocation = IGoApplication.getCurrentLocation() HttpManager.getPhone(currentLocation.latitude, currentLocation.longitude) .request(this, false) { _, data -> data?.forEach { if (it.type == 1) phoneEmergency = it.phone else if (it.type == 2) IGoApplication.phoneService = it.phone } } } /** * 查询是否有进行中的订单 */ fun queryTripping() { HttpManager.queryServingOrder().request(this, false) { _, data -> data?.let { if (isFinishing) return@let if (it.isEmpty()) { isTripping = false if (fragments.contains(taxiFragment)) taxiFragment.getDriverNum() tv_tip.setOnClickListener(null) getTripId() } else { val order = data[0] if (order.state in (1..5) || order.state == 11) { IGoApplication.tripId = order.tripId } else { getTripId() } isTripping = true tv_tip.text = getString(R.string.您有一笔订单正进行中) tv_tip.isVisible = mViewPager.currentItem != 1 Log.e("当前订单详情: ", "order.state ${order.state}") Log.e("当前订单详情: ", "order.orderType ${order.orderType}") tv_tip.setOnDurationClickListener { if (tv_tip.alpha != 0f) { if (order.state in (1..5) || order.state == 11) { LogHelper.logRecord("有正在处理的订单state:${order.state} orderId:${order.orderId} orderType:${order.orderType}") startActivity( "id" to order.orderId, "type" to order.orderType ) } else if (order.state == 7 && order.orderType == Const.OrderType.TYPE_CROSS_CITY) { startActivity("id" to order.orderId) } else startActivity( "id" to order.orderId, "type" to order.orderType ) } } if (!IGoApplication.hasAutoGoTripping) { tv_tip.performClick() IGoApplication.hasAutoGoTripping = true } } } } } private fun queryUserInfo() { HttpManager.queryUserInfo().request(this) { _, data -> userInfo = data data?.run { SPUtils.instance().put(Const.User.PHONE, phone).apply() iv_header_home.setImageURI(avatar) tv_nickname.text = nickName tv_score.text = getString(R.string.当前积分, if (integral.isEmpty()) "0" else integral) tv_score.paintFlags = tv_score.paintFlags or Paint.UNDERLINE_TEXT_FLAG IGoApplication.emergency = emergencyContactNumber IGoApplication.phone = phone IGoApplication.phoneOperator = phoneOperator if (isOpen && func.isNotEmpty() && (firstName.isEmpty() || lastName.isEmpty()) && !IGoApplication.isNotifyEmail) { IGoApplication.isNotifyEmail = true //只提醒一次 val tipDialog = TipDialog() tipDialog.arguments = bundleOf( "msg" to getString(R.string.请完善你的姓名), "ok" to getString(R.string.前往), "cancel" to getString(R.string.取消), "isNotifyRed" to true ) tipDialog.setCallback(object : TipDialog.OnClickCallback { override fun onOk() { startActivity( "nickName" to nickName, "avatar" to avatar, "birthday" to birthday, "sex" to sex, "mail" to email, "firstName" to firstName, "lastName" to lastName ) } override fun onCancel() { } }) tipDialog.showAllowingStateLoss(supportFragmentManager, "email") } } } } private fun queryUnReadNum() { HttpManager.queryUnReadNum().request(this, false) { _, data -> data?.run { iv_unread.visibility = if (optInt("number") > 0) View.VISIBLE else View.GONE } } } private fun updateTip(orderType: Int) { if (orderType > 0) tv_tip.gone() else tv_tip.visible() } fun updateLogisticsTitle(show: Boolean) { tv_logistics_title.visibility = if (show) View.VISIBLE else View.GONE } fun updateTabVisibility(show: Boolean) { tabView.visibility = if (show) View.VISIBLE else View.GONE } fun updateTipAlpha(f: Float) { tv_tip.alpha = f } fun updateTipText(t: Spannable) { tv_tip.text = t tv_tip.isVisible = mViewPager.currentItem != 1 } /** * @param isHide true:广告上滑消失 false:下滑显示 * @param isChange true:确认订单步骤隐藏 false:返回上一步显示 */ fun updateTitleVisibility(isHide: Boolean, isChange: Boolean) { cl_title.visibility = if (isHide) View.GONE else View.VISIBLE if (isChange) { tv_city.invisible() cl_right.gone() iv_mine.isSelected = true } else { tv_city.visible() cl_right.visible() iv_mine.isSelected = false } } ///显示定位描述弹窗 private fun showLocationDescDialog(sureCallback: () -> Unit) { val rxPermissions = RxPermissions(this); if (!rxPermissions.isGranted(Manifest.permission.ACCESS_FINE_LOCATION)) { val tipDialog = TipDialog() tipDialog.arguments = bundleOf( "msg" to getString(R.string.定位权限说明), "ok" to getString(R.string.ok), "cancel" to getString(R.string.取消) ) tipDialog.setCallback(object : TipDialog.OnClickCallback { @SuppressLint("CheckResult") override fun onOk() { rxPermissions.request( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION ).subscribe { if (it) { sureCallback.invoke() } else { myToast(getString(R.string.没有权限)) finish() } } } override fun onCancel() { finish() } }) tipDialog.isCancelable = false tipDialog.show(supportFragmentManager, "locationDesc") } else { sureCallback.invoke() } } //获取广告 private fun getAds() { if (!isOpen) { return } if (lat != 0.0 && lon != 0.0) { getAds(lat, lon) } else { initLocation { getAds(it.latitude, it.longitude) } } } //获取广告 private fun getAds(latitude: Double, longitude: Double) { HttpManager.getAds(1, latitude.toString(), longitude.toString()).request(this) { _, data -> data?.let { if (it.isNotEmpty()) { val bannerDialog = BannerDialog() bannerDialog.arguments = bundleOf("data" to it) bannerDialog.showAllowingStateLoss(supportFragmentManager, "banner") } } } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == 500 && resultCode == Activity.RESULT_OK) { resetLogin() if (data?.getBooleanExtra("toLogin", false) == true) gotoLogin() } else if (requestCode == 501) {//选择城市 if (resultCode == Activity.RESULT_OK && data != null) { tv_city.text = IGoApplication.chooseCityName IGoApplication.setLocation( data.getDoubleExtra("lat", 0.0), data.getDoubleExtra("lon", 0.0) ) lifecycleScope.launchWhenResumed { taxiFragment.aMap?.moveCamera( CameraUpdateFactory.newLatLng(IGoApplication.getCurrentLocation()) ) } } else if (!isOpen || func.isEmpty()) { if (IGoApplication.chooseCityName == "——") showAlert() } } } /** * 恢复未登录状态 */ fun resetLogin() { drawer_main.closeDrawer(GravityCompat.START) isTripping = false if (fragments.contains(taxiFragment)) taxiFragment.getDriverNum() } override fun onResume() { super.onResume() refreshInfo() } fun getTripId() { HttpManager.getNewTripId().request(this, false) { _, data -> IGoApplication.tripId = data ?: "" } } fun refreshInfo() { if (checkLogin(false)) { queryTripping() queryUserInfo() queryUnReadNum() } } //初始化定位 private fun initLocation(block: (LatLng) -> Unit) { if (!IGoApplication.hadInitLocation()) { AMapKit.initLocation(this, success = { val latLng = it.latLng if (latLng == null) { LogHelper.logRecord("定位失败") return@initLocation } latHome = latLng.latitude lonHome = latLng.longitude LogHelper.logRecord("定位成功:latitude=${latLng.latitude} longitude=${latLng.longitude}") IGoApplication.setLocation(latLng) block.invoke(latLng) }) { LogHelper.logRecord("定位失败") } return } block.invoke(IGoApplication.getCurrentLocation()) } }