diff --git a/app/src/main/java/com/cheng/bole/bean/BidItemBean.kt b/app/src/main/java/com/cheng/bole/bean/BidItemBean.kt index 38a63a8..2babb78 100644 --- a/app/src/main/java/com/cheng/bole/bean/BidItemBean.kt +++ b/app/src/main/java/com/cheng/bole/bean/BidItemBean.kt @@ -1,7 +1,5 @@ package com.cheng.bole.bean -import android.graphics.Color - data class BidItemBean( val id: String, val recommend_id: String, //订阅消息 diff --git a/app/src/main/java/com/cheng/bole/bean/ContactsInfoBean.kt b/app/src/main/java/com/cheng/bole/bean/ContactsInfoBean.kt index 82d2cfc..d894d3f 100644 --- a/app/src/main/java/com/cheng/bole/bean/ContactsInfoBean.kt +++ b/app/src/main/java/com/cheng/bole/bean/ContactsInfoBean.kt @@ -1,6 +1,5 @@ package com.cheng.bole.bean -import android.R import java.io.Serializable class ContactsInfoBean( diff --git a/app/src/main/java/com/cheng/bole/bean/OrderBean.kt b/app/src/main/java/com/cheng/bole/bean/OrderBean.kt new file mode 100644 index 0000000..657e1d6 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/bean/OrderBean.kt @@ -0,0 +1,28 @@ +package com.cheng.bole.bean + +import java.io.Serializable + +data class OrderBean( + val create_time: String, + val goods_name: String, + val id: String, + val invoice_major: Boolean, + val invoice_status: String, + val out_trade_no: String, + val pay_params: String, + val pay_time: String, + val pay_type: String, + val status: String, + val total_fee: String +):Serializable { + data class TransInfo( + val accountName: String, + val accountNo: String, + val appId: String, + val bankName: String, + val bankNo: String, + val orderId: String, + val outTradeNo: String, + val unifyOrderId: String + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/bean/VipGoodsEntity.kt b/app/src/main/java/com/cheng/bole/bean/VipGoodsEntity.kt index 3bba959..5c39722 100644 --- a/app/src/main/java/com/cheng/bole/bean/VipGoodsEntity.kt +++ b/app/src/main/java/com/cheng/bole/bean/VipGoodsEntity.kt @@ -1,6 +1,8 @@ package com.cheng.bole.bean -class VipGoodsEntity { +import java.io.Serializable + +class VipGoodsEntity: Serializable { var checked: Boolean = false var goods_id: String = "" var goods_name: String = "" diff --git a/app/src/main/java/com/cheng/bole/common/EventConstants.kt b/app/src/main/java/com/cheng/bole/common/EventConstants.kt index bd211ee..b6988c6 100644 --- a/app/src/main/java/com/cheng/bole/common/EventConstants.kt +++ b/app/src/main/java/com/cheng/bole/common/EventConstants.kt @@ -66,6 +66,10 @@ object EventConstants { const val JUMP_TO_MESSAGE = "client.jump.to.message" //跳转到消息页 + const val JUMP_TO_AUTH = "client.jump.to.auth" //跳转到企业认证 + + const val JUMP_TO_SEAT_MANAGE = "client.jump.to.seat.manage" //跳转到席位管理 + const val JUMP_TO_FEEDBACK = "client.jump.to.feedback" //跳转到意见反馈 const val JUMP_TO_SERVICE = "client.jump.to.service" //跳转到联系客服 diff --git a/app/src/main/java/com/cheng/bole/event/CompanyAuthEvent.kt b/app/src/main/java/com/cheng/bole/event/CompanyAuthEvent.kt new file mode 100644 index 0000000..48e922d --- /dev/null +++ b/app/src/main/java/com/cheng/bole/event/CompanyAuthEvent.kt @@ -0,0 +1,4 @@ +package com.cheng.bole.event + +class CompanyAuthEvent { +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/event/OrderEvent.kt b/app/src/main/java/com/cheng/bole/event/OrderEvent.kt new file mode 100644 index 0000000..c508bd1 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/event/OrderEvent.kt @@ -0,0 +1,4 @@ +package com.cheng.bole.event + +class OrderEvent { +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/manager/ContactsManager.kt b/app/src/main/java/com/cheng/bole/manager/ContactsManager.kt index 818e482..5987506 100644 --- a/app/src/main/java/com/cheng/bole/manager/ContactsManager.kt +++ b/app/src/main/java/com/cheng/bole/manager/ContactsManager.kt @@ -1,6 +1,5 @@ package com.cheng.bole.manager -import android.R import android.text.TextUtils import com.cheng.bole.bean.ContactsInfoBean import com.example.base.utils.MMKVUtils @@ -15,6 +14,17 @@ object ContactsManager { MMKVUtils.put("contacts_list", Gson().toJson(list)) } + fun update(contacts: ContactsInfoBean) { + val list = all() + val oldContacts = list.find { it.id == contacts.id } + if (oldContacts != null) { + val index = list.indexOf(oldContacts) + list.removeAt(index) + list.add(index, contacts) + } + MMKVUtils.put("contacts_list", Gson().toJson(list)) + } + fun delete(id: String) { val list = all() val contacts = list.find { it.id == id } diff --git a/app/src/main/java/com/cheng/bole/net/ApiService.kt b/app/src/main/java/com/cheng/bole/net/ApiService.kt index 9845748..9c18049 100644 --- a/app/src/main/java/com/cheng/bole/net/ApiService.kt +++ b/app/src/main/java/com/cheng/bole/net/ApiService.kt @@ -13,6 +13,7 @@ import com.cheng.bole.bean.GuideUpdateInfoBean import com.cheng.bole.bean.HotWordBean import com.cheng.bole.bean.LoginEntity import com.cheng.bole.bean.MerchantGoodsBean +import com.cheng.bole.bean.OrderBean import com.cheng.bole.bean.OrderPayEntity import com.cheng.bole.bean.ZZDBInfoBean import com.cheng.bole.bean.SeatItemBean @@ -170,6 +171,24 @@ interface ApiService { @POST("/api/order") suspend fun payCreateOrder(@Body requestBody: RequestBody): HttpBaseResult + /** + * 订单列表查询 + */ + @GET("/api/order") + suspend fun getOrderList(@Query("status") status: String): HttpBaseResult> + + /** + * 订单查询 + */ + @GET("/api/order") + suspend fun getOrderInfo(@Query("order_id") orderId: String): HttpBaseResult + + /** + * 更新订单 + */ + @PUT("/api/order") + suspend fun updateOrder(@Body requestBody: RequestBody): HttpBaseResult + /** * 权限验证 */ diff --git a/app/src/main/java/com/cheng/bole/net/RequestHeaderInterceptor.kt b/app/src/main/java/com/cheng/bole/net/RequestHeaderInterceptor.kt index 07e790e..92b0132 100644 --- a/app/src/main/java/com/cheng/bole/net/RequestHeaderInterceptor.kt +++ b/app/src/main/java/com/cheng/bole/net/RequestHeaderInterceptor.kt @@ -27,7 +27,7 @@ class RequestHeaderInterceptor : Interceptor { .addHeader("x-mobile-brand", android.os.Build.BRAND) .addHeader("x-mobile-model", android.os.Build.MODEL) .addHeader("x-base-version", AppUtils.getAppVersionName()) - .addHeader("x-channel", "jk_${ChannelUtils.getChannel()}") + .addHeader("x-channel", "bole_${ChannelUtils.getChannel()}") .addHeader("x-click-id", UserConfigManager.getBDVID()) .addHeader("x-app-id", Constants.APP_ID) .addHeader("x-package", BuildConfig.APPLICATION_ID) @@ -40,7 +40,7 @@ class RequestHeaderInterceptor : Interceptor { stringBuilder.append("x-mobile-brand = ${android.os.Build.BRAND}\n") stringBuilder.append("x-mobile-model = ${android.os.Build.MODEL}\n") stringBuilder.append("x-base-version = ${AppUtils.getAppVersionName()}\n") - stringBuilder.append("x-channel = jk_${ChannelUtils.getChannel()}\n") + stringBuilder.append("x-channel = bole_${ChannelUtils.getChannel()}\n") stringBuilder.append("x-click-id = ${UserConfigManager.getBDVID()}\n") stringBuilder.append("x-package = ${BuildConfig.APPLICATION_ID}\n") stringBuilder.append("-------------header end-------------") diff --git a/app/src/main/java/com/cheng/bole/ui/dialog/AccountListDialog.kt b/app/src/main/java/com/cheng/bole/ui/dialog/AccountListDialog.kt index b9b9756..b75ef98 100644 --- a/app/src/main/java/com/cheng/bole/ui/dialog/AccountListDialog.kt +++ b/app/src/main/java/com/cheng/bole/ui/dialog/AccountListDialog.kt @@ -18,6 +18,7 @@ import com.example.base.utils.ScreenUtils import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.cheng.bole.R +import com.cheng.bole.bean.AccountEntity import com.cheng.bole.common.Constants import com.cheng.bole.databinding.DialogAccountListBinding import com.cheng.bole.manager.DialogEnum @@ -57,7 +58,7 @@ class AccountListDialog : DialogFragment() { val listStr = arguments?.getString("list") if (!TextUtils.isEmpty(listStr)) { - val list = Gson().fromJson>(listStr, object : TypeToken>(){}.type) + val list = Gson().fromJson>(listStr, object : TypeToken>(){}.type) mAdapter.setList(list) } @@ -80,7 +81,7 @@ class AccountListDialog : DialogFragment() { } companion object { - fun newInstance(list: List, btnText: String? = null): AccountListDialog { + fun newInstance(list: List, btnText: String? = null): AccountListDialog { val arg = Bundle() arg.putString("list", Gson().toJson(list)) arg.putString("btnText", btnText) @@ -90,14 +91,18 @@ class AccountListDialog : DialogFragment() { } } - class AccountAdapter: BaseQuickAdapter(R.layout.listitem_account_login_tip) { - override fun convert(holder: BaseViewHolder, item: com.cheng.bole.bean.AccountEntity) { + class AccountAdapter: BaseQuickAdapter(R.layout.listitem_account_login_tip) { + override fun convert(holder: BaseViewHolder, item: AccountEntity) { if (item.vip_type == "1") { holder.setGone(R.id.iv_vip_tag, true) } else if (item.vip_type == "2" || item.vip_type == "3") { holder.setImageResource(R.id.iv_vip_tag, if (item.vip_type == "2") R.mipmap.ic_vip_tag1 else R.mipmap.ic_vip_tag2) holder.setGone(R.id.iv_vip_tag, false) + } else if (item.vip_type == "12" || item.vip_type == "11") { + holder.setImageResource(R.id.iv_vip_tag, if (item.vip_type == "12") R.mipmap.ic_vip_tag3 else R.mipmap.ic_vip_tag4) + holder.setGone(R.id.iv_vip_tag, false) } + holder.setText(R.id.tv_username, item.name) holder.setText(R.id.tv_create_time, "${item.create_time} 注册") holder.setGone(R.id.iv_bind_wx, !item.bind.contains("weixin")) diff --git a/app/src/main/java/com/cheng/bole/ui/dialog/BindPhoneDialog.kt b/app/src/main/java/com/cheng/bole/ui/dialog/BindPhoneDialog.kt index af9fac0..f988b5d 100644 --- a/app/src/main/java/com/cheng/bole/ui/dialog/BindPhoneDialog.kt +++ b/app/src/main/java/com/cheng/bole/ui/dialog/BindPhoneDialog.kt @@ -18,6 +18,7 @@ import com.example.base.extensions.toast import com.example.base.utils.RegexUtils import com.example.base.utils.ScreenUtils import com.cheng.bole.R +import com.cheng.bole.common.Constants import com.cheng.bole.databinding.DialogBindPhoneBinding import com.cheng.bole.impl.TextWatcherImpl import com.cheng.bole.utils.KeyboardUtils @@ -62,6 +63,8 @@ class BindPhoneDialog : DialogFragment(), KeyboardUtils.OnSoftInputChangedListen binding = DialogBindPhoneBinding.bind(view) + binding.tvTitle.typeface = Constants.douyinsansB + binding.etPhone.addTextChangedListener(textWatcher) binding.ivClose.onClick { diff --git a/app/src/main/java/com/cheng/bole/ui/dialog/BuySeatDialog.kt b/app/src/main/java/com/cheng/bole/ui/dialog/BuySeatDialog.kt new file mode 100644 index 0000000..09afe46 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/dialog/BuySeatDialog.kt @@ -0,0 +1,298 @@ +package com.cheng.bole.ui.dialog + +import android.annotation.SuppressLint +import android.app.Dialog +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Build +import android.os.Bundle +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.fragment.app.DialogFragment +import androidx.lifecycle.lifecycleScope +import com.cheng.bole.R +import com.cheng.bole.bean.OrderPayEntity +import com.cheng.bole.bean.VipGoodsEntity +import com.cheng.bole.common.Constants +import com.cheng.bole.common.EventConstants +import com.cheng.bole.databinding.DialogBuySeatBinding +import com.cheng.bole.event.PayStatusEnum +import com.cheng.bole.event.PayStatusEvent +import com.cheng.bole.event.PaySuccessEvent +import com.cheng.bole.manager.EventReportManager +import com.cheng.bole.manager.LoginManager +import com.cheng.bole.manager.UserConfigManager +import com.cheng.bole.net.ApiFactory +import com.cheng.bole.utils.pay.PayUtils +import com.example.base.common.RxBus +import com.example.base.dialog.LoadingDialog +import com.example.base.extensions.gone +import com.example.base.extensions.onClick +import com.example.base.extensions.toast +import com.example.base.extensions.visible +import com.example.base.utils.L +import com.example.base.utils.ScreenUtils +import com.example.base.utils.SpanUtils +import com.google.gson.Gson +import com.google.gson.JsonObject +import com.tencent.mm.opensdk.openapi.IWXAPI +import com.tencent.mm.opensdk.openapi.WXAPIFactory +import io.reactivex.disposables.Disposable +import kotlinx.coroutines.launch +import okhttp3.RequestBody.Companion.toRequestBody +import java.text.DecimalFormat + +class BuySeatDialog : DialogFragment() { + private lateinit var api: IWXAPI + + private var payType = 0 // 0 微信 1 支付宝 + + private var goodsEntity: VipGoodsEntity? = null + private var orderEntity: OrderPayEntity? = null + + private var count = 1 + private var totalPrice = 0f + + private val loadingDialog by lazy { LoadingDialog(requireContext()) } + + private var payStatusDisposable: Disposable? = null + + private var mOnBackListener: (() -> Unit)? = null //回调事件 + + private lateinit var binding: DialogBuySeatBinding + + override fun onStart() { + super.onStart() + val window = dialog?.window + val windowParams = window?.attributes + windowParams?.dimAmount = 0.7f + windowParams?.width = ScreenUtils.getWindowSize().x + windowParams?.gravity = Gravity.BOTTOM + windowParams?.windowAnimations = R.style.dialog_bottom + dialog?.window?.attributes = windowParams + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + return super.onCreateView(inflater, container, savedInstanceState) + } + + @SuppressLint("NotifyDataSetChanged") + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val view = layoutInflater.inflate(R.layout.dialog_buy_seat, null) + + binding = DialogBuySeatBinding.bind(view) + + initView() + initListener() + initObserver() + initData() + + val dialog = Dialog(requireContext()) + dialog.setContentView(view) + return dialog + } + + private fun initView() { + binding.tvTitle.typeface = Constants.douyinsansB + binding.tvPrice.typeface = Constants.dDIN_PRO_M + binding.tvCount.typeface = Constants.dDIN_PRO_M + } + + @SuppressLint("SetTextI18n") + private fun initData() { + api = WXAPIFactory.createWXAPI(requireContext(), Constants.WechatAppId) + + goodsEntity = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + arguments?.getSerializable("goods", VipGoodsEntity::class.java) + } else { + arguments?.getSerializable("goods") as? VipGoodsEntity + } + if (goodsEntity != null) { + binding.tvName.text = goodsEntity!!.goods_name + SpanUtils.with(binding.tvOriginPrice) + .append("原价:${DecimalFormat("0.##").format(goodsEntity!!.origin_price.toFloat())}元/个") + .setStrikethrough() + .create() + totalPrice = goodsEntity!!.price.toFloat() + binding.tvPrice.text = "¥${DecimalFormat("0.##").format(totalPrice)}" + releasePayType() + } + } + + @SuppressLint("SetTextI18n") + private fun initListener() { + binding.ivClose.onClick { dismiss() } + + binding.ivAdd.onClick { + count++ + binding.tvCount.text = "$count" + totalPrice = goodsEntity!!.price.toFloat() * count + binding.tvPrice.text = "¥${DecimalFormat("0.##").format(totalPrice)}" + binding.ivSubtract.setImageResource(R.mipmap.ic_subtract_count_enable) + } + + binding.ivSubtract.onClick { + if (count > 1) { + count-- + binding.tvCount.text = "$count" + totalPrice = goodsEntity!!.price.toFloat() * count + binding.tvPrice.text = "¥${DecimalFormat("0.##").format(totalPrice)}" + binding.ivSubtract.setImageResource(if (count > 1) R.mipmap.ic_subtract_count_enable else R.mipmap.ic_subtract_count_disable) + } + } + + binding.tvWxPay.onClick { + payType = 0 + checkPayType() + } + + binding.tvAliPay.onClick { + payType = 1 + checkPayType() + } + + binding.btnPay.onClick { + if (goodsEntity == null) return@onClick + if (!UserConfigManager.getNoLoginPay() && !LoginManager.isLogin()) { + toast("请登录后支付") + return@onClick + } + if (payType == 0 && !api.isWXAppInstalled) { + toast("您没有安装微信客户端,请先下载安装") + return@onClick + } + if (payType == 0) { + payCreateOrder("weixin") + } else if (payType == 1) { + payCreateOrder("alipay") + } + EventReportManager.eventReport( + EventConstants.PAY_PAY, + if (payType == 0) "weixin" else "alipay", + Gson().toJson(goodsEntity) + ) + } + } + + private fun initObserver() { + payStatusDisposable = RxBus.defaultInstance.toObservable(PayStatusEvent::class.java).subscribe { + when (it.payStatus) { + PayStatusEnum.PAY_SUCCESS -> { + toast("支付成功") + EventReportManager.eventReport( + EventConstants.PAY_SUCCESS, + if (payType == 0) "weixin" else "alipay", + "{orderId:${orderEntity?.orderId}, meal:${Gson().toJson(goodsEntity)}}" + ) + RxBus.defaultInstance.post(PaySuccessEvent()) + } + + PayStatusEnum.PAY_CANCEL -> { + toast("已取消支付") + EventReportManager.eventReport(EventConstants.PAY_CANCEL, if (payType == 0) "weixin" else "alipay", "{orderId:${orderEntity?.orderId}") + } + + else -> { + toast("已取消支付") + EventReportManager.eventReport(if (payType == 0) EventConstants.ERROR_CLIENT_WXPAY_ERR else EventConstants.ERROR_CLIENT_ALIPAY_ERR, "{orderId:${orderEntity?.orderId}", it.message) + } + } + } + } + + private fun payCreateOrder(payType: String) { + loadingDialog.show() + lifecycleScope.launch { + try { + val json = JsonObject() + json.addProperty("goods_id", goodsEntity!!.goods_id) + json.addProperty("pay_type", payType) + json.addProperty("source", "corp") + json.addProperty("pay_source", "app") + val extra = JsonObject() + extra.addProperty("add_corp_limit", "$count") + json.add("extra", extra) + + val response = ApiFactory.apiService.payCreateOrder(json.toString().toRequestBody()) + if (response.status) { + orderEntity = response.data + if (this@BuySeatDialog.payType == 0) { + PayUtils.toWXPay(requireActivity(), response.data) + } else if (this@BuySeatDialog.payType == 1) { + PayUtils.toAliPay(requireActivity(), response.data.payParam, "") + } + } else toast(response.message, true) + loadingDialog.dismiss() + } catch (e: Exception) { + loadingDialog.dismiss() + L.d(e) + } + } + } + + private fun releasePayType() { + val list = goodsEntity?.pay_type?.split(",")?.map { it.trim() }?.toList() + if (list?.find { it == "alipay" } != null) { + binding.tvAliPay.visible() + } else { + binding.tvAliPay.gone() + } + if (list?.find { it == "weixin" } != null) { + binding.tvWxPay.visible() + } else { + binding.tvWxPay.gone() + } + + if (goodsEntity?.pay_type!!.startsWith("weixin")) { + payType = 0 + } + if (goodsEntity?.pay_type!!.startsWith("alipay")) { + payType = 1 + } + + checkPayType() + } + + private fun checkPayType() { + if (payType == 0) { + val start1 = ContextCompat.getDrawable(requireContext(), R.mipmap.ic_wx_pay) + val end1 = ContextCompat.getDrawable(requireContext(), R.mipmap.ic_pay_checked3) + binding.tvWxPay.setCompoundDrawablesRelativeWithIntrinsicBounds(start1, null, end1, null) + + val start2 = ContextCompat.getDrawable(requireContext(), R.mipmap.ic_ali_pay) + val end2 = ContextCompat.getDrawable(requireContext(), R.mipmap.ic_pay_default3) + binding.tvAliPay.setCompoundDrawablesRelativeWithIntrinsicBounds(start2, null, end2, null) + } else if (payType == 1) { + val start1 = ContextCompat.getDrawable(requireContext(), R.mipmap.ic_ali_pay) + val end1 = ContextCompat.getDrawable(requireContext(), R.mipmap.ic_pay_checked3) + binding.tvAliPay.setCompoundDrawablesRelativeWithIntrinsicBounds(start1, null, end1, null) + + val start2 = ContextCompat.getDrawable(requireContext(), R.mipmap.ic_wx_pay) + val end2 = ContextCompat.getDrawable(requireContext(), R.mipmap.ic_pay_default3) + binding.tvWxPay.setCompoundDrawablesRelativeWithIntrinsicBounds(start2, null, end2, null) + } + } + + fun setOnSelectListener(listener: () -> Unit) { + mOnBackListener = listener + } + + override fun onDestroy() { + payStatusDisposable?.dispose() + super.onDestroy() + } + + companion object { + fun newInstance(goods: VipGoodsEntity): BuySeatDialog { + val arg = Bundle() + arg.putSerializable("goods", goods) + val fragment = BuySeatDialog() + fragment.arguments = arg + return fragment + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/dialog/SeatAuthDialog.kt b/app/src/main/java/com/cheng/bole/ui/dialog/SeatAuthDialog.kt new file mode 100644 index 0000000..f28ede4 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/dialog/SeatAuthDialog.kt @@ -0,0 +1,102 @@ +package com.cheng.bole.ui.dialog + +import android.annotation.SuppressLint +import android.app.Dialog +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.text.TextUtils +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.fragment.app.DialogFragment +import com.cheng.bole.R +import com.cheng.bole.common.Constants +import com.cheng.bole.databinding.DialogSeatAuthBinding +import com.cheng.bole.utils.KeyboardUtils +import com.example.base.extensions.getColor +import com.example.base.extensions.onClick +import com.example.base.extensions.toast +import com.example.base.utils.ScreenUtils +import com.example.base.utils.SpanUtils + +class SeatAuthDialog : DialogFragment(), KeyboardUtils.OnSoftInputChangedListener { + private var mOnBackListener: ((String) -> Unit)? = null //回调事件 + + private lateinit var binding: DialogSeatAuthBinding + + override fun onStart() { + super.onStart() + val window = dialog?.window + val windowParams = window?.attributes + windowParams?.dimAmount = 0.7f + windowParams?.width = ScreenUtils.getWindowSize().x + windowParams?.gravity = Gravity.BOTTOM + windowParams?.windowAnimations = R.style.dialog_bottom + dialog?.window?.attributes = windowParams + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + KeyboardUtils.registerSoftInputChangedListener(requireActivity(), this) + return super.onCreateView(inflater, container, savedInstanceState) + } + + @SuppressLint("NotifyDataSetChanged") + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val view = layoutInflater.inflate(R.layout.dialog_seat_auth, null) + + binding = DialogSeatAuthBinding.bind(view) + + binding.tvTitle.typeface = Constants.douyinsansB + + SpanUtils.with(binding.tvTip) + .append("注:授权者需提前到") + .append("设置-绑定账号-手机号绑定") + .setForegroundColor(getColor(R.color.color_ff8518)) + .append("才能正常授权") + .create() + + binding.ivClose.onClick { dismiss() } + + binding.btnNext.onClick { + val phone = binding.etPhone.text.toString() + if (TextUtils.isEmpty(phone)) { + toast("请输入手机号") + return@onClick + } + mOnBackListener?.invoke(phone) + dismiss() + } + + val dialog = Dialog(requireContext()) + dialog.setContentView(view) + return dialog + } + + override fun onSoftInputChanged(height: Int) { + val lp = binding.layoutContent.layoutParams as ConstraintLayout.LayoutParams + lp.bottomMargin = height + binding.layoutContent.layoutParams = lp + } + + override fun onDestroyView() { + KeyboardUtils.unregisterSoftInputChangedListener(requireActivity().window) + super.onDestroyView() + } + + fun setOnSelectListener(listener: (String) -> Unit) { + mOnBackListener = listener + } + + companion object { + fun newInstance(): SeatAuthDialog { + val arg = Bundle() + val fragment = SeatAuthDialog() + fragment.arguments = arg + return fragment + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/contacts/AddContactsFragment.kt b/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/contacts/AddContactsFragment.kt index c79a4f3..290a648 100644 --- a/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/contacts/AddContactsFragment.kt +++ b/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/contacts/AddContactsFragment.kt @@ -1,5 +1,6 @@ package com.cheng.bole.ui.fragment.bid.publish.contacts +import android.annotation.SuppressLint import android.graphics.Color import android.os.Build import android.text.TextUtils @@ -10,12 +11,10 @@ import com.cheng.bole.event.ContactsEvent import com.cheng.bole.manager.ContactsManager import com.cheng.bole.manager.DialogEnum import com.cheng.bole.ui.dialog.TipDialog -import com.efs.sdk.memleaksdk.monitor.internal.bi import com.example.base.common.RxBus import com.example.base.decoration.GridSpaceItemDecoration import com.example.base.extensions.onClick import com.example.base.extensions.toast -import com.example.base.extensions.visible import com.example.base.ui.BaseFragment import com.example.base.utils.DensityUtils import java.util.UUID @@ -44,6 +43,7 @@ class AddContactsFragment: BaseFragment @@ -71,13 +71,13 @@ class AddContactsFragment: BaseFragment() { } override fun initData() { + mViewModel.getCompanyInfo() super.initData() } @@ -78,32 +91,32 @@ class MineFragment : BaseFragment() { binding.tvExpireTime.onClick { binding.tvVipName.performClick() } binding.ivSetting.onClick { -// PublicActivity.start(requireContext(), SettingFragment::class.java) + PublicActivity.start(requireContext(), SettingsFragment::class.java) EventReportManager.eventReport(EventConstants.JUMP_TO_SYSTEM_SETTING, "", "") } binding.ivMessage.onClick { -// PublicActivity.start(requireContext(), MessageFragment::class.java) + PublicActivity.start(requireContext(), MessageFragment::class.java) EventReportManager.eventReport(EventConstants.JUMP_TO_MESSAGE, "", "") } binding.layoutPush.onClick { -// PublicActivity.start(requireContext(), SubscribeFragment::class.java) + PublicActivity.start(requireContext(), SubscribeFragment::class.java) EventReportManager.eventReport(EventConstants.JUMP_TO_SUBSCRIBE, "center", "") } binding.layoutFavorite.onClick { -// PublicActivity.start(requireContext(), FavoriteFragment::class.java) + PublicActivity.start(requireContext(), FavoriteFragment::class.java) EventReportManager.eventReport(EventConstants.JUMP_TO_FAVORITE, "", "") } binding.layoutHistory.onClick { -// PublicActivity.start(requireContext(), HistoryFragment::class.java) + PublicActivity.start(requireContext(), HistoryFragment::class.java) EventReportManager.eventReport(EventConstants.JUMP_TO_HISTORY, "", "") } binding.layoutOrder.onClick { -// PublicActivity.start(requireContext(), OrderFragment::class.java) + PublicActivity.start(requireContext(), OrderFragment::class.java) EventReportManager.eventReport(EventConstants.JUMP_TO_ORDER, "", "") } @@ -112,11 +125,13 @@ class MineFragment : BaseFragment() { } binding.tvAuth.onClick { - + PublicActivity.start(requireContext(), CompanyAuthFragment::class.java) + EventReportManager.eventReport(EventConstants.JUMP_TO_AUTH, "", "") } binding.tvSeatManage.onClick { - + PublicActivity.start(requireContext(), SeatManageFragment::class.java) + EventReportManager.eventReport(EventConstants.JUMP_TO_SEAT_MANAGE, "", "") } binding.tvService.onClick { @@ -144,6 +159,31 @@ class MineFragment : BaseFragment() { setUserInfo() } + mViewModel.companyLiveData.observe(this) { + if (it != null) { + when (it.status) { + "2" -> { + binding.tvAuthStatus.text = "认证成功" + binding.tvAuthStatus.setTextColor(getColor(R.color.color_3bbf0f)) + binding.tvAuthStatus.setCompoundDrawablesWithIntrinsicBounds(R.drawable.shape_auth_success_dot, 0, 0, 0) + } + "3" -> { + binding.tvAuthStatus.text = "认证失败" + binding.tvAuthStatus.setTextColor(getColor(R.color.color_ff592b)) + binding.tvAuthStatus.setCompoundDrawablesWithIntrinsicBounds(R.drawable.shape_auth_fail_dot, 0, 0, 0) + } + else -> binding.tvAuthStatus.gone() + } + } else { + binding.tvAuthStatus.gone() + } + } + + val authEvent = RxBus.defaultInstance.toObservable(CompanyAuthEvent::class.java).subscribe { + mViewModel.getCompanyInfo() + } + addDisposable(authEvent) + val mineRefreshEvent = RxBus.defaultInstance.toObservable(MineRefreshEvent::class.java).subscribe { mViewModel.userInfo() } diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/MineViewModel.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/MineViewModel.kt index 76c878e..034cfb8 100644 --- a/app/src/main/java/com/cheng/bole/ui/fragment/mine/MineViewModel.kt +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/MineViewModel.kt @@ -1,6 +1,8 @@ package com.cheng.bole.ui.fragment.mine import androidx.lifecycle.MutableLiveData +import com.cheng.bole.bean.CompanyBean +import com.cheng.bole.bean.UploadFileEntity import com.cheng.bole.bean.UserEntity import com.cheng.bole.bean.WxServiceEntity import com.cheng.bole.common.Constants @@ -15,6 +17,7 @@ import com.tencent.mm.opensdk.openapi.WXAPIFactory class MineViewModel : BaseViewModel() { val userInfoLiveData = MutableLiveData() + val companyLiveData = MutableLiveData() fun userInfo(showLoading: Boolean = false) { if (showLoading) showDialog() @@ -31,6 +34,18 @@ class MineViewModel : BaseViewModel() { }) } + fun getCompanyInfo() { + launchOnUiTryCatch({ + val response = ApiFactory.apiService.getCompanyInfo() + if (response.status) { + companyLiveData.postValue(response.data) + } else toast(response.message, true) + }, { + setError(it) + L.d(it) + }) + } + fun wxService() { showDialog() launchOnUiTryCatch({ diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/about/AboutFragment.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/about/AboutFragment.kt index c385c06..42e3508 100644 --- a/app/src/main/java/com/cheng/bole/ui/fragment/mine/about/AboutFragment.kt +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/about/AboutFragment.kt @@ -1,13 +1,13 @@ package com.cheng.bole.ui.fragment.mine.about import android.annotation.SuppressLint -import com.example.base.extensions.onClick -import com.example.base.ui.BaseFragment -import com.example.base.utils.AppUtils import com.cheng.bole.databinding.FragmentAboutBinding import com.cheng.bole.ui.dialog.PopupDialog import com.cheng.bole.utils.ChannelUtils import com.cheng.bole.utils.UrlHelper +import com.example.base.extensions.onClick +import com.example.base.ui.BaseFragment +import com.example.base.utils.AppUtils import org.jetbrains.anko.sdk27.listeners.onLongClick class AboutFragment : BaseFragment() { @@ -17,10 +17,6 @@ class AboutFragment : BaseFragment() { mTitleBar?.background = null binding.tvVersionName.text = "版本号:${AppUtils.getAppVersionName()}" - - if (ChannelUtils.getChannel() == "huawei") { - binding.tvAppName.text = AppUtils.getAppName() - } } override fun initListener() { @@ -35,5 +31,14 @@ class AboutFragment : BaseFragment() { binding.tvPolicy.onClick { UrlHelper.startPrivacyPolicy(requireContext()) } + binding.tvPermissionList.onClick { + UrlHelper.startPermissionList(requireContext()) + } + binding.tvShareList.onClick { + UrlHelper.startShareList(requireContext()) + } + binding.tvSdkList.onClick { + UrlHelper.startSDKList(requireContext()) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/account/AccountAdapter.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/account/AccountAdapter.kt index 700a48f..0d8148d 100644 --- a/app/src/main/java/com/cheng/bole/ui/fragment/mine/account/AccountAdapter.kt +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/account/AccountAdapter.kt @@ -6,27 +6,43 @@ import coil.transform.CircleCropTransformation import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.viewholder.BaseViewHolder import com.cheng.bole.R +import com.cheng.bole.bean.AccountEntity import com.cheng.bole.manager.UserConfigManager +import com.example.base.extensions.getColor -class AccountAdapter:BaseQuickAdapter(R.layout.listitem_account) { +class AccountAdapter : BaseQuickAdapter(R.layout.listitem_account) { - override fun convert(holder: BaseViewHolder, item: com.cheng.bole.bean.AccountEntity) { + override fun convert(holder: BaseViewHolder, item: AccountEntity) { holder.getView(R.id.iv_avatar).load(item.avater) { transformations(CircleCropTransformation()) placeholder(R.mipmap.ic_default_avatar) error(R.mipmap.ic_default_avatar) } + if (item.vip_type == "1") { - holder.setGone(R.id.tv_vip_tag, true) + holder.setGone(R.id.iv_vip_tag, true) } else if (item.vip_type == "2" || item.vip_type == "3") { - holder.setText(R.id.tv_vip_tag, if (item.vip_type == "2") item.vip_name else "终生会员") - holder.setGone(R.id.tv_vip_tag, false) + holder.setImageResource(R.id.iv_vip_tag, if (item.vip_type == "2") R.mipmap.ic_vip_tag1 else R.mipmap.ic_vip_tag2) + holder.setGone(R.id.iv_vip_tag, false) + } else if (item.vip_type == "12" || item.vip_type == "11") { + holder.setImageResource(R.id.iv_vip_tag, if (item.vip_type == "12") R.mipmap.ic_vip_tag3 else R.mipmap.ic_vip_tag4) + holder.setGone(R.id.iv_vip_tag, false) } + holder.setVisible(R.id.tv_current_account, item.user_id == UserConfigManager.userInfo?.user_id) holder.setVisible(R.id.tv_change_account, item.user_id != UserConfigManager.userInfo?.user_id) + holder.setVisible(R.id.tv_user_id_left, item.user_id != UserConfigManager.userInfo?.user_id) + holder.setVisible(R.id.tv_user_id_right, item.user_id == UserConfigManager.userInfo?.user_id) + + holder.setBackgroundColor( + R.id.layout_title, + if (item.user_id == UserConfigManager.userInfo?.user_id) getColor(R.color.color_dce4f3) else getColor(R.color.color_f7ebe2) + ) + + holder.setText(R.id.tv_user_id_left, "ID:${item.user_id}") + holder.setText(R.id.tv_user_id_right, "ID:${item.user_id}") holder.setText(R.id.tv_username, item.name) - holder.setText(R.id.tv_user_id, "ID:${item.user_id}") holder.setGone(R.id.iv_bind_wx, !item.bind.contains("weixin")) holder.setGone(R.id.iv_bind_phone, !item.bind.contains("phone")) } diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/account/AccountManageFragment.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/account/AccountManageFragment.kt index 519430c..68041c7 100644 --- a/app/src/main/java/com/cheng/bole/ui/fragment/mine/account/AccountManageFragment.kt +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/account/AccountManageFragment.kt @@ -1,8 +1,10 @@ package com.cheng.bole.ui.fragment.mine.account import android.graphics.Color +import com.cheng.bole.bean.AccountEntity import com.cheng.bole.common.EventConstants import com.cheng.bole.databinding.FragmentAccountManageBinding +import com.cheng.bole.event.LoginSuccessEvent import com.cheng.bole.manager.DialogEnum import com.cheng.bole.manager.EventReportManager import com.cheng.bole.manager.LoginManager @@ -17,7 +19,7 @@ import org.jetbrains.anko.backgroundColor class AccountManageFragment : BaseFragment() { private val mAdapter by lazy { AccountAdapter() } - private var mAccount: com.cheng.bole.bean.AccountEntity? = null + private var mAccount: AccountEntity? = null override fun initView() { super.initView() @@ -93,7 +95,7 @@ class AccountManageFragment : BaseFragment() { + private var companyDetail: CompanyBean? = null + + private var image: UploadFileEntity? = null + + private val contactsAdapter by lazy { AddBidContactsAdapter() } + + private var city: AreaBean? = null + + private val imageLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { + it?.let { + val imagePath = FileProviderUtils.getFileAbsolutePath(requireContext(), it) + if (!TextUtils.isEmpty(imagePath)) { + mViewModel.uploadImage(requireContext(), imagePath!!) + } else { + toast("图片加载失败") + } + } + } + + override fun initView() { + super.initView() + binding.tvTitle.typeface = Constants.pmzdbt + + binding.rvContacts.adapter = contactsAdapter + + binding.ivTopBg.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + (binding.tvTitle.layoutParams as ConstraintLayout.LayoutParams).topMargin = (binding.ivTopBg.height * 94f / 250f).toInt() + (binding.layoutContent.layoutParams as ConstraintLayout.LayoutParams).topMargin = (binding.ivTopBg.height * 178f / 250f).toInt() + + binding.layoutContent.setupWith(binding.nestedScrollView).setFrameClearDrawable(binding.layoutContent.background).setBlurRadius(5f) + binding.ivTopBg.viewTreeObserver.removeOnGlobalLayoutListener(this) + } + }) + } + + override fun initData() { + super.initData() + mViewModel.getCompanyInfo() + } + + @SuppressLint("NotifyDataSetChanged") + override fun initListener() { + super.initListener() + binding.tvArea.onClick { + val f = SelectAreaDialog.newInstance(if (city != null) listOf(city!!) else emptyList(), true) + f.setOnSelectListener { + city = it[0] + binding.tvArea.text = city!!.name + } + f.show(childFragmentManager, "") + } + + binding.ivImage.onClick { + if (image != null) { + PublicActivity.start(requireContext(), PhotoViewFragment::class.java, Pair("photos", listOf(image!!.url))) + } + } + binding.ivAddImage.onClick { + if (image == null) { + PermissionUtils.checkPhotoPermission(requireActivity(), childFragmentManager) { isGranted -> + if (isGranted) { + imageLauncher.launch("image/*") + } + } + } + } + binding.ivDeleteImage.onClick { + if (companyDetail == null && image != null) { + mViewModel.deleteImage(image!!.id) + } + image = null + binding.ivImage.load("") + binding.ivAddImage.visible() + binding.ivDeleteImage.gone() + } + + binding.ivAddContacts.onClick { + val f = SelectContactsDialog.newInstance(contactsAdapter.data) + f.setOnSelectListener { + contactsAdapter.setList(it) + binding.rvContacts.visible() + binding.tvContacts.gone() + if (contactsAdapter.data.size == 5) { + binding.ivAddContacts.gone() + } + } + f.show(childFragmentManager, "") + } + + binding.btnNext.onClick { + val name = binding.etName.text.toString().trim() + if (TextUtils.isEmpty(name)) { + toast("请输入企业名称") + return@onClick + } + if (city == null) { + toast("请选择地区") + return@onClick + } + if (image == null) { + toast("请上传营业执照") + return@onClick + } + if (contactsAdapter.data.isEmpty()) { + toast("请添加联系人") + return@onClick + } + if (UserConfigManager.userInfo?.vip != "1") { + commit() + } else { + PublicActivity.start(requireContext(), VipFragment::class.java, Pair("origin", "enterprise_auth")) + } + } + } + + override fun initObserve() { + super.initObserve() + mViewModel.addLiveData.observe(this) { + toast("提交成功") + requireActivity().finish() + } + + mViewModel.companyLiveData.observe(this) { + companyDetail = it + if (companyDetail != null) { + setData(companyDetail!!) + } + } + + mViewModel.imageLiveData.observe(this) { + image = it + binding.ivImage.load(it.url) { + transformations(RoundedCornersTransformation(DensityUtils.dp2px(8f).toFloat())) + } + binding.ivAddImage.gone() + binding.ivDeleteImage.visible() + } + } + + private fun commit() { + val name = binding.etName.text.toString().trim() + val jsonObject = JsonObject() + jsonObject.addProperty("company_name", name) + jsonObject.addProperty("city_id", "${city!!.id}") + jsonObject.addProperty("file_id", image!!.id) + + val contactArray = JsonArray() + contactsAdapter.data.forEach { + val contactObj = JsonObject() + contactObj.addProperty("name", it.name) + contactObj.addProperty("phone", it.phone) + contactObj.addProperty("job", it.job) + contactArray.add(contactObj) + } + jsonObject.add("contact", contactArray) + + if (companyDetail == null) { + mViewModel.addCompanyInfo(jsonObject.toString().toRequestBody()) + } else { + jsonObject.addProperty("id", companyDetail!!.id) + mViewModel.updateCompanyInfo(jsonObject.toString().toRequestBody()) + } + RxBus.defaultInstance.post(CompanyAuthEvent()) + } + + @SuppressLint("SetTextI18n") + private fun setData(detail: CompanyBean) { + when (detail.status) { + "1" -> { + binding.etName.isEnabled = false + binding.tvArea.isEnabled = false + binding.ivAddImage.isEnabled = false + binding.ivDeleteImage.isEnabled = false + binding.rvContacts.isEnabled = false + binding.ivAddContacts.isEnabled = false + binding.btnNext.isEnabled = false + binding.layoutRejectReason.gone() + + binding.btnNext.text = "审核中" + } + "2" -> { + binding.tvStatus.text = "认证成功" + binding.tvStatus.setCompoundDrawablesWithIntrinsicBounds(R.mipmap.ic_auth_success, 0, 0, 0) + binding.tvReason.gone() + binding.layoutRejectReason.visible() + + binding.btnNext.text = "重新提交" + } + "3" -> { + binding.tvStatus.text = "认证失败" + binding.tvStatus.setCompoundDrawablesWithIntrinsicBounds(R.mipmap.ic_auth_fail, 0, 0, 0) + binding.tvReason.text = "理由:${detail.remark}" + binding.layoutRejectReason.visible() + + binding.btnNext.text = "重新提交" + } + else -> { + binding.layoutRejectReason.gone() + } + } + binding.etName.setText(detail.company_name) + + city = UserConfigManager.getCityList().find { it.id == detail.city_id.toInt() } + if (city != null) binding.tvArea.text = city!!.name + + image = UploadFileEntity(detail.file_id, detail.file_url) + binding.ivImage.load(image!!.url) { + transformations(RoundedCornersTransformation(DensityUtils.dp2px(8f).toFloat())) + } + binding.ivAddImage.gone() + binding.ivDeleteImage.visible() + + contactsAdapter.setList(detail.contact) + if (contactsAdapter.data.size == 5) { + binding.ivAddContacts.gone() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/auth/CompanyAuthViewModel.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/auth/CompanyAuthViewModel.kt new file mode 100644 index 0000000..7e990c3 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/auth/CompanyAuthViewModel.kt @@ -0,0 +1,92 @@ +package com.cheng.bole.ui.fragment.mine.auth + +import android.content.Context +import androidx.lifecycle.MutableLiveData +import com.cheng.bole.bean.CompanyBean +import com.cheng.bole.bean.UploadFileEntity +import com.cheng.bole.net.ApiFactory +import com.cheng.bole.utils.BitmapUtils +import com.example.base.extensions.toast +import com.example.base.utils.L +import com.example.base.viewmodel.BaseViewModel +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody + +class CompanyAuthViewModel: BaseViewModel() { + val companyLiveData = MutableLiveData() + val addLiveData = MutableLiveData() + val imageLiveData = MutableLiveData() + + fun getCompanyInfo() { + showDialog() + launchOnUiTryCatch({ + val response = ApiFactory.apiService.getCompanyInfo() + if (response.status) { + companyLiveData.postValue(response.data) + } else toast(response.message, true) + dismissDialog() + }, { + dismissDialog() + setError(it) + L.d(it) + }) + } + + fun addCompanyInfo(requestBody: RequestBody) { + showDialog() + launchOnUiTryCatch({ + val response = ApiFactory.apiService.addCompanyInfo(requestBody) + if (response.status) { + addLiveData.postValue(Any()) + } else toast(response.message, true) + dismissDialog() + }, { + dismissDialog() + setError(it) + L.d(it) + }) + } + + fun updateCompanyInfo(requestBody: RequestBody) { + showDialog() + launchOnUiTryCatch({ + val response = ApiFactory.apiService.updateCompanyInfo(requestBody) + if (response.status) { + addLiveData.postValue(Any()) + } else toast(response.message, true) + dismissDialog() + }, { + dismissDialog() + setError(it) + L.d(it) + }) + } + + fun uploadImage(context: Context, path: String) { + showDialog() + BitmapUtils.compressImg(context, path) { + launchOnUiTryCatch({ + val requestFile = RequestBody.create("multipart/form-data".toMediaTypeOrNull(), it) + val filePart = MultipartBody.Part.createFormData("file", it.getName(), requestFile) + val response = ApiFactory.apiService.upload(filePart, "company") + if (response.status) { + imageLiveData.postValue(response.data) + } else toast(response.message, true) + dismissDialog() + }, { + dismissDialog() + setError(it) + L.d(it) + }) + } + } + + fun deleteImage(id: String) { + launchOnUiTryCatch({ + ApiFactory.apiService.delUserFile(id) + }, { + L.d(it) + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/favorite/FavoriteFragment.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/favorite/FavoriteFragment.kt new file mode 100644 index 0000000..5f11058 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/favorite/FavoriteFragment.kt @@ -0,0 +1,64 @@ +package com.cheng.bole.ui.fragment.mine.favorite + +import com.cheng.bole.R +import com.cheng.bole.bean.BidItemBean +import com.cheng.bole.databinding.FragmentFavoriteBinding +import com.cheng.bole.event.FavoriteEvent +import com.cheng.bole.ui.activity.PublicActivity +import com.cheng.bole.ui.fragment.bid.BidAdapter +import com.cheng.bole.ui.fragment.bid.detail.BidDetailFragment +import com.cheng.bole.ui.fragment.mine.vip.VipFragment +import com.example.base.common.RxBus +import com.example.base.ui.list.ListFragment + +class FavoriteFragment: ListFragment() { + private var item: BidItemBean? = null + + override fun noDataClick() { + + } + + override fun bindAdapter() = BidAdapter() + + override fun initView() { + super.initView() + mTitleBar?.background = null + + mEmptyView.setNoDataLogo(R.mipmap.ic_empty_favorite) + mEmptyView.setNoDataText("暂无收藏") + } + + override fun initData() { + super.initData() + firstLoad() + } + + override fun initListener() { + super.initListener() + mAdapter.setOnItemClickListener { _, _, i -> + item = mAdapter.getItem(i) + mViewModel.checkAuth() + } + } + + override fun initObserve() { + super.initObserve() + mViewModel.authLiveData.observe(this) { + if (it.auth) { + PublicActivity.start( + requireContext(), + BidDetailFragment::class.java, + Pair("id", item!!.id), + Pair("info_source", item!!.info_source) + ) + } else { + PublicActivity.start(requireContext(), VipFragment::class.java, Pair("origin", "view_bid")) + } + } + + val favoriteEvent = RxBus.defaultInstance.toObservable(FavoriteEvent::class.java).subscribe { + firstLoad() + } + addDisposable(favoriteEvent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/favorite/FavoriteViewModel.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/favorite/FavoriteViewModel.kt new file mode 100644 index 0000000..b15364b --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/favorite/FavoriteViewModel.kt @@ -0,0 +1,31 @@ +package com.cheng.bole.ui.fragment.mine.favorite + +import androidx.collection.ArrayMap +import androidx.lifecycle.MutableLiveData +import com.cheng.bole.bean.BidItemBean +import com.cheng.bole.bean.UserAuthBean +import com.cheng.bole.net.ApiFactory +import com.cheng.bole.net.model.toListResult +import com.example.base.extensions.toast +import com.example.base.utils.L +import com.example.base.viewmodel.ListViewModel + +class FavoriteViewModel: ListViewModel() { + override suspend fun requestApi(params: ArrayMap): Result> { + return ApiFactory.apiService.getFavoriteList().toListResult() + } + + val authLiveData = MutableLiveData() + + fun checkAuth() { + launchOnUiTryCatch({ + val response = ApiFactory.apiService.checkAuth() + if (response.status) { + authLiveData.postValue(response.data) + } else toast(response.message, true) + }, { + setError(it) + L.d(it) + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/history/HistoryAdapter.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/history/HistoryAdapter.kt new file mode 100644 index 0000000..e459b92 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/history/HistoryAdapter.kt @@ -0,0 +1,28 @@ +package com.cheng.bole.ui.fragment.mine.history + +import android.text.TextUtils +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.cheng.bole.R +import com.cheng.bole.bean.BidDetailBean +import com.cheng.bole.utils.BidTypeUtils +import com.cheng.bole.widget.CommonShapeView +import com.example.base.ui.list.LoadMoreAdapter +import java.text.DecimalFormat + +class HistoryAdapter: LoadMoreAdapter(R.layout.listitem_bid) { + + override fun convert(holder: BaseViewHolder, item: BidDetailBean) { + val tvTag = holder.getView(R.id.tv_tag) + tvTag.setBgColor(BidTypeUtils.getTypeColor(item.type_name)) + tvTag.text = BidTypeUtils.getShortName(item.type_name) + + holder.setText(R.id.tv_title, item.origin_content.toString()) + holder.setText(R.id.tv_location, if (TextUtils.isEmpty(item.city_name)) "全国" else item.city_name) + holder.setText(R.id.tv_amount, item.project_amount) + holder.setText(R.id.tv_time, item.tips_time) + holder.setText(R.id.tv_rate, DecimalFormat("0.0").format(item.star.toFloat())) + + holder.setGone(R.id.tv_amount, TextUtils.isEmpty(item.project_amount)) + holder.setGone(R.id.tv_time, true) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/history/HistoryFragment.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/history/HistoryFragment.kt new file mode 100644 index 0000000..3014346 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/history/HistoryFragment.kt @@ -0,0 +1,56 @@ +package com.cheng.bole.ui.fragment.mine.history + +import com.cheng.bole.R +import com.cheng.bole.bean.BidDetailBean +import com.cheng.bole.databinding.FragmentHistoryBinding +import com.cheng.bole.ui.activity.PublicActivity +import com.cheng.bole.ui.fragment.bid.detail.BidDetailFragment +import com.cheng.bole.ui.fragment.mine.vip.VipFragment +import com.example.base.ui.list.ListFragment + +class HistoryFragment: ListFragment() { + private var item: BidDetailBean? = null + + override fun noDataClick() { + + } + + override fun bindAdapter() = HistoryAdapter() + + override fun initView() { + super.initView() + mTitleBar?.background = null + + mEmptyView.setNoDataLogo(R.mipmap.ic_empty_history) + mEmptyView.setNoDataText("暂无足迹") + } + + override fun initData() { + super.initData() + firstLoad() + } + + override fun initListener() { + super.initListener() + mAdapter.setOnItemClickListener { _, _, i -> + item = mAdapter.getItem(i) + mViewModel.checkAuth() + } + } + + override fun initObserve() { + super.initObserve() + mViewModel.authLiveData.observe(this) { + if (it.auth) { + PublicActivity.start( + requireContext(), + BidDetailFragment::class.java, + Pair("id", item!!.id), + Pair("info_source", item!!.info_source) + ) + } else { + PublicActivity.start(requireContext(), VipFragment::class.java, Pair("origin", "view_bid")) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/history/HistoryViewModel.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/history/HistoryViewModel.kt new file mode 100644 index 0000000..d8a0438 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/history/HistoryViewModel.kt @@ -0,0 +1,31 @@ +package com.cheng.bole.ui.fragment.mine.history + +import androidx.collection.ArrayMap +import androidx.lifecycle.MutableLiveData +import com.cheng.bole.bean.BidDetailBean +import com.cheng.bole.bean.UserAuthBean +import com.cheng.bole.net.ApiFactory +import com.cheng.bole.net.model.toListResult +import com.example.base.extensions.toast +import com.example.base.utils.L +import com.example.base.viewmodel.ListViewModel + +class HistoryViewModel: ListViewModel() { + override suspend fun requestApi(params: ArrayMap): Result> { + return ApiFactory.apiService.getViewHistoryList().toListResult() + } + + val authLiveData = MutableLiveData() + + fun checkAuth() { + launchOnUiTryCatch({ + val response = ApiFactory.apiService.checkAuth() + if (response.status) { + authLiveData.postValue(response.data) + } else toast(response.message, true) + }, { + setError(it) + L.d(it) + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/message/MessageAdapter.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/message/MessageAdapter.kt new file mode 100644 index 0000000..b0a791c --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/message/MessageAdapter.kt @@ -0,0 +1,27 @@ +package com.cheng.bole.ui.fragment.mine.message + +import android.text.TextUtils +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.cheng.bole.R +import com.cheng.bole.bean.SubscriptionMessageBean +import com.cheng.bole.utils.BidTypeUtils +import com.cheng.bole.utils.StringUtils +import com.cheng.bole.widget.CommonShapeView +import com.example.base.ui.list.LoadMoreAdapter +import java.text.DecimalFormat + +class MessageAdapter: LoadMoreAdapter(R.layout.listitem_message) { + override fun convert(holder: BaseViewHolder, item: SubscriptionMessageBean) { + val tvTag = holder.getView(R.id.tv_tag) + tvTag.setBgColor(BidTypeUtils.getTypeColor(item.extra.typeName)) + tvTag.text = BidTypeUtils.getShortName(item.extra.typeName) + + holder.setText(R.id.tv_time, item.create_time) + holder.setText(R.id.tv_title, item.extra.title) + holder.setText(R.id.tv_location, if (TextUtils.isEmpty(item.extra.regionName)) "全国" else item.extra.regionName) + holder.setText(R.id.tv_amount, StringUtils.formatAmount(item.extra.money)) + holder.setText(R.id.tv_rate, DecimalFormat("0.0").format(item.extra.star.toFloat())) + + holder.setGone(R.id.tv_amount, TextUtils.isEmpty(item.extra.money)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/message/MessageFragment.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/message/MessageFragment.kt new file mode 100644 index 0000000..5602435 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/message/MessageFragment.kt @@ -0,0 +1,55 @@ +package com.cheng.bole.ui.fragment.mine.message + +import android.graphics.Color +import com.cheng.bole.R +import com.cheng.bole.bean.SubscriptionMessageBean +import com.cheng.bole.databinding.FragmentMessageBinding +import com.cheng.bole.ui.activity.PublicActivity +import com.cheng.bole.ui.fragment.bid.detail.BidDetailFragment +import com.cheng.bole.ui.fragment.mine.vip.VipFragment +import com.example.base.ui.list.ListFragment + +class MessageFragment: ListFragment() { + private var item: SubscriptionMessageBean? = null + + override fun noDataClick() { + } + + override fun bindAdapter() = MessageAdapter() + + override fun initView() { + super.initView() + mTitleBar?.setBackgroundColor(Color.WHITE) + + mEmptyView.setNoDataLogo(R.mipmap.ic_empty_message) + mEmptyView.setNoDataText("暂无消息") + } + + override fun initData() { + super.initData() + firstLoad() + } + + override fun initListener() { + super.initListener() + mAdapter.setOnItemClickListener { _, _, i -> + item = mAdapter.getItem(i) + mViewModel.checkAuth() + } + } + + override fun initObserve() { + super.initObserve() + mViewModel.authLiveData.observe(this) { + if (it.auth) { + PublicActivity.start( + requireContext(), + BidDetailFragment::class.java, + Pair("id", item!!.extra.recommend_id) + ) + } else { + PublicActivity.start(requireContext(), VipFragment::class.java, Pair("origin", "view_bid")) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/message/MessageViewModel.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/message/MessageViewModel.kt new file mode 100644 index 0000000..a24fc90 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/message/MessageViewModel.kt @@ -0,0 +1,31 @@ +package com.cheng.bole.ui.fragment.mine.message + +import androidx.collection.ArrayMap +import androidx.lifecycle.MutableLiveData +import com.cheng.bole.bean.SubscriptionMessageBean +import com.cheng.bole.bean.UserAuthBean +import com.cheng.bole.net.ApiFactory +import com.cheng.bole.net.model.toListResult +import com.example.base.extensions.toast +import com.example.base.utils.L +import com.example.base.viewmodel.ListViewModel + +class MessageViewModel: ListViewModel() { + override suspend fun requestApi(params: ArrayMap): Result> { + return ApiFactory.apiService.getSubscriptionMessage(params).toListResult() + } + + val authLiveData = MutableLiveData() + + fun checkAuth() { + launchOnUiTryCatch({ + val response = ApiFactory.apiService.checkAuth() + if (response.status) { + authLiveData.postValue(response.data) + } else toast(response.message, true) + }, { + setError(it) + L.d(it) + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/OrderFragment.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/OrderFragment.kt new file mode 100644 index 0000000..80ec61a --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/OrderFragment.kt @@ -0,0 +1,56 @@ +package com.cheng.bole.ui.fragment.mine.order + +import android.graphics.Color +import android.graphics.Typeface +import android.widget.TextView +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentStatePagerAdapter +import com.angcyo.tablayout.delegate.ViewPager1Delegate +import com.cheng.bole.R +import com.cheng.bole.common.Constants +import com.cheng.bole.databinding.FragmentOrderBinding +import com.cheng.bole.ui.base.BasePageAdapter +import com.cheng.bole.ui.fragment.mine.order.list.OrderListFragment +import com.example.base.ui.BaseFragment + +class OrderFragment: BaseFragment() { + private val tabText = listOf("全部", "待支付", "已支付") + private val fragmentList by lazy { mutableListOf() } + private val pageAdapter by lazy { + BasePageAdapter( + childFragmentManager, + tabText, + fragmentList, + FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT + ) + } + + override fun initView() { + super.initView() + mTitleBar?.background = null + + initFragment() + binding.viewPager.adapter = pageAdapter + binding.viewPager.offscreenPageLimit = fragmentList.size + binding.tabLayout.setupViewPager(ViewPager1Delegate.install(binding.viewPager, binding.tabLayout)) + } + + private fun initFragment() { + fragmentList.add(OrderListFragment.newInstance("")) + fragmentList.add(OrderListFragment.newInstance("1")) + fragmentList.add(OrderListFragment.newInstance("2")) + } + + override fun initListener() { + super.initListener() + binding.tabLayout.observeIndexChange { fromIndex, toIndex, _, _ -> + binding.viewPager.currentItem = toIndex + if (fromIndex != -1) { + (binding.tabLayout.getChildAt(fromIndex) as TextView).typeface = Typeface.DEFAULT + (binding.tabLayout.getChildAt(fromIndex) as TextView).setBackgroundResource(R.drawable.shape_push_bid_type_default) + } + (binding.tabLayout.getChildAt(toIndex) as TextView).typeface = Constants.douyinsansB + (binding.tabLayout.getChildAt(toIndex) as TextView).setBackgroundResource(R.drawable.shape_push_bid_type_checked) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/OrderViewModel.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/OrderViewModel.kt new file mode 100644 index 0000000..bda6007 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/OrderViewModel.kt @@ -0,0 +1,6 @@ +package com.cheng.bole.ui.fragment.mine.order + +import com.example.base.viewmodel.BaseViewModel + +class OrderViewModel: BaseViewModel() { +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/cert/CertificateFragment.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/cert/CertificateFragment.kt new file mode 100644 index 0000000..a22398a --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/cert/CertificateFragment.kt @@ -0,0 +1,130 @@ +package com.cheng.bole.ui.fragment.mine.order.cert + +import android.annotation.SuppressLint +import android.text.TextUtils +import androidx.activity.result.contract.ActivityResultContracts +import coil.load +import coil.transform.RoundedCornersTransformation +import com.cheng.bole.bean.OrderBean +import com.cheng.bole.databinding.FragmentCertificateBinding +import com.cheng.bole.event.OrderEvent +import com.cheng.bole.ui.activity.PublicActivity +import com.cheng.bole.ui.fragment.photo.PhotoViewFragment +import com.cheng.bole.utils.FileProviderUtils +import com.cheng.bole.utils.PermissionUtils +import com.example.base.common.RxBus +import com.example.base.extensions.gone +import com.example.base.extensions.onClick +import com.example.base.extensions.toast +import com.example.base.extensions.visible +import com.example.base.ui.BaseFragment +import com.example.base.utils.ClipboardUtils +import com.example.base.utils.DensityUtils +import com.google.gson.Gson +import com.google.gson.JsonObject +import okhttp3.RequestBody.Companion.toRequestBody +import java.text.DecimalFormat + +class CertificateFragment: BaseFragment() { + private val orderId by lazy { arguments?.getString("orderId") ?: "" } + + private var orderInfo: OrderBean? = null + private var transInfo: OrderBean.TransInfo? = null + + private var imagePath: String? = null + + private val imageLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { + it?.let { + imagePath = FileProviderUtils.getFileAbsolutePath(requireContext(), it) + if (!TextUtils.isEmpty(imagePath)) { + binding.ivImage.load(imagePath) { + transformations(RoundedCornersTransformation(DensityUtils.dp2px(8f).toFloat())) + } + binding.ivAddImage.gone() + binding.ivDeleteImage.visible() + } + } + } + + override fun initView() { + super.initView() + } + + override fun initData() { + super.initData() + mViewModel.getOrderInfo(orderId) + } + + override fun initListener() { + super.initListener() + binding.btnCopy.onClick { + ClipboardUtils.copyText(orderInfo!!.pay_params) + toast("复制成功") + } + + binding.ivImage.onClick { + if (!TextUtils.isEmpty(imagePath)) { + PublicActivity.start(requireContext(), PhotoViewFragment::class.java, Pair("photos", listOf(imagePath))) + } + } + binding.ivAddImage.onClick { + if (TextUtils.isEmpty(imagePath)) { + PermissionUtils.checkPhotoPermission(requireActivity(), childFragmentManager) { isGranted -> + if (isGranted) { + imageLauncher.launch("image/*") + } + } + } + } + binding.ivDeleteImage.onClick { + imagePath = null + binding.ivImage.load("") + binding.ivAddImage.visible() + binding.ivDeleteImage.gone() + } + + binding.btnNext.onClick { + if (TextUtils.isEmpty(imagePath)) { + toast("请上传凭证") + return@onClick + } + mViewModel.uploadImg(requireContext(), imagePath!!) + } + } + + override fun initObserve() { + super.initObserve() + mViewModel.orderLiveData.observe(this) { + orderInfo = it + if (!TextUtils.isEmpty(it.pay_params)) { + transInfo = Gson().fromJson(it.pay_params, OrderBean.TransInfo::class.java) + setTransInfo() + } + } + + mViewModel.imageLiveData.observe(this) { + val jsonObject = JsonObject() + jsonObject.addProperty("order_id", orderId) + jsonObject.addProperty("bank_bill_url", it.url) + mViewModel.updateOrder(jsonObject.toString().toRequestBody()) + } + + mViewModel.updateLiveData.observe(this) { + toast("提交成功") + RxBus.defaultInstance.post(OrderEvent()) + requireActivity().finish() + } + } + + @SuppressLint("SetTextI18n") + private fun setTransInfo() { + if (transInfo != null) { + binding.tvAccountName.text = transInfo!!.accountName + binding.tvAccountNo.text = transInfo!!.accountNo + binding.tvBankName.text = transInfo!!.bankName + binding.tvBankNo.text = transInfo!!.bankNo + binding.tvCode.text = orderInfo!!.id + binding.tvAmount.text = "¥${DecimalFormat("0.00").format(orderInfo!!.total_fee.toFloat())}" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/cert/CertificateViewModel.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/cert/CertificateViewModel.kt new file mode 100644 index 0000000..08617fa --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/cert/CertificateViewModel.kt @@ -0,0 +1,68 @@ +package com.cheng.bole.ui.fragment.mine.order.cert + +import android.content.Context +import androidx.lifecycle.MutableLiveData +import com.cheng.bole.bean.OrderBean +import com.cheng.bole.bean.UploadFileEntity +import com.cheng.bole.net.ApiFactory +import com.cheng.bole.utils.BitmapUtils +import com.example.base.extensions.toast +import com.example.base.utils.L +import com.example.base.viewmodel.BaseViewModel +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody + +class CertificateViewModel : BaseViewModel() { + val orderLiveData = MutableLiveData() + val updateLiveData = MutableLiveData() + val imageLiveData = MutableLiveData() + + fun getOrderInfo(orderId: String) { + showDialog() + launchOnUiTryCatch({ + val response = ApiFactory.apiService.getOrderInfo(orderId) + if (response.status) { + orderLiveData.postValue(response.data) + } else toast(response.message, true) + dismissDialog() + }, { + dismissDialog() + setError(it) + L.d(it) + }) + } + + fun updateOrder(requestBody: RequestBody) { + showDialog() + launchOnUiTryCatch({ + val response = ApiFactory.apiService.updateOrder(requestBody) + if (response.status) { + updateLiveData.postValue(Any()) + } else toast(response.message, true) + dismissDialog() + }, { + dismissDialog() + setError(it) + L.d(it) + }) + } + + fun uploadImg(context: Context, path: String) { + showDialog() + BitmapUtils.compressImg(context, path) { + launchOnUiTryCatch({ + val requestFile = RequestBody.create("multipart/form-data".toMediaTypeOrNull(), it) + val filePart = MultipartBody.Part.createFormData("file", it.getName(), requestFile) + val response = ApiFactory.apiService.upload(filePart, "certificate") + if (response.status) { + imageLiveData.postValue(response.data) + } else toast(response.message, true) + dismissDialog() + }, { + dismissDialog() + L.d(it) + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/invoice/InvoiceFragment.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/invoice/InvoiceFragment.kt new file mode 100644 index 0000000..4be2cab --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/invoice/InvoiceFragment.kt @@ -0,0 +1,201 @@ +package com.cheng.bole.ui.fragment.mine.order.invoice + +import android.graphics.Color +import android.os.Build +import android.text.TextUtils +import com.cheng.bole.R +import com.cheng.bole.bean.OrderBean +import com.cheng.bole.databinding.FragmentInvoiceBinding +import com.cheng.bole.event.OrderEvent +import com.example.base.common.RxBus +import com.example.base.extensions.gone +import com.example.base.extensions.onClick +import com.example.base.extensions.toast +import com.example.base.extensions.visible +import com.example.base.ui.BaseFragment +import com.google.gson.JsonObject +import okhttp3.RequestBody.Companion.toRequestBody +import java.text.DecimalFormat + +class InvoiceFragment : BaseFragment() { + private var userType = 0 // 0 企业 1 个人 + private var invoiceType = 0 // 0 普票 1 专票 + + private var orderInfo: OrderBean? = null + + override fun initView() { + super.initView() + mTitleBar?.setBackgroundColor(Color.WHITE) + setStyle() + } + + override fun initData() { + super.initData() + orderInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + arguments?.getSerializable("item", OrderBean::class.java) + } else { + arguments?.getSerializable("item") as? OrderBean + } + + binding.tvAmount.text = DecimalFormat("0.00").format(orderInfo!!.total_fee.toFloat()) + } + + override fun initListener() { + super.initListener() + binding.rgTitleType.setOnCheckedChangeListener { _, checkedId -> + when(checkedId) { + R.id.rb_title1 -> { + userType = 0 + setStyle() + } + R.id.rb_title2 -> { + userType = 1 + setStyle() + } + } + } + + binding.rgType.setOnCheckedChangeListener { _, checkedId -> + when(checkedId) { + R.id.rb1 -> { + invoiceType = 0 + setStyle() + } + R.id.rb2 -> { + invoiceType = 1 + setStyle() + } + } + } + + binding.tv1.onClick { + binding.rb1.isChecked = true + } + + binding.tv2.onClick { + binding.rb2.isChecked = true + } + + binding.btnNext.onClick { + commit() + } + } + + override fun initObserve() { + super.initObserve() + mViewModel.updateLiveData.observe(this) { + toast("提交成功") + RxBus.defaultInstance.post(OrderEvent()) + requireActivity().finish() + } + } + + private fun setStyle() { + if (userType == 0) { + binding.layoutType.visible() + binding.layoutEnterpriseName.visible() + binding.layoutEnterpriseCode.visible() + binding.layoutUsername.gone() + binding.layoutIdCard.gone() + if (invoiceType == 0) { + binding.layoutEnterpriseAddress.gone() + binding.layoutEnterprisePhone.gone() + binding.layoutBankName.gone() + binding.layoutBankNo.gone() + } else { + binding.layoutEnterpriseAddress.visible() + binding.layoutEnterprisePhone.visible() + binding.layoutBankName.visible() + binding.layoutBankNo.visible() + } + } else { + binding.layoutUsername.visible() + binding.layoutIdCard.visible() + + binding.layoutType.gone() + binding.layoutEnterpriseName.gone() + binding.layoutEnterpriseCode.gone() + binding.layoutEnterpriseAddress.gone() + binding.layoutEnterprisePhone.gone() + binding.layoutBankName.gone() + binding.layoutBankNo.gone() + } + } + + private fun commit() { + val enterpriseName = binding.etEnterpriseName.text.toString().trim() + val enterpriseCode = binding.etEnterpriseCode.toString().trim() + val enterpriseAddress = binding.etEnterpriseAddress.text.toString().trim() + val enterprisePhone = binding.etEnterprisePhone.text.toString().trim() + val bankName = binding.etBankName.text.toString().trim() + val bankNo = binding.etBankNo.text.toString().trim() + + val username = binding.etUsername.text.toString().trim() + val idCard = binding.etIdCard.text.toString().trim() + + val email = binding.etEmail.text.toString().trim() + + if (userType == 0) { + if (TextUtils.isEmpty(enterpriseName)) { + toast("请输入企业名称") + return + } + if (TextUtils.isEmpty(enterpriseCode)) { + toast("请输入纳税人识别号") + return + } + if (invoiceType == 1) { + if (TextUtils.isEmpty(enterpriseAddress)) { + toast("请输入详细地址") + return + } + if (TextUtils.isEmpty(enterprisePhone)) { + toast("请输入电话号码") + return + } + if (TextUtils.isEmpty(bankName)) { + toast("请输入开户行") + return + } + if (TextUtils.isEmpty(bankNo)) { + toast("请输入开户行账户") + return + } + } + } else { + if (TextUtils.isEmpty(username)) { + toast("请输入您的姓名") + return + } + if (TextUtils.isEmpty(idCard)) { + toast("请输入您的身份证号码") + return + } + } + if (TextUtils.isEmpty(email)) { + toast("请输入邮箱地址") + return + } + val jsonObject = JsonObject() + jsonObject.addProperty("order_id", orderInfo!!.id) + jsonObject.addProperty("invoice_status", "2") + val paramsObj = JsonObject() + paramsObj.addProperty("email", email) + if (userType == 0) { + paramsObj.addProperty("name", enterpriseName) + paramsObj.addProperty("tax_no", enterpriseCode) + paramsObj.addProperty("invoice_type", if (invoiceType == 0) "普票" else "专票") + if (invoiceType == 1) { + paramsObj.addProperty("address", enterpriseAddress) + paramsObj.addProperty("phone", enterprisePhone) + paramsObj.addProperty("bank", bankName) + paramsObj.addProperty("bank_number", bankNo) + } + } else { + paramsObj.addProperty("name", username) + paramsObj.addProperty("tax_no", idCard) + } + jsonObject.add("invoice_params", paramsObj) + mViewModel.updateOrder(jsonObject.toString().toRequestBody()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/invoice/InvoiceViewModel.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/invoice/InvoiceViewModel.kt new file mode 100644 index 0000000..00aa5a1 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/invoice/InvoiceViewModel.kt @@ -0,0 +1,27 @@ +package com.cheng.bole.ui.fragment.mine.order.invoice + +import androidx.lifecycle.MutableLiveData +import com.cheng.bole.net.ApiFactory +import com.example.base.extensions.toast +import com.example.base.utils.L +import com.example.base.viewmodel.BaseViewModel +import okhttp3.RequestBody + +class InvoiceViewModel: BaseViewModel() { + val updateLiveData = MutableLiveData() + + fun updateOrder(requestBody: RequestBody) { + showDialog() + launchOnUiTryCatch({ + val response = ApiFactory.apiService.updateOrder(requestBody) + if (response.status) { + updateLiveData.postValue(Any()) + } else toast(response.message, true) + dismissDialog() + }, { + dismissDialog() + setError(it) + L.d(it) + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/list/OrderAdapter.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/list/OrderAdapter.kt new file mode 100644 index 0000000..a96450c --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/list/OrderAdapter.kt @@ -0,0 +1,79 @@ +package com.cheng.bole.ui.fragment.mine.order.list + +import android.graphics.Color +import android.text.TextUtils +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.cheng.bole.R +import com.cheng.bole.bean.OrderBean +import com.cheng.bole.widget.CommonShapeView +import java.text.DecimalFormat + +class OrderAdapter : BaseQuickAdapter(R.layout.listitem_order) { + + init { + addChildClickViewIds(R.id.btn_invoice, R.id.btn_certificate) + } + + override fun convert(holder: BaseViewHolder, item: OrderBean) { + holder.setText(R.id.tv_name, item.goods_name) + holder.setText(R.id.tv_order_no, item.out_trade_no) + holder.setText( + R.id.tv_pay_type, + when (item.pay_type) { + "weixin" -> "微信支付" + "alipay" -> "支付宝支付" + "apple" -> "苹果支付" + "bank" -> "对公转账" + else -> "未知" + } + ) + holder.setText(R.id.tv_amount, "¥${DecimalFormat("0.00").format(item.total_fee.toFloat())}") + holder.setText(R.id.tv_create_time, item.create_time) + holder.setText(R.id.tv_pay_time, item.pay_time) + + holder.setGone(R.id.tv_pay_time_title, TextUtils.isEmpty(item.pay_time)) + holder.setGone(R.id.tv_pay_time, TextUtils.isEmpty(item.pay_time)) + + val status = holder.getView(R.id.tv_status) + holder.setGone(R.id.btn_invoice, true) + holder.setGone(R.id.btn_certificate, true) + when (item.status) { + "1" -> { + status.text = "待支付" + status.setTextColor(Color.parseColor("#FF4C4C")) + status.setBgColor(Color.parseColor("#FFEDED")) + if (item.pay_type == "bank") { + holder.setVisible(R.id.btn_certificate, true) + } + } + + "2" -> { + status.text = "已支付" + status.setTextColor(Color.parseColor("#2090FE")) + status.setBgColor(Color.parseColor("#E8F3FE")) + if (item.invoice_status == "1") { + holder.setVisible(R.id.btn_invoice, true) + } + } + + "3" -> { + status.text = "已退款" + status.setTextColor(Color.parseColor("#CCCCCC")) + status.setBgColor(Color.parseColor("#EEEEEE")) + } + + "4" -> { + status.text = "已取消" + status.setTextColor(Color.parseColor("#CCCCCC")) + status.setBgColor(Color.parseColor("#EEEEEE")) + } + + "5" -> { + status.text = "待审核" + status.setTextColor(Color.parseColor("#FF9B2F")) + status.setBgColor(Color.parseColor("#1AFF9B2F")) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/list/OrderListFragment.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/list/OrderListFragment.kt new file mode 100644 index 0000000..cfcadca --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/list/OrderListFragment.kt @@ -0,0 +1,82 @@ +package com.cheng.bole.ui.fragment.mine.order.list + +import android.os.Bundle +import com.cheng.bole.R +import com.cheng.bole.databinding.FragmentOrderListBinding +import com.cheng.bole.event.OrderEvent +import com.cheng.bole.ui.activity.PublicActivity +import com.cheng.bole.ui.fragment.mine.order.cert.CertificateFragment +import com.cheng.bole.ui.fragment.mine.order.invoice.InvoiceFragment +import com.example.base.common.RxBus +import com.example.base.ui.BaseFragment +import com.example.base.widget.EmptyView +import com.example.base.widget.PageStatus + +class OrderListFragment : BaseFragment() { + private val status by lazy { arguments?.getString("status") ?: "" } + + private val mAdapter by lazy { OrderAdapter() } + private val mEmptyView by lazy { EmptyView(requireContext()) } + + companion object { + fun newInstance(status: String): OrderListFragment { + val args = Bundle() + args.putString("status", status) + val fragment = OrderListFragment() + fragment.arguments = args + return fragment + } + } + + override fun initView() { + super.initView() + + binding.mRecyclerView.adapter = mAdapter + mEmptyView.setNoDataLogo(R.mipmap.ic_empty_order) + mEmptyView.setNoDataText("暂无订单") + mAdapter.setEmptyView(mEmptyView) + } + + override fun initData() { + super.initData() + mViewModel.getOrderList(status) + } + + override fun initListener() { + super.initListener() + binding.mRefreshLayout.setOnRefreshListener { + mViewModel.getOrderList(status) + } + + mAdapter.setOnItemChildClickListener { _, view, i -> + val item = mAdapter.getItem(i) + when (view.id) { + R.id.btn_invoice -> { + PublicActivity.start(requireContext(), InvoiceFragment::class.java, Pair("item", item)) + } + + R.id.btn_certificate -> { + PublicActivity.start(requireContext(), CertificateFragment::class.java, Pair("orderId", item.id)) + } + } + } + } + + override fun initObserve() { + super.initObserve() + mViewModel.orderLiveData.observe(this) { + mAdapter.setList(it) + if (it.isNotEmpty()) { + mEmptyView.setStatus(PageStatus.GONG) + } else { + mEmptyView.setStatus(PageStatus.NO_DATA) + } + binding.mRefreshLayout.finishRefresh() + } + + val orderEvent = RxBus.defaultInstance.toObservable(OrderEvent::class.java).subscribe { + binding.mRefreshLayout.autoRefresh() + } + addDisposable(orderEvent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/list/OrderListViewModel.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/list/OrderListViewModel.kt new file mode 100644 index 0000000..d3e1f6f --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/order/list/OrderListViewModel.kt @@ -0,0 +1,27 @@ +package com.cheng.bole.ui.fragment.mine.order.list + +import androidx.lifecycle.MutableLiveData +import com.cheng.bole.bean.OrderBean +import com.cheng.bole.net.ApiFactory +import com.example.base.extensions.toast +import com.example.base.utils.L +import com.example.base.viewmodel.BaseViewModel + +class OrderListViewModel : BaseViewModel() { + val orderLiveData = MutableLiveData>() + + fun getOrderList(status: String) { + showDialog() + launchOnUiTryCatch({ + val response = ApiFactory.apiService.getOrderList(status) + if (response.status) { + orderLiveData.postValue(response.data) + } else toast(response.message, true) + dismissDialog() + }, { + dismissDialog() + setError(it) + L.d(it) + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/seat/SeatManageAdapter.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/seat/SeatManageAdapter.kt new file mode 100644 index 0000000..366f48d --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/seat/SeatManageAdapter.kt @@ -0,0 +1,29 @@ +package com.cheng.bole.ui.fragment.mine.seat + +import android.text.TextUtils +import android.widget.ImageView +import coil.load +import coil.transform.CircleCropTransformation +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.cheng.bole.R +import com.cheng.bole.bean.SeatItemBean + +class SeatManageAdapter: BaseQuickAdapter(R.layout.listitem_seat_manage) { + + init { + addChildClickViewIds(R.id.btn_delete) + } + + override fun convert(holder: BaseViewHolder, item: SeatItemBean) { + holder.getView(R.id.iv_avatar).load(item.avatar) { + transformations(CircleCropTransformation()) + } + holder.setText(R.id.tv_name, item.user_name) + if (!TextUtils.isEmpty(item.phone)) { + holder.setText(R.id.tv_phone, item.phone.replaceRange(3, 7, "****")) + } else { + holder.setText(R.id.tv_phone, "") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/seat/SeatManageFragment.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/seat/SeatManageFragment.kt new file mode 100644 index 0000000..09f55a7 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/seat/SeatManageFragment.kt @@ -0,0 +1,143 @@ +package com.cheng.bole.ui.fragment.mine.seat + +import android.annotation.SuppressLint +import com.cheng.bole.R +import com.cheng.bole.bean.CorpInfoBean +import com.cheng.bole.databinding.FragmentSeatManageBinding +import com.cheng.bole.event.PaySuccessEvent +import com.cheng.bole.manager.DialogEnum +import com.cheng.bole.ui.dialog.BuySeatDialog +import com.cheng.bole.ui.dialog.SeatAuthDialog +import com.cheng.bole.ui.dialog.TipDialog +import com.example.base.common.RxBus +import com.example.base.extensions.onClick +import com.example.base.extensions.toast +import com.example.base.ui.BaseFragment +import com.example.base.widget.EmptyView +import com.example.base.widget.PageStatus +import com.google.gson.JsonObject +import okhttp3.RequestBody.Companion.toRequestBody + +class SeatManageFragment: BaseFragment() { + private val mEmptyView by lazy { EmptyView(requireContext()) } + private val mAdapter by lazy { SeatManageAdapter() } + + private var corpInfo: CorpInfoBean? = null + + private var seatDialog: BuySeatDialog? = null + private var dismissDialog = false + + override fun initView() { + super.initView() + mTitleBar?.background = null + + binding.mRecyclerView.adapter = mAdapter + mEmptyView.setNoDataText("暂无数据") + mEmptyView.setNoDataLogo(R.mipmap.ic_empty_seat) + mAdapter.setEmptyView(mEmptyView) + } + + override fun initData() { + super.initData() + mViewModel.getCorpInfo() + } + + override fun initListener() { + super.initListener() + binding.tvAdd.onClick { + mViewModel.getGoodsList() + } + + binding.btnNext.onClick { + if (corpInfo!!.sub_user_limit > corpInfo!!.bind_count) { + showSeatAuthDialog() + } else { + mViewModel.getGoodsList() + } + } + + mAdapter.setOnItemChildClickListener { _, view, i -> + val item = mAdapter.getItem(i) + when(view.id) { + R.id.btn_delete -> { + val f = TipDialog.newInstance("解除席位授权", "是否解除尾号${item.phone.substring(7)}的用户席位?") + f.setOnSelectListener { + if (it == DialogEnum.CLICK_OK) { + mViewModel.deleteSeat(item.id) + } + } + f.show(childFragmentManager, TipDialog::class.java.simpleName) + } + } + + } + } + + @SuppressLint("SetTextI18n") + override fun initObserve() { + super.initObserve() + mViewModel.corpInfoLiveData.observe(this) { + corpInfo = it + mViewModel.getSeatList() + } + + mViewModel.seatListLiveData.observe(this) { + mAdapter.setList(it) + binding.tvCount.text = "当前席位(${it.size}/${corpInfo!!.sub_user_limit})" + if (it.isNotEmpty()) { + mEmptyView.setStatus(PageStatus.GONG) + } else { + mEmptyView.setStatus(PageStatus.NO_DATA) + } + } + + mViewModel.addLiveData.observe(this) { + toast("授权成功") + mViewModel.getSeatList() + } + + mViewModel.deleteLiveData.observe(this) { + toast("解除成功") + mViewModel.getSeatList() + } + + mViewModel.goodsLiveData.observe(this) { + if (it.isNotEmpty()) { + seatDialog = BuySeatDialog.newInstance(it[0]) + seatDialog!!.show(childFragmentManager, "") + } else { + toast("获取商品失败,请稍后再试") + } + } + + val paySuccessEvent = RxBus.defaultInstance.toObservable(PaySuccessEvent::class.java).subscribe { + dismissDialog = true + if (!isStateSaved) dismissSeatDialog() + mViewModel.getCorpInfo() + } + addDisposable(paySuccessEvent) + } + + private fun showSeatAuthDialog() { + val f = SeatAuthDialog.newInstance() + f.setOnSelectListener { phone -> + val jsonObject = JsonObject() + jsonObject.addProperty("phone", phone) + mViewModel.addSeat(jsonObject.toString().toRequestBody()) + } + f.show(childFragmentManager, "") + } + + private fun dismissSeatDialog() { + if (dismissDialog) { + seatDialog?.dismiss() + seatDialog = null + dismissDialog = false + } + } + + override fun onResume() { + super.onResume() + dismissSeatDialog() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/seat/SeatManageViewModel.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/seat/SeatManageViewModel.kt new file mode 100644 index 0000000..600bd3a --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/seat/SeatManageViewModel.kt @@ -0,0 +1,94 @@ +package com.cheng.bole.ui.fragment.mine.seat + +import androidx.lifecycle.MutableLiveData +import com.cheng.bole.bean.CorpInfoBean +import com.cheng.bole.bean.SeatItemBean +import com.cheng.bole.bean.VipGoodsEntity +import com.cheng.bole.net.ApiFactory +import com.example.base.extensions.toast +import com.example.base.utils.L +import com.example.base.viewmodel.BaseViewModel +import okhttp3.RequestBody + +class SeatManageViewModel: BaseViewModel() { + val goodsLiveData = MutableLiveData>() + val corpInfoLiveData = MutableLiveData() + val seatListLiveData = MutableLiveData>() + val addLiveData = MutableLiveData() + val deleteLiveData = MutableLiveData() + + fun getGoodsList() { + showDialog() + launchOnUiTryCatch({ + val response = ApiFactory.apiService.getGoodsList("corp_add") + if (response.status) { + goodsLiveData.postValue(response.data) + } else toast(response.message, true) + dismissDialog() + }, { + dismissDialog() + setError(it) + L.d(it) + }) + } + + fun getCorpInfo() { + showDialog() + launchOnUiTryCatch({ + val response = ApiFactory.apiService.getSeatInfo() + if (response.status) { + corpInfoLiveData.postValue(response.data) + } else toast(response.message, true) + dismissDialog() + }, { + dismissDialog() + setError(it) + L.d(it) + }) + } + + fun getSeatList() { + showDialog() + launchOnUiTryCatch({ + val response = ApiFactory.apiService.getSeatList() + if (response.status) { + seatListLiveData.postValue(response.data.items) + } else toast(response.message, true) + dismissDialog() + }, { + dismissDialog() + setError(it) + L.d(it) + }) + } + + fun addSeat(requestBody: RequestBody) { + showDialog() + launchOnUiTryCatch({ + val response = ApiFactory.apiService.addSeat(requestBody) + if (response.status) { + addLiveData.postValue(Any()) + } else toast(response.message, true) + dismissDialog() + }, { + dismissDialog() + setError(it) + L.d(it) + }) + } + + fun deleteSeat(id: String) { + showDialog() + launchOnUiTryCatch({ + val response = ApiFactory.apiService.deleteSeat(id) + if (response.status) { + deleteLiveData.postValue(Any()) + } else toast(response.message, true) + dismissDialog() + }, { + dismissDialog() + setError(it) + L.d(it) + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/mine/settings/SettingsFragment.kt b/app/src/main/java/com/cheng/bole/ui/fragment/mine/settings/SettingsFragment.kt index eb19c07..001a8fd 100644 --- a/app/src/main/java/com/cheng/bole/ui/fragment/mine/settings/SettingsFragment.kt +++ b/app/src/main/java/com/cheng/bole/ui/fragment/mine/settings/SettingsFragment.kt @@ -16,13 +16,16 @@ import com.cheng.bole.ui.dialog.TipDialog import com.cheng.bole.ui.fragment.mine.about.AboutFragment import com.cheng.bole.ui.fragment.mine.account.AccountManageFragment import com.cheng.bole.ui.fragment.mine.account.BindAccountFragment +import com.cheng.bole.utils.AppUpdateUtils import com.cheng.bole.utils.DataCacheUtils +import com.cheng.bole.utils.FileUtils import com.example.base.common.RxBus import com.example.base.extensions.gone import com.example.base.extensions.onClick import com.example.base.extensions.toast import com.example.base.extensions.visible import com.example.base.ui.BaseFragment +import com.example.base.utils.AppUtils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -52,11 +55,16 @@ class SettingsFragment : BaseFragment() { } else if (payType == 1) { PayUtils.toAliPay(requireActivity(), it.payParam, "") } else { -// PublicActivity.start(requireContext(), CertificateFragment::class.java, Pair("orderId", orderEntity!!.orderId)) + PublicActivity.start(requireContext(), CertificateFragment::class.java, Pair("orderId", orderEntity!!.orderId)) } } diff --git a/app/src/main/java/com/cheng/bole/utils/AppUpdateUtils.kt b/app/src/main/java/com/cheng/bole/utils/AppUpdateUtils.kt new file mode 100644 index 0000000..7a1d359 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/utils/AppUpdateUtils.kt @@ -0,0 +1,40 @@ +package com.cheng.bole.utils + +import androidx.fragment.app.Fragment +import com.cheng.bole.BuildConfig +import com.cheng.bole.R +import com.cheng.bole.bean.VersionEntity +import com.cheng.bole.manager.UserConfigManager +import com.cheng.bole.ui.dialog.UpdateVersionDialog +import com.example.base.extensions.toast + +object AppUpdateUtils { + + fun checkUpdate(fragment: Fragment, isManual: Boolean, clickFun: () -> Unit?) { + + if (isManual) { + toast(fragment.getString(R.string.check_version_ing)) + } + + val result: VersionEntity? = UserConfigManager.userConfig?.config?.versionEntity + result?.apply { + if (UIUtils.checkVersion(version, BuildConfig.VERSION_NAME)) { + if (last_version_force == BuildConfig.VERSION_NAME) { + force = true + } else if (UIUtils.checkVersion(last_version_force, BuildConfig.VERSION_NAME)) { + force = true + } + clickFun.invoke() + startUpdate(result, fragment) + } else { + if (isManual) { + toast(fragment.getString(R.string.curr_new_version)) + } + } + } + } + + private fun startUpdate(versionEntity: VersionEntity, fragment: Fragment) { + UpdateVersionDialog.newInstance(versionEntity).show(fragment.childFragmentManager, null) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/utils/StringUtils.kt b/app/src/main/java/com/cheng/bole/utils/StringUtils.kt index 8421c57..eb0a664 100644 --- a/app/src/main/java/com/cheng/bole/utils/StringUtils.kt +++ b/app/src/main/java/com/cheng/bole/utils/StringUtils.kt @@ -4,6 +4,7 @@ import android.text.TextUtils import com.example.base.utils.SpanUtils import java.security.MessageDigest import java.security.NoSuchAlgorithmException +import java.text.DecimalFormat import java.text.ParseException import java.text.SimpleDateFormat import java.util.Calendar @@ -470,6 +471,29 @@ object StringUtils { return spanUtils.create() } + /** + * 格式化金额 + * + * @param str 金额字符串 + */ + fun formatAmount(str: String): String { + if (!isNumeric(str)) return str + try { + val formatter = DecimalFormat("0.00") + val amount = str.toFloat() + if (amount > 100000000) { + return "${formatter.format(amount / 100000000)}亿元" + } else if (amount > 10000) { + return "${formatter.format(amount / 10000)}万元" + } else { + return "${formatter.format(amount)}元" + } + } catch (e: Exception) { + e.printStackTrace() + } + return str + } + /** * 将字符串中的unicode字符转换为中文字符 */ diff --git a/app/src/main/java/com/cheng/bole/utils/UrlHelper.kt b/app/src/main/java/com/cheng/bole/utils/UrlHelper.kt index 295fb90..bc63669 100644 --- a/app/src/main/java/com/cheng/bole/utils/UrlHelper.kt +++ b/app/src/main/java/com/cheng/bole/utils/UrlHelper.kt @@ -17,4 +17,16 @@ object UrlHelper { fun startRenewAgreement(context: Context) { BrowserActivity.start(context, "自动续费服务规则", Constants.renewAgreement) } + + fun startPermissionList(context: Context) { + BrowserActivity.start(context, "权限说明", Constants.permissionList) + } + + fun startShareList(context: Context) { + BrowserActivity.start(context, "第三方共享清单", Constants.shareList) + } + + fun startSDKList(context: Context) { + BrowserActivity.start(context, "第三方SDK目录", Constants.sdkList) + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_invoice_title_color.xml b/app/src/main/res/drawable/selector_invoice_title_color.xml new file mode 100644 index 0000000..4ede1dc --- /dev/null +++ b/app/src/main/res/drawable/selector_invoice_title_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_invoice_title_rb.xml b/app/src/main/res/drawable/selector_invoice_title_rb.xml new file mode 100644 index 0000000..0bc9c08 --- /dev/null +++ b/app/src/main/res/drawable/selector_invoice_title_rb.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_change_account_bg.xml b/app/src/main/res/drawable/shape_change_account_bg.xml new file mode 100644 index 0000000..da512fb --- /dev/null +++ b/app/src/main/res/drawable/shape_change_account_bg.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_current_account_bg.xml b/app/src/main/res/drawable/shape_current_account_bg.xml new file mode 100644 index 0000000..3b03876 --- /dev/null +++ b/app/src/main/res/drawable/shape_current_account_bg.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_eeeeee_cor4.xml b/app/src/main/res/drawable/shape_eeeeee_cor4.xml new file mode 100644 index 0000000..e4d91de --- /dev/null +++ b/app/src/main/res/drawable/shape_eeeeee_cor4.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_ff8340_circle_dp4.xml b/app/src/main/res/drawable/shape_ff8340_circle_dp4.xml deleted file mode 100644 index 744cbc1..0000000 --- a/app/src/main/res/drawable/shape_ff8340_circle_dp4.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_invoice_title_checked.xml b/app/src/main/res/drawable/shape_invoice_title_checked.xml new file mode 100644 index 0000000..8465cb8 --- /dev/null +++ b/app/src/main/res/drawable/shape_invoice_title_checked.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_invoice_title_default.xml b/app/src/main/res/drawable/shape_invoice_title_default.xml new file mode 100644 index 0000000..d43b36d --- /dev/null +++ b/app/src/main/res/drawable/shape_invoice_title_default.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_white_line_cor8.xml b/app/src/main/res/drawable/shape_white_line_cor8.xml new file mode 100644 index 0000000..4146cf6 --- /dev/null +++ b/app/src/main/res/drawable/shape_white_line_cor8.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_bind_phone.xml b/app/src/main/res/layout/dialog_bind_phone.xml index dbf7a8d..7c62674 100644 --- a/app/src/main/res/layout/dialog_bind_phone.xml +++ b/app/src/main/res/layout/dialog_bind_phone.xml @@ -2,59 +2,72 @@ + android:layout_height="wrap_content"> + + + android:layout_marginTop="@dimen/dp_18" + android:background="@mipmap/ic_bind_phone_bg" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toBottomOf="@id/iv_close"> - + android:layout_marginTop="@dimen/dp_4" + android:text="享受一键快捷登录~" + android:textColor="@color/color_222222" + android:textSize="@dimen/sp_12" + app:layout_constraintStart_toStartOf="@id/tv_title" + app:layout_constraintTop_toBottomOf="@id/tv_title" /> + android:layout_height="@dimen/dp_52" + android:layout_marginStart="@dimen/dp_16" + android:layout_marginTop="@dimen/dp_26" + android:layout_marginEnd="@dimen/dp_16" + app:layout_constraintTop_toBottomOf="@id/tv_desc"> @@ -75,24 +88,27 @@ + app:layout_constraintEnd_toEndOf="parent" /> + + diff --git a/app/src/main/res/layout/dialog_buy_seat.xml b/app/src/main/res/layout/dialog_buy_seat.xml new file mode 100644 index 0000000..59411bf --- /dev/null +++ b/app/src/main/res/layout/dialog_buy_seat.xml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_edit_text.xml b/app/src/main/res/layout/dialog_edit_text.xml index aba2e02..8c1ffe6 100644 --- a/app/src/main/res/layout/dialog_edit_text.xml +++ b/app/src/main/res/layout/dialog_edit_text.xml @@ -87,7 +87,7 @@ android:paddingStart="@dimen/dp_16" android:paddingTop="@dimen/dp_9" android:paddingEnd="@dimen/dp_16" - android:paddingBottom="@dimen/dp_30" + android:paddingBottom="@dimen/dp_9" app:layout_constraintTop_toBottomOf="@id/layout_text"> + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_select_bid_type.xml b/app/src/main/res/layout/dialog_select_bid_type.xml index 5dd8297..4540099 100644 --- a/app/src/main/res/layout/dialog_select_bid_type.xml +++ b/app/src/main/res/layout/dialog_select_bid_type.xml @@ -53,7 +53,7 @@ android:paddingStart="@dimen/dp_16" android:paddingTop="@dimen/dp_9" android:paddingEnd="@dimen/dp_16" - android:paddingBottom="@dimen/dp_30" + android:paddingBottom="@dimen/dp_9" app:layout_constraintTop_toBottomOf="@id/mRecyclerView"> diff --git a/app/src/main/res/layout/dialog_select_goods_type.xml b/app/src/main/res/layout/dialog_select_goods_type.xml index 370aab9..86d87f0 100644 --- a/app/src/main/res/layout/dialog_select_goods_type.xml +++ b/app/src/main/res/layout/dialog_select_goods_type.xml @@ -53,7 +53,7 @@ android:paddingStart="@dimen/dp_16" android:paddingTop="@dimen/dp_9" android:paddingEnd="@dimen/dp_16" - android:paddingBottom="@dimen/dp_30" + android:paddingBottom="@dimen/dp_9" app:layout_constraintTop_toBottomOf="@id/mRecyclerView"> + android:layout_height="match_parent" + android:background="@color/white"> + app:layout_constraintTop_toBottomOf="@id/tvVersionName" /> + app:layout_constraintTop_toBottomOf="@id/tvAgreement" /> + app:layout_constraintTop_toBottomOf="@id/view_line1" /> + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_account_manage.xml b/app/src/main/res/layout/fragment_account_manage.xml index 666129a..ba5d0f9 100644 --- a/app/src/main/res/layout/fragment_account_manage.xml +++ b/app/src/main/res/layout/fragment_account_manage.xml @@ -18,9 +18,8 @@ android:id="@+id/rv_account" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginStart="@dimen/dp_16" - android:layout_marginEnd="@dimen/dp_16" - android:layout_marginBottom="@dimen/dp_50" + android:layout_marginTop="@dimen/dp_5" + android:layout_marginBottom="@dimen/dp_15" android:overScrollMode="never" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/fragment_add_contacts.xml b/app/src/main/res/layout/fragment_add_contacts.xml index 11396be..614f8cb 100644 --- a/app/src/main/res/layout/fragment_add_contacts.xml +++ b/app/src/main/res/layout/fragment_add_contacts.xml @@ -178,7 +178,7 @@ android:paddingStart="@dimen/dp_16" android:paddingTop="@dimen/dp_9" android:paddingEnd="@dimen/dp_16" - android:paddingBottom="@dimen/dp_30" + android:paddingBottom="@dimen/dp_9" app:layout_constraintBottom_toBottomOf="parent"> @@ -417,7 +417,7 @@ android:layout_marginStart="@dimen/dp_9" android:layout_marginEnd="@dimen/dp_9" app:hl_cornerRadius="@dimen/dp_10" - app:hl_shadowColor="#0d4a4f5b" + app:hl_shadowColor="@color/color_shadow" app:hl_shadowLimit="@dimen/dp_7" app:layout_constraintTop_toBottomOf="@id/layout_base_info"> @@ -592,7 +592,7 @@ android:paddingStart="@dimen/dp_16" android:paddingTop="@dimen/dp_9" android:paddingEnd="@dimen/dp_16" - android:paddingBottom="@dimen/dp_30" + android:paddingBottom="@dimen/dp_9" app:layout_constraintBottom_toBottomOf="parent"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_company_auth.xml b/app/src/main/res/layout/fragment_company_auth.xml new file mode 100644 index 0000000..6ed5309 --- /dev/null +++ b/app/src/main/res/layout/fragment_company_auth.xml @@ -0,0 +1,389 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_favorite.xml b/app/src/main/res/layout/fragment_favorite.xml new file mode 100644 index 0000000..9b699f8 --- /dev/null +++ b/app/src/main/res/layout/fragment_favorite.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_feedback.xml b/app/src/main/res/layout/fragment_feedback.xml index 14e8bf5..6516d83 100644 --- a/app/src/main/res/layout/fragment_feedback.xml +++ b/app/src/main/res/layout/fragment_feedback.xml @@ -44,7 +44,7 @@ android:layout_marginTop="@dimen/dp_15" android:layout_marginEnd="@dimen/dp_9" app:hl_cornerRadius="@dimen/dp_12" - app:hl_shadowColor="#0d4a4f5b" + app:hl_shadowColor="@color/color_shadow" app:hl_shadowLimit="@dimen/dp_7" app:layout_constraintTop_toBottomOf="@id/tv_title"> @@ -140,7 +140,7 @@ android:layout_marginStart="@dimen/dp_9" android:layout_marginEnd="@dimen/dp_9" app:hl_cornerRadius="@dimen/dp_12" - app:hl_shadowColor="#0d4a4f5b" + app:hl_shadowColor="@color/color_shadow" app:hl_shadowLimit="@dimen/dp_7" app:layout_constraintTop_toBottomOf="@id/layout_type"> @@ -239,7 +239,7 @@ android:layout_marginStart="@dimen/dp_9" android:layout_marginEnd="@dimen/dp_9" app:hl_cornerRadius="@dimen/dp_12" - app:hl_shadowColor="#0d4a4f5b" + app:hl_shadowColor="@color/color_shadow" app:hl_shadowLimit="@dimen/dp_7" app:layout_constraintTop_toBottomOf="@id/layout_content"> @@ -300,7 +300,7 @@ android:paddingStart="@dimen/dp_16" android:paddingTop="@dimen/dp_9" android:paddingEnd="@dimen/dp_16" - android:paddingBottom="@dimen/dp_30" + android:paddingBottom="@dimen/dp_9" app:layout_constraintBottom_toBottomOf="parent"> + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_invoice.xml b/app/src/main/res/layout/fragment_invoice.xml new file mode 100644 index 0000000..2e4142b --- /dev/null +++ b/app/src/main/res/layout/fragment_invoice.xml @@ -0,0 +1,749 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_merchant_goods_detail.xml b/app/src/main/res/layout/fragment_merchant_goods_detail.xml index 55f27c6..7f888ab 100644 --- a/app/src/main/res/layout/fragment_merchant_goods_detail.xml +++ b/app/src/main/res/layout/fragment_merchant_goods_detail.xml @@ -66,7 +66,7 @@ android:layout_marginTop="@dimen/dp_13" android:layout_marginEnd="@dimen/dp_9" app:hl_cornerRadius="@dimen/dp_12" - app:hl_shadowColor="#0d4a4f5b" + app:hl_shadowColor="@color/color_shadow" app:hl_shadowLimit="@dimen/dp_7" app:layout_constraintTop_toTopOf="parent"> @@ -153,7 +153,7 @@ android:layout_marginStart="@dimen/dp_9" android:layout_marginEnd="@dimen/dp_9" app:hl_cornerRadius="@dimen/dp_12" - app:hl_shadowColor="#0d4a4f5b" + app:hl_shadowColor="@color/color_shadow" app:hl_shadowLimit="@dimen/dp_7" app:layout_constraintTop_toBottomOf="@id/layout_goods_info"> @@ -235,7 +235,7 @@ android:layout_marginStart="@dimen/dp_9" android:layout_marginEnd="@dimen/dp_9" app:hl_cornerRadius="@dimen/dp_12" - app:hl_shadowColor="#0d4a4f5b" + app:hl_shadowColor="@color/color_shadow" app:hl_shadowLimit="@dimen/dp_7" app:layout_constraintTop_toBottomOf="@id/layout_company_info"> diff --git a/app/src/main/res/layout/fragment_message.xml b/app/src/main/res/layout/fragment_message.xml new file mode 100644 index 0000000..ee2eca3 --- /dev/null +++ b/app/src/main/res/layout/fragment_message.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_order.xml b/app/src/main/res/layout/fragment_order.xml new file mode 100644 index 0000000..ca977d6 --- /dev/null +++ b/app/src/main/res/layout/fragment_order.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_order_list.xml b/app/src/main/res/layout/fragment_order_list.xml new file mode 100644 index 0000000..ece4d9f --- /dev/null +++ b/app/src/main/res/layout/fragment_order_list.xml @@ -0,0 +1,21 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_publish_bid_message.xml b/app/src/main/res/layout/fragment_publish_bid_message.xml index edcad42..7a3ba83 100644 --- a/app/src/main/res/layout/fragment_publish_bid_message.xml +++ b/app/src/main/res/layout/fragment_publish_bid_message.xml @@ -59,7 +59,7 @@ android:layout_height="wrap_content" android:visibility="gone" app:hl_cornerRadius="@dimen/dp_12" - app:hl_shadowColor="#0d4a4f5b" + app:hl_shadowColor="@color/color_shadow" app:hl_shadowLimit="@dimen/dp_7"> @@ -161,7 +161,7 @@ android:layout_marginEnd="@dimen/dp_9" app:hl_cornerRadius="@dimen/dp_10" app:hl_layoutBackground="@color/white" - app:hl_shadowColor="#0d4a4f5b" + app:hl_shadowColor="@color/color_shadow" app:hl_shadowLimit="@dimen/dp_7" app:layout_goneMarginTop="@dimen/dp_13" app:layout_constraintTop_toBottomOf="@id/layout_history"> @@ -218,7 +218,7 @@ android:layout_marginEnd="@dimen/dp_9" app:hl_cornerRadius="@dimen/dp_10" app:hl_layoutBackground="@color/white" - app:hl_shadowColor="#0d4a4f5b" + app:hl_shadowColor="@color/color_shadow" app:hl_shadowLimit="@dimen/dp_7" app:layout_constraintTop_toBottomOf="@id/layout_recommend"> diff --git a/app/src/main/res/layout/fragment_seat_manage.xml b/app/src/main/res/layout/fragment_seat_manage.xml new file mode 100644 index 0000000..b9fd2b2 --- /dev/null +++ b/app/src/main/res/layout/fragment_seat_manage.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 627a261..79f31d1 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -55,13 +55,14 @@ @@ -93,6 +94,49 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_source_search.xml b/app/src/main/res/layout/fragment_source_search.xml index 510efe1..dc81966 100644 --- a/app/src/main/res/layout/fragment_source_search.xml +++ b/app/src/main/res/layout/fragment_source_search.xml @@ -158,7 +158,7 @@ android:layout_marginTop="@dimen/dp_5" android:layout_marginEnd="@dimen/dp_9" app:hl_cornerRadius="@dimen/dp_10" - app:hl_shadowColor="#0d4a4f5b" + app:hl_shadowColor="@color/color_shadow" app:hl_shadowLimit="@dimen/dp_7" app:layout_constraintTop_toBottomOf="@id/tv_recommend_title"> diff --git a/app/src/main/res/layout/listitem_account.xml b/app/src/main/res/layout/listitem_account.xml index e528e0f..3331bef 100644 --- a/app/src/main/res/layout/listitem_account.xml +++ b/app/src/main/res/layout/listitem_account.xml @@ -1,117 +1,150 @@ - + app:hl_cornerRadius="@dimen/dp_8" + app:hl_shadowColor="#1a9399a1" + app:hl_shadowLimit="@dimen/dp_7"> - + - + - + - + - + - + + - + - + - + - + - \ No newline at end of file + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/listitem_bid.xml b/app/src/main/res/layout/listitem_bid.xml index da0e65d..98d4f6a 100644 --- a/app/src/main/res/layout/listitem_bid.xml +++ b/app/src/main/res/layout/listitem_bid.xml @@ -6,7 +6,7 @@ android:layout_marginStart="@dimen/dp_5" android:layout_marginEnd="@dimen/dp_5" app:hl_cornerRadius="@dimen/dp_8" - app:hl_shadowColor="#0d4a4f5b" + app:hl_shadowColor="@color/color_shadow" app:hl_shadowLimit="@dimen/dp_7"> + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/listitem_order.xml b/app/src/main/res/layout/listitem_order.xml new file mode 100644 index 0000000..f18548f --- /dev/null +++ b/app/src/main/res/layout/listitem_order.xml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/listitem_seat_manage.xml b/app/src/main/res/layout/listitem_seat_manage.xml new file mode 100644 index 0000000..8df4846 --- /dev/null +++ b/app/src/main/res/layout/listitem_seat_manage.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/listitem_selected_source.xml b/app/src/main/res/layout/listitem_selected_source.xml index 235f755..0c3d693 100644 --- a/app/src/main/res/layout/listitem_selected_source.xml +++ b/app/src/main/res/layout/listitem_selected_source.xml @@ -6,7 +6,7 @@ android:layout_marginTop="@dimen/dp_1" android:layout_marginEnd="@dimen/dp_1" app:hl_cornerRadius="@dimen/dp_25" - app:hl_shadowColor="#0d4a4f5b" + app:hl_shadowColor="@color/color_shadow" app:hl_shadowLimit="@dimen/dp_7"> #FF000000 #FFFFFF #F7F9FD + #0d4a4f5b @@ -113,4 +114,9 @@ #703D27 #753906 #146847 + #EAEAEA + #F5F5F5 + #DCE4F3 + #F7EBE2 + #FF8518 \ No newline at end of file