FoodContentView.kt 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. package com.develop.common.widget
  2. import android.content.Context
  3. import android.graphics.drawable.Drawable
  4. import android.util.AttributeSet
  5. import android.util.Log
  6. import android.view.View
  7. import android.widget.RelativeLayout
  8. import androidx.constraintlayout.widget.ConstraintLayout
  9. import androidx.core.graphics.drawable.DrawableCompat
  10. import com.blankj.utilcode.util.ThreadUtils.runOnUiThread
  11. import com.bumptech.glide.Glide
  12. import com.bumptech.glide.load.DataSource
  13. import com.bumptech.glide.load.engine.DiskCacheStrategy
  14. import com.bumptech.glide.load.engine.GlideException
  15. import com.bumptech.glide.request.RequestListener
  16. import com.bumptech.glide.request.target.Target
  17. import com.develop.base.ext.background_drawable
  18. import com.develop.base.ext.load
  19. import com.develop.base.ext.navigateTo
  20. import com.develop.base.ext.resId2Dimension
  21. import com.develop.base.ext.skinBackground
  22. import com.develop.base.ext.skinSrc
  23. import com.develop.base.ext.src
  24. import com.develop.base.ext.updateText
  25. import com.develop.base.util.TopResumedAtyHolder
  26. import com.develop.common.R
  27. import com.develop.common.data_repo.FoodDataProvider
  28. import com.develop.common.data_repo.db.FoodContentModel
  29. import com.develop.common.data_repo.db.entity.UserFavoriteRecipes
  30. import com.develop.common.databinding.FoodContentViewBinding
  31. import com.develop.common.dialog.CancelConfirmDialog
  32. import com.develop.common.event.RefreshDataEvent
  33. import com.develop.common.event.RefreshLikeDataEvent
  34. import com.develop.common.router.Screens
  35. import com.develop.common.tag.*
  36. import com.drake.net.utils.scope
  37. import com.drake.net.utils.withMain
  38. import kotlinx.coroutines.Dispatchers
  39. import kotlinx.coroutines.launch
  40. import kotlinx.coroutines.withContext
  41. import org.greenrobot.eventbus.EventBus
  42. class FoodContentView : ConstraintLayout {
  43. constructor(context: Context) : super(context) {}
  44. constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {}
  45. constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
  46. context, attrs, defStyleAttr
  47. ) {
  48. }
  49. private val cancelConfirmDialog by lazy {
  50. CancelConfirmDialog()
  51. }
  52. private var binding: FoodContentViewBinding
  53. private var mFoodContent: FoodContentModel? = null
  54. private var mIsFoodList = false
  55. var mIsHistoryList = false
  56. init {
  57. val root = View.inflate(context, R.layout.food_content_view, this)
  58. binding = FoodContentViewBinding.bind(root)
  59. binding.contentLayout.skinBackground(R.drawable.food_content_conner)
  60. binding.likeLayout.skinBackground(R.drawable.white_circle)
  61. binding.contentLayout.setOnClickListener {
  62. mFoodContent?.apply {
  63. TopResumedAtyHolder.getCurrentActivity()?.navigateTo(Screens.Cook.COOK_DETAIL) {
  64. withString(
  65. SOURCE_TAG, if (isNetRecipes) {
  66. "remote"
  67. } else {
  68. "local"
  69. }
  70. )
  71. withString(NUMBER_TAG, foodId)
  72. withBoolean(IS_LIKE_TAG, isLike)
  73. if (!mIsFoodList) {
  74. withString(RECIPES_EDITION_TAG, recipesEdition)
  75. }
  76. }
  77. }
  78. }
  79. //喜欢点击
  80. val tintList = resources.getColorStateList(com.develop.common.R.color.color_cook_tab_tint)
  81. binding.ivNet.drawable?.apply {
  82. DrawableCompat.setTintList(this, tintList)
  83. }
  84. binding.likeLayout.setOnClickListener {
  85. //收藏/取消收藏
  86. mFoodContent?.apply {
  87. if (isNetRecipes && mIsFoodList) {
  88. val titleStr = context.getString(R.string.are_you_sure_to_delete)
  89. val confirmStr = context.getString(R.string.yes)
  90. val cancelStr = context.getString(R.string.no)
  91. TopResumedAtyHolder.getCurrentActivity()?.apply {
  92. cancelConfirmDialog.apply {
  93. this.title = titleStr
  94. this.confirmStr = confirmStr
  95. this.cancelStr = cancelStr
  96. onDialogClickListener =
  97. object : CancelConfirmDialog.OnDialogClickListener {
  98. override fun onConfirm() {
  99. FoodDataProvider.getUserDatabase().runInTransaction {
  100. FoodDataProvider.getUserDatabase().userInfoDao()
  101. .removeOnlineRecipe(
  102. CURRENT_USER_ID, foodId
  103. )
  104. }
  105. /***
  106. * 2024.03.04 删除下载记录,只删除记录,不删除食谱
  107. */
  108. FoodDataProvider.getDatabase().runInTransaction {
  109. // val recipeDao =
  110. // FoodDataProvider.getDatabase().recipeDao()
  111. // val recipes = recipeDao.queryRecipe(foodId)
  112. // recipes?.apply {
  113. // recipeDao.deleteRecipe(this)
  114. // }
  115. FoodDataProvider.deleteRecipeResource(foodId)
  116. }
  117. EventBus.getDefault().post(RefreshDataEvent())
  118. }
  119. override fun onCancel() {
  120. }
  121. }
  122. showDialog(supportFragmentManager, "cancelConfirmDialog")
  123. }
  124. }
  125. } else {
  126. if (isLike) {
  127. isLike = false
  128. binding.ivLike.skinSrc(R.drawable.ic_unlike)
  129. FoodDataProvider.getUserDatabase().runInTransaction {
  130. FoodDataProvider.getUserDatabase().userInfoDao().removeFavoriteRecipe(
  131. CURRENT_USER_ID, foodId
  132. )
  133. }
  134. if (!mIsHistoryList) {
  135. EventBus.getDefault().post(RefreshLikeDataEvent(false, foodId))
  136. }
  137. } else {
  138. isLike = true
  139. binding.ivLike.skinSrc(R.drawable.ic_like)
  140. FoodDataProvider.getUserDatabase().runInTransaction {
  141. FoodDataProvider.getUserDatabase().userInfoDao().insertFavoriteRecipe(
  142. UserFavoriteRecipes(CURRENT_USER_ID, foodId)
  143. )
  144. }
  145. if (!mIsHistoryList) {
  146. EventBus.getDefault().post(RefreshLikeDataEvent(true, foodId))
  147. }
  148. }
  149. }
  150. }
  151. }
  152. }
  153. /**
  154. * 显示菜谱数据
  155. * @param isFoodList 是否为FoodListActivity
  156. */
  157. fun setFoodContent(content: FoodContentModel, isFoodList: Boolean = false) {
  158. Log.d("------", "---333---")
  159. mFoodContent = content
  160. mIsFoodList = isFoodList
  161. val isNetRecipes = content.isNetRecipes
  162. val hasDownload = content.hasDownloaded
  163. val isLike = content.isLike
  164. val cover = if (isFoodList) {
  165. if (isNetRecipes && !content.hasDownloaded) {
  166. content.cover
  167. } else {
  168. FoodDataProvider.getResourcePath(content.cover.toString())
  169. }
  170. } else {
  171. if (isNetRecipes) {
  172. content.cover
  173. } else {
  174. FoodDataProvider.getResourcePath(content.cover.toString())
  175. }
  176. }
  177. Log.d("------", "---444---")
  178. binding.apply {
  179. if ("" != cover) ivCover.load(cover, binding.ivCover.width, binding.ivCover.height)
  180. tvFoodName.updateText(content.foodName)
  181. Log.d("------", "---666---")
  182. starView.apply {
  183. setCommentNumber(content.useNum.toString())
  184. setCommentTextColorGray()
  185. }
  186. Log.d("------", "---777---")
  187. tvTimeAndLevel.updateText(content.time)
  188. if (isNetRecipes) {
  189. ivNet.visibility = View.VISIBLE
  190. } else {
  191. ivNet.visibility = View.GONE
  192. }
  193. ivNet.isSelected = hasDownload
  194. if (hasDownload) {
  195. ivLike.skinSrc(R.drawable.ic_delete)
  196. } else {
  197. if (isLike) {
  198. ivLike.skinSrc(R.drawable.ic_like)
  199. } else {
  200. ivLike.skinSrc(R.drawable.ic_unlike)
  201. }
  202. }
  203. }
  204. binding.starView.setStarCount(content.starCount)
  205. Log.d("------", "---999---")
  206. }
  207. fun recycleImageView() {
  208. binding.ivCover.apply {
  209. Glide.with(context).clear(this)
  210. }
  211. }
  212. companion object {
  213. val dp10 = (com.develop.common.R.dimen.convert_10px).resId2Dimension()
  214. }
  215. }