FoodContentView.kt 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  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.getSN
  19. import com.develop.base.ext.isRecipesList
  20. import com.develop.base.ext.load
  21. import com.develop.base.ext.navigateTo
  22. import com.develop.base.ext.resId2Dimension
  23. import com.develop.base.ext.setRecipesList
  24. import com.develop.base.ext.skinBackground
  25. import com.develop.base.ext.skinSrc
  26. import com.develop.base.ext.src
  27. import com.develop.base.ext.updateText
  28. import com.develop.base.util.TopResumedAtyHolder
  29. import com.develop.common.R
  30. import com.develop.common.data_repo.FoodDataProvider
  31. import com.develop.common.data_repo.db.FoodContentModel
  32. import com.develop.common.data_repo.db.entity.UserFavoriteRecipes
  33. import com.develop.common.databinding.FoodContentViewBinding
  34. import com.develop.common.dialog.CancelConfirmDialog
  35. import com.develop.common.event.OnLikeDataEvent
  36. import com.develop.common.event.RefreshDataEvent
  37. import com.develop.common.event.RefreshLikeDataEvent
  38. import com.develop.common.router.Screens
  39. import com.develop.common.tag.*
  40. import com.develop.common.utils.GsonUtils
  41. import com.drake.net.utils.scope
  42. import com.drake.net.utils.withMain
  43. import kotlinx.coroutines.Dispatchers
  44. import kotlinx.coroutines.launch
  45. import kotlinx.coroutines.withContext
  46. import org.greenrobot.eventbus.EventBus
  47. class FoodContentView : ConstraintLayout {
  48. constructor(context: Context) : super(context) {}
  49. constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {}
  50. constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
  51. context, attrs, defStyleAttr
  52. ) {
  53. }
  54. private val cancelConfirmDialog by lazy {
  55. CancelConfirmDialog()
  56. }
  57. private var binding: FoodContentViewBinding
  58. private var mFoodContent: FoodContentModel? = null
  59. private var mIsFoodList = false
  60. var mIsHistoryList = false
  61. private var is033 = false
  62. private var numberList = ""
  63. private var foodSn = getSN()
  64. init {
  65. val root = View.inflate(context, R.layout.food_content_view, this)
  66. is033 = foodSn.startsWith("033")
  67. binding = FoodContentViewBinding.bind(root)
  68. binding.contentLayout.skinBackground(R.drawable.food_content_conner)
  69. binding.likeLayout.skinBackground(R.drawable.white_circle)
  70. binding.contentLayout.setOnClickListener {
  71. mFoodContent?.apply {
  72. TopResumedAtyHolder.getCurrentActivity()?.navigateTo(Screens.Cook.COOK_DETAIL) {
  73. withString(
  74. SOURCE_TAG, if (isNetRecipes) {
  75. "remote"
  76. } else {
  77. "local"
  78. }
  79. )
  80. withString(NUMBER_TAG, foodId)
  81. withBoolean(IS_LIKE_TAG, isLike)
  82. if (!mIsFoodList) {
  83. withString(RECIPES_EDITION_TAG, recipesEdition)
  84. }
  85. }
  86. if (numberList.contains(mFoodContent?.foodId ?: "00000000")) {
  87. //由于存在的numberList
  88. //处理更新菜谱的标识 ,点击以后消除更新食谱编号
  89. var listNew = isRecipesList()
  90. var list = GsonUtils.GsonToList<String>(listNew)
  91. var strs = ""
  92. if (list.isNotEmpty()) {
  93. for (str in list) {
  94. if (str.equals(foodId)) {
  95. strs = str
  96. }
  97. }
  98. if (strs.isNotEmpty()) {
  99. list.remove(strs)
  100. }
  101. //保存更新食谱数据
  102. setRecipesList(GsonUtils.GsonString(list))
  103. }
  104. binding.ivContentNew.visibility = View.INVISIBLE
  105. }
  106. }
  107. }
  108. //喜欢点击
  109. val tintList = resources.getColorStateList(com.develop.common.R.color.color_cook_tab_tint)
  110. binding.ivNet.drawable?.apply {
  111. DrawableCompat.setTintList(this, tintList)
  112. }
  113. binding.likeLayout.setOnClickListener {
  114. //收藏/取消收藏
  115. mFoodContent?.apply {
  116. if (isNetRecipes && mIsFoodList) {
  117. if (foodSn.startsWith("011")) {
  118. if (isLike) {
  119. EventBus.getDefault().post(OnLikeDataEvent(false, foodId))
  120. } else {
  121. EventBus.getDefault().post(OnLikeDataEvent(true, foodId))
  122. }
  123. } else {
  124. val titleStr = context.getString(R.string.are_you_sure_to_delete)
  125. val confirmStr = context.getString(R.string.yes)
  126. val cancelStr = context.getString(R.string.no)
  127. TopResumedAtyHolder.getCurrentActivity()?.apply {
  128. cancelConfirmDialog.apply {
  129. this.title = titleStr
  130. this.confirmStr = confirmStr
  131. this.cancelStr = cancelStr
  132. onDialogClickListener =
  133. object : CancelConfirmDialog.OnDialogClickListener {
  134. override fun onConfirm() {
  135. FoodDataProvider.getUserDatabase().runInTransaction {
  136. FoodDataProvider.getUserDatabase().userInfoDao()
  137. .removeOnlineRecipe(
  138. CURRENT_USER_ID, foodId
  139. )
  140. }
  141. /***
  142. * 2024.03.04 删除下载记录,只删除记录,不删除食谱
  143. */
  144. FoodDataProvider.getDatabase().runInTransaction {
  145. // val recipeDao =
  146. // FoodDataProvider.getDatabase().recipeDao()
  147. // val recipes = recipeDao.queryRecipe(foodId)
  148. // recipes?.apply {
  149. // recipeDao.deleteRecipe(this)
  150. // }
  151. FoodDataProvider.deleteRecipeResource(foodId)
  152. }
  153. EventBus.getDefault().post(RefreshDataEvent())
  154. }
  155. override fun onCancel() {
  156. }
  157. override fun onKey() {
  158. }
  159. }
  160. showDialog(supportFragmentManager, "cancelConfirmDialog")
  161. }
  162. }
  163. }
  164. } else {
  165. if (isLike) {
  166. if (foodSn.startsWith("011")) {
  167. EventBus.getDefault().post(OnLikeDataEvent(false, foodId))
  168. } else {
  169. isLike = false
  170. binding.ivLike.skinSrc(R.drawable.ic_unlike)
  171. FoodDataProvider.getUserDatabase().runInTransaction {
  172. FoodDataProvider.getUserDatabase().userInfoDao()
  173. .removeFavoriteRecipe(
  174. CURRENT_USER_ID, foodId
  175. )
  176. }
  177. /**
  178. * 不知道之前为什么写这个代码,现在011客户反馈
  179. * 在历史记录界面收藏或者取消收藏食谱,回到食谱列表没有状态修改估注掉代码
  180. * */
  181. // if (!mIsHistoryList) {
  182. // EventBus.getDefault().post(RefreshLikeDataEvent(false, foodId))
  183. // }
  184. EventBus.getDefault().post(RefreshLikeDataEvent(false, foodId))
  185. }
  186. } else {
  187. if (foodSn.startsWith("011")) {
  188. EventBus.getDefault().post(OnLikeDataEvent(true, foodId))
  189. } else {
  190. isLike = true
  191. binding.ivLike.skinSrc(R.drawable.ic_like)
  192. FoodDataProvider.getUserDatabase().runInTransaction {
  193. FoodDataProvider.getUserDatabase().userInfoDao()
  194. .insertFavoriteRecipe(
  195. UserFavoriteRecipes(CURRENT_USER_ID, foodId)
  196. )
  197. }
  198. // if (!mIsHistoryList) {
  199. // EventBus.getDefault().post(RefreshLikeDataEvent(true, foodId))
  200. // }
  201. EventBus.getDefault().post(RefreshLikeDataEvent(true, foodId))
  202. }
  203. }
  204. }
  205. }
  206. }
  207. }
  208. /**
  209. * 显示菜谱数据
  210. * @param isFoodList 是否为FoodListActivity
  211. */
  212. fun setFoodContent(content: FoodContentModel, isFoodList: Boolean = false) {
  213. Log.d("------", "---333---")
  214. mFoodContent = content
  215. mIsFoodList = isFoodList
  216. numberList = isRecipesList()
  217. val isNetRecipes = content.isNetRecipes
  218. val hasDownload = content.hasDownloaded
  219. val isLike = content.isLike
  220. val cover = if (isFoodList) {
  221. if (isNetRecipes && !content.hasDownloaded) {
  222. content.cover
  223. } else {
  224. FoodDataProvider.getResourcePath(content.cover.toString())
  225. }
  226. } else {
  227. if (isNetRecipes) {
  228. content.cover
  229. } else {
  230. FoodDataProvider.getResourcePath(content.cover.toString())
  231. }
  232. }
  233. Log.d("------", "---444---")
  234. binding.apply {
  235. if ("" != cover) ivCover.load(cover, binding.ivCover.width, binding.ivCover.height)
  236. tvFoodName.updateText(content.foodName)
  237. Log.d("------", "---666---")
  238. starView.apply {
  239. if (is033 || foodSn.startsWith("011")) {
  240. starView.visibility = View.GONE
  241. } else {
  242. starView.visibility = View.VISIBLE
  243. setCommentNumber(content.useNum.toString())
  244. setCommentTextColorGray()
  245. }
  246. }
  247. if (foodSn.startsWith("011")) {
  248. binding.easyLayout.visibility = View.VISIBLE
  249. content.level.let {
  250. binding.tvEasy.text = it
  251. }
  252. }
  253. Log.d("------", "---777---")
  254. tvTimeAndLevel.updateText(content.time)
  255. if (isNetRecipes) {
  256. ivNet.visibility = View.VISIBLE
  257. } else {
  258. ivNet.visibility = View.GONE
  259. }
  260. ivNet.isSelected = hasDownload
  261. if (hasDownload) {
  262. ivLike.skinSrc(R.drawable.ic_delete)
  263. } else {
  264. if (isLike) {
  265. ivLike.skinSrc(R.drawable.ic_like)
  266. } else {
  267. ivLike.skinSrc(R.drawable.ic_unlike)
  268. }
  269. }
  270. if (numberList.contains(mFoodContent?.foodId ?: "00000000")) {
  271. ivContentNew.visibility = View.VISIBLE
  272. } else {
  273. ivContentNew.visibility = View.GONE
  274. }
  275. }
  276. binding.starView.setStarCount(content.starCount)
  277. Log.d("------", "---999---")
  278. }
  279. fun recycleImageView() {
  280. binding.ivCover.apply {
  281. Glide.with(context).clear(this)
  282. }
  283. }
  284. companion object {
  285. val dp10 = (com.develop.common.R.dimen.convert_10px).resId2Dimension()
  286. }
  287. }