FoodContentView.kt 8.3 KB

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