FoodContentView.kt 8.3 KB

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