diff --git a/app/src/main/assets/fonts/DingTalk-JinBuTi.ttf b/app/src/main/assets/fonts/DingTalk-JinBuTi.ttf new file mode 100644 index 0000000..c4efa55 Binary files /dev/null and b/app/src/main/assets/fonts/DingTalk-JinBuTi.ttf differ 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 a994d6d..82d2cfc 100644 --- a/app/src/main/java/com/cheng/bole/bean/ContactsInfoBean.kt +++ b/app/src/main/java/com/cheng/bole/bean/ContactsInfoBean.kt @@ -1,16 +1,19 @@ package com.cheng.bole.bean +import android.R import java.io.Serializable class ContactsInfoBean( + val id: String, var name: String, var phone: String, - var job: String -): Serializable { + var job: String, + var isChecked: Boolean = false +) : Serializable { class Job( val name: String, var isChecked: Boolean = false - ): Serializable + ) : Serializable companion object { fun getPositionList(): List { diff --git a/app/src/main/java/com/cheng/bole/bean/SupplierGoodsBean.kt b/app/src/main/java/com/cheng/bole/bean/SupplierGoodsBean.kt new file mode 100644 index 0000000..23947d0 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/bean/SupplierGoodsBean.kt @@ -0,0 +1,26 @@ +package com.cheng.bole.bean + +import java.io.Serializable + +data class SupplierGoodsBean( + val city_id: String, + val city_name: String, + val company: CompanyBean, + val contact: List, + val create_time: String, + val file: List, + val goods_description: String, + val goods_name: String, + val goods_price: String, + val goods_price_show: String, + val goods_price_type: String, + val id: String, + val remark: String, + val review_time: String, + val status: String, + val type: String, + val update_time: String, + val user_id: String, + val view_count: String, + val is_broadcast: Boolean +) : Serializable \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/common/Constants.kt b/app/src/main/java/com/cheng/bole/common/Constants.kt index 206b580..f2d2cc2 100644 --- a/app/src/main/java/com/cheng/bole/common/Constants.kt +++ b/app/src/main/java/com/cheng/bole/common/Constants.kt @@ -31,4 +31,5 @@ object Constants { val dDIN_PRO_M = Typeface.createFromAsset(Utils.getApp().assets, "fonts/D-DIN-PRO-500-Medium.otf") val douyinsansB = Typeface.createFromAsset(Utils.getApp().assets, "fonts/DouyinSansBold.otf") val pmzdbt = Typeface.createFromAsset(Utils.getApp().assets, "fonts/PangMenZhengDaoBiaoTiTi.ttf") + val dtjbt = Typeface.createFromAsset(Utils.getApp().assets, "fonts/DingTalk-JinBuTi.ttf") } \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/event/ContactsEvent.kt b/app/src/main/java/com/cheng/bole/event/ContactsEvent.kt new file mode 100644 index 0000000..5a2d128 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/event/ContactsEvent.kt @@ -0,0 +1,6 @@ +package com.cheng.bole.event + +import com.cheng.bole.bean.ContactsInfoBean + +class ContactsEvent(val contacts: ContactsInfoBean) { +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/event/SupplyEvent.kt b/app/src/main/java/com/cheng/bole/event/SupplyEvent.kt new file mode 100644 index 0000000..0bc9934 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/event/SupplyEvent.kt @@ -0,0 +1,4 @@ +package com.cheng.bole.event + +class SupplyEvent(val from: Int = 0) { +} \ 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 new file mode 100644 index 0000000..818e482 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/manager/ContactsManager.kt @@ -0,0 +1,35 @@ +package com.cheng.bole.manager + +import android.R +import android.text.TextUtils +import com.cheng.bole.bean.ContactsInfoBean +import com.example.base.utils.MMKVUtils +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +object ContactsManager { + + fun add(contacts: ContactsInfoBean) { + val list = all() + list.add(contacts) + MMKVUtils.put("contacts_list", Gson().toJson(list)) + } + + fun delete(id: String) { + val list = all() + val contacts = list.find { it.id == id } + if (contacts != null) { + list.remove(contacts) + } + MMKVUtils.put("contacts_list", Gson().toJson(list)) + } + + fun all(): MutableList { + val str = MMKVUtils.getString("contacts_list") + return if (!TextUtils.isEmpty(str)) { + Gson().fromJson(str, object : TypeToken>(){}.type) + } else { + mutableListOf() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/dialog/PublishBidDialog.kt b/app/src/main/java/com/cheng/bole/ui/dialog/PublishBidDialog.kt index 272d5b1..bfc1635 100644 --- a/app/src/main/java/com/cheng/bole/ui/dialog/PublishBidDialog.kt +++ b/app/src/main/java/com/cheng/bole/ui/dialog/PublishBidDialog.kt @@ -19,7 +19,7 @@ import com.cheng.bole.databinding.DialogPublishBidBinding import com.cheng.bole.manager.EventReportManager import com.cheng.bole.ui.activity.PublicActivity import com.cheng.bole.ui.fragment.bid.publish.bid.PublishBidMessageFragment -import com.efs.sdk.memleaksdk.monitor.internal.bi +import com.cheng.bole.ui.fragment.bid.publish.goods.PublishGoodsMessageFragment import com.example.base.extensions.onClick import com.example.base.utils.ScreenUtils @@ -70,7 +70,7 @@ class PublishBidDialog : DialogFragment() { } binding.layoutGoods.onClick { -// PublicActivity.start(requireActivity(), PublishSupplyMessageFragment::class.java, Pair("from", 1)) + PublicActivity.start(requireActivity(), PublishGoodsMessageFragment::class.java, Pair("from", 1)) EventReportManager.eventReport(EventConstants.JUMP_TO_PUBLISH, "home", "商品") dismiss() } @@ -82,7 +82,7 @@ class PublishBidDialog : DialogFragment() { val lp = binding.tvTitle.layoutParams as ConstraintLayout.LayoutParams lp.topMargin = (binding.ivTopBg.height * 55f / 291f).toInt() binding.tvTitle.layoutParams = lp -// (binding.tvTitle.layoutParams as ConstraintLayout.LayoutParams).topMargin = (binding.ivTopBg.height * 85f / 291f).toInt() + binding.ivTopBg.viewTreeObserver.removeOnGlobalLayoutListener(this) } }) diff --git a/app/src/main/java/com/cheng/bole/ui/dialog/SelectBidTypeDialog.kt b/app/src/main/java/com/cheng/bole/ui/dialog/SelectBidTypeDialog.kt index acb0184..0167a47 100644 --- a/app/src/main/java/com/cheng/bole/ui/dialog/SelectBidTypeDialog.kt +++ b/app/src/main/java/com/cheng/bole/ui/dialog/SelectBidTypeDialog.kt @@ -109,7 +109,7 @@ class SelectBidTypeDialog : DialogFragment() { class BidTypeAdapter : BaseQuickAdapter(R.layout.listitem_bid_type) { override fun convert(holder: BaseViewHolder, item: BidTypeBean) { holder.setText(R.id.tv_name, item.name) - holder.setTextColor(R.id.tv_name, if (item.isChecked) getColor(R.color.color_ff493c) else getColor(R.color.color_666666)) + holder.setTextColor(R.id.tv_name, if (item.isChecked) getColor(R.color.color_125ffe) else getColor(R.color.color_1a1a1a)) holder.getView(R.id.tv_name).typeface = if (item.isChecked) Typeface.DEFAULT_BOLD else Typeface.DEFAULT holder.itemView.setBackgroundResource(if (item.isChecked) R.drawable.shape_f1f6f_cor4 else 0) diff --git a/app/src/main/java/com/cheng/bole/ui/dialog/SelectContactsDialog.kt b/app/src/main/java/com/cheng/bole/ui/dialog/SelectContactsDialog.kt new file mode 100644 index 0000000..ae4184f --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/dialog/SelectContactsDialog.kt @@ -0,0 +1,167 @@ +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.fragment.app.DialogFragment +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.ContactsInfoBean +import com.cheng.bole.databinding.DialogSelectContactsBinding +import com.cheng.bole.event.ContactsEvent +import com.cheng.bole.manager.ContactsManager +import com.cheng.bole.ui.activity.PublicActivity +import com.cheng.bole.ui.fragment.bid.publish.contacts.AddContactsFragment +import com.example.base.common.RxBus +import com.example.base.extensions.onClick +import com.example.base.extensions.toast +import com.example.base.utils.ScreenUtils +import com.example.base.widget.EmptyView +import com.example.base.widget.PageStatus +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import io.reactivex.disposables.Disposable + +class SelectContactsDialog : DialogFragment() { + private val mAdapter by lazy { ContactsAdapter() } + + private val mEmptyView by lazy { EmptyView(requireContext()) } + + private var contactsEvent: Disposable? = null + + private var mOnBackListener: ((List) -> Unit)? = null //回调事件 + + private lateinit var binding: DialogSelectContactsBinding + + 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_select_contacts, null) + + binding = DialogSelectContactsBinding.bind(view) + + binding.mRecyclerView.adapter = mAdapter + mEmptyView.setNoDataLogo(R.mipmap.ic_empty_contacts) + mEmptyView.setNoDataText("暂无联系人信息") + mAdapter.setEmptyView(mEmptyView) + + mAdapter.setOnItemClickListener { _, _, i -> + val item = mAdapter.getItem(i) + item.isChecked = !item.isChecked + mAdapter.notifyDataSetChanged() + + binding.tvTitle.text = "已选择${mAdapter.data.filter { it.isChecked }.size}人" + } + + mAdapter.setOnItemChildClickListener { _, _, i -> + PublicActivity.start(requireContext(), AddContactsFragment::class.java, Pair("item", mAdapter.getItem(i))) + } + + binding.btnAdd.onClick { + PublicActivity.start(requireContext(), AddContactsFragment::class.java) + } + + binding.btnNext.onClick { + val selectList = mAdapter.data.filter { it.isChecked } + if (selectList.isEmpty()) { + toast("请选择联系人") + return@onClick + } + mOnBackListener?.invoke(selectList) + dismiss() + } + + binding.ivClose.onClick { dismiss() } + + contactsEvent = RxBus.defaultInstance.toObservable(ContactsEvent::class.java).subscribe { + setData(false) + } + + setData(true) + + val dialog = Dialog(requireContext()) + dialog.setContentView(view) + return dialog + } + + private fun setData(init: Boolean) { + val selectList = if (init) { + val listStr = arguments?.getString("list") ?: "" + if (!TextUtils.isEmpty(listStr)) { + Gson().fromJson(listStr, object : TypeToken>() {}.type) + } else mutableListOf() + } else { + mAdapter.data.filter { it.isChecked } + } + + val contactsList = ContactsManager.all() + contactsList.forEach { contacts -> + if (selectList.find { it.id == contacts.id } != null) { + contacts.isChecked = true + } + } + mAdapter.setList(contactsList) + if (mAdapter.data.isNotEmpty()) { + mEmptyView.setStatus(PageStatus.GONG) + } else { + mEmptyView.setStatus(PageStatus.NO_DATA) + } + binding.tvTitle.text = "已选择${mAdapter.data.filter { it.isChecked }.size}人" + } + + override fun onDestroyView() { + contactsEvent?.dispose() + super.onDestroyView() + } + + fun setOnSelectListener(listener: ((List) -> Unit)) { + mOnBackListener = listener + } + + companion object { + fun newInstance(list: List): SelectContactsDialog { + val arg = Bundle() + arg.putString("list", Gson().toJson(list)) + val fragment = SelectContactsDialog() + fragment.arguments = arg + return fragment + } + } + + class ContactsAdapter : BaseQuickAdapter(R.layout.listitem_contacts) { + + init { + addChildClickViewIds(R.id.iv_edit) + } + + override fun convert(holder: BaseViewHolder, item: ContactsInfoBean) { + holder.setText(R.id.tv_phone, item.phone) + holder.setText(R.id.tv_name, "${item.name} | ${item.job}") + holder.setImageResource(R.id.iv_check, if (item.isChecked) R.mipmap.ic_rb_checked else R.mipmap.ic_rb_default) + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/dialog/SelectGoodsTypeDialog.kt b/app/src/main/java/com/cheng/bole/ui/dialog/SelectGoodsTypeDialog.kt new file mode 100644 index 0000000..c6e1bac --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/dialog/SelectGoodsTypeDialog.kt @@ -0,0 +1,117 @@ +package com.cheng.bole.ui.dialog + +import android.annotation.SuppressLint +import android.app.Dialog +import android.graphics.Color +import android.graphics.Typeface +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.fragment.app.DialogFragment +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.BidTypeBean +import com.cheng.bole.databinding.DialogSelectGoodsTypeBinding +import com.example.base.extensions.getColor +import com.example.base.extensions.onClick +import com.example.base.extensions.toast +import com.example.base.utils.ScreenUtils + +class SelectGoodsTypeDialog : DialogFragment() { + private val typeList by lazy { + listOf( + BidTypeBean("1", "提供服务"), + BidTypeBean("2", "提供产品"), + BidTypeBean("3", "其他") + ) + } + + private val type by lazy { arguments?.getString("type") ?: "" } + private val mAdapter by lazy { GoodsTypeAdapter() } + + private var bidType: BidTypeBean? = null + + private var mOnBackListener: ((BidTypeBean) -> Unit)? = null //回调事件 + + private lateinit var binding: DialogSelectGoodsTypeBinding + + 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_select_goods_type, null) + + binding = DialogSelectGoodsTypeBinding.bind(view) + + binding.mRecyclerView.adapter = mAdapter + typeList.find { it.id == type }?.isChecked = true + mAdapter.setList(typeList) + + mAdapter.setOnItemClickListener { _, _, i -> + val item = mAdapter.getItem(i) + mAdapter.data.find { it.isChecked }?.isChecked = false + item.isChecked = true + bidType = item + mAdapter.notifyDataSetChanged() + } + + binding.btnNext.onClick { + if (bidType == null) { + toast("请选择类型") + return@onClick + } + mOnBackListener?.invoke(bidType!!) + dismiss() + } + + binding.ivClose.onClick { dismiss() } + + val dialog = Dialog(requireContext()) + dialog.setContentView(view) + return dialog + } + + fun setOnSelectListener(listener: ((BidTypeBean) -> Unit)) { + mOnBackListener = listener + } + + companion object { + fun newInstance(type: String): SelectGoodsTypeDialog { + val arg = Bundle() + arg.putString("type", type) + val fragment = SelectGoodsTypeDialog() + fragment.arguments = arg + return fragment + } + } + + class GoodsTypeAdapter : BaseQuickAdapter(R.layout.listitem_bid_type) { + override fun convert(holder: BaseViewHolder, item: BidTypeBean) { + holder.setText(R.id.tv_name, item.name) + holder.setTextColor(R.id.tv_name, if (item.isChecked) getColor(R.color.color_125ffe) else getColor(R.color.color_1a1a1a)) + holder.getView(R.id.tv_name).typeface = if (item.isChecked) Typeface.DEFAULT_BOLD else Typeface.DEFAULT + + holder.itemView.setBackgroundResource(if (item.isChecked) R.drawable.shape_f1f6f_cor4 else 0) + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/bid/AddBidContactsAdapter.kt b/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/bid/AddBidContactsAdapter.kt index 46dd372..1aec0a4 100644 --- a/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/bid/AddBidContactsAdapter.kt +++ b/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/bid/AddBidContactsAdapter.kt @@ -7,10 +7,6 @@ import com.cheng.bole.bean.ContactsInfoBean class AddBidContactsAdapter: BaseQuickAdapter(R.layout.listitem_publish_bid_contacts) { - init { - addChildClickViewIds(R.id.iv_edit) - } - override fun convert(holder: BaseViewHolder, item: ContactsInfoBean) { holder.setText(R.id.tv_name, item.name) holder.setText(R.id.tv_phone, item.phone) diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/bid/PublishBidMessageFragment.kt b/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/bid/PublishBidMessageFragment.kt index 089f789..cf4774f 100644 --- a/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/bid/PublishBidMessageFragment.kt +++ b/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/bid/PublishBidMessageFragment.kt @@ -3,7 +3,10 @@ package com.cheng.bole.ui.fragment.bid.publish.bid import android.annotation.SuppressLint import android.os.Build import android.text.TextUtils +import android.view.ViewOutlineProvider +import android.view.ViewTreeObserver import androidx.activity.result.contract.ActivityResultContracts +import androidx.constraintlayout.widget.ConstraintLayout import com.cheng.bole.R import com.cheng.bole.bean.AreaBean import com.cheng.bole.bean.AttachmentBean @@ -16,6 +19,7 @@ import com.cheng.bole.impl.TextWatcherImpl import com.cheng.bole.manager.UserConfigManager import com.cheng.bole.ui.dialog.SelectAreaDialog import com.cheng.bole.ui.dialog.SelectBidTypeDialog +import com.cheng.bole.ui.dialog.SelectContactsDialog import com.cheng.bole.utils.FileProviderUtils import com.cheng.bole.utils.GlideEngine import com.cheng.bole.utils.PermissionUtils @@ -67,10 +71,25 @@ class PublishBidMessageFragment : BaseFragment + binding.rgInfoType.setOnCheckedChangeListener { _, checkedId -> when (checkedId) { R.id.rb1 -> { contentType = 1 - binding.etProjectInfo.visible() + binding.etInfo.visible() binding.tvTextCount.visible() binding.tvImageCount.gone() binding.tvImageLimitTip.gone() @@ -136,7 +157,7 @@ class PublishBidMessageFragment : BaseFragment { contentType = 2 - binding.etProjectInfo.gone() + binding.etInfo.gone() binding.tvTextCount.gone() binding.tvImageCount.visible() binding.tvImageLimitTip.visible() @@ -186,19 +207,10 @@ class PublishBidMessageFragment : BaseFragment - /*val f = AddContactsDialog.newInstance(contactsAdapter.getItem(i)) - f.setOnSelectListener { - contactsAdapter.removeAt(i) - contactsAdapter.addData(i, it) - } - f.show(childFragmentManager, AddContactsDialog::class.java.simpleName)*/ - } - binding.btnNext.onClick { - val name = binding.etProjectName.text.toString().trim() - val price = binding.etProjectPrice.text.toString().trim() - val contentText = binding.etProjectInfo.text.toString().trim() + val name = binding.etName.text.toString().trim() + val price = binding.etPrice.text.toString().trim() + val contentText = binding.etInfo.text.toString().trim() if (bidType == null) { toast("请选择项目类型") return@onClick @@ -267,17 +279,17 @@ class PublishBidMessageFragment : BaseFragment>(Gson().toJson(detail.origin_content), object : TypeToken>(){}.type) @@ -358,12 +370,12 @@ class PublishBidMessageFragment : BaseFragment() { + private val mAdapter by lazy { ContactsJobAdapter() } + + private var contactsInfo: ContactsInfoBean? = null + + override fun initView() { + super.initView() + mTitleBar?.setBackgroundColor(Color.WHITE) + + binding.rvJob.adapter = mAdapter + binding.rvJob.addItemDecoration(GridSpaceItemDecoration(3, DensityUtils.dp2px(8f), DensityUtils.dp2px(8f))) + mAdapter.setList(ContactsInfoBean.getPositionList()) + } + + override fun initData() { + super.initData() + contactsInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + arguments?.getSerializable("item", ContactsInfoBean::class.java) + } else { + arguments?.getSerializable("item") as? ContactsInfoBean + } + setData() + } + + override fun initListener() { + super.initListener() + mAdapter.setOnItemClickListener { _, _, i -> + val item = mAdapter.getItem(i) + mAdapter.data.find { it.isChecked }?.isChecked = false + item.isChecked = true + mAdapter.notifyDataSetChanged() + + binding.etJob.setText(item.name) + } + + binding.btnDelete.onClick { + if (contactsInfo != null) { + val f = TipDialog.newInstance("温馨提示", "确定删除该联系人?") + f.setOnSelectListener { + if (it == DialogEnum.CLICK_OK) { + ContactsManager.delete(contactsInfo!!.id) + RxBus.defaultInstance.post(ContactsEvent(contactsInfo!!)) + requireActivity().finish() + } + } + f.show(childFragmentManager, "") + } + } + + binding.btnNext.onClick { + val name = binding.etName.text.toString().trim() + val contacts = binding.etPhone.text.toString().trim() + val job = binding.etJob.text.toString().trim() + if (TextUtils.isEmpty(name)) { + toast("请输入姓名") + return@onClick + } + if (TextUtils.isEmpty(contacts)) { + toast("请输入联系方式") + return@onClick + } + if (TextUtils.isEmpty(job) && mAdapter.data.find { it.isChecked } == null) { + toast("请输入职位") + return@onClick + } + val contactsInfo = ContactsInfoBean(UUID.randomUUID().toString(), name, contacts, mAdapter.data.find { it.isChecked }?.name ?: job) + ContactsManager.add(contactsInfo) + RxBus.defaultInstance.post(ContactsEvent(contactsInfo)) + requireActivity().finish() + } + } + + override fun initObserve() { + super.initObserve() + } + + private fun setData() { + if (contactsInfo != null) { + binding.etName.setText(contactsInfo!!.name) + binding.etPhone.setText(contactsInfo!!.phone) + binding.etJob.setText(contactsInfo!!.job) + } + binding.btnDelete.visibility = if (contactsInfo != null) View.VISIBLE else View.GONE + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/contacts/AddContactsViewModel.kt b/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/contacts/AddContactsViewModel.kt new file mode 100644 index 0000000..095dd8d --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/contacts/AddContactsViewModel.kt @@ -0,0 +1,6 @@ +package com.cheng.bole.ui.fragment.bid.publish.contacts + +import com.example.base.viewmodel.BaseViewModel + +class AddContactsViewModel: BaseViewModel() { +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/contacts/ContactsJobAdapter.kt b/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/contacts/ContactsJobAdapter.kt new file mode 100644 index 0000000..b82ccac --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/contacts/ContactsJobAdapter.kt @@ -0,0 +1,17 @@ +package com.cheng.bole.ui.fragment.bid.publish.contacts + +import android.graphics.Typeface +import android.widget.TextView +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.ContactsInfoBean +import com.example.base.extensions.getColor + +class ContactsJobAdapter : BaseQuickAdapter(R.layout.listitem_contacts_job) { + override fun convert(holder: BaseViewHolder, item: ContactsInfoBean.Job) { + holder.setText(R.id.tv_name, item.name) + holder.setTextColor(R.id.tv_name, if (item.isChecked) getColor(R.color.color_125ffe) else getColor(R.color.color_1a1a1a)) + holder.getView(R.id.tv_name).typeface = if (item.isChecked) Typeface.DEFAULT_BOLD else Typeface.DEFAULT + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/goods/PublishGoodsMessageFragment.kt b/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/goods/PublishGoodsMessageFragment.kt new file mode 100644 index 0000000..16ee649 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/goods/PublishGoodsMessageFragment.kt @@ -0,0 +1,339 @@ +package com.cheng.bole.ui.fragment.bid.publish.goods + +import android.annotation.SuppressLint +import android.os.Build +import android.text.TextUtils +import android.view.ViewOutlineProvider +import android.view.ViewTreeObserver +import androidx.constraintlayout.widget.ConstraintLayout +import com.cheng.bole.R +import com.cheng.bole.bean.AreaBean +import com.cheng.bole.bean.SupplierGoodsBean +import com.cheng.bole.bean.UploadFileEntity +import com.cheng.bole.common.Constants +import com.cheng.bole.databinding.FragmentPublishGoodsMessageBinding +import com.cheng.bole.impl.TextWatcherImpl +import com.cheng.bole.manager.UserConfigManager +import com.cheng.bole.ui.dialog.SelectAreaDialog +import com.cheng.bole.ui.dialog.SelectContactsDialog +import com.cheng.bole.ui.dialog.SelectGoodsTypeDialog +import com.cheng.bole.ui.fragment.bid.publish.bid.AddBidContactsAdapter +import com.cheng.bole.ui.fragment.bid.publish.bid.AddBidImageAdapter +import com.cheng.bole.utils.GlideEngine +import com.cheng.bole.utils.PermissionUtils +import com.example.base.extensions.getColor +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.SpanUtils +import com.google.gson.Gson +import com.google.gson.JsonArray +import com.google.gson.JsonObject +import com.google.gson.reflect.TypeToken +import com.huantansheng.easyphotos.EasyPhotos +import com.huantansheng.easyphotos.callback.SelectCallback +import com.huantansheng.easyphotos.models.album.entity.Photo +import okhttp3.RequestBody.Companion.toRequestBody + +class PublishGoodsMessageFragment: BaseFragment() { + private val from by lazy { arguments?.getInt("from") ?: 0 } + + private var goodsDetail: SupplierGoodsBean? = null + + private val imageAdapter by lazy { AddBidImageAdapter(requireContext(), uploadedImgList) } + private var uploadedImgList: ArrayList = ArrayList() + private val deletedList = mutableListOf() + + private val contactsAdapter by lazy { AddBidContactsAdapter() } + + private var goodsType: String = "" // 1 提供服务 2 提供产品 3其他 + private var priceType: Int = 1 // 1 具体价格 2 面议 + + private var city: AreaBean? = null + + private val textWatcher = object : TextWatcherImpl() { + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + super.onTextChanged(s, start, before, count) + SpanUtils.with(binding.tvTextCount) + .append("${s?.length ?: 0}") + .setForegroundColor(getColor(R.color.color_1a1a1a)) + .append("/500") + .create() + } + } + + override fun initView() { + super.initView() + binding.tvDesc.typeface = Constants.dtjbt + + imageAdapter.selectMax = 5 + binding.rvImages.adapter = imageAdapter + binding.rvContacts.adapter = contactsAdapter + + binding.ivTopBg.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + val lp1 = binding.tvDesc.layoutParams as ConstraintLayout.LayoutParams + lp1.topMargin = (binding.ivTopBg.height * 100f / 314f).toInt() + binding.tvDesc.layoutParams = lp1 + + binding.layoutContent.setupWith(binding.layoutContainer).setFrameClearDrawable(binding.layoutContent.background).setBlurRadius(5f) + binding.layoutContent.outlineProvider = ViewOutlineProvider.BACKGROUND + binding.layoutContent.setClipToOutline(true) + + binding.ivTopBg.viewTreeObserver.removeOnGlobalLayoutListener(this) + } + }) + } + + override fun initData() { + super.initData() + goodsDetail = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + arguments?.getSerializable("item", SupplierGoodsBean::class.java) + } else { + arguments?.getSerializable("item") as? SupplierGoodsBean + } + if (goodsDetail != null) { + setData(goodsDetail!!) + } + } + + @SuppressLint("NotifyDataSetChanged") + override fun initListener() { + super.initListener() + binding.etExplain.addTextChangedListener(textWatcher) + + binding.tvType.onClick { + val f = SelectGoodsTypeDialog.newInstance(goodsType) + f.setOnSelectListener { + goodsType = it.id + binding.tvType.text = it.name + } + f.show(childFragmentManager, "") + } + + 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, SelectAreaDialog::class.java.simpleName) + } + + 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.tvPrice1.onClick { + binding.rbPrice1.isChecked = true + } + + binding.tvPrice2.onClick { + binding.rbPrice2.isChecked = true + } + + binding.rgPriceType.setOnCheckedChangeListener { _, checkedId -> + when(checkedId) { + R.id.rb_price1 -> { + priceType = 1 + binding.etPrice.setText("") + binding.etPrice.isEnabled = true + binding.tvUnit.visible() + } + R.id.rb_price2 -> { + priceType = 2 + binding.etPrice.setText("面议") + binding.etPrice.isEnabled = false + binding.tvUnit.gone() + } + } + } + + imageAdapter.setOnItemClick { type, position -> + when (type) { + AddBidImageAdapter.TYPE_ADD -> { + PermissionUtils.checkPhotoPermission(requireActivity(), childFragmentManager, true) { isGranted -> + if (isGranted) selectPhoto() + } + } + + AddBidImageAdapter.TYPE_DELETE -> { + if (uploadedImgList.isNotEmpty()) { + if (goodsDetail == null) { + mViewModel.deleteFile(imageAdapter.data[position].id) + } + deletedList.add(uploadedImgList[position].id) + uploadedImgList.removeAt(position) + imageAdapter.notifyDataSetChanged() + SpanUtils.with(binding.tvImageCount) + .append("(") + .append("${uploadedImgList.size}") + .setForegroundColor(getColor(R.color.color_ff493c)) + .append("/5)") + .create() + } + } + } + } + + binding.btnNext.onClick { + val name = binding.etName.text.toString().trim() + val price = binding.etPrice.text.toString().trim() + val desc = binding.etExplain.text.toString().trim() + if (TextUtils.isEmpty(name)) { + toast("请输入名称") + return@onClick + } + if (priceType == 1 && TextUtils.isEmpty(price)) { + toast("请输入价格") + return@onClick + } + if (city == null) { + toast("请选择地区") + return@onClick + } + if (TextUtils.isEmpty(desc)) { + toast("请输入说明") + return@onClick + } + if (imageAdapter.data.isEmpty()) { + toast("请上传宣传图") + return@onClick + } + if (contactsAdapter.data.isEmpty()) { + toast("请添加联系人") + return@onClick + } + commit() + } + } + + @SuppressLint("NotifyDataSetChanged") + override fun initObserve() { + super.initObserve() + mViewModel.addLiveData.observe(this) { + /*toast("提交成功") + RxBus.defaultInstance.post(SupplyEvent(from)) + if (from == 1) { + PublicActivity.start(requireContext(), MySupplierFragment::class.java) + } + requireActivity().finish()*/ + } + + mViewModel.imageLiveData.observe(this) { + uploadedImgList.addAll(it) + imageAdapter.notifyDataSetChanged() + SpanUtils.with(binding.tvImageCount) + .append("(") + .append("${uploadedImgList.size}") + .setForegroundColor(getColor(R.color.color_ff493c)) + .append("/5)") + .create() + } + } + + private fun commit() { + val name = binding.etName.text.toString().trim() + val price = binding.etPrice.text.toString().trim() + val desc = binding.etExplain.text.toString().trim() + val jsonObject = JsonObject() + jsonObject.addProperty("type", "$goodsType") + jsonObject.addProperty("goods_name", name) + jsonObject.addProperty("goods_price", price) + jsonObject.addProperty("goods_price_type", "$priceType") + jsonObject.addProperty("goods_description", desc) + jsonObject.addProperty("city_id", "${city!!.id}") + + val imageArray = JsonArray() + uploadedImgList.forEach { + imageArray.add(it.id) + } + jsonObject.add("file", imageArray) + + 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 (goodsDetail == null) { + mViewModel.addGoods(jsonObject.toString().toRequestBody()) + } else { + jsonObject.addProperty("id", goodsDetail!!.id) + mViewModel.updateGoods(jsonObject.toString().toRequestBody()) + } + } + + @SuppressLint("SetTextI18n", "NotifyDataSetChanged") + private fun setData(detail: SupplierGoodsBean) { + if (detail.status == "3") { + binding.tvReason.text = "理由:${detail.remark}" + binding.tvTime.text = detail.review_time + binding.layoutRejectReason.visible() + } + goodsType = detail.type + binding.tvType.text = if (detail.type == "1") "提供服务" else if (detail.type == "2") "提供产品" else "其他" + binding.rgPriceType.check(if (detail.goods_price_type == "1") R.id.rb_price1 else R.id.rb_price2) + binding.etName.setText(detail.goods_name) + binding.etPrice.setText(detail.goods_price) + binding.etExplain.setText(detail.goods_description) + + city = UserConfigManager.getCityList().find { it.id == detail.city_id.toInt() } + if (city != null) binding.tvArea.text = city!!.name + + val imageList = Gson().fromJson>(Gson().toJson(detail.file), object : TypeToken>(){}.type) + uploadedImgList.addAll(imageList) + imageAdapter.notifyDataSetChanged() + SpanUtils.with(binding.tvImageCount) + .append("(") + .append("${uploadedImgList.size}") + .setForegroundColor(getColor(R.color.color_ff493c)) + .append("/5)") + .create() + + contactsAdapter.setList(detail.contact) + if (contactsAdapter.data.size == 5) { + binding.ivAddContacts.gone() + } + } + + private fun selectPhoto() { + EasyPhotos.createAlbum(this, true, false, GlideEngine.getInstance()) + .setFileProviderAuthority(Constants.AppFilter) + .setCount(imageAdapter.selectMax - uploadedImgList.size) + .start(object : SelectCallback() { + @SuppressLint("NotifyDataSetChanged") + override fun onResult(photos: ArrayList, isOriginal: Boolean) { + if (photos.find { it.size > 10 * 1024 * 1024 } != null) { + toast("单张图片大小不能超过10M") + return + } + mViewModel.imgList.clear() + mViewModel.upload(requireContext(), photos) + } + + override fun onCancel() { + } + }) + } + + override fun onDestroyView() { + binding.etExplain.removeTextChangedListener(textWatcher) + super.onDestroyView() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/goods/PublishGoodsMessageViewModel.kt b/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/goods/PublishGoodsMessageViewModel.kt new file mode 100644 index 0000000..9ffd912 --- /dev/null +++ b/app/src/main/java/com/cheng/bole/ui/fragment/bid/publish/goods/PublishGoodsMessageViewModel.kt @@ -0,0 +1,97 @@ +package com.cheng.bole.ui.fragment.bid.publish.goods + +import android.content.Context +import androidx.lifecycle.MutableLiveData +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 com.huantansheng.easyphotos.models.album.entity.Photo +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody + +class PublishGoodsMessageViewModel: BaseViewModel() { + val addLiveData = MutableLiveData() + + val imageLiveData = MutableLiveData>() + val imgList = ArrayList() + + fun addGoods(requestBody: RequestBody) { + showDialog() + launchOnUiTryCatch({ + val response = ApiFactory.apiService.addGoodsInfo(requestBody) + if (response.status) { + addLiveData.postValue(Any()) + } else toast(response.message, true) + dismissDialog() + }, { + dismissDialog() + setError(it) + L.d(it) + }) + } + + fun updateGoods(requestBody: RequestBody) { + showDialog() + launchOnUiTryCatch({ + val response = ApiFactory.apiService.updateGoodsInfo(requestBody) + if (response.status) { + addLiveData.postValue(Any()) + } else toast(response.message, true) + dismissDialog() + }, { + dismissDialog() + setError(it) + L.d(it) + }) + } + + //删除文件 + fun deleteFile(id: String) { + launchOnUiTryCatch({ + ApiFactory.apiService.delUserFile(id) + }, { + L.d(it) + }) + } + + fun upload(context: Context, list: ArrayList) { + showDialog() + list.forEachIndexed { index, photo -> + if (index == 0) { + uploadImg(context, photo) { + list.remove(photo) + if (list.isNotEmpty()) { + upload(context, list) + } else { + imageLiveData.postValue(imgList) + dismissDialog() + } + } + } + } + } + + private fun uploadImg(context: Context, item: Photo, clickFun: () -> Unit) { + BitmapUtils.compressImg(context, item.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, "supply") + if (response.status) { + imgList.add(response.data) + clickFun.invoke() + } else { + toast(response.message, true) + dismissDialog() + } + }, { + dismissDialog() + L.d(it) + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_trans_top_line_cor20.xml b/app/src/main/res/drawable/shape_trans_top_line_cor20.xml new file mode 100644 index 0000000..5bdf29f --- /dev/null +++ b/app/src/main/res/drawable/shape_trans_top_line_cor20.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_upload_file_btn_bg.xml b/app/src/main/res/drawable/shape_upload_file_btn_bg.xml new file mode 100644 index 0000000..c097ab7 --- /dev/null +++ b/app/src/main/res/drawable/shape_upload_file_btn_bg.xml @@ -0,0 +1,9 @@ + + + + + \ 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 c17acef..5dd8297 100644 --- a/app/src/main/res/layout/dialog_select_bid_type.xml +++ b/app/src/main/res/layout/dialog_select_bid_type.xml @@ -11,10 +11,10 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_16" + android:fontFamily="sans-serif-medium" android:text="选择类型" - android:textColor="@color/color_1a1a1a" - android:textSize="@dimen/sp_16" - android:textStyle="bold" + android:textColor="@color/color_222222" + android:textSize="@dimen/sp_17" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/dialog_select_contacts.xml b/app/src/main/res/layout/dialog_select_contacts.xml new file mode 100644 index 0000000..3813a1d --- /dev/null +++ b/app/src/main/res/layout/dialog_select_contacts.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_select_goods_type.xml b/app/src/main/res/layout/dialog_select_goods_type.xml new file mode 100644 index 0000000..370aab9 --- /dev/null +++ b/app/src/main/res/layout/dialog_select_goods_type.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_add_contacts.xml b/app/src/main/res/layout/fragment_add_contacts.xml new file mode 100644 index 0000000..11396be --- /dev/null +++ b/app/src/main/res/layout/fragment_add_contacts.xml @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 31bd93a..dad77fe 100644 --- a/app/src/main/res/layout/fragment_publish_bid_message.xml +++ b/app/src/main/res/layout/fragment_publish_bid_message.xml @@ -12,616 +12,586 @@ app:layout_constraintTop_toTopOf="parent"> + app:layout_constraintDimensionRatio="h,1125:804" + app:layout_constraintTop_toTopOf="parent" /> + android:textColor="@color/color_1a1a1a" + android:textSize="@dimen/sp_17" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - - + android:orientation="vertical"> - + android:visibility="gone" + app:hl_cornerRadius="@dimen/dp_12" + app:hl_shadowColor="#0d4a4f5b" + app:hl_shadowLimit="@dimen/dp_7"> - - - - - - - - - - - - - - - - - - - - - - - + android:paddingTop="@dimen/dp_16" + android:paddingEnd="@dimen/dp_12" + android:paddingBottom="@dimen/dp_16"> - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:paddingBottom="@dimen/dp_16"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_height="wrap_content" + android:drawablePadding="@dimen/dp_6" + android:layout_marginTop="@dimen/dp_16" + android:fontFamily="sans-serif-medium" + android:text="项目信息" + android:textColor="@color/color_1a1a1a" + android:textSize="@dimen/sp_16" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - + + + + - + android:orientation="horizontal" + android:padding="@dimen/dp_2" + app:layout_constraintBottom_toBottomOf="@id/tv_info_title" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="@id/tv_info_title"> - + - + + - + - + - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:layout_height="@dimen/dp_15" /> - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/app/src/main/res/layout/fragment_publish_goods_message.xml b/app/src/main/res/layout/fragment_publish_goods_message.xml new file mode 100644 index 0000000..f2c51e2 --- /dev/null +++ b/app/src/main/res/layout/fragment_publish_goods_message.xml @@ -0,0 +1,539 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/listitem_add_bid_img.xml b/app/src/main/res/layout/listitem_add_bid_img.xml index f45b5d2..f1265c9 100644 --- a/app/src/main/res/layout/listitem_add_bid_img.xml +++ b/app/src/main/res/layout/listitem_add_bid_img.xml @@ -17,6 +17,7 @@ android:layout_width="0dp" android:layout_height="0dp" android:scaleType="center" + android:background="@drawable/shape_dfdfdf_line_cor8" android:src="@mipmap/ic_add_bid_image" app:layout_constraintBottom_toBottomOf="@id/iv_image" app:layout_constraintEnd_toEndOf="@id/iv_image" diff --git a/app/src/main/res/layout/listitem_bid_type.xml b/app/src/main/res/layout/listitem_bid_type.xml index 6101e4f..1ea97b1 100644 --- a/app/src/main/res/layout/listitem_bid_type.xml +++ b/app/src/main/res/layout/listitem_bid_type.xml @@ -11,7 +11,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="招标公告" - android:textColor="@color/color_666666" + android:textColor="@color/color_1a1a1a" android:textSize="@dimen/sp_14" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/listitem_contacts.xml b/app/src/main/res/layout/listitem_contacts.xml new file mode 100644 index 0000000..1e0cbf6 --- /dev/null +++ b/app/src/main/res/layout/listitem_contacts.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/listitem_contacts_job.xml b/app/src/main/res/layout/listitem_contacts_job.xml new file mode 100644 index 0000000..aeddcc9 --- /dev/null +++ b/app/src/main/res/layout/listitem_contacts_job.xml @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/listitem_publish_bid_contacts.xml b/app/src/main/res/layout/listitem_publish_bid_contacts.xml index e78db57..ca00ec5 100644 --- a/app/src/main/res/layout/listitem_publish_bid_contacts.xml +++ b/app/src/main/res/layout/listitem_publish_bid_contacts.xml @@ -1,34 +1,28 @@ - - - + android:layout_height="wrap_content"> + android:textSize="@dimen/sp_14" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - - \ No newline at end of file + android:layout_marginTop="@dimen/dp_4" + android:text="郭女士 | 企业负责人" + android:textColor="@color/color_999999" + android:textSize="@dimen/sp_12" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/tv_phone" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/listitem_publish_bid_file.xml b/app/src/main/res/layout/listitem_publish_bid_file.xml index c38a9dc..7a8b465 100644 --- a/app/src/main/res/layout/listitem_publish_bid_file.xml +++ b/app/src/main/res/layout/listitem_publish_bid_file.xml @@ -8,7 +8,6 @@ android:id="@+id/tv_name" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/dp_12" android:layout_marginEnd="@dimen/dp_12" android:drawableStart="@mipmap/ic_pdf_attachment" android:drawablePadding="@dimen/dp_12" @@ -28,7 +27,6 @@ android:id="@+id/iv_delete" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginEnd="@dimen/dp_12" android:src="@mipmap/ic_delete" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/mipmap-xxhdpi/ic_add_bid_image.png b/app/src/main/res/mipmap-xxhdpi/ic_add_bid_image.png deleted file mode 100644 index 2e73ca2..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_add_bid_image.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_add_bid_image.webp b/app/src/main/res/mipmap-xxhdpi/ic_add_bid_image.webp new file mode 100644 index 0000000..a2ca49d Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_add_bid_image.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_add_contacts.png b/app/src/main/res/mipmap-xxhdpi/ic_add_contacts.png deleted file mode 100644 index a8b5bb9..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_add_contacts.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_add_contacts.webp b/app/src/main/res/mipmap-xxhdpi/ic_add_contacts.webp new file mode 100644 index 0000000..a3f4f29 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_add_contacts.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_arrow_dp18.png b/app/src/main/res/mipmap-xxhdpi/ic_arrow_dp18.png deleted file mode 100644 index c7ad36c..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_arrow_dp18.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_arrow_dp18.webp b/app/src/main/res/mipmap-xxhdpi/ic_arrow_dp18.webp new file mode 100644 index 0000000..030eb67 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_arrow_dp18.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_delete_bid_image.png b/app/src/main/res/mipmap-xxhdpi/ic_delete_bid_image.png deleted file mode 100644 index 086f2b8..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_delete_bid_image.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_delete_bid_image.webp b/app/src/main/res/mipmap-xxhdpi/ic_delete_bid_image.webp new file mode 100644 index 0000000..420bb92 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_delete_bid_image.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_edit_contacts.png b/app/src/main/res/mipmap-xxhdpi/ic_edit_contacts.png deleted file mode 100644 index 715bb12..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_edit_contacts.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_edit_contacts.webp b/app/src/main/res/mipmap-xxhdpi/ic_edit_contacts.webp new file mode 100644 index 0000000..b3bac0a Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_edit_contacts.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_empty_contacts.webp b/app/src/main/res/mipmap-xxhdpi/ic_empty_contacts.webp new file mode 100644 index 0000000..93abf97 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_empty_contacts.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_publish_bid_top_bg.png b/app/src/main/res/mipmap-xxhdpi/ic_publish_bid_top_bg.png deleted file mode 100644 index 16c5ceb..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_publish_bid_top_bg.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_publish_bid_top_bg.webp b/app/src/main/res/mipmap-xxhdpi/ic_publish_bid_top_bg.webp new file mode 100644 index 0000000..12b232a Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_publish_bid_top_bg.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_close.png b/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_close.png deleted file mode 100644 index 8a9731d..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_close.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_close.webp b/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_close.webp new file mode 100644 index 0000000..34bc7bd Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_close.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_icon1.png b/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_icon1.png deleted file mode 100644 index f2946d7..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_icon1.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_icon1.webp b/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_icon1.webp new file mode 100644 index 0000000..ab9e30f Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_icon1.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_icon2.png b/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_icon2.png deleted file mode 100644 index 9e1d6e1..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_icon2.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_icon2.webp b/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_icon2.webp new file mode 100644 index 0000000..93a60ae Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_icon2.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_top_bg.png b/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_top_bg.png deleted file mode 100644 index 485096c..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_top_bg.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_top_bg.webp b/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_top_bg.webp new file mode 100644 index 0000000..6e26948 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_publish_dialog_top_bg.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_select_contacts.webp b/app/src/main/res/mipmap-xxhdpi/ic_select_contacts.webp new file mode 100644 index 0000000..a200c08 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_select_contacts.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_upload_file.png b/app/src/main/res/mipmap-xxhdpi/ic_upload_file.png deleted file mode 100644 index ed5abdf..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_upload_file.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_upload_file.webp b/app/src/main/res/mipmap-xxhdpi/ic_upload_file.webp new file mode 100644 index 0000000..ab86f86 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_upload_file.webp differ diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index f6619ad..ff676fd 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -88,5 +88,6 @@ 132dp 116dp 52dp + 68dp \ No newline at end of file