diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1539fc4db..e487b259a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -903,6 +903,22 @@
android:name=".decoration.view.DecorationStoreActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize" />
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/chwl/app/home/MeViewModel.kt b/app/src/main/java/com/chwl/app/home/MeViewModel.kt
index b821d9b8a..6efa6377d 100644
--- a/app/src/main/java/com/chwl/app/home/MeViewModel.kt
+++ b/app/src/main/java/com/chwl/app/home/MeViewModel.kt
@@ -4,17 +4,24 @@ import androidx.lifecycle.MutableLiveData
import com.chwl.app.R
import com.chwl.app.base.BaseViewModel
import com.chwl.core.UriProvider
-import com.chwl.core.home.bean.BannerInfo
-import com.chwl.core.home.model.HomeModel
import com.chwl.core.im.custom.bean.RouterType
import com.chwl.core.room.bean.MeCenterInfo
-import com.chwl.core.user.bean.DiamondGiveHistoryInfo
import com.chwl.library.utils.ResUtil
class MeViewModel : BaseViewModel() {
- private val _meCenterInfoLiveData = MutableLiveData?>()
- val meCenterInfoLiveData: MutableLiveData?> = _meCenterInfoLiveData
+ private val _meCenterInfoLiveData = MutableLiveData?>()
+ val meCenterInfoLiveData: MutableLiveData?> = _meCenterInfoLiveData
+
+ var donationMenuVisible = false
+
+ val donationMenu: MeCenterInfo by lazy(LazyThreadSafetyMode.NONE) {
+ MeCenterInfo(
+ icon = R.drawable.me_ic_menu_donation,
+ centerName = ResUtil.getString(R.string.me_donation),
+ skipType = RouterType.USER_DONATION
+ )
+ }
// private val _bannerLiveData = MutableLiveData?>()
// val bannerLiveData: MutableLiveData?> = _bannerLiveData
@@ -50,7 +57,7 @@ class MeViewModel : BaseViewModel() {
)
}
- private fun requestCenterList(): List? {
+ private fun requestCenterList(): MutableList? {
return ArrayList().apply {
add(
MeCenterInfo(
@@ -81,6 +88,9 @@ class MeViewModel : BaseViewModel() {
skipType = RouterType.MY_REVENUE
)
)
+ if (donationMenuVisible) {
+ add(donationMenu)
+ }
add(
MeCenterInfo(
icon = R.drawable.me_ic_menu_collect,
diff --git a/app/src/main/java/com/chwl/app/home/fragment/MeFragment.kt b/app/src/main/java/com/chwl/app/home/fragment/MeFragment.kt
index 514be8bda..b24e970d8 100644
--- a/app/src/main/java/com/chwl/app/home/fragment/MeFragment.kt
+++ b/app/src/main/java/com/chwl/app/home/fragment/MeFragment.kt
@@ -35,6 +35,8 @@ import com.chwl.app.view.GenderAgeTextView
import com.chwl.app.vip.VipMainActivity
import com.chwl.app.vip.VipViewModel
import com.chwl.core.auth.AuthModel
+import com.chwl.core.im.custom.bean.RouterType
+import com.chwl.core.initial.InitialModel
import com.chwl.core.level.UserLevelVo
import com.chwl.core.manager.IMNetEaseManager
import com.chwl.core.manager.RelationShipEvent
@@ -176,6 +178,46 @@ class MeFragment : BaseFragment(), View.OnClickListener {
}
setUserLevel(it.userLevelVo)
setWalletInfo()
+ setDonation(it)
+ }
+ }
+
+ private fun setDonation(userInfo: UserInfo) {
+ val initInfo = InitialModel.get().cacheInitInfo
+ val diamondList = initInfo?.giveDiamondErbanNoList
+ val giftList = initInfo?.giveGiftErbanNoList
+ val levelSep = userInfo.userLevelVo.experLevelSeq
+ if (diamondList?.contains(userInfo.erbanNo) == true || giftList?.contains(userInfo.erbanNo) == true
+ || levelSep >= (initInfo?.giveDiamondExperLevel
+ ?: 0) || levelSep >= (initInfo?.giveGiftExperLevel ?: 0)
+ ) {
+ reloadMenuForDonation(true)
+ } else {
+ reloadMenuForDonation(false)
+ }
+ }
+
+ private fun reloadMenuForDonation(isVisible: Boolean) {
+ meViewModel.donationMenuVisible = isVisible
+ val list = mCenterAdapter.data
+ val itemIndex = list.indexOfFirst {
+ it.skipType == RouterType.USER_DONATION
+ }
+ if (isVisible) {
+ if (itemIndex == -1) {
+ val index = list.indexOfFirst {
+ it.skipType == RouterType.MY_REVENUE
+ }
+ if (index == -1) {
+ mCenterAdapter.addData(meViewModel.donationMenu)
+ } else {
+ mCenterAdapter.addData(index, meViewModel.donationMenu)
+ }
+ }
+ } else {
+ if (itemIndex != -1) {
+ mCenterAdapter.remove(itemIndex)
+ }
}
}
diff --git a/app/src/main/java/com/chwl/app/pay/GiveGoldModel.kt b/app/src/main/java/com/chwl/app/pay/GiveGoldModel.kt
new file mode 100644
index 000000000..4e135c846
--- /dev/null
+++ b/app/src/main/java/com/chwl/app/pay/GiveGoldModel.kt
@@ -0,0 +1,68 @@
+package com.chwl.app.pay
+
+import androidx.lifecycle.MutableLiveData
+import com.chwl.app.base.BaseViewModel
+import com.chwl.core.bean.response.ListResult
+import com.chwl.core.home.model.HomeModel
+import com.chwl.core.user.bean.DiamondGiveHistoryInfo
+import com.chwl.core.user.bean.SearchUserInfo
+
+class GiveGoldModel : BaseViewModel() {
+
+ private val _diamondGiveHistoryLiveData = MutableLiveData?>()
+ val diamondGiveHistoryLiveData: MutableLiveData?> =
+ _diamondGiveHistoryLiveData
+
+ private val _searchUserLiveData = MutableLiveData()
+ val searchUserLiveData: MutableLiveData = _searchUserLiveData
+
+ private val _giveGiftLiveData = MutableLiveData()
+ val giveGiftLiveData: MutableLiveData = _giveGiftLiveData
+
+ private val _giveDetailLiveData = MutableLiveData?>()
+ val giveDetailLiveData: MutableLiveData?> =
+ _giveDetailLiveData
+
+ fun getDiamondListInfo(pageNum: Int, pageSize: Int) {
+ safeLaunch(
+ onError = {
+ _diamondGiveHistoryLiveData.value = ListResult.failed(pageNum)
+ },
+ block = {
+ val result = HomeModel.getDiamondGiveHistory(pageNum, pageSize)
+ _diamondGiveHistoryLiveData.value = ListResult.success(result, pageNum)
+ }
+ )
+ }
+
+ fun getSearchUserInfo(erbanNo: Long) {
+ safeLaunch(
+ true,
+ block = {
+ _searchUserLiveData.value = HomeModel.getSearchUser(erbanNo)
+ }
+ )
+ }
+
+ fun giveGift(toUid: Long, giftId: Int, giftNum: Int) {
+ safeLaunch(
+ true,
+ block = {
+ _giveGiftLiveData.value = HomeModel.giveGift(toUid, giftId, giftNum)
+ }
+ )
+ }
+
+ fun giveDetailInfo(uid: Long, type: Int, pageNum: Int, pageSize: Int) {
+ safeLaunch(
+ onError = {
+ _giveDetailLiveData.value = ListResult.failed(pageNum)
+ },
+ block = {
+ val result = HomeModel.getGiveDetail(uid, type, pageNum, pageSize)
+ _giveDetailLiveData.value = ListResult.success(result, pageNum)
+ }
+ )
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/chwl/app/pay/activity/GiveGoldActivity.kt b/app/src/main/java/com/chwl/app/pay/activity/GiveGoldActivity.kt
new file mode 100644
index 000000000..3057a0f2f
--- /dev/null
+++ b/app/src/main/java/com/chwl/app/pay/activity/GiveGoldActivity.kt
@@ -0,0 +1,129 @@
+package com.chwl.app.pay.activity
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.content.Intent
+import android.text.TextUtils
+import android.view.KeyEvent
+import android.view.inputmethod.EditorInfo
+import android.widget.TextView.OnEditorActionListener
+import androidx.activity.viewModels
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.netease.nim.uikit.StatusBarUtil
+import com.chwl.app.R
+import com.chwl.app.base.BaseViewBindingActivity
+import com.chwl.app.common.EmptyViewHelper
+import com.chwl.app.databinding.ActivityGiveGoldBinding
+import com.chwl.app.pay.GiveGoldModel
+import com.chwl.app.pay.adapter.LatelyGiveAdapter
+import com.chwl.app.ui.utils.RVDelegate
+import com.chwl.core.gift.GiftModel
+import com.chwl.core.user.bean.DiamondGiveHistoryInfo
+import com.chwl.library.utils.ResUtil
+
+/**
+ * 轉贈鉆石頁面
+ */
+class GiveGoldActivity : BaseViewBindingActivity() {
+
+ private var pageNum: Int = 1
+ private val pageSize = 20
+ private lateinit var mAdapter: LatelyGiveAdapter
+ private lateinit var rvDelegate: RVDelegate
+
+ private val giveGoldModel: GiveGoldModel by viewModels()
+
+ companion object {
+ fun start(context: Context) {
+ val intent = Intent(context, GiveGoldActivity::class.java)
+ context.startActivity(intent)
+ }
+ }
+
+ override fun init() {
+ initTitleBar(ResUtil.getString(R.string.me_donation))
+ binding.etSearch.setOnEditorActionListener(OnEditorActionListener { v, actionId, event -> //以下方法防止两次发送请求
+ if (actionId == EditorInfo.IME_ACTION_SEARCH && event != null || event != null && event.keyCode == KeyEvent.KEYCODE_ENTER) {
+ if (event.action == KeyEvent.ACTION_UP) { //发送请求
+ val newStr: String = binding.etSearch.text.toString().trim { it <= ' ' }
+ if (!TextUtils.isEmpty(newStr)) {
+ giveGoldModel.getSearchUserInfo(newStr.toLong())
+ }else{
+ toast(getString(R.string.password_input_user_id))
+ }
+ return@OnEditorActionListener true //自己消费
+ }
+ return@OnEditorActionListener true
+ }
+ false
+ })
+ binding.mTvSearch.setOnClickListener {
+ val newStr: String = binding.etSearch.text.toString().trim { it <= ' ' }
+ if (!TextUtils.isEmpty(newStr)) {
+ giveGoldModel.getSearchUserInfo(newStr.toLong())
+ } else {
+ toast(getString(R.string.password_input_user_id))
+ }
+ }
+
+ mAdapter = LatelyGiveAdapter()
+ rvDelegate = RVDelegate.Builder()
+ .setAdapter(mAdapter)
+ .setLayoutManager(LinearLayoutManager(this))
+ .setPageSize(20)
+ .setEmptyView(
+ EmptyViewHelper.createEmptyTextView(
+ this,
+ ResUtil.getString(R.string.me_give_gold_empty)
+ )
+ )
+ .setRefreshLayout(binding.refreshLayout)
+ .setRecyclerView(binding.recyclerView)
+ .build()
+ mAdapter.setOnItemClickListener { _, _, position ->
+ mAdapter.getItem(position)?.targetUid?.let { GiveGoldDetailActivity.start(this, it) }
+ }
+ mAdapter.setOnLoadMoreListener({
+ loadData(false)
+ }, binding.recyclerView)
+ binding.refreshLayout.setOnRefreshListener {
+ loadData(true)
+ }
+ giveGoldModel.diamondGiveHistoryLiveData.observe(this) {
+ rvDelegate.loadData(it)
+ }
+ giveGoldModel.searchUserLiveData.observe(this) {
+ it?.let {
+ GiveGoldToUserActivity.start(this, it)
+ }
+ }
+ giveGoldModel.loadingLiveData.observe(this) {
+ if (it) dialogManager.showProgressDialog(this)
+ else dialogManager.dismissDialog()
+ }
+ }
+
+ override fun onResume() {
+ super.onResume()
+ loadData(true)
+ GiftModel.get().requestKnapGiftInfos().subscribe()
+ }
+
+ @SuppressLint("CheckResult")
+ fun loadData(isRefresh: Boolean) {
+ binding.refreshLayout.isRefreshing = isRefresh
+ pageNum = if (isRefresh) 1 else (pageNum + 1)
+ giveGoldModel.getDiamondListInfo(pageNum, pageSize)
+ }
+
+ override fun setStatusBar() {
+ super.setStatusBar()
+ StatusBarUtil.transparencyBar(this)
+ StatusBarUtil.StatusBarLightMode(this)
+ }
+
+ override fun needSteepStateBar(): Boolean {
+ return true
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/chwl/app/pay/activity/GiveGoldDetailActivity.kt b/app/src/main/java/com/chwl/app/pay/activity/GiveGoldDetailActivity.kt
new file mode 100644
index 000000000..254289411
--- /dev/null
+++ b/app/src/main/java/com/chwl/app/pay/activity/GiveGoldDetailActivity.kt
@@ -0,0 +1,115 @@
+package com.chwl.app.pay.activity
+
+import android.content.Context
+import android.content.Intent
+import android.view.View
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import androidx.viewpager2.widget.ViewPager2
+import com.netease.nim.uikit.StatusBarUtil
+import com.chwl.app.R
+import com.chwl.app.avroom.adapter.CommonVPAdapter
+import com.chwl.app.base.BaseViewBindingActivity
+import com.chwl.app.databinding.ActivityGiveGoldDetailBinding
+import com.chwl.app.pay.fragment.GiveDiamondFragment
+import com.chwl.app.pay.fragment.GiveGiftFragment
+import com.chwl.app.ui.user.adapter.CommonWrapIndicatorAdapter
+import com.chwl.app.ui.widget.magicindicator.MagicIndicator
+import com.chwl.app.ui.widget.magicindicator.ViewPagerHelper
+import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
+import com.chwl.core.initial.InitialModel
+import com.chwl.core.user.UserModel
+import com.chwl.library.utils.ResUtil
+
+/**
+ * 轉贈鉆石頁面
+ */
+class GiveGoldDetailActivity : BaseViewBindingActivity() {
+
+ companion object {
+ fun start(context: Context, uid: Long) {
+ val intent = Intent(context, GiveGoldDetailActivity::class.java)
+ intent.putExtra("uid", uid)
+ context.startActivity(intent)
+ }
+ }
+
+ override fun init() {
+ initTitleBar(ResUtil.getString(R.string.me_donation_detail))
+ initDetail()
+ }
+
+ /**
+ * 轉贈詳情
+ */
+ private fun initDetail() {
+ val uid = intent.extras?.getLong("uid", 0L) ?: 0L
+
+ val initInfo = InitialModel.get().cacheInitInfo
+ val userInfo = UserModel.get().cacheLoginUserInfo
+ val diamondList = initInfo?.giveDiamondErbanNoList
+ val giftList = initInfo?.giveGiftErbanNoList
+ val levelSep = userInfo?.userLevelVo?.experLevelSeq ?: 0
+
+ val viewPager: ViewPager2 = binding.viewPagerDetail
+ val magicIndicator: MagicIndicator = binding.magicIndicator
+ val fragmentList: MutableList = ArrayList()
+ val pagerAdapter = CommonVPAdapter(supportFragmentManager, lifecycle, fragmentList)
+ val tagList: MutableList = ArrayList()
+ if (diamondList?.contains(userInfo?.erbanNo) == true || levelSep >= (initInfo?.giveDiamondExperLevel
+ ?: 0)
+ ) {
+ tagList.add(getString(R.string.diamond))
+ fragmentList.add(GiveDiamondFragment.newInstance(uid))
+ }
+ if (giftList?.contains(userInfo?.erbanNo) == true || levelSep >= (initInfo?.giveGiftExperLevel
+ ?: 0)
+ ) {
+ tagList.add(getString(R.string.gift_action))
+ fragmentList.add(GiveGiftFragment.newInstance(uid))
+ }
+ if (tagList.size == 0) {
+ return
+ }else if(tagList.size == 1){
+ binding.magicIndicator.visibility = View.GONE
+ }
+ val commonNavigator = CommonNavigator(context)
+ commonNavigator.isAdjustMode = true//自我调节位置,实现自我平分
+ val magicIndicatorAdapter = CommonWrapIndicatorAdapter(context, tagList)
+ magicIndicatorAdapter.setOnItemSelectListener { position: Int, view: TextView? ->
+ viewPager.currentItem = position
+ }
+ commonNavigator.adapter = magicIndicatorAdapter
+ magicIndicator.navigator = commonNavigator
+ commonNavigator.titleContainer.showDividers = LinearLayout.SHOW_DIVIDER_MIDDLE
+ viewPager.adapter = pagerAdapter
+ ViewPagerHelper.bind(magicIndicator, viewPager)
+ viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+ }
+
+ override fun onPageSelected(position: Int) {
+ viewPager.requestLayout()
+ }
+
+ override fun onPageScrollStateChanged(state: Int) {}
+ })
+
+ }
+
+ override fun setStatusBar() {
+ super.setStatusBar()
+ StatusBarUtil.transparencyBar(this)
+ StatusBarUtil.StatusBarLightMode(this)
+ }
+
+ override fun needSteepStateBar(): Boolean {
+ return true
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/chwl/app/pay/activity/GiveGoldSearchActivity.kt b/app/src/main/java/com/chwl/app/pay/activity/GiveGoldSearchActivity.kt
new file mode 100644
index 000000000..e7ef48370
--- /dev/null
+++ b/app/src/main/java/com/chwl/app/pay/activity/GiveGoldSearchActivity.kt
@@ -0,0 +1,84 @@
+package com.chwl.app.pay.activity
+
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.content.Intent
+import android.os.Bundle
+import android.os.Parcelable
+import android.text.Editable
+import android.text.TextWatcher
+import android.widget.EditText
+import android.widget.TextView
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.chwl.app.R
+import com.chwl.app.base.BaseActivity
+import com.chwl.app.common.EmptyViewHelper
+import com.chwl.app.pay.adapter.GiveSearchAdapter
+import com.chwl.app.ui.utils.RVDelegate
+import com.chwl.core.room.bean.SearchRoomInfo
+import com.chwl.core.room.model.AvRoomModel
+import com.chwl.core.utils.net.RxHelper
+import com.chwl.library.utils.ResUtil
+
+class GiveGoldSearchActivity : BaseActivity(), TextWatcher {
+
+ companion object {
+ const val REQUEST_CODE = 0xff12
+
+ @JvmStatic
+ fun start(context: Activity) {
+ val intent = Intent(context, GiveGoldSearchActivity::class.java)
+ context.startActivityForResult(intent, REQUEST_CODE)
+ }
+ }
+
+ private lateinit var rvDelegate: RVDelegate
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_give_gold_search)
+ val adapter = GiveSearchAdapter()
+ rvDelegate = RVDelegate.Builder()
+ .setPageSize(Int.MAX_VALUE)
+ .setEmptyView(EmptyViewHelper.createEmptyTextView(this, ResUtil.getString(R.string.pay_activity_givegoldsearchactivity_01)))
+ .setLayoutManager(LinearLayoutManager(this))
+ .setRecyclerView(findViewById(R.id.recyclerView))
+ .setAdapter(adapter)
+ .build()
+ adapter.setOnItemClickListener { _, _, position ->
+ setResult(Activity.RESULT_OK, Intent().apply {
+ adapter.getItem(position)?.let {
+ putExtra("searchRoomInfo", it as Parcelable)
+ }
+ })
+ finish()
+ }
+ findViewById(R.id.editSearch).addTextChangedListener(this)
+ findViewById(R.id.tvCancel).setOnClickListener { finish() }
+ }
+
+ override fun afterTextChanged(s: Editable?) {
+
+ }
+
+ override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
+ }
+
+ @SuppressLint("CheckResult")
+ override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
+ if (s.isNullOrEmpty()) {
+ rvDelegate.setNewData(null)
+ } else {
+ AvRoomModel.get()
+ .roomSearch(s.toString())
+ .compose(RxHelper.handleBeanData())
+ .doOnError { rvDelegate.loadErr(true) }
+ .compose(bindToLifecycle())
+ .subscribe { rooms ->
+ rvDelegate.setNewData(rooms)
+ }
+ }
+
+ }
+}
diff --git a/app/src/main/java/com/chwl/app/pay/activity/GiveGoldToUserActivity.kt b/app/src/main/java/com/chwl/app/pay/activity/GiveGoldToUserActivity.kt
new file mode 100644
index 000000000..bc2757843
--- /dev/null
+++ b/app/src/main/java/com/chwl/app/pay/activity/GiveGoldToUserActivity.kt
@@ -0,0 +1,401 @@
+package com.chwl.app.pay.activity
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.content.Intent
+import android.text.Editable
+import android.text.InputFilter
+import android.text.InputFilter.LengthFilter
+import android.text.TextWatcher
+import android.util.SparseArray
+import android.view.View
+import android.view.ViewGroup
+import android.widget.EditText
+import androidx.activity.viewModels
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import androidx.viewpager.widget.PagerAdapter
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.netease.nim.uikit.StatusBarUtil
+import com.chwl.app.R
+import com.chwl.app.base.BaseViewBindingActivity
+import com.chwl.app.databinding.ActivityGiveGoldToUserBinding
+import com.chwl.app.pay.GiveGoldModel
+import com.chwl.app.pay.adapter.GiveGiftAdapter
+import com.chwl.app.pay.password.GiveGoldPassWordFragment
+import com.chwl.app.pay.widget.GridPasswordNoFocusView
+import com.chwl.app.ui.setting.ModifyPwdActivity
+import com.chwl.app.ui.utils.ImageLoadUtils
+import com.chwl.app.ui.widget.OnPageSelectedListener
+import com.chwl.app.ui.widget.dialog.CommonTipDialog
+import com.chwl.app.ui.widget.dialog.GiveDiamondTipDialog
+import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil
+import com.chwl.app.ui.widget.recyclerview.decoration.GridSpacingItemNewDecoration
+import com.chwl.app.utils.DoubleClickCheckListener
+import com.chwl.core.DemoCache
+import com.chwl.core.gift.GiftModel
+import com.chwl.core.gift.bean.GiftInfo
+import com.chwl.core.initial.InitialModel
+import com.chwl.core.pay.PayModel
+import com.chwl.core.user.UserModel
+import com.chwl.core.user.bean.SearchUserInfo
+import com.chwl.library.utils.ResUtil
+
+class GiveGoldToUserActivity : BaseViewBindingActivity(),
+ GridPasswordNoFocusView.OnPasswordChangedListener,
+ TextWatcher {
+
+ private val giveGoldModel: GiveGoldModel by viewModels()
+
+ companion object {
+ @JvmStatic
+ fun start(context: Context, searchUser: SearchUserInfo) {
+ val intent = Intent(context, GiveGoldToUserActivity::class.java)
+ intent.putExtra("searchUser", searchUser)
+ context.startActivity(intent)
+ }
+ }
+
+ private var searchUserInfo: SearchUserInfo? = null
+ private var passWordFragment: GiveGoldPassWordFragment? = null
+ private var selectGiftPos = -1
+ private var giftAllCount = -1
+ private var giftId = -1
+
+ private var centerIndex = 0
+
+ override fun setStatusBar() {
+ super.setStatusBar()
+ StatusBarUtil.transparencyBar(this)
+ StatusBarUtil.StatusBarLightMode(this)
+ }
+
+ override fun needSteepStateBar(): Boolean {
+ return true
+ }
+
+ override fun init() {
+ initTitleBar(ResUtil.getString(R.string.donation_to))
+ searchUserInfo = intent.getSerializableExtra("searchUser") as SearchUserInfo?
+ searchUserInfo?.apply {
+ binding.tvId.text = "ID:${erbanNo}"
+ binding.tvNickname.text = nick
+ ImageLoadUtils.loadAvatar(context, avatar, binding.ivAvatar)
+ }
+ val initInfo = InitialModel.get().cacheInitInfo
+ val userInfo = UserModel.get().cacheLoginUserInfo
+ val diamondList = initInfo?.giveDiamondErbanNoList
+ val giftList = initInfo?.giveGiftErbanNoList
+ val levelSep = userInfo?.userLevelVo?.experLevelSeq ?: 0
+ if (diamondList?.contains(userInfo?.erbanNo) == true || levelSep >= (initInfo?.giveDiamondExperLevel
+ ?: 0)
+ ) {
+ binding.tvDiamondTab.visibility = View.VISIBLE
+ binding.groupDiamond.visibility = View.VISIBLE
+ } else {
+ binding.tvDiamondTab.visibility = View.GONE
+ binding.groupDiamond.visibility = View.GONE
+ }
+ if (giftList?.contains(userInfo?.erbanNo) == true || levelSep >= (initInfo?.giveGiftExperLevel
+ ?: 0)
+ ) {
+ binding.tvGiftTab.visibility = View.VISIBLE
+ binding.groupGift.visibility = View.VISIBLE
+ } else {
+ binding.tvGiftTab.visibility = View.GONE
+ binding.groupGift.visibility = View.GONE
+ }
+ binding.viewPagerEntrance.addOnPageChangeListener(object : OnPageSelectedListener() {
+ override fun onPageSelected(position: Int) {
+ centerIndex = position
+ binding.magicIndicatorEntrance.setSelectedPage(position)
+ }
+ })
+ initDiamond()
+ initGift()
+ initListener()
+ giveGoldModel.loadingLiveData.observe(this) {
+ if (it) dialogManager.showProgressDialog(this)
+ else dialogManager.dismissDialog()
+ }
+ giveGoldModel.giveGiftLiveData.observe(this) {
+ toast(getString(R.string.gift_give_success))
+ finish()
+ }
+ }
+
+ private fun initListener() {
+ binding.tvSure.setOnClickListener {
+ val initInfo = DemoCache.readInitInfo()
+ if (binding.groupDiamond.visibility == View.VISIBLE) {
+ searchUserInfo?.apply {
+ val gold = binding.mEditGold.text.toString().toInt()
+ if (gold <= 0) {
+ toast(ResUtil.getString(R.string.pay_activity_givegoldtouseractivity_06))
+ return@setOnClickListener
+ }
+ UserModel.get().cacheLoginUserInfo?.let {
+ if (!it.isBindPaymentPwd) {
+ val tipDialog = CommonTipDialog(this@GiveGoldToUserActivity)
+ tipDialog.setTipMsg(ResUtil.getString(R.string.setting_pay_pwd_first))
+ tipDialog.setOkText(getString(R.string.to_setting))
+ tipDialog.setOnActionListener(
+ object : CommonTipDialog.OnActionListener {
+ override fun onOk() {
+ ModifyPwdActivity.start(
+ this@GiveGoldToUserActivity,
+ ModifyPwdActivity.PAY_PWD
+ )
+ }
+ }
+ )
+ tipDialog.show()
+ } else {
+ val rateGold = initInfo.giveDiamondRate * 100
+ val tipDialog = GiveDiamondTipDialog(this@GiveGoldToUserActivity)
+ tipDialog.setTvDiamond(gold.toString())
+ tipDialog.setTipMsg(getString(R.string.give_gold_to_user, nick))
+ if (rateGold == 0.0) {
+ tipDialog.setTipMessageGone(true)
+ } else {
+ tipDialog.setTvSeCharge("${rateGold.toInt()}%")
+ val goldNew = gold + (gold * initInfo.giveDiamondRate)
+ tipDialog.setTvConsumeDiamond(
+ getString(
+ R.string.invite_gift_price_text,
+ goldNew.toString()
+ )
+ )
+ }
+ tipDialog.setOnActionListener(
+ object : GiveDiamondTipDialog.OnActionListener {
+ override fun onOk() {
+ GiveGoldPassWordFragment.newInstance(
+ supportFragmentManager,
+ gold.toString(),
+ nick,
+ ""
+ )
+ .apply {
+ passWordFragment = this
+ setListener(this@GiveGoldToUserActivity)
+ }
+ }
+ }
+ )
+ tipDialog.show()
+ }
+ } ?: run {
+ toast(ResUtil.getString(R.string.ui_setting_settingactivity_06))
+ return@setOnClickListener
+ }
+ }
+ } else {//赠送礼物
+ searchUserInfo?.apply {
+ val giftNum = binding.editGift.text.toString().toInt()
+ if (selectGiftPos < 0) {
+ toast(ResUtil.getString(R.string.please_select_gift))
+ return@setOnClickListener
+ } else if (giftNum == 0) {
+ toast(ResUtil.getString(R.string.please_enter_gift_num))
+ return@setOnClickListener
+ } else if (giftNum > giftAllCount) {
+ toast(ResUtil.getString(R.string.gift_num_fail))
+ return@setOnClickListener
+ }
+ giveGoldModel.giveGift(uid, giftId, giftNum)
+ }
+ }
+ }
+ }
+
+ private fun initDiamond() {
+ if (binding.tvDiamondTab.visibility == View.GONE) {
+ return
+ } else if (binding.tvGiftTab.visibility == View.VISIBLE) {
+ binding.tvGiftTab.isSelected = false
+ binding.groupGift.visibility = View.GONE
+ }
+ val initInfo = DemoCache.readInitInfo()
+ val length = initInfo?.giveDiamondOnceLimitNum?.toInt()?.toString()?.length ?: 0
+ binding.mEditGold.text.filters = arrayOf(LengthFilter(length))
+ binding.mTvDiamond.text = getString(
+ R.string.my_diamond,
+ PayModel.get().currentWalletInfo?.diamondNum?.toString() ?: "0"
+ )
+ binding.mEditGold.addTextChangedListener(this)
+ binding.tvDiamondTab.isSelected = true
+ binding.tvDiamondTab.setOnClickListener {
+ if (binding.tvGiftTab.visibility == View.VISIBLE) {
+ binding.tvGiftTab.isSelected = false
+ binding.groupGift.visibility = View.GONE
+ binding.tvDiamondTab.isSelected = true
+ binding.groupDiamond.visibility = View.VISIBLE
+ }
+ }
+ }
+
+ @SuppressLint("CheckResult")
+ private fun initGift() {
+ if (binding.tvGiftTab.visibility == View.GONE) {
+ return
+ }
+ val giftList = GiftModel.get().knapList
+ if (binding.tvDiamondTab.visibility == View.GONE) {
+ binding.tvGiftTab.isSelected = true
+ binding.tvSure.isEnabled = true
+ }
+ binding.tvGiftTab.setOnClickListener {
+ if (binding.tvDiamondTab.visibility == View.VISIBLE) {
+ binding.tvDiamondTab.isSelected = false
+ binding.groupDiamond.visibility = View.GONE
+ binding.tvGiftTab.isSelected = true
+ binding.groupGift.visibility = View.VISIBLE
+ binding.tvSure.isEnabled = true
+ }
+ }
+ if (giftList.size == 0) {
+ binding.tvEmptyTip.visibility = View.VISIBLE
+ return
+ } else {
+ binding.tvEmptyTip.visibility = View.GONE
+ }
+ val list = transformList(giftList, 8)
+ binding.magicIndicatorEntrance.initIndicator(list.size)
+ binding.magicIndicatorEntrance.setSelectedPage(centerIndex)
+ binding.magicIndicatorEntrance.visibility =
+ if (list.size > 1) View.VISIBLE else View.INVISIBLE
+ binding.viewPagerEntrance.adapter = object : PagerAdapter() {
+ var cacheItemView = SparseArray()
+ override fun getCount(): Int {
+ return list.size
+ }
+
+ override fun isViewFromObject(view: View, `object`: Any): Boolean {
+ return view == `object`
+ }
+
+ override fun instantiateItem(container: ViewGroup, position: Int): Any {
+ val recyclerView: RecyclerView
+ val giveGiftAdapter: GiveGiftAdapter
+ if (cacheItemView[position] == null) {
+ recyclerView = RecyclerView(context)
+ var lp = recyclerView.layoutParams
+ if (lp == null) {
+ lp = ViewGroup.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT
+ )
+ }
+ recyclerView.layoutParams = lp
+ recyclerView.layoutManager = GridLayoutManager(context, 4)
+ recyclerView.addItemDecoration(
+ GridSpacingItemNewDecoration(
+ UIUtil.dip2px(
+ context,
+ 18.0
+ ), UIUtil.dip2px(context, 10.0), true
+ )
+ )
+ giveGiftAdapter = GiveGiftAdapter()
+ giveGiftAdapter.onItemClickListener = object : DoubleClickCheckListener() {
+ override fun onItemClickSingle(
+ adapter: BaseQuickAdapter<*, *>?,
+ view: View,
+ position: Int
+ ) {
+ val oldBean = giveGiftAdapter.getItem(selectGiftPos)
+ oldBean?.isSelected = false
+ giveGiftAdapter.notifyItemChanged(selectGiftPos)
+ val bean = giveGiftAdapter.getItem(position)
+ bean?.isSelected = true
+ giveGiftAdapter.notifyItemChanged(position)
+ selectGiftPos = position
+ giftAllCount = giveGiftAdapter.getItem(position)?.count ?: -1
+ giftId = giveGiftAdapter.getItem(position)?.giftId ?: -1
+ }
+ }
+ recyclerView.adapter = giveGiftAdapter
+ } else {
+ recyclerView = cacheItemView[position]
+ giveGiftAdapter = recyclerView.adapter as GiveGiftAdapter
+ }
+ giveGiftAdapter.setNewData(list[position])
+ container.addView(recyclerView)
+ return recyclerView
+ }
+
+ override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
+ val recyclerView = cacheItemView[position]
+ container.removeView(recyclerView)
+ }
+ }
+ binding.viewPagerEntrance.setCurrentItem(centerIndex, false)
+ binding.editGift.addTextChangedListener(this)
+ binding.tvAll.setOnClickListener {
+ if (giftAllCount != -1)
+ binding.editGift.setText(giftAllCount.toString())
+ }
+ }
+
+ private fun transformList(
+ data: List,
+ pageSize: Int
+ ): List> {
+ val result: MutableList> = ArrayList()
+ if (data.isEmpty()) {
+ return result
+ }
+ for (i in data.toTypedArray().indices) {
+ var page: MutableList? = null
+ if (i % pageSize == 0) {
+ page = ArrayList()
+ result.add(page)
+ } else {
+ if (result.size > 0) {
+ page = result[result.size - 1]
+ }
+ }
+ page?.add(data[i])
+ }
+ return result
+ }
+
+ @SuppressLint("CheckResult")
+ override fun onInputFinish(psw: String) {
+ }
+
+ @SuppressLint("CheckResult")
+ override fun onTextChanged(psw: String) {
+ val password = passWordFragment?.password?.password ?: ""
+ if (password.length == 6) {
+ searchUserInfo?.apply {
+ dialogManager.showProgressDialog(context)
+ PayModel.get().giveGold(uid, findViewById(R.id.mEditGold).text.toString(), DESAndBase64(password))
+ .compose(bindToLifecycle())
+ .doOnError {
+ toast(it.message)
+ passWordFragment?.password?.clearPassword()
+ dialogManager.dismissDialog()
+ }
+ .subscribe { _ ->
+ passWordFragment?.dismissAllowingStateLoss()
+ dialogManager.dismissDialog()
+ toast(getString(R.string.layout_activity_give_gold_success_01))
+ finish()
+ }
+ }
+ }
+ }
+
+ override fun afterTextChanged(s: Editable?) {
+ }
+
+ override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
+ }
+
+ override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
+ binding.tvSure.isEnabled = !s.isNullOrBlank()
+ }
+
+}
diff --git a/app/src/main/java/com/chwl/app/pay/adapter/GiveDiamondDetailAdapter.kt b/app/src/main/java/com/chwl/app/pay/adapter/GiveDiamondDetailAdapter.kt
new file mode 100644
index 000000000..fc6c45733
--- /dev/null
+++ b/app/src/main/java/com/chwl/app/pay/adapter/GiveDiamondDetailAdapter.kt
@@ -0,0 +1,23 @@
+package com.chwl.app.pay.adapter
+
+import android.annotation.SuppressLint
+import android.widget.TextView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.chwl.app.R
+import com.chwl.core.user.bean.DiamondGiveHistoryInfo
+import com.chwl.library.utils.TimeUtils
+
+
+class GiveDiamondDetailAdapter :
+ BaseQuickAdapter(R.layout.item_give_diamond_detail) {
+
+ @SuppressLint("SetTextI18n")
+ override fun convert(helper: BaseViewHolder, item: DiamondGiveHistoryInfo) {
+ helper.getView(R.id.tv_number).text = item.diamondNum.toString()
+ helper.getView(R.id.tv_pay_diamond).text =
+ mContext.getString(R.string.all_pay_diamond, item.realDiamondNum.toString())
+ helper.setText(R.id.tv_date, TimeUtils.getDateTimeString(item.createTime,"yyyy-MM-dd HH:mm:ss"))
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/chwl/app/pay/adapter/GiveGiftAdapter.java b/app/src/main/java/com/chwl/app/pay/adapter/GiveGiftAdapter.java
new file mode 100644
index 000000000..4fb065d60
--- /dev/null
+++ b/app/src/main/java/com/chwl/app/pay/adapter/GiveGiftAdapter.java
@@ -0,0 +1,34 @@
+package com.chwl.app.pay.adapter;
+
+
+import android.widget.ImageView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+import com.chwl.app.R;
+import com.chwl.app.ui.utils.ImageLoadUtils;
+import com.chwl.core.gift.bean.GiftInfo;
+
+/**
+ * 赠送礼物
+ */
+public class GiveGiftAdapter extends BaseQuickAdapter {
+
+
+ public GiveGiftAdapter() {
+ super(R.layout.item_give_gift);
+ }
+
+ @Override
+ protected void convert(BaseViewHolder helper, GiftInfo item) {
+ if (item == null) {
+ return;
+ }
+ helper.setText(R.id.tvName, item.getGiftName())
+ .setText(R.id.tvNum, "x" + item.getCount());
+ ImageView giftPic = helper.itemView.findViewById(R.id.ivGift);
+ ImageLoadUtils.loadImage(mContext, item.getGiftUrl(), giftPic);
+ helper.getView(R.id.viewBg).setSelected(item.isSelected);
+ }
+
+}
diff --git a/app/src/main/java/com/chwl/app/pay/adapter/GiveGiftDetailAdapter.kt b/app/src/main/java/com/chwl/app/pay/adapter/GiveGiftDetailAdapter.kt
new file mode 100644
index 000000000..64fd0011f
--- /dev/null
+++ b/app/src/main/java/com/chwl/app/pay/adapter/GiveGiftDetailAdapter.kt
@@ -0,0 +1,24 @@
+package com.chwl.app.pay.adapter
+
+import android.annotation.SuppressLint
+import android.widget.TextView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.chwl.app.R
+import com.chwl.app.ui.utils.ImageLoadUtils
+import com.chwl.app.utils.TimeUiUtils
+import com.chwl.core.user.bean.DiamondGiveHistoryInfo
+import com.chwl.library.utils.TimeUtils
+
+
+class GiveGiftDetailAdapter :
+ BaseQuickAdapter(R.layout.item_give_gift_detail) {
+
+ @SuppressLint("SetTextI18n")
+ override fun convert(helper: BaseViewHolder, item: DiamondGiveHistoryInfo) {
+ helper.getView(R.id.tv_gift_name).text = "${item.giftName}x${item.giftNum}"
+ ImageLoadUtils.loadAvatar(mContext, item.giftUrl, helper.getView(R.id.iv_avatar))
+ helper.setText(R.id.tv_date, TimeUtils.getDateTimeString(item.createTime,"yyyy-MM-dd HH:mm:ss"))
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/chwl/app/pay/adapter/GiveSearchAdapter.kt b/app/src/main/java/com/chwl/app/pay/adapter/GiveSearchAdapter.kt
new file mode 100644
index 000000000..f203ed529
--- /dev/null
+++ b/app/src/main/java/com/chwl/app/pay/adapter/GiveSearchAdapter.kt
@@ -0,0 +1,22 @@
+package com.chwl.app.pay.adapter
+
+import android.annotation.SuppressLint
+import android.widget.TextView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.chwl.app.R
+import com.chwl.app.ui.utils.ImageLoadUtils
+import com.chwl.core.room.bean.SearchRoomInfo
+
+
+class GiveSearchAdapter :
+ BaseQuickAdapter(R.layout.item_lately_give) {
+
+ @SuppressLint("SetTextI18n")
+ override fun convert(helper: BaseViewHolder, item: SearchRoomInfo) {
+ helper.getView(R.id.tv_id).text = "ID:${item.erbanNo}"
+ helper.getView(R.id.tv_nickname).text = item.nick
+ ImageLoadUtils.loadAvatar(mContext, item.avatar, helper.getView(R.id.iv_avatar))
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/chwl/app/pay/adapter/LatelyGiveAdapter.kt b/app/src/main/java/com/chwl/app/pay/adapter/LatelyGiveAdapter.kt
new file mode 100644
index 000000000..50c8fcf9f
--- /dev/null
+++ b/app/src/main/java/com/chwl/app/pay/adapter/LatelyGiveAdapter.kt
@@ -0,0 +1,22 @@
+package com.chwl.app.pay.adapter
+
+import android.annotation.SuppressLint
+import android.widget.TextView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.chwl.app.R
+import com.chwl.app.ui.utils.ImageLoadUtils
+import com.chwl.core.user.bean.DiamondGiveHistoryInfo
+
+
+class LatelyGiveAdapter :
+ BaseQuickAdapter(R.layout.item_lately_give) {
+
+ @SuppressLint("SetTextI18n")
+ override fun convert(helper: BaseViewHolder, item: DiamondGiveHistoryInfo) {
+ helper.getView(R.id.tv_id).text = "ID:${item.targetErbanNo}"
+ helper.getView(R.id.tv_nickname).text = item.targetNick
+ ImageLoadUtils.loadAvatar(mContext, item.targetAvatar, helper.getView(R.id.iv_avatar))
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/chwl/app/pay/fragment/GiveDiamondFragment.kt b/app/src/main/java/com/chwl/app/pay/fragment/GiveDiamondFragment.kt
new file mode 100644
index 000000000..e00a39a78
--- /dev/null
+++ b/app/src/main/java/com/chwl/app/pay/fragment/GiveDiamondFragment.kt
@@ -0,0 +1,73 @@
+package com.chwl.app.pay.fragment
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import androidx.fragment.app.viewModels
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.chwl.app.R
+import com.chwl.app.base.BaseViewBindingFragment
+import com.chwl.app.common.EmptyViewHelper
+import com.chwl.app.databinding.FragmentGiveDiamondBinding
+import com.chwl.app.pay.GiveGoldModel
+import com.chwl.app.pay.adapter.GiveDiamondDetailAdapter
+import com.chwl.app.ui.utils.RVDelegate
+import com.chwl.core.user.bean.DiamondGiveHistoryInfo
+import com.chwl.library.utils.ResUtil
+
+class GiveDiamondFragment : BaseViewBindingFragment() {
+
+ private var pageNum: Int = 1
+ private val pageSize = 20
+ private lateinit var mAdapter: GiveDiamondDetailAdapter
+ private lateinit var rvDelegate: RVDelegate
+
+ private val giveGoldModel: GiveGoldModel by viewModels()
+
+ private var uid: Long = 0L
+
+ companion object {
+ fun newInstance(uid: Long): GiveDiamondFragment {
+ val args = Bundle()
+ args.putLong("uid", uid)
+ val fragment = GiveDiamondFragment()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ override fun init() {
+ uid = arguments?.getLong("uid") ?: 0L
+ mAdapter = GiveDiamondDetailAdapter()
+ rvDelegate = RVDelegate.Builder()
+ .setAdapter(mAdapter)
+ .setLayoutManager(LinearLayoutManager(context))
+ .setPageSize(20)
+ .setEmptyView(
+ EmptyViewHelper.createEmptyTextView(
+ context,
+ ResUtil.getString(R.string.me_give_gold_empty)
+ )
+ )
+ .setRefreshLayout(binding.refreshLayout)
+ .setRecyclerView(binding.recyclerView)
+ .build()
+ mAdapter.setOnLoadMoreListener({
+ loadData(false)
+ }, binding.recyclerView)
+ binding.refreshLayout.setOnRefreshListener {
+ loadData(true)
+ }
+ giveGoldModel.giveDetailLiveData.observe(this) {
+ rvDelegate.loadData(it)
+ }
+ loadData(true)
+ }
+
+ @SuppressLint("CheckResult")
+ fun loadData(isRefresh: Boolean) {
+ binding.refreshLayout.isRefreshing = isRefresh
+ pageNum = if (isRefresh) 1 else (pageNum + 1)
+ giveGoldModel.giveDetailInfo(uid, 0, pageNum, pageSize)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/chwl/app/pay/fragment/GiveGiftFragment.kt b/app/src/main/java/com/chwl/app/pay/fragment/GiveGiftFragment.kt
new file mode 100644
index 000000000..603a9a3f2
--- /dev/null
+++ b/app/src/main/java/com/chwl/app/pay/fragment/GiveGiftFragment.kt
@@ -0,0 +1,73 @@
+package com.chwl.app.pay.fragment
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import androidx.fragment.app.viewModels
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.chwl.app.R
+import com.chwl.app.base.BaseViewBindingFragment
+import com.chwl.app.common.EmptyViewHelper
+import com.chwl.app.databinding.FragmentGiveGiftBinding
+import com.chwl.app.pay.GiveGoldModel
+import com.chwl.app.pay.adapter.GiveGiftDetailAdapter
+import com.chwl.app.ui.utils.RVDelegate
+import com.chwl.core.user.bean.DiamondGiveHistoryInfo
+import com.chwl.library.utils.ResUtil
+
+class GiveGiftFragment : BaseViewBindingFragment() {
+
+ private var pageNum: Int = 1
+ private val pageSize = 20
+ private lateinit var mAdapter: GiveGiftDetailAdapter
+ private lateinit var rvDelegate: RVDelegate
+
+ private val giveGoldModel: GiveGoldModel by viewModels()
+
+ private var uid: Long = 0L
+
+ companion object {
+ fun newInstance(uid: Long): GiveGiftFragment {
+ val args = Bundle()
+ args.putLong("uid", uid)
+ val fragment = GiveGiftFragment()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ override fun init() {
+ uid = arguments?.getLong("uid") ?: 0L
+ mAdapter = GiveGiftDetailAdapter()
+ rvDelegate = RVDelegate.Builder()
+ .setAdapter(mAdapter)
+ .setLayoutManager(LinearLayoutManager(context))
+ .setPageSize(20)
+ .setEmptyView(
+ EmptyViewHelper.createEmptyTextView(
+ context,
+ ResUtil.getString(R.string.me_give_gold_empty)
+ )
+ )
+ .setRefreshLayout(binding.refreshLayout)
+ .setRecyclerView(binding.recyclerView)
+ .build()
+ mAdapter.setOnLoadMoreListener({
+ loadData(false)
+ }, binding.recyclerView)
+ binding.refreshLayout.setOnRefreshListener {
+ loadData(true)
+ }
+ giveGoldModel.giveDetailLiveData.observe(this) {
+ rvDelegate.loadData(it)
+ }
+ loadData(true)
+ }
+
+ @SuppressLint("CheckResult")
+ fun loadData(isRefresh: Boolean) {
+ binding.refreshLayout.isRefreshing = isRefresh
+ pageNum = if (isRefresh) 1 else (pageNum + 1)
+ giveGoldModel.giveDetailInfo(uid, 1, pageNum, pageSize)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/chwl/app/pay/interfaces/PasswordView.java b/app/src/main/java/com/chwl/app/pay/interfaces/PasswordView.java
new file mode 100644
index 000000000..3643c5300
--- /dev/null
+++ b/app/src/main/java/com/chwl/app/pay/interfaces/PasswordView.java
@@ -0,0 +1,23 @@
+package com.chwl.app.pay.interfaces;
+
+import com.jungly.gridpasswordview.PasswordType;
+import com.chwl.app.pay.widget.GridPasswordNoFocusView;
+
+public interface PasswordView {
+
+ //void setError(String error);
+
+ String getPassWord();
+
+ void clearPassword();
+
+ void setPassword(String password);
+
+ void setPasswordVisibility(boolean visible);
+
+ void togglePasswordVisibility();
+
+ void setOnPasswordChangedListener(GridPasswordNoFocusView.OnPasswordChangedListener listener);
+
+ void setPasswordType(PasswordType passwordType);
+}
diff --git a/app/src/main/java/com/chwl/app/pay/password/GiveGoldPassWordFragment.java b/app/src/main/java/com/chwl/app/pay/password/GiveGoldPassWordFragment.java
new file mode 100644
index 000000000..56d9d1d68
--- /dev/null
+++ b/app/src/main/java/com/chwl/app/pay/password/GiveGoldPassWordFragment.java
@@ -0,0 +1,132 @@
+package com.chwl.app.pay.password;
+
+import android.graphics.drawable.ColorDrawable;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.DisplayMetrics;
+import android.view.Display;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+
+import androidx.annotation.Nullable;
+import androidx.fragment.app.DialogFragment;
+import androidx.fragment.app.FragmentManager;
+
+import com.chwl.app.R;
+import com.chwl.app.pay.widget.GridPasswordNoFocusView;
+import com.chwl.app.ui.setting.ModifyPwdActivity;
+import com.chwl.library.utils.ResUtil;
+
+
+//也可继承design中的BottomSheetDialogFragment
+public class GiveGoldPassWordFragment extends DialogFragment {
+
+ private GiveGoldPasswordView mPassword;
+
+ private GridPasswordNoFocusView.OnPasswordChangedListener listener;
+
+ private static GiveGoldPassWordFragment passWordFragment;
+
+ private static final String EXTRA_GOLD = "gold";
+ private static final String EXTRA_NICKNAME = "nickname";
+ private static final String EXTRA_GOLD_RATE = "rate";
+
+ public static GiveGoldPassWordFragment newInstance(FragmentManager fragmentManager, String gold) {
+ if (passWordFragment == null) {
+ passWordFragment = new GiveGoldPassWordFragment();
+ Bundle bundle = new Bundle();
+ bundle.putString(EXTRA_GOLD, gold);
+ passWordFragment.setArguments(bundle);
+ passWordFragment.show(fragmentManager, "GiveGoldPassWordFragment");
+ }
+ return passWordFragment;
+ }
+
+ /**
+ * @param gold 金额
+ * @param nickname 转账对象昵称
+ * @param rate 手续费
+ * @return
+ */
+ public static GiveGoldPassWordFragment newInstance(FragmentManager fragmentManager, String gold, String nickname, String rate) {
+ if (passWordFragment == null) {
+ passWordFragment = new GiveGoldPassWordFragment();
+ Bundle bundle = new Bundle();
+ bundle.putString(EXTRA_GOLD, gold);
+ bundle.putString(EXTRA_NICKNAME, nickname);
+ bundle.putString(EXTRA_GOLD_RATE, rate);
+ passWordFragment.setArguments(bundle);
+ passWordFragment.show(fragmentManager, "GiveGoldPassWordFragment");
+ }
+ return passWordFragment;
+ }
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ }
+
+ //继承BottomSheetDialogFragment时onStart()可注释掉
+ @Override
+ public void onStart() {
+ super.onStart();
+ Window window = getDialog().getWindow();
+ if (window != null) {
+ window.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.transparent)));
+ WindowManager.LayoutParams layoutParams = window.getAttributes();
+ DisplayMetrics dm = new DisplayMetrics();
+ Display d = window.getWindowManager().getDefaultDisplay();
+ d.getRealMetrics(dm);
+ window.getWindowManager().getDefaultDisplay().getMetrics(dm);
+ layoutParams.width = dm.widthPixels;
+ layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT;
+ window.setAttributes(layoutParams);
+ }
+
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.dialog_give_gold_password, container);
+ init(view);
+ return view;
+ }
+
+ private void init(View view) {
+ mPassword = view.findViewById(R.id.give_gold_password_view);
+ mPassword.getCloseImageView().setOnClickListener(view12 -> dismiss());
+ mPassword.getForgetTextView().setOnClickListener(view1 -> ModifyPwdActivity.start(getContext(), ModifyPwdActivity.PAY_PWD));
+ mPassword.getPswView().setOnPasswordChangedListener(listener);
+ if (getArguments() != null) {
+ if (!TextUtils.isEmpty(getArguments().getString(EXTRA_NICKNAME))) {
+ mPassword.getTvNickname().setText(ResUtil.getString(R.string.pay_password_givegoldpasswordfragment_01) + getArguments().getString(EXTRA_NICKNAME));
+ } else {
+ mPassword.getTvNickname().setVisibility(View.GONE);
+ }
+ if (!TextUtils.isEmpty(getArguments().getString(EXTRA_GOLD_RATE))) {
+ mPassword.getTvRate().setText(getArguments().getString(EXTRA_GOLD_RATE));
+ } else {
+ mPassword.getTvRate().setVisibility(View.GONE);
+ }
+ mPassword.getTvGold().setText(getArguments().getString(EXTRA_GOLD));
+ }
+ }
+
+ public void setListener(GridPasswordNoFocusView.OnPasswordChangedListener listener) {
+ this.listener = listener;
+ }
+
+ public GiveGoldPasswordView getPassword() {
+ return mPassword;
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ passWordFragment = null;
+ }
+}
diff --git a/app/src/main/java/com/chwl/app/pay/password/GiveGoldPasswordView.java b/app/src/main/java/com/chwl/app/pay/password/GiveGoldPasswordView.java
new file mode 100644
index 000000000..02219d16d
--- /dev/null
+++ b/app/src/main/java/com/chwl/app/pay/password/GiveGoldPasswordView.java
@@ -0,0 +1,135 @@
+package com.chwl.app.pay.password;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.chwl.app.R;
+import com.chwl.app.pay.widget.GridPasswordNoFocusView;
+import com.chwl.app.ui.widget.password.PasswordKeyboardView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by lcw on 2016/11/28.
+ */
+
+public class GiveGoldPasswordView extends RelativeLayout {
+
+ private ImageView mClose;
+ private TextView mTitle;
+ private TextView mForgetPwd;
+ private GridPasswordNoFocusView mPassword;
+ private TextView tvNickname;
+ private TextView tvRate;
+ private TextView tvGold;
+ private PasswordKeyboardView mKeyboard;
+ private List passwordList;//记录键盘输入的值
+ private StringBuilder mValue;//最后保存的密码
+
+ public GiveGoldPasswordView(Context context) {
+ this(context, null);
+ }
+
+ public GiveGoldPasswordView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public GiveGoldPasswordView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ View.inflate(context, R.layout.view_give_gold_password, this);
+ initView();
+ initEvent();
+ }
+
+ private void initView() {
+ mPassword = findViewById(R.id.view_password);
+ mClose = findViewById(R.id.img_close);
+ mTitle = findViewById(R.id.tv_title);
+ mForgetPwd = findViewById(R.id.tv_forgetPwd);
+ mKeyboard = findViewById(R.id.view_keyboard);
+ tvGold = findViewById(R.id.tv_gold);
+ tvNickname = findViewById(R.id.tv_nickname);
+ tvRate = findViewById(R.id.tv_rate);
+ //打乱数字的位置
+ //mKeyboard.shuffleKeyboard();
+ }
+
+ private void initEvent() {
+ mValue = new StringBuilder();
+ passwordList = new ArrayList<>();
+ mKeyboard.setIOnKeyboardListener(new PasswordKeyboardView.IOnKeyboardListener() {
+
+ @Override
+ public void onInsertKeyEvent(String text) {
+ mValue.setLength(0);
+ passwordList.add(text);
+ for (int i = 0; i < passwordList.size(); i++) {
+ mValue.append(passwordList.get(i));
+ }
+ mPassword.setPassword(mValue.toString());
+ }
+
+ @Override
+ public void onDeleteKeyEvent() {
+ mValue.setLength(0);
+ if (passwordList.size() != 0) {
+ passwordList.remove(passwordList.size() - 1);
+ for (int i = 0; i < passwordList.size(); i++) {
+ mValue.append(passwordList.get(i));
+ }
+ mPassword.setPassword(mValue.toString());
+ }
+ }
+ });
+ }
+
+ //获取输入的密码
+ public String getPassword() {
+ return mValue.toString();
+ }
+
+ //取消
+ public ImageView getCloseImageView() {
+ return mClose;
+ }
+
+ //标题
+ public TextView getTitleTextView() {
+ return mTitle;
+ }
+
+ //忘记密码
+ public TextView getForgetTextView() {
+ return mForgetPwd;
+ }
+
+
+ public TextView getTvNickname() {
+ return tvNickname;
+ }
+
+ public TextView getTvRate() {
+ return tvRate;
+ }
+
+ public TextView getTvGold() {
+ return tvGold;
+ }
+
+ //输入密码控件
+ public GridPasswordNoFocusView getPswView() {
+ return mPassword;
+ }
+
+ public void clearPassword(){
+ mValue.setLength(0);
+ mPassword.clearPassword();
+ passwordList.clear();
+ }
+
+}
diff --git a/app/src/main/java/com/chwl/app/pay/widget/GridPasswordNoFocusView.java b/app/src/main/java/com/chwl/app/pay/widget/GridPasswordNoFocusView.java
new file mode 100644
index 000000000..96cb42671
--- /dev/null
+++ b/app/src/main/java/com/chwl/app/pay/widget/GridPasswordNoFocusView.java
@@ -0,0 +1,436 @@
+package com.chwl.app.pay.widget;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.content.res.TypedArray;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.GradientDrawable;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.text.Editable;
+import android.text.InputType;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.text.method.PasswordTransformationMethod;
+import android.util.AttributeSet;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.jungly.gridpasswordview.CustomPasswordTransformationMethod;
+import com.jungly.gridpasswordview.PasswordType;
+import com.jungly.gridpasswordview.Util;
+import com.jungly.gridpasswordview.imebugfixer.ImeDelBugFixedEditText;
+import com.chwl.app.R;
+import com.chwl.app.pay.interfaces.PasswordView;
+
+public class GridPasswordNoFocusView extends LinearLayout implements PasswordView {
+ private static final int DEFAULT_PASSWORDLENGTH = 6;
+ private static final int DEFAULT_TEXTSIZE = 16;
+ private static final String DEFAULT_TRANSFORMATION = "●";
+ private static final int DEFAULT_LINECOLOR = 0xaa888888;
+ private static final int DEFAULT_GRIDCOLOR = 0xffffffff;
+
+ private ColorStateList mTextColor;
+ private int mTextSize = DEFAULT_TEXTSIZE;
+ private int mLineWidth;
+ private int mLineColor;
+ private int mGridColor;
+ private Drawable mLineDrawable;
+ private Drawable mOuterLineDrawable;
+ private int mPasswordLength;
+ private String mPasswordTransformation;
+ private int mPasswordType;
+
+ private String[] mPasswordArr;
+ private TextView[] mViewArr;
+
+ private ImeDelBugFixedEditText mInputView;
+ private OnPasswordChangedListener mListener;
+ private PasswordTransformationMethod mTransformationMethod;
+
+ public GridPasswordNoFocusView(Context context) {
+ super(context);
+ initViews(context);
+ init(context, null, 0);
+ }
+
+ public GridPasswordNoFocusView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(context, attrs, 0);
+ }
+
+ public GridPasswordNoFocusView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init(context, attrs, defStyleAttr);
+ }
+
+ public GridPasswordNoFocusView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ init(context, attrs, defStyleAttr);
+ }
+
+ private void init(Context context, AttributeSet attrs, int defStyleAttr) {
+ initAttrs(context, attrs, defStyleAttr);
+ initViews(context);
+ }
+
+ private void initAttrs(Context context, AttributeSet attrs, int defStyleAttr) {
+ TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.gridPasswordView, defStyleAttr, 0);
+
+ mTextColor = ta.getColorStateList(R.styleable.gridPasswordView_gpvTextColor);
+ if (mTextColor == null)
+ mTextColor = ColorStateList.valueOf(getResources().getColor(android.R.color.primary_text_light));
+ int textSize = ta.getDimensionPixelSize(R.styleable.gridPasswordView_gpvTextSize, -1);
+ if (textSize != -1) {
+ this.mTextSize = Util.px2sp(context, textSize);
+ }
+
+ mLineWidth = (int) ta.getDimension(R.styleable.gridPasswordView_gpvLineWidth, Util.dp2px(getContext(), 1));
+ mLineColor = ta.getColor(R.styleable.gridPasswordView_gpvLineColor, DEFAULT_LINECOLOR);
+ mGridColor = ta.getColor(R.styleable.gridPasswordView_gpvGridColor, DEFAULT_GRIDCOLOR);
+ mLineDrawable = ta.getDrawable(R.styleable.gridPasswordView_gpvLineColor);
+ if (mLineDrawable == null)
+ mLineDrawable = new ColorDrawable(mLineColor);
+ mOuterLineDrawable = generateBackgroundDrawable();
+
+ mPasswordLength = ta.getInt(R.styleable.gridPasswordView_gpvPasswordLength, DEFAULT_PASSWORDLENGTH);
+ mPasswordTransformation = ta.getString(R.styleable.gridPasswordView_gpvPasswordTransformation);
+ if (TextUtils.isEmpty(mPasswordTransformation))
+ mPasswordTransformation = DEFAULT_TRANSFORMATION;
+
+
+ mPasswordType = ta.getInt(R.styleable.gridPasswordView_gpvPasswordType, 0);
+
+ ta.recycle();
+
+ mPasswordArr = new String[mPasswordLength];
+ mViewArr = new TextView[mPasswordLength];
+ }
+
+ private void initViews(Context context) {
+ super.setBackgroundDrawable(mOuterLineDrawable);
+ setShowDividers(SHOW_DIVIDER_NONE);
+ setOrientation(HORIZONTAL);
+
+ mTransformationMethod = new CustomPasswordTransformationMethod(mPasswordTransformation);
+ inflaterViews(context);
+ }
+
+ private void inflaterViews(Context context) {
+ LayoutInflater inflater = LayoutInflater.from(context);
+ inflater.inflate(R.layout.grid_password_view, this);
+
+ mInputView = (ImeDelBugFixedEditText) findViewById(R.id.inputView);
+ mInputView.setMaxEms(mPasswordLength);
+ mInputView.addTextChangedListener(textWatcher);
+ mInputView.setDelKeyEventListener(onDelKeyEventListener);
+ setCustomAttr(mInputView);
+
+ mViewArr[0] = mInputView;
+
+ int index = 1;
+ while (index < mPasswordLength) {
+ View dividerView = inflater.inflate(R.layout.divider, null);
+ LinearLayout.LayoutParams dividerParams = new LinearLayout.LayoutParams(mLineWidth, LinearLayout.LayoutParams.MATCH_PARENT);
+ dividerView.setBackgroundDrawable(mLineDrawable);
+ addView(dividerView, dividerParams);
+
+ TextView textView = (TextView) inflater.inflate(R.layout.textview, null);
+ setCustomAttr(textView);
+ LinearLayout.LayoutParams textViewParams = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1f);
+ addView(textView, textViewParams);
+
+ mViewArr[index] = textView;
+ index++;
+ }
+
+ }
+
+ private void setCustomAttr(TextView view) {
+ if (mTextColor != null)
+ view.setTextColor(mTextColor);
+ view.setTextSize(mTextSize);
+
+ int inputType = InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD;
+ switch (mPasswordType) {
+
+ case 1:
+ inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD;
+ break;
+
+ case 2:
+ inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
+ break;
+
+ case 3:
+ inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD;
+ break;
+ }
+ view.setInputType(inputType);
+ view.setTransformationMethod(mTransformationMethod);
+ }
+
+ private GradientDrawable generateBackgroundDrawable() {
+ GradientDrawable drawable = new GradientDrawable();
+ drawable.setColor(mGridColor);
+ drawable.setStroke(mLineWidth, mLineColor);
+ return drawable;
+ }
+
+ private ImeDelBugFixedEditText.OnDelKeyEventListener onDelKeyEventListener = new ImeDelBugFixedEditText.OnDelKeyEventListener() {
+
+ @Override
+ public void onDeleteClick() {
+ for (int i = mPasswordArr.length - 1; i >= 0; i--) {
+ if (mPasswordArr[i] != null) {
+ mPasswordArr[i] = null;
+ mViewArr[i].setText(null);
+ notifyTextChanged();
+ break;
+ } else {
+ mViewArr[i].setText(null);
+ }
+ }
+ }
+ };
+
+ private TextWatcher textWatcher = new TextWatcher() {
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ if (s == null) {
+ return;
+ }
+
+ String newStr = s.toString();
+ if (newStr.length() == 1) {
+ mPasswordArr[0] = newStr;
+ notifyTextChanged();
+ } else if (newStr.length() == 2) {
+ String newNum = newStr.substring(1);
+ for (int i = 0; i < mPasswordArr.length; i++) {
+ if (mPasswordArr[i] == null) {
+ mPasswordArr[i] = newNum;
+ mViewArr[i].setText(newNum);
+ notifyTextChanged();
+ break;
+ }
+ }
+ mInputView.removeTextChangedListener(this);
+ mInputView.setText(mPasswordArr[0]);
+ if (mInputView.getText().length() >= 1) {
+ mInputView.setSelection(1);
+ }
+ mInputView.addTextChangedListener(this);
+ }
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+
+ }
+ };
+
+ @Deprecated
+ private OnKeyListener onKeyListener = new OnKeyListener() {
+ @Override
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ if (event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_DEL) {
+ onDelKeyEventListener.onDeleteClick();
+ return true;
+ }
+ return false;
+ }
+ };
+
+ private void notifyTextChanged() {
+ if (mListener == null)
+ return;
+
+ String currentPsw = getPassWord();
+ mListener.onTextChanged(currentPsw);
+
+ if (currentPsw.length() == mPasswordLength)
+ mListener.onInputFinish(currentPsw);
+ }
+
+ @Override
+ protected Parcelable onSaveInstanceState() {
+ Bundle bundle = new Bundle();
+ bundle.putParcelable("instanceState", super.onSaveInstanceState());
+ bundle.putStringArray("passwordArr", mPasswordArr);
+ return bundle;
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Parcelable state) {
+ if (state instanceof Bundle) {
+ Bundle bundle = (Bundle) state;
+ mPasswordArr = bundle.getStringArray("passwordArr");
+ state = bundle.getParcelable("instanceState");
+ mInputView.removeTextChangedListener(textWatcher);
+ setPassword(getPassWord());
+ mInputView.addTextChangedListener(textWatcher);
+ }
+ super.onRestoreInstanceState(state);
+ }
+
+ //TODO
+ //@Override
+ private void setError(String error) {
+ mInputView.setError(error);
+ }
+
+ /**
+ * Return the text the PasswordView is displaying.
+ */
+ @Override
+ public String getPassWord() {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < mPasswordArr.length; i++) {
+ if (mPasswordArr[i] != null)
+ sb.append(mPasswordArr[i]);
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Clear the passwrod the PasswordView is displaying.
+ */
+ @Override
+ public void clearPassword() {
+ for (int i = 0; i < mPasswordArr.length; i++) {
+ mPasswordArr[i] = null;
+ mViewArr[i].setText(null);
+ }
+ }
+
+ /**
+ * Sets the string value of the PasswordView.
+ */
+ @Override
+ public void setPassword(String password) {
+ clearPassword();
+
+ if (TextUtils.isEmpty(password))
+ return;
+
+ char[] pswArr = password.toCharArray();
+ for (int i = 0; i < pswArr.length; i++) {
+ if (i < mPasswordArr.length) {
+ mPasswordArr[i] = pswArr[i] + "";
+ mViewArr[i].setText(mPasswordArr[i]);
+ }
+ }
+ }
+
+ /**
+ * Set the enabled state of this view.
+ */
+ @Override
+ public void setPasswordVisibility(boolean visible) {
+ for (TextView textView : mViewArr) {
+ textView.setTransformationMethod(visible ? null : mTransformationMethod);
+ if (textView instanceof EditText) {
+ EditText et = (EditText) textView;
+ et.setSelection(et.getText().length());
+ }
+ }
+ }
+
+ /**
+ * Toggle the enabled state of this view.
+ */
+ @Override
+ public void togglePasswordVisibility() {
+ boolean currentVisible = getPassWordVisibility();
+ setPasswordVisibility(!currentVisible);
+ }
+
+ /**
+ * Get the visibility of this view.
+ */
+ private boolean getPassWordVisibility() {
+ return mViewArr[0].getTransformationMethod() == null;
+ }
+
+ /**
+ * Register a callback to be invoked when password changed.
+ */
+ @Override
+ public void setOnPasswordChangedListener(OnPasswordChangedListener listener) {
+ this.mListener = listener;
+ }
+
+ @Override
+ public void setPasswordType(PasswordType passwordType) {
+ boolean visible = getPassWordVisibility();
+ int inputType = InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD;
+ switch (passwordType) {
+
+ case TEXT:
+ inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD;
+ break;
+
+ case TEXTVISIBLE:
+ inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
+ break;
+
+ case TEXTWEB:
+ inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD;
+ break;
+ }
+
+ for (TextView textView : mViewArr)
+ textView.setInputType(inputType);
+
+ setPasswordVisibility(visible);
+ }
+
+ @Override
+ public void setBackground(Drawable background) {
+ }
+
+ @Override
+ public void setBackgroundColor(int color) {
+ }
+
+ @Override
+ public void setBackgroundResource(int resid) {
+ }
+
+ @Override
+ public void setBackgroundDrawable(Drawable background) {
+ }
+
+
+ /**
+ * Interface definition for a callback to be invoked when the password changed or is at the maximum length.
+ */
+ public interface OnPasswordChangedListener {
+
+ /**
+ * Invoked when the password changed.
+ *
+ * @param psw new text
+ */
+ void onTextChanged(String psw);
+
+ /**
+ * Invoked when the password is at the maximum length.
+ *
+ * @param psw complete text
+ */
+ void onInputFinish(String psw);
+
+ }
+}
diff --git a/app/src/main/java/com/chwl/app/ui/im/RouterHandler.java b/app/src/main/java/com/chwl/app/ui/im/RouterHandler.java
index c3f1b1b75..d4eba66a1 100644
--- a/app/src/main/java/com/chwl/app/ui/im/RouterHandler.java
+++ b/app/src/main/java/com/chwl/app/ui/im/RouterHandler.java
@@ -5,6 +5,7 @@ import android.content.Context;
import com.chwl.app.decoration.view.DecorationStoreActivity;
import com.chwl.app.earn.activity.EarnRecordActivity;
+import com.chwl.app.pay.activity.GiveGoldActivity;
import com.trello.rxlifecycle3.components.support.RxAppCompatActivity;
import com.chwl.app.R;
import com.chwl.app.UIHelper;
@@ -277,6 +278,9 @@ public class RouterHandler {
case RouterType.USER_LEVEL:
CommonWebViewActivity.start(context, UriProvider.getUserLevelUrl());
break;
+ case RouterType.USER_DONATION:
+ GiveGoldActivity.Companion.start(context);
+ break;
default:
SingleToastUtil.showToast(ResUtil.getString(R.string.ui_im_routerhandler_07));
return false;
diff --git a/app/src/main/java/com/chwl/app/ui/user/activity/UserGiftActivity.kt b/app/src/main/java/com/chwl/app/ui/user/activity/UserGiftActivity.kt
index 2ffc1ba22..0b64eb90d 100644
--- a/app/src/main/java/com/chwl/app/ui/user/activity/UserGiftActivity.kt
+++ b/app/src/main/java/com/chwl/app/ui/user/activity/UserGiftActivity.kt
@@ -11,7 +11,6 @@ import com.chwl.app.base.BaseViewBindingActivity
import com.chwl.app.databinding.ActivityUserGiftBinding
import com.chwl.app.ui.user.fragment.UserInfoGiftFragment
import com.chwl.app.ui.user.adapter.CommonWrapIndicatorAdapter
-import com.chwl.app.ui.user.adapter.UserInfoPagerAdapter
import com.chwl.app.ui.widget.magicindicator.MagicIndicator
import com.chwl.app.ui.widget.magicindicator.ViewPagerHelper
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
diff --git a/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoActivity.java b/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoActivity.java
index ac6bcd693..420630b53 100644
--- a/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoActivity.java
+++ b/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoActivity.java
@@ -43,7 +43,6 @@ import com.chwl.app.ui.im.avtivity.NimFriendModel;
import com.chwl.app.ui.im.avtivity.NimP2PMessageActivity;
import com.chwl.app.ui.user.adapter.SelfPhotoAdapter;
import com.chwl.app.ui.user.adapter.UserInfoIndicatorAdapter;
-import com.chwl.app.ui.user.adapter.UserInfoPagerAdapter;
import com.chwl.app.ui.user.adapter.UserInfoPhotoAdapter;
import com.chwl.app.ui.user.adapter.UserPhotoAdapter;
import com.chwl.app.ui.user.fragment.UserInfoGiftWallFragment;
@@ -53,7 +52,6 @@ import com.chwl.app.ui.utils.ImageLoadUtils;
import com.chwl.app.ui.utils.ImageLoadUtilsV2;
import com.chwl.app.ui.widget.ButtonItem;
import com.chwl.app.ui.widget.ObservableScrollView;
-import com.chwl.app.ui.widget.magicindicator.ViewPagerHelper;
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator;
import com.chwl.app.ui.widget.rollviewpager.adapter.StaticPagerAdapterWrapper;
import com.chwl.app.utils.RegexUtil;
diff --git a/app/src/main/java/com/chwl/app/ui/user/adapter/UserInfoPagerAdapter.kt b/app/src/main/java/com/chwl/app/ui/user/adapter/UserInfoPagerAdapter.kt
deleted file mode 100644
index b7e53c36f..000000000
--- a/app/src/main/java/com/chwl/app/ui/user/adapter/UserInfoPagerAdapter.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.chwl.app.ui.user.adapter
-
-import android.annotation.SuppressLint
-import androidx.fragment.app.Fragment
-import androidx.fragment.app.FragmentManager
-import androidx.fragment.app.FragmentPagerAdapter
-
-@SuppressLint("WrongConstant")
-class UserInfoPagerAdapter(fm:FragmentManager, private val list:List) :FragmentPagerAdapter(fm,
- BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT){
- override fun getCount()=list.size
-
- override fun getItem(position: Int)=list[position]
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/chwl/app/ui/user/fragment/UserInfoGiftWallFragment.kt b/app/src/main/java/com/chwl/app/ui/user/fragment/UserInfoGiftWallFragment.kt
index 7a9d6626d..6fbd37879 100644
--- a/app/src/main/java/com/chwl/app/ui/user/fragment/UserInfoGiftWallFragment.kt
+++ b/app/src/main/java/com/chwl/app/ui/user/fragment/UserInfoGiftWallFragment.kt
@@ -4,14 +4,12 @@ import android.content.Intent
import android.widget.LinearLayout
import android.widget.TextView
import androidx.fragment.app.Fragment
-import androidx.viewpager.widget.ViewPager
import com.chwl.app.R
import com.chwl.app.avroom.adapter.CommonVPAdapter
import com.chwl.app.base.BaseViewBindingFragment
import com.chwl.app.databinding.FragmentUserinfoGiftWallBinding
import com.chwl.app.ui.user.activity.UserGiftActivity
import com.chwl.app.ui.user.adapter.CommonWrapIndicatorAdapter
-import com.chwl.app.ui.user.adapter.UserInfoPagerAdapter
import com.chwl.app.ui.widget.magicindicator.MagicIndicator
import com.chwl.app.ui.widget.magicindicator.ViewPagerHelper
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
diff --git a/app/src/main/res/drawable-xhdpi/ic_give_diamond_details.png b/app/src/main/res/drawable-xhdpi/ic_give_diamond_details.png
new file mode 100644
index 000000000..e42865f60
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_give_diamond_details.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/me_ic_menu_donation.png b/app/src/main/res/drawable-xxhdpi/me_ic_menu_donation.png
new file mode 100644
index 000000000..973dd03aa
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/me_ic_menu_donation.png differ
diff --git a/app/src/main/res/layout/activity_give_gold.xml b/app/src/main/res/layout/activity_give_gold.xml
new file mode 100644
index 000000000..bfe5a49df
--- /dev/null
+++ b/app/src/main/res/layout/activity_give_gold.xml
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_give_gold_detail.xml b/app/src/main/res/layout/activity_give_gold_detail.xml
new file mode 100644
index 000000000..6babf8282
--- /dev/null
+++ b/app/src/main/res/layout/activity_give_gold_detail.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_give_gold_search.xml b/app/src/main/res/layout/activity_give_gold_search.xml
new file mode 100644
index 000000000..2c065b5da
--- /dev/null
+++ b/app/src/main/res/layout/activity_give_gold_search.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_give_gold_to_user.xml b/app/src/main/res/layout/activity_give_gold_to_user.xml
new file mode 100644
index 000000000..12b8ea652
--- /dev/null
+++ b/app/src/main/res/layout/activity_give_gold_to_user.xml
@@ -0,0 +1,288 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/dialog_give_gold_password.xml b/app/src/main/res/layout/dialog_give_gold_password.xml
new file mode 100644
index 000000000..caa0c977a
--- /dev/null
+++ b/app/src/main/res/layout/dialog_give_gold_password.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_give_diamond.xml b/app/src/main/res/layout/fragment_give_diamond.xml
new file mode 100644
index 000000000..a3d92b162
--- /dev/null
+++ b/app/src/main/res/layout/fragment_give_diamond.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_give_gift.xml b/app/src/main/res/layout/fragment_give_gift.xml
new file mode 100644
index 000000000..a3d92b162
--- /dev/null
+++ b/app/src/main/res/layout/fragment_give_gift.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_give_diamond_detail.xml b/app/src/main/res/layout/item_give_diamond_detail.xml
new file mode 100644
index 000000000..cab5119da
--- /dev/null
+++ b/app/src/main/res/layout/item_give_diamond_detail.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_give_gift.xml b/app/src/main/res/layout/item_give_gift.xml
new file mode 100644
index 000000000..1196be618
--- /dev/null
+++ b/app/src/main/res/layout/item_give_gift.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_lately_give.xml b/app/src/main/res/layout/item_lately_give.xml
new file mode 100644
index 000000000..b29b9cfdf
--- /dev/null
+++ b/app/src/main/res/layout/item_lately_give.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/view_give_gold_password.xml b/app/src/main/res/layout/view_give_gold_password.xml
new file mode 100644
index 000000000..4859fed65
--- /dev/null
+++ b/app/src/main/res/layout/view_give_gold_password.xml
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 95d6ea49e..3c4c58456 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -4862,8 +4862,7 @@
يرجى تعيين كلمة مرور الدفع أولاً
الانتقال إلى الإعدادات
رسوم الخدمة
- إجمالي استهلاك الألماس
- %s ألماس
+ إجمالي النقود المستهلكة
إعطاء لـ %s
تم النسخ
نسخ
@@ -4874,7 +4873,7 @@
الرجاء إدخال كمية الهدية
كمية الهدية غير صالحة، يرجى إعادة الإدخال
تم إرسال الهدية بنجاح
- إجمالي النفقات %s ألماس
+ إجمالي الإنفاق %s عملات ذهبية
لاحقًا
لا توجد هدايا في الوقت الحالي
تم التقديم
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 3e8fa9fd7..5e1010617 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -4860,8 +4860,7 @@
請先設置支付密碼
去設置
手續費
- 總消耗鉆石
- %s鉆
+ 總消耗金幣
向%s轉贈
已複製
複製
@@ -4872,7 +4871,7 @@
請輸入禮物數量
禮物數量有誤,請重新輸入
轉贈成功
- 總支出%s鉆
+ 總支出%s金幣
以後再説
暫時沒有禮物
已申請
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 91468edcb..0217d7c0d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -4842,8 +4842,7 @@
Please set up payment password first
Go to Setting
Service Charge
- Total Diamond Consumption
- %s Diamonds
+ Total Coins Consumed
Give to %s
Copied
Copy
@@ -4854,7 +4853,7 @@
Please enter the quantity of the gift
Invalid gift quantity, please re-enter
Gift sent successfully
- Total Expenditure %s Diamonds
+ Total Expenditure %s Coins
Later
No gifts at the moment
Applied
diff --git a/core/src/main/java/com/chwl/core/home/model/HomeModel.kt b/core/src/main/java/com/chwl/core/home/model/HomeModel.kt
index e677d1bed..b9c7c443c 100644
--- a/core/src/main/java/com/chwl/core/home/model/HomeModel.kt
+++ b/core/src/main/java/com/chwl/core/home/model/HomeModel.kt
@@ -8,6 +8,8 @@ import com.chwl.core.community.CommunityConstant
import com.chwl.core.community.bean.UnReadCountInfo
import com.chwl.core.home.bean.*
import com.chwl.core.room.bean.AnchorInfo
+import com.chwl.core.user.bean.DiamondGiveHistoryInfo
+import com.chwl.core.user.bean.SearchUserInfo
import com.chwl.core.user.bean.UserInfo
import com.chwl.core.utils.net.RxHelper
import com.chwl.core.utils.net.launchRequest
@@ -183,7 +185,79 @@ object HomeModel : BaseModel() {
api.getResourceJumpInfo(id)
}
+ suspend fun getDiamondGiveHistory(page: Int, pageSize: Int): List? =
+ launchRequest {
+ api.getRecord(page, pageSize)
+ }
+
+ suspend fun getSearchUser(erbanNo: Long): SearchUserInfo? =
+ launchRequest {
+ api.getSearchUser(erbanNo)
+ }
+
+ suspend fun giveGift(toUid: Long, giftId: Int, giftNum: Int): String? =
+ launchRequest {
+ api.giveGift(toUid, giftId, giftNum)
+ }
+
+ suspend fun getGiveDetail(
+ uid: Long,
+ type: Int,
+ page: Int,
+ pageSize: Int
+ ): List? =
+ launchRequest {
+ api.getGiveDetail(uid, type, page, pageSize)
+ }
+
private interface Api {
+
+ /**
+ * 轉贈鉆石歷史記錄
+ *
+ * @return
+ */
+ @GET("/user/diamond/giveRecord")
+ suspend fun getRecord(
+ @Query("pageNum") pageNum: Int?,
+ @Query("pageSize") pageSize: Int?
+ ): ServiceResult>
+
+ /**
+ * 精確搜索用戶
+ *
+ * @return
+ */
+ @POST("/user/diamond/searchUser")
+ suspend fun getSearchUser(
+ @Query("erbanNo") erbanNo: Long?
+ ): ServiceResult
+
+ /**
+ * 贈送禮物
+ *
+ * @return
+ */
+ @POST("/user/diamond/giveGift")
+ suspend fun giveGift(
+ @Query("toUid") toUid: Long?,
+ @Query("giftId") giftId: Int?,
+ @Query("giftNum") giftNum: Int?
+ ): ServiceResult
+
+ /**
+ * 轉贈詳情
+ *
+ * @return
+ */
+ @GET("/user/diamond/giveRecordVoByType")
+ suspend fun getGiveDetail(
+ @Query("toUid") toUid: Long?,
+ @Query("type") type: Int?,
+ @Query("pageNum") pageNum: Int?,
+ @Query("pageSize") pageSize: Int?
+ ): ServiceResult>
+
/**
* 提交反馈
*
diff --git a/core/src/main/java/com/chwl/core/im/custom/bean/RouterType.java b/core/src/main/java/com/chwl/core/im/custom/bean/RouterType.java
index 314c6c929..710363785 100644
--- a/core/src/main/java/com/chwl/core/im/custom/bean/RouterType.java
+++ b/core/src/main/java/com/chwl/core/im/custom/bean/RouterType.java
@@ -217,4 +217,8 @@ public class RouterType {
* 用户等级(目前只是本地用到,所以用了100001)
*/
public static final int USER_LEVEL = 100001;
+ /**
+ * 我的转赠(目前只是本地用到,所以用了100002)
+ */
+ public static final int USER_DONATION = 100002;
}
diff --git a/core/src/main/java/com/chwl/core/pay/IPayModel.java b/core/src/main/java/com/chwl/core/pay/IPayModel.java
index f9115e02f..0139d89e3 100644
--- a/core/src/main/java/com/chwl/core/pay/IPayModel.java
+++ b/core/src/main/java/com/chwl/core/pay/IPayModel.java
@@ -86,4 +86,5 @@ public interface IPayModel extends IModel {
Single getChargeContact();
+ Single giveGold(long toUid, String goldNum, String password);
}
diff --git a/core/src/main/java/com/chwl/core/pay/PayModel.java b/core/src/main/java/com/chwl/core/pay/PayModel.java
index b7d688003..a1d402095 100644
--- a/core/src/main/java/com/chwl/core/pay/PayModel.java
+++ b/core/src/main/java/com/chwl/core/pay/PayModel.java
@@ -325,8 +325,27 @@ public class PayModel extends BaseModel implements IPayModel {
.compose(RxHelper.handleSchedulers());
}
+
+ @Override
+ public Single giveGold(long toUid, String goldNum, String password) {
+ return api.giveGold(toUid, goldNum, password)
+ .compose(RxHelper.handleStringData())
+ .compose(RxHelper.handleSchedulers());
+ }
+
public interface Api {
+ /**
+ * 钻石转赠
+ *
+ * @return
+ */
+ @FormUrlEncoded
+ @POST("/user/diamond/give")
+ Single> giveGold(@Field("toUid") long toUid,
+ @Field("diamondNum") String diamondNum,
+ @Field("payPwd") String payPwd);
+
/**
* 获取钱包
*