package com.develop.common.widget import android.content.Context import android.graphics.drawable.Drawable import android.util.AttributeSet import android.util.Log import android.view.View import android.widget.RelativeLayout import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.graphics.drawable.DrawableCompat import com.blankj.utilcode.util.ThreadUtils.runOnUiThread import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target import com.develop.base.ext.background_drawable import com.develop.base.ext.getSN import com.develop.base.ext.isRecipesList import com.develop.base.ext.load import com.develop.base.ext.navigateTo import com.develop.base.ext.resId2Dimension import com.develop.base.ext.setRecipesList import com.develop.base.ext.skinBackground import com.develop.base.ext.skinSrc import com.develop.base.ext.src import com.develop.base.ext.updateText import com.develop.base.util.TopResumedAtyHolder import com.develop.common.R import com.develop.common.data_repo.FoodDataProvider import com.develop.common.data_repo.db.FoodContentModel import com.develop.common.data_repo.db.entity.UserFavoriteRecipes import com.develop.common.databinding.FoodContentViewBinding import com.develop.common.dialog.CancelConfirmDialog import com.develop.common.event.OnLikeDataEvent import com.develop.common.event.RefreshDataEvent import com.develop.common.event.RefreshLikeDataEvent import com.develop.common.router.Screens import com.develop.common.tag.* import com.develop.common.utils.GsonUtils import com.drake.net.utils.scope import com.drake.net.utils.withMain import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.greenrobot.eventbus.EventBus class FoodContentView : ConstraintLayout { constructor(context: Context) : super(context) {} constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {} constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( context, attrs, defStyleAttr ) { } private val cancelConfirmDialog by lazy { CancelConfirmDialog() } private var binding: FoodContentViewBinding private var mFoodContent: FoodContentModel? = null private var mIsFoodList = false var mIsHistoryList = false private var is033 = false private var numberList = "" private var foodSn = getSN() init { val root = View.inflate(context, R.layout.food_content_view, this) is033 = foodSn.startsWith("033") binding = FoodContentViewBinding.bind(root) binding.contentLayout.skinBackground(R.drawable.food_content_conner) binding.likeLayout.skinBackground(R.drawable.white_circle) binding.contentLayout.setOnClickListener { mFoodContent?.apply { TopResumedAtyHolder.getCurrentActivity()?.navigateTo(Screens.Cook.COOK_DETAIL) { withString( SOURCE_TAG, if (isNetRecipes) { "remote" } else { "local" } ) withString(NUMBER_TAG, foodId) withBoolean(IS_LIKE_TAG, isLike) if (!mIsFoodList) { withString(RECIPES_EDITION_TAG, recipesEdition) } } if (numberList.contains(mFoodContent?.foodId ?: "00000000")) { //由于存在的numberList //处理更新菜谱的标识 ,点击以后消除更新食谱编号 var listNew = isRecipesList() var list = GsonUtils.GsonToList(listNew) var strs = "" if (list.isNotEmpty()) { for (str in list) { if (str.equals(foodId)) { strs = str } } if (strs.isNotEmpty()) { list.remove(strs) } //保存更新食谱数据 setRecipesList(GsonUtils.GsonString(list)) } binding.ivContentNew.visibility = View.INVISIBLE } } } //喜欢点击 val tintList = resources.getColorStateList(com.develop.common.R.color.color_cook_tab_tint) binding.ivNet.drawable?.apply { DrawableCompat.setTintList(this, tintList) } binding.likeLayout.setOnClickListener { //收藏/取消收藏 mFoodContent?.apply { if (isNetRecipes && mIsFoodList) { if (foodSn.startsWith("011")) { if (isLike) { EventBus.getDefault().post(OnLikeDataEvent(false, foodId)) } else { EventBus.getDefault().post(OnLikeDataEvent(true, foodId)) } } else { val titleStr = context.getString(R.string.are_you_sure_to_delete) val confirmStr = context.getString(R.string.yes) val cancelStr = context.getString(R.string.no) TopResumedAtyHolder.getCurrentActivity()?.apply { cancelConfirmDialog.apply { this.title = titleStr this.confirmStr = confirmStr this.cancelStr = cancelStr onDialogClickListener = object : CancelConfirmDialog.OnDialogClickListener { override fun onConfirm() { FoodDataProvider.getUserDatabase().runInTransaction { FoodDataProvider.getUserDatabase().userInfoDao() .removeOnlineRecipe( CURRENT_USER_ID, foodId ) } /*** * 2024.03.04 删除下载记录,只删除记录,不删除食谱 */ FoodDataProvider.getDatabase().runInTransaction { // val recipeDao = // FoodDataProvider.getDatabase().recipeDao() // val recipes = recipeDao.queryRecipe(foodId) // recipes?.apply { // recipeDao.deleteRecipe(this) // } FoodDataProvider.deleteRecipeResource(foodId) } EventBus.getDefault().post(RefreshDataEvent()) } override fun onCancel() { } override fun onKey() { } } showDialog(supportFragmentManager, "cancelConfirmDialog") } } } } else { if (isLike) { if (foodSn.startsWith("011")) { EventBus.getDefault().post(OnLikeDataEvent(false, foodId)) } else { isLike = false binding.ivLike.skinSrc(R.drawable.ic_unlike) FoodDataProvider.getUserDatabase().runInTransaction { FoodDataProvider.getUserDatabase().userInfoDao() .removeFavoriteRecipe( CURRENT_USER_ID, foodId ) } /** * 不知道之前为什么写这个代码,现在011客户反馈 * 在历史记录界面收藏或者取消收藏食谱,回到食谱列表没有状态修改估注掉代码 * */ // if (!mIsHistoryList) { // EventBus.getDefault().post(RefreshLikeDataEvent(false, foodId)) // } EventBus.getDefault().post(RefreshLikeDataEvent(false, foodId)) } } else { if (foodSn.startsWith("011")) { EventBus.getDefault().post(OnLikeDataEvent(true, foodId)) } else { isLike = true binding.ivLike.skinSrc(R.drawable.ic_like) FoodDataProvider.getUserDatabase().runInTransaction { FoodDataProvider.getUserDatabase().userInfoDao() .insertFavoriteRecipe( UserFavoriteRecipes(CURRENT_USER_ID, foodId) ) } // if (!mIsHistoryList) { // EventBus.getDefault().post(RefreshLikeDataEvent(true, foodId)) // } EventBus.getDefault().post(RefreshLikeDataEvent(true, foodId)) } } } } } } /** * 显示菜谱数据 * @param isFoodList 是否为FoodListActivity */ fun setFoodContent(content: FoodContentModel, isFoodList: Boolean = false) { Log.d("------", "---333---") mFoodContent = content mIsFoodList = isFoodList numberList = isRecipesList() val isNetRecipes = content.isNetRecipes val hasDownload = content.hasDownloaded val isLike = content.isLike val cover = if (isFoodList) { if (isNetRecipes && !content.hasDownloaded) { content.cover } else { FoodDataProvider.getResourcePath(content.cover.toString()) } } else { if (isNetRecipes) { content.cover } else { FoodDataProvider.getResourcePath(content.cover.toString()) } } Log.d("------", "---444---") binding.apply { if ("" != cover) ivCover.load(cover, binding.ivCover.width, binding.ivCover.height) tvFoodName.updateText(content.foodName) Log.d("------", "---666---") starView.apply { if (is033 || foodSn.startsWith("011")) { starView.visibility = View.GONE } else { starView.visibility = View.VISIBLE setCommentNumber(content.useNum.toString()) setCommentTextColorGray() } } if (foodSn.startsWith("011")) { binding.easyLayout.visibility = View.VISIBLE content.level.let { binding.tvEasy.text = it } } Log.d("------", "---777---") tvTimeAndLevel.updateText(content.time) if (isNetRecipes) { ivNet.visibility = View.VISIBLE } else { ivNet.visibility = View.GONE } ivNet.isSelected = hasDownload if (hasDownload) { ivLike.skinSrc(R.drawable.ic_delete) } else { if (isLike) { ivLike.skinSrc(R.drawable.ic_like) } else { ivLike.skinSrc(R.drawable.ic_unlike) } } if (numberList.contains(mFoodContent?.foodId ?: "00000000")) { ivContentNew.visibility = View.VISIBLE } else { ivContentNew.visibility = View.GONE } } binding.starView.setStarCount(content.starCount) Log.d("------", "---999---") } fun recycleImageView() { binding.ivCover.apply { Glide.with(context).clear(this) } } companion object { val dp10 = (com.develop.common.R.dimen.convert_10px).resId2Dimension() } }