From 67dd4bda78d5719a9ae63e57ee5e13d38273cbee Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Thu, 12 May 2022 13:32:36 +0200 Subject: [PATCH] Rewrite sprite rendering to not make things blurry --- Habitica/res/layout/achievement_grid_item.xml | 2 +- Habitica/res/layout/achievement_list_item.xml | 2 +- Habitica/res/layout/activity_armoire.xml | 2 +- Habitica/res/layout/activity_full_profile.xml | 4 +- Habitica/res/layout/adventure_guide_item.xml | 2 +- Habitica/res/layout/can_hatch_item.xml | 4 +- .../res/layout/customization_grid_item.xml | 2 +- .../res/layout/dialog_achievement_detail.xml | 2 +- .../layout/dialog_completed_quest_content.xml | 2 +- Habitica/res/layout/dialog_first_drop.xml | 4 +- .../res/layout/dialog_login_incentive.xml | 2 +- .../res/layout/dialog_open_mysteryitem.xml | 2 +- .../res/layout/dialog_pet_suggest_hatch.xml | 6 +- .../layout/dialog_purchase_content_gear.xml | 2 +- .../layout/dialog_purchase_content_item.xml | 2 +- .../layout/dialog_purchase_content_quest.xml | 2 +- .../layout/dialog_purchase_customization.xml | 2 +- Habitica/res/layout/dialog_purchase_gems.xml | 2 +- Habitica/res/layout/dialog_won_challenge.xml | 2 +- .../res/layout/equipment_overview_item.xml | 2 +- Habitica/res/layout/fragment_party_detail.xml | 4 +- Habitica/res/layout/fragment_quest_detail.xml | 2 +- Habitica/res/layout/fragment_subscription.xml | 2 +- Habitica/res/layout/gear_list_item.xml | 2 +- Habitica/res/layout/item_image_row.xml | 2 +- Habitica/res/layout/item_item.xml | 2 +- Habitica/res/layout/mount_overview_item.xml | 2 +- Habitica/res/layout/pet_detail_item.xml | 2 +- Habitica/res/layout/pet_imageview.xml | 3 +- Habitica/res/layout/pet_overview_item.xml | 2 +- .../res/layout/profile_achievement_item.xml | 2 +- Habitica/res/layout/profile_gear_tablerow.xml | 2 +- Habitica/res/layout/quest_collect.xml | 2 +- Habitica/res/layout/quest_progress.xml | 4 +- Habitica/res/layout/row_quest_reward.xml | 2 +- Habitica/res/layout/row_shopitem.xml | 2 +- Habitica/res/layout/skill_list_item.xml | 2 +- .../habitica/interactors/FeedPetUseCase.kt | 9 ++- .../habitica/interactors/HatchPetUseCase.kt | 8 +-- .../interactors/ShowNotificationInteractor.kt | 8 +-- .../android/habitica/ui/ItemDetailDialog.kt | 17 +++--- .../ui/activities/AdventureGuideActivity.kt | 4 +- .../habitica/ui/activities/ArmoireActivity.kt | 3 +- .../ui/activities/FullProfileActivity.kt | 3 +- .../ui/adapter/AchievementsAdapter.kt | 8 +-- ...stomizationEquipmentRecyclerViewAdapter.kt | 9 +-- .../CustomizationRecyclerViewAdapter.kt | 4 +- .../ui/adapter/SkillsRecyclerViewAdapter.kt | 4 +- .../inventory/EquipmentRecyclerViewAdapter.kt | 4 +- .../adapter/inventory/ItemRecyclerAdapter.kt | 4 +- .../inventory/PetDetailRecyclerAdapter.kt | 9 +-- .../inventory/StableRecyclerAdapter.kt | 4 +- .../purchases/SubscriptionFragment.kt | 6 +- .../fragments/social/QuestDetailFragment.kt | 3 +- .../social/party/PartyDetailFragment.kt | 11 ++-- .../habitica/ui/helpers/DataBindingUtils.kt | 35 +++++------ .../ui/viewHolders/MountViewHolder.kt | 2 +- .../habitica/ui/viewHolders/PetViewHolder.kt | 2 +- .../ui/viewHolders/ShopItemViewHolder.kt | 4 +- .../habitica/ui/views/EquipmentItemRow.kt | 6 +- .../habitica/ui/views/NPCBannerView.kt | 4 +- .../android/habitica/ui/views/PixelArtView.kt | 59 +++++++++++++++++++ .../views/dialogs/AchievementDetailDialog.kt | 8 +-- .../ui/views/dialogs/AchievementDialog.kt | 4 +- .../ui/views/dialogs/FirstDropDialog.kt | 12 ++-- .../ui/views/dialogs/PetSuggestHatchDialog.kt | 7 ++- .../dialogs/QuestCompletedDialogContent.kt | 9 +-- .../ui/views/dialogs/WonChallengeDialog.kt | 7 ++- .../views/equipment/EquipmentOverviewItem.kt | 4 +- .../shops/PurchaseDialogBackgroundContent.kt | 6 +- .../views/shops/PurchaseDialogBaseContent.kt | 4 +- .../ui/views/shops/PurchaseDialogContent.kt | 4 +- .../PurchaseDialogCustomizationContent.kt | 4 +- .../PurchaseDialogCustomizationSetContent.kt | 8 +-- .../views/shops/PurchaseDialogGearContent.kt | 3 +- .../views/shops/PurchaseDialogGemsContent.kt | 3 +- .../views/shops/PurchaseDialogItemContent.kt | 4 +- .../views/shops/PurchaseDialogQuestContent.kt | 9 +-- .../ui/views/social/OldQuestProgressView.kt | 19 ++---- .../ui/views/social/QuestProgressView.kt | 23 +++----- 80 files changed, 254 insertions(+), 203 deletions(-) create mode 100644 Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/PixelArtView.kt diff --git a/Habitica/res/layout/achievement_grid_item.xml b/Habitica/res/layout/achievement_grid_item.xml index ca8f8b076..ff310f861 100644 --- a/Habitica/res/layout/achievement_grid_item.xml +++ b/Habitica/res/layout/achievement_grid_item.xml @@ -22,7 +22,7 @@ - - - - @@ -369,7 +369,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" tools:text="#" /> - diff --git a/Habitica/res/layout/adventure_guide_item.xml b/Habitica/res/layout/adventure_guide_item.xml index 03d162a2b..a102cdccf 100644 --- a/Habitica/res/layout/adventure_guide_item.xml +++ b/Habitica/res/layout/adventure_guide_item.xml @@ -4,7 +4,7 @@ android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> - - - - - - - - - - diff --git a/Habitica/res/layout/dialog_pet_suggest_hatch.xml b/Habitica/res/layout/dialog_pet_suggest_hatch.xml index c656d893f..eecc61a48 100644 --- a/Habitica/res/layout/dialog_pet_suggest_hatch.xml +++ b/Habitica/res/layout/dialog_pet_suggest_hatch.xml @@ -21,7 +21,7 @@ android:background="@drawable/layout_rounded_bg_window" android:layout_centerVertical="true" android:layout_alignParentStart="true"> - - - - diff --git a/Habitica/res/layout/dialog_purchase_content_item.xml b/Habitica/res/layout/dialog_purchase_content_item.xml index b5a974e7e..1c1cf936f 100644 --- a/Habitica/res/layout/dialog_purchase_content_item.xml +++ b/Habitica/res/layout/dialog_purchase_content_item.xml @@ -11,7 +11,7 @@ tools:parentTag="LinearLayout" tools:orientation="vertical"> - diff --git a/Habitica/res/layout/dialog_purchase_content_quest.xml b/Habitica/res/layout/dialog_purchase_content_quest.xml index e160016a4..ca22596ad 100644 --- a/Habitica/res/layout/dialog_purchase_content_quest.xml +++ b/Habitica/res/layout/dialog_purchase_content_quest.xml @@ -10,7 +10,7 @@ tools:parentTag="LinearLayout" tools:orientation="vertical"> - diff --git a/Habitica/res/layout/dialog_purchase_customization.xml b/Habitica/res/layout/dialog_purchase_customization.xml index c9c1ef4e0..617fbad52 100644 --- a/Habitica/res/layout/dialog_purchase_customization.xml +++ b/Habitica/res/layout/dialog_purchase_customization.xml @@ -6,7 +6,7 @@ android:layout_height="wrap_content" tools:parentTag="android.widget.LinearLayout"> - - diff --git a/Habitica/res/layout/dialog_won_challenge.xml b/Habitica/res/layout/dialog_won_challenge.xml index 2b754f810..58c57dffc 100644 --- a/Habitica/res/layout/dialog_won_challenge.xml +++ b/Habitica/res/layout/dialog_won_challenge.xml @@ -25,7 +25,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:src="@drawable/sparkles_left" /> - - - @@ -101,7 +101,7 @@ android:background="@drawable/layout_rounded_bg_window" android:padding="@dimen/spacing_medium" android:layout_marginBottom="@dimen/spacing_medium"> - - - - - - - - - diff --git a/Habitica/res/layout/pet_overview_item.xml b/Habitica/res/layout/pet_overview_item.xml index be8bfb6c4..b47e75fc7 100644 --- a/Habitica/res/layout/pet_overview_item.xml +++ b/Habitica/res/layout/pet_overview_item.xml @@ -18,7 +18,7 @@ android:layout_width="68dp" android:layout_height="58dp" android:layout_gravity="center"> - - - - - - - - - { return inventoryRepository.hatchPet(requestValues.egg, requestValues.potion) { val petWrapper = View.inflate(requestValues.context, R.layout.pet_imageview, null) as? FrameLayout - val petImageView = petWrapper?.findViewById(R.id.pet_imageview) as? ImageView + val petImageView = petWrapper?.findViewById(R.id.pet_imageview) as? PixelArtView - DataBindingUtils.loadImage(petImageView, "stable_Pet-" + requestValues.egg.key + "-" + requestValues.potion.key) + petImageView?.loadImage("stable_Pet-" + requestValues.egg.key + "-" + requestValues.potion.key) val potionName = requestValues.potion.text val eggName = requestValues.egg.text val dialog = HabiticaAlertDialog(requestValues.context) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ShowNotificationInteractor.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ShowNotificationInteractor.kt index e861f26aa..c77e0f389 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ShowNotificationInteractor.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/ShowNotificationInteractor.kt @@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.interactors import android.app.Activity import android.view.LayoutInflater import android.view.View -import android.widget.ImageView import android.widget.TextView import androidx.lifecycle.LifecycleCoroutineScope import com.google.firebase.analytics.FirebaseAnalytics @@ -14,8 +13,9 @@ import com.habitrpg.android.habitica.models.notifications.ChallengeWonData import com.habitrpg.android.habitica.models.notifications.FirstDropData import com.habitrpg.android.habitica.models.notifications.LoginIncentiveData import com.habitrpg.android.habitica.models.user.User -import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar +import com.habitrpg.android.habitica.ui.views.PixelArtView import com.habitrpg.android.habitica.ui.views.SnackbarActivity import com.habitrpg.android.habitica.ui.views.dialogs.AchievementDialog import com.habitrpg.android.habitica.ui.views.dialogs.FirstDropDialog @@ -84,12 +84,12 @@ class ShowNotificationInteractor( val factory = LayoutInflater.from(activity) val view = factory.inflate(R.layout.dialog_login_incentive, null) - val imageView = view.findViewById(R.id.imageView) as? ImageView + val imageView = view.findViewById(R.id.imageView) as? PixelArtView var imageKey = notificationData.rewardKey?.get(0) if (imageKey?.contains("armor") == true) { imageKey = "slim_$imageKey" } - DataBindingUtils.loadImage(imageView, imageKey) + imageView?.loadImage(imageKey) val youEarnedMessage = activity.getString(R.string.checkInRewardEarned, notificationData.rewardText) val youEarnedTexView = view.findViewById(R.id.you_earned_message) as? TextView diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.kt index 1fa1231e6..76a6deaf1 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/ItemDetailDialog.kt @@ -9,15 +9,16 @@ import android.widget.LinearLayout import android.widget.TextView import androidx.appcompat.app.AlertDialog import com.habitrpg.android.habitica.R -import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper +import com.habitrpg.android.habitica.ui.views.PixelArtView class ItemDetailDialog(context: Context) : AlertDialog(context) { - private val itemImageView: ImageView - private val contentTextView: TextView - private val priceTextView: TextView - private val currencyImageView: ImageView + private val itemImageView = PixelArtView(context) + private val contentTextView = TextView(context, null) + private val priceTextView = TextView(context, null) + private val currencyImageView = ImageView(context) init { @@ -26,7 +27,6 @@ class ItemDetailDialog(context: Context) : AlertDialog(context) { contentViewLayout.orientation = LinearLayout.VERTICAL // Gear Image - itemImageView = ImageView(context) val gearImageLayoutParams = LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT ) @@ -39,7 +39,6 @@ class ItemDetailDialog(context: Context) : AlertDialog(context) { itemImageView.visibility = View.GONE // Gear Description - contentTextView = TextView(context, null) contentTextView.setPadding(16, 0, 16, 0) contentTextView.visibility = View.GONE @@ -57,10 +56,8 @@ class ItemDetailDialog(context: Context) : AlertDialog(context) { goldPriceLayout.gravity = Gravity.CENTER_HORIZONTAL or Gravity.CENTER_VERTICAL // Price View - priceTextView = TextView(context) priceTextView.setPadding(10, 0, 0, 0) - currencyImageView = ImageView(context) currencyImageView.minimumHeight = 50 currencyImageView.minimumWidth = 50 currencyImageView.setPadding(0, 0, 5, 0) @@ -104,7 +101,7 @@ class ItemDetailDialog(context: Context) : AlertDialog(context) { fun setImage(imageName: String) { itemImageView.visibility = View.VISIBLE - DataBindingUtils.loadImage(itemImageView, imageName) + itemImageView.loadImage(imageName) } fun setBuyListener(listener: DialogInterface.OnClickListener) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt index 939e74e5b..f05cc9068 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt @@ -17,7 +17,7 @@ import com.habitrpg.android.habitica.extensions.fromHtml import com.habitrpg.android.habitica.helpers.AmplitudeManager import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.user.User -import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage class AdventureGuideActivity : BaseActivity() { private lateinit var binding: ActivityAdventureGuideBinding @@ -107,7 +107,7 @@ class AdventureGuideActivity : BaseActivity() { } else { "achievement-unearned2x" } - DataBindingUtils.loadImage(itemBinding.iconView, iconName) + itemBinding.iconView.loadImage(iconName) if (achievement.earned) { itemBinding.titleView.paintFlags = itemBinding.titleView.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG itemBinding.titleView.setTextColor(ContextCompat.getColor(this, R.color.text_ternary)) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ArmoireActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ArmoireActivity.kt index c8cd4ab0a..49a438d2b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ArmoireActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/ArmoireActivity.kt @@ -27,6 +27,7 @@ import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaBottomSheetDialog import com.plattysoft.leonids.ParticleSystem import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import java.util.Locale import javax.inject.Inject class ArmoireActivity: BaseActivity() { @@ -192,7 +193,7 @@ class ArmoireActivity: BaseActivity() { } fun configure(type: String, key: String, text: String, value: String? = "") { - binding.titleView.text = text + binding.titleView.text = text.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() } binding.equipButton.visibility = if (type == "gear") View.VISIBLE else View.GONE when (type) { "gear" -> { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt index e41b3fd75..b5ddd9c44 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/FullProfileActivity.kt @@ -39,6 +39,7 @@ import com.habitrpg.android.habitica.ui.helpers.loadImage import com.habitrpg.android.habitica.ui.helpers.setMarkdown import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar.SnackbarDisplayType +import com.habitrpg.android.habitica.ui.views.PixelArtView import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import io.reactivex.rxjava3.core.Flowable import kotlinx.coroutines.Dispatchers @@ -316,7 +317,7 @@ class FullProfileActivity : BaseActivity() { private fun addEquipmentRow(table: TableLayout, gearKey: String?, text: String?, stats: String?) { val gearRow = layoutInflater.inflate(R.layout.profile_gear_tablerow, table, false) as? TableRow - val draweeView = gearRow?.findViewById(R.id.gear_drawee) + val draweeView = gearRow?.findViewById(R.id.gear_drawee) draweeView?.loadImage("shop_$gearKey") diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/AchievementsAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/AchievementsAdapter.kt index e99026c70..cb63d4516 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/AchievementsAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/AchievementsAdapter.kt @@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.ui.adapter import android.view.View import android.view.ViewGroup -import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.habitrpg.android.habitica.R @@ -12,7 +11,8 @@ import com.habitrpg.android.habitica.databinding.AchievementSectionHeaderBinding import com.habitrpg.android.habitica.extensions.inflate import com.habitrpg.android.habitica.models.Achievement import com.habitrpg.android.habitica.models.QuestAchievement -import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage +import com.habitrpg.android.habitica.ui.views.PixelArtView import com.habitrpg.android.habitica.ui.views.dialogs.AchievementDetailDialog class AchievementsAdapter : RecyclerView.Adapter() { @@ -75,7 +75,7 @@ class AchievementsAdapter : RecyclerView.Adapter() { private var achievement: Achievement? = null private val achievementContainer: ViewGroup? - private val achievementIconView: ImageView + private val achievementIconView: PixelArtView private val achievementCountView: TextView private val achievementTitleView: TextView private val achievementDescriptionView: TextView? @@ -96,7 +96,7 @@ class AchievementsAdapter : RecyclerView.Adapter() { } else { "achievement-unearned2x" } - DataBindingUtils.loadImage(achievementIconView, iconName) + achievementIconView.loadImage(iconName) achievementTitleView.text = achievement.title achievementDescriptionView?.text = achievement.text if (achievement.optionalCount ?: 0 > 0) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationEquipmentRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationEquipmentRecyclerViewAdapter.kt index e5dfea384..8b30fb146 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationEquipmentRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationEquipmentRecyclerViewAdapter.kt @@ -13,8 +13,9 @@ import com.habitrpg.android.habitica.databinding.CustomizationGridItemBinding import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.android.habitica.models.inventory.CustomizationSet import com.habitrpg.android.habitica.models.inventory.Equipment -import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper +import com.habitrpg.android.habitica.ui.views.PixelArtView import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable @@ -91,7 +92,7 @@ class CustomizationEquipmentRecyclerViewAdapter : androidx.recyclerview.widget.R fun bind(equipment: Equipment) { this.equipment = equipment - DataBindingUtils.loadImage(binding.imageView, "shop_" + this.equipment?.key) + binding.imageView.loadImage("shop_" + this.equipment?.key) if (equipment.owned == true || equipment.value == 0.0) { binding.buyButton.visibility = View.GONE } else { @@ -115,8 +116,8 @@ class CustomizationEquipmentRecyclerViewAdapter : androidx.recyclerview.widget.R if (equipment?.owned != true && (equipment?.value ?: 0.0) > 0.0) { val dialogContent = LayoutInflater.from(itemView.context).inflate(R.layout.dialog_purchase_customization, null) as LinearLayout - val imageView = dialogContent.findViewById(R.id.imageView) - DataBindingUtils.loadImage(imageView, "shop_" + this.equipment?.key) + val imageView = dialogContent.findViewById(R.id.imageView) + imageView.loadImage("shop_" + this.equipment?.key) val priceLabel = dialogContent.findViewById(R.id.priceLabel) priceLabel.text = if (equipment?.gearSet == "animal") { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt index d01ce9997..6508b568d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/CustomizationRecyclerViewAdapter.kt @@ -15,7 +15,7 @@ import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.android.habitica.models.inventory.Customization import com.habitrpg.android.habitica.models.inventory.CustomizationSet import com.habitrpg.android.habitica.models.shops.ShopItem -import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.android.habitica.ui.views.shops.PurchaseDialog import io.reactivex.rxjava3.core.BackpressureStrategy @@ -148,7 +148,7 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler if (customization.type == "background" && customization.identifier == "") { binding.imageView.load(R.drawable.no_background) } else { - DataBindingUtils.loadImage(binding.imageView, customization.getIconName(userSize, hairColor)) + binding.imageView.loadImage(customization.getIconName(userSize, hairColor)) } if (customization.isUsable(ownedCustomizations.contains(customization.id))) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/SkillsRecyclerViewAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/SkillsRecyclerViewAdapter.kt index 4b16466f9..daf589343 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/SkillsRecyclerViewAdapter.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/SkillsRecyclerViewAdapter.kt @@ -13,7 +13,7 @@ import com.habitrpg.android.habitica.extensions.inflate import com.habitrpg.android.habitica.extensions.isUsingNightModeResources import com.habitrpg.android.habitica.models.Skill import com.habitrpg.android.habitica.models.user.OwnedItem -import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable @@ -125,7 +125,7 @@ class SkillsRecyclerViewAdapter : RecyclerView.Adapter() { internal inner class StableViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener { private var animal: Animal? = null - private val imageView: ImageView = itemView.findViewById(R.id.imageView) + private val imageView: PixelArtView = itemView.findViewById(R.id.imageView) private val titleView: TextView = itemView.findViewById(R.id.titleTextView) private val ownedTextView: TextView = itemView.findViewById(R.id.ownedTextView) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt index 9af5d4993..b807015c7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt @@ -26,14 +26,14 @@ import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.ui.activities.GiftSubscriptionActivity import com.habitrpg.android.habitica.ui.fragments.BaseFragment import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment -import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import com.habitrpg.android.habitica.ui.views.subscriptions.SubscriptionOptionView -import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import javax.inject.Inject class SubscriptionFragment : BaseFragment() { @@ -90,7 +90,7 @@ class SubscriptionFragment : BaseFragment() { compositeSubscription.add( inventoryRepository.getLatestMysteryItem().subscribe( { - DataBindingUtils.loadImage(binding?.subBenefitsMysteryItemIcon, "shop_set_mystery_${it.key?.split("_")?.last()}") + binding?.subBenefitsMysteryItemIcon?.loadImage("shop_set_mystery_${it.key?.split("_")?.last()}") binding?.subBenefitsMysteryItemText?.text = context?.getString(R.string.subscribe_listitem3_description_new, it.text) }, RxErrorHandler.handleEmptyError() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt index 931d11c4c..9a0227fba 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/QuestDetailFragment.kt @@ -26,6 +26,7 @@ import com.habitrpg.android.habitica.modules.AppModule import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils import com.habitrpg.android.habitica.ui.helpers.MarkdownParser +import com.habitrpg.android.habitica.ui.helpers.loadImage import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import javax.inject.Inject @@ -149,7 +150,7 @@ class QuestDetailFragment : BaseMainFragment() { // We need to do this, because the quest description can contain markdown AND HTML. binding?.descriptionView?.setText(MarkdownParser.parseMarkdown(questContent.notes).toHtml().fromHtml(), TextView.BufferType.SPANNABLE) - DataBindingUtils.loadImage(binding?.questScrollImageView, "inventory_quest_scroll_" + questContent.key) + binding?.questScrollImageView?.loadImage("inventory_quest_scroll_" + questContent.key) } private fun setQuestParticipants(participants: List?) { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt index e142314dc..dff11665a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt @@ -35,16 +35,17 @@ import com.habitrpg.android.habitica.ui.fragments.BaseFragment import com.habitrpg.android.habitica.ui.fragments.inventory.items.ItemDialogFragment import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils import com.habitrpg.android.habitica.ui.helpers.dismissKeyboard +import com.habitrpg.android.habitica.ui.helpers.loadImage import com.habitrpg.android.habitica.ui.helpers.setMarkdown import com.habitrpg.android.habitica.ui.viewHolders.GroupMemberViewHolder import com.habitrpg.android.habitica.ui.viewmodels.PartyViewModel import com.habitrpg.android.habitica.ui.views.HabiticaSnackbar import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog -import javax.inject.Inject -import javax.inject.Named import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import javax.inject.Inject +import javax.inject.Named class PartyDetailFragment : BaseFragment() { @@ -218,9 +219,9 @@ class PartyDetailFragment : BaseFragment() { return } binding?.questTitleView?.text = questContent.text - DataBindingUtils.loadImage(binding?.questScrollImageView, "inventory_quest_scroll_" + questContent.key) + binding?.questScrollImageView?.loadImage("inventory_quest_scroll_" + questContent.key) if (questContent.hasGifImage()) { - DataBindingUtils.loadImage(binding?.questImageView, "quest_" + questContent.key, "gif") + binding?.questImageView?.loadImage("quest_" + questContent.key, "gif") } else { context?.let { context -> DataBindingUtils.loadImage(context, "quest_" + questContent.key) { @@ -230,7 +231,7 @@ class PartyDetailFragment : BaseFragment() { binding?.questImageView?.layoutParams = params } } - DataBindingUtils.loadImage(binding?.questImageView, "quest_" + questContent.key) + binding?.questImageView?.loadImage("quest_" + questContent.key) } binding?.questImageWrapper?.alpha = 1.0f binding?.questProgressView?.alpha = 1.0f diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.kt index ce611332c..4877b818c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.kt @@ -6,39 +6,36 @@ import android.graphics.drawable.Drawable import android.view.View import android.view.animation.Animation import android.view.animation.Transformation -import android.widget.ImageView import android.widget.LinearLayout import androidx.core.content.res.ResourcesCompat +import androidx.core.graphics.drawable.toBitmap import coil.imageLoader -import coil.load import coil.request.ImageRequest import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.extensions.setTintWith import com.habitrpg.android.habitica.helpers.AppConfigManager +import com.habitrpg.android.habitica.ui.views.PixelArtView import java.util.Collections import java.util.Date -fun ImageView.loadImage(imageName: String?, imageFormat: String? = null) { - DataBindingUtils.loadImage(this, imageName, imageFormat) +fun PixelArtView.loadImage(imageName: String?, imageFormat: String? = null) { + if (imageName != null) { + val fullname = DataBindingUtils.getFullFilename(imageName, imageFormat) + if (tag == fullname) { + return + } + tag = fullname + bitmap = null + DataBindingUtils.loadImage(context, imageName, imageFormat) { + if (tag == fullname) { + bitmap = it.toBitmap() + } + } + } } object DataBindingUtils { - fun loadImage(view: ImageView?, imageName: String) { - loadImage(view, imageName, null) - } - - fun loadImage(view: ImageView?, imageName: String?, imageFormat: String? = null) { - if (view != null && imageName != null && view.visibility == View.VISIBLE) { - val fullname = getFullFilename(imageName, imageFormat) - if (view.tag == fullname) { - return - } - view.tag = fullname - view.load(BASE_IMAGE_URL + fullname) - } - } - fun loadImage(context: Context, imageName: String, imageResult: (Drawable) -> Unit) { loadImage(context, imageName, null, imageResult) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/MountViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/MountViewHolder.kt index 9202c484b..7528584db 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/MountViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/MountViewHolder.kt @@ -41,7 +41,7 @@ class MountViewHolder(parent: ViewGroup, private val equipEvents: PublishSubject binding.activeIndicator.visibility = if (currentMount.equals(animal?.key)) View.VISIBLE else View.GONE DataBindingUtils.loadImage(itemView.context, imageName) { val drawable = if (owned) it else BitmapDrawable(itemView.context.resources, it.toBitmap().extractAlpha()) - binding.imageView.background = drawable + binding.imageView.bitmap = drawable.toBitmap() } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt index 22131203f..0ecfb1102 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt @@ -101,7 +101,7 @@ class PetViewHolder( val resources = itemView.context.resources ?: return@loadImage val drawable = if (trained == 0) BitmapDrawable(resources, it.toBitmap().extractAlpha()) else it - binding.imageView.background = drawable + binding.imageView.bitmap = drawable.toBitmap() } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt index 2ea926b63..4b094a75a 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt @@ -10,7 +10,7 @@ import com.habitrpg.android.habitica.databinding.RowShopitemBinding import com.habitrpg.android.habitica.extensions.dpToPx import com.habitrpg.android.habitica.extensions.isUsingNightModeResources import com.habitrpg.android.habitica.models.shops.ShopItem -import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import com.habitrpg.android.habitica.ui.views.shops.PurchaseDialog @@ -39,7 +39,7 @@ class ShopItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), Vi this.item = item binding.buyButton.visibility = View.VISIBLE - DataBindingUtils.loadImage(binding.imageView, item.imageName?.replace("_locked", "")) + binding.imageView.loadImage(item.imageName?.replace("_locked", "")) binding.itemDetailIndicator.text = null binding.itemDetailIndicator.visibility = View.GONE diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/EquipmentItemRow.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/EquipmentItemRow.kt index 7ec4e3979..3904587cd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/EquipmentItemRow.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/EquipmentItemRow.kt @@ -7,7 +7,7 @@ import android.widget.LinearLayout import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.ItemImageRowBinding import com.habitrpg.android.habitica.extensions.layoutInflater -import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage class EquipmentItemRow(context: Context, attrs: AttributeSet?) : LinearLayout(context, attrs) { @@ -16,14 +16,14 @@ class EquipmentItemRow(context: Context, attrs: AttributeSet?) : LinearLayout(co set(value) { field = value val imageName = if (equipmentIdentifier?.isNotEmpty() == true && equipmentIdentifier?.endsWith("base_0") == false) "shop_$equipmentIdentifier" else "head_0" - DataBindingUtils.loadImage(binding.imageView, imageName) + binding.imageView.loadImage(imageName) } var customizationIdentifier: String? = null set(value) { field = value val imageName = if (customizationIdentifier?.isNotEmpty() == true) customizationIdentifier else "head_0" - DataBindingUtils.loadImage(binding.imageView, imageName) + binding.imageView.loadImage(imageName) } init { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/NPCBannerView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/NPCBannerView.kt index e266e64a0..5fb3ba45d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/NPCBannerView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/NPCBannerView.kt @@ -38,7 +38,9 @@ class NPCBannerView(context: Context, attrs: AttributeSet?) : FrameLayout(contex } private fun setImage() { - DataBindingUtils.loadImage(binding.sceneView, identifier + "_scene" + shopSpriteSuffix) + DataBindingUtils.loadImage(context, identifier + "_scene" + shopSpriteSuffix) { + binding.sceneView.setImageDrawable(it) + } binding.backgroundView.scaleType = ImageView.ScaleType.FIT_START diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/PixelArtView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/PixelArtView.kt new file mode 100644 index 000000000..0f91eb226 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/PixelArtView.kt @@ -0,0 +1,59 @@ +package com.habitrpg.android.habitica.ui.views + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Paint +import android.graphics.Rect +import android.util.AttributeSet + +class PixelArtView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 +) : androidx.appcompat.widget.AppCompatImageView(context, attrs, defStyleAttr) { + + private var targetRect = Rect(0, 0, 0, 0) + + var bitmap: Bitmap? = null + set(value) { + field = value + updateTargetRect() + invalidate() + } + + private val paint: Paint by lazy { + val paint = Paint() + paint.isAntiAlias = true + paint.isFilterBitmap = false + paint + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + updateTargetRect() + } + + private fun updateTargetRect() { + var targetWidth = bitmap?.width ?: 0 + var targetHeight = bitmap?.height ?: 0 + + if (width > 0 && targetWidth > 0 && width != targetWidth) { + targetWidth = (targetWidth/3) * (width / (targetWidth/3)) + } + if (height > 0 && targetHeight > 0 && height != targetHeight) { + targetHeight = (targetHeight/3) * (height / (targetHeight/3)) + } + + val left = (width-targetWidth)/2 + val top = (height-targetHeight)/2 + targetRect = Rect(left, top, left+targetWidth, top+targetHeight) + } + + override fun onDraw(canvas: Canvas?) { + if (bitmap == null) { + super.onDraw(canvas) + return + } + val bitmap = bitmap ?: return + canvas?.drawBitmap(bitmap, null, targetRect, paint) + } +} \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDetailDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDetailDialog.kt index f233bf867..e310f98fb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDetailDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDetailDialog.kt @@ -3,17 +3,17 @@ package com.habitrpg.android.habitica.ui.views.dialogs import android.content.Context import android.view.LayoutInflater import android.view.View -import android.widget.ImageView import android.widget.TextView import com.habitrpg.android.habitica.databinding.DialogAchievementDetailBinding import com.habitrpg.android.habitica.extensions.addCloseButton import com.habitrpg.android.habitica.extensions.fromHtml import com.habitrpg.android.habitica.models.Achievement -import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage +import com.habitrpg.android.habitica.ui.views.PixelArtView class AchievementDetailDialog(val achievement: Achievement, context: Context) : HabiticaAlertDialog(context) { - private var iconView: ImageView? + private var iconView: PixelArtView? private var descriptionView: TextView? init { @@ -30,7 +30,7 @@ class AchievementDetailDialog(val achievement: Achievement, context: Context) : } else { "achievement-unearned2x" } - DataBindingUtils.loadImage(iconView, iconName) + iconView?.loadImage(iconName) addCloseButton(true) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDialog.kt index 43ac339c2..3c68fc3b6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/AchievementDialog.kt @@ -12,7 +12,7 @@ import com.habitrpg.android.habitica.extensions.layoutInflater import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.android.habitica.models.Notification import com.habitrpg.android.habitica.models.user.User -import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage class AchievementDialog(context: Context) : HabiticaAlertDialog(context) { var isLastOnboardingAchievement: Boolean = false @@ -51,7 +51,7 @@ class AchievementDialog(context: Context) : HabiticaAlertDialog(context) { private fun configure(title: String, description: String, iconName: String) { binding.titleView.text = title binding.descriptionView.setText(description.fromHtml(), TextView.BufferType.SPANNABLE) - DataBindingUtils.loadImage(binding.iconView, "achievement-${iconName}2x") + binding.iconView.loadImage("achievement-${iconName}2x") if (iconName == "onboardingComplete") { setTitle(R.string.onboardingComplete_achievement_title) binding.titleView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/FirstDropDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/FirstDropDialog.kt index cdc1f473f..13919e580 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/FirstDropDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/FirstDropDialog.kt @@ -2,15 +2,15 @@ package com.habitrpg.android.habitica.ui.views.dialogs import android.content.Context import android.view.LayoutInflater -import android.widget.ImageView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.helpers.MainNavigationController -import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage +import com.habitrpg.android.habitica.ui.views.PixelArtView class FirstDropDialog(context: Context) : HabiticaAlertDialog(context) { - private var eggView: ImageView? - private var hatchingPotionView: ImageView? + private var eggView: PixelArtView? + private var hatchingPotionView: PixelArtView? init { val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as? LayoutInflater @@ -26,7 +26,7 @@ class FirstDropDialog(context: Context) : HabiticaAlertDialog(context) { } fun configure(egg: String, hatchingPotion: String) { - DataBindingUtils.loadImage(eggView, "Pet_Egg_$egg") - DataBindingUtils.loadImage(hatchingPotionView, "Pet_HatchingPotion_$hatchingPotion") + eggView?.loadImage("Pet_Egg_$egg") + hatchingPotionView?.loadImage("Pet_HatchingPotion_$hatchingPotion") } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt index 6a36c4b5d..4e5403cd3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/PetSuggestHatchDialog.kt @@ -19,6 +19,7 @@ import com.habitrpg.android.habitica.models.inventory.Item import com.habitrpg.android.habitica.ui.activities.BaseActivity import com.habitrpg.android.habitica.ui.activities.MainActivity import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage import com.habitrpg.android.habitica.ui.views.CurrencyView import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Flowable @@ -50,8 +51,8 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { hasUnlockedPotion: Boolean, hasMount: Boolean ) { - DataBindingUtils.loadImage(binding.eggView, "Pet_Egg_${pet.animal}") - DataBindingUtils.loadImage(binding.hatchingPotionView, "Pet_HatchingPotion_${pet.color}") + binding.eggView.loadImage("Pet_Egg_${pet.animal}") + binding.hatchingPotionView.loadImage("Pet_HatchingPotion_${pet.color}") binding.petTitleView.text = pet.text val hasEgg = eggCount > 0 @@ -170,7 +171,7 @@ class PetSuggestHatchDialog(context: Context) : HabiticaAlertDialog(context) { .observeOn(AndroidSchedulers.mainThread()) .subscribe( { - binding.petView.background = drawable + binding.petView.bitmap = drawable.toBitmap() }, RxErrorHandler.handleEmptyError() ) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialogContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialogContent.kt index 5d0c1189b..8f4e046d7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialogContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/QuestCompletedDialogContent.kt @@ -15,8 +15,9 @@ import com.habitrpg.android.habitica.extensions.fromHtml import com.habitrpg.android.habitica.extensions.layoutInflater import com.habitrpg.android.habitica.models.inventory.QuestContent import com.habitrpg.android.habitica.models.inventory.QuestDropItem -import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper +import com.habitrpg.android.habitica.ui.views.PixelArtView class QuestCompletedDialogContent : LinearLayout { @@ -40,7 +41,7 @@ class QuestCompletedDialogContent : LinearLayout { fun setQuestContent(questContent: QuestContent) { binding.titleTextView.setText(questContent.text.fromHtml(), TextView.BufferType.SPANNABLE) binding.notesTextView.setText(questContent.completion.fromHtml(), TextView.BufferType.SPANNABLE) - DataBindingUtils.loadImage(binding.imageView, "quest_" + questContent.key) + binding.imageView.loadImage("quest_" + questContent.key) val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as? LayoutInflater @@ -89,9 +90,9 @@ class QuestCompletedDialogContent : LinearLayout { containerView: ViewGroup? ) { val view = inflater?.inflate(R.layout.row_quest_reward, containerView, false) as? ViewGroup - val imageView = view?.findViewById(R.id.imageView) as? ImageView + val imageView = view?.findViewById(R.id.imageView) as? PixelArtView val titleTextView = view?.findViewById(R.id.titleTextView) as? TextView - DataBindingUtils.loadImage(imageView, item.imageName) + imageView?.loadImage(item.imageName) if (item.count > 1) { titleTextView?.text = context.getString(R.string.quest_reward_count, item.text, item.count) } else { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/WonChallengeDialog.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/WonChallengeDialog.kt index c9c6df553..ddcbe0ed0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/WonChallengeDialog.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/dialogs/WonChallengeDialog.kt @@ -8,12 +8,13 @@ import android.widget.TextView import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.extensions.fromHtml import com.habitrpg.android.habitica.models.notifications.ChallengeWonData -import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage +import com.habitrpg.android.habitica.ui.views.PixelArtView class WonChallengeDialog(context: Context) : HabiticaAlertDialog(context) { fun configure(data: ChallengeWonData?) { - val imageView = additionalContentView?.findViewById(R.id.achievement_view) - DataBindingUtils.loadImage(imageView, "achievement-karaoke-2x") + val imageView = additionalContentView?.findViewById(R.id.achievement_view) + imageView?.loadImage("achievement-karaoke-2x") if (data?.name != null) { additionalContentView?.findViewById(R.id.description_view)?.text = context.getString(R.string.won_achievement_description, data.name).fromHtml() diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/equipment/EquipmentOverviewItem.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/equipment/EquipmentOverviewItem.kt index 55834b0bb..62146b185 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/equipment/EquipmentOverviewItem.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/equipment/EquipmentOverviewItem.kt @@ -9,7 +9,7 @@ import androidx.core.content.ContextCompat import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.EquipmentOverviewItemBinding import com.habitrpg.android.habitica.extensions.layoutInflater -import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper class EquipmentOverviewItem @JvmOverloads constructor( @@ -35,7 +35,7 @@ class EquipmentOverviewItem @JvmOverloads constructor( identifier = key ?: "" binding.twoHandedIndicator.setImageDrawable(null) if (identifier.isNotEmpty() && !identifier.endsWith("base_0")) { - DataBindingUtils.loadImage(binding.iconView, "shop_$key") + binding.iconView.loadImage("shop_$key") binding.localIconView.visibility = View.GONE binding.iconView.visibility = View.VISIBLE binding.iconWrapper.background = ContextCompat.getDrawable(context, R.drawable.layout_rounded_bg_content) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogBackgroundContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogBackgroundContent.kt index 388e84e5e..512a62eb0 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogBackgroundContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogBackgroundContent.kt @@ -1,17 +1,17 @@ package com.habitrpg.android.habitica.ui.views.shops import android.content.Context -import android.widget.ImageView import android.widget.TextView import com.habitrpg.android.habitica.databinding.PurchaseDialogBackgroundBinding import com.habitrpg.android.habitica.extensions.layoutInflater import com.habitrpg.android.habitica.models.Avatar import com.habitrpg.android.habitica.models.shops.ShopItem +import com.habitrpg.android.habitica.ui.views.PixelArtView class PurchaseDialogBackgroundContent(context: Context) : PurchaseDialogContent(context) { val binding = PurchaseDialogBackgroundBinding.inflate(context.layoutInflater, this) - override val imageView: ImageView - get() = ImageView(context) + override val imageView: PixelArtView + get() = PixelArtView(context) override val titleTextView: TextView get() = binding.titleTextView diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogBaseContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogBaseContent.kt index 42980cc4e..6bf12be43 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogBaseContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogBaseContent.kt @@ -1,14 +1,14 @@ package com.habitrpg.android.habitica.ui.views.shops import android.content.Context -import android.widget.ImageView import android.widget.TextView import com.habitrpg.android.habitica.databinding.DialogPurchaseContentItemBinding import com.habitrpg.android.habitica.extensions.layoutInflater +import com.habitrpg.android.habitica.ui.views.PixelArtView class PurchaseDialogBaseContent(context: Context) : PurchaseDialogContent(context) { val binding = DialogPurchaseContentItemBinding.inflate(context.layoutInflater, this) - override val imageView: ImageView + override val imageView: PixelArtView get() = binding.imageView override val titleTextView: TextView get() = binding.titleTextView diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogContent.kt index e4842dbf3..ac391c128 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogContent.kt @@ -3,7 +3,6 @@ package com.habitrpg.android.habitica.ui.views.shops import android.content.Context import android.util.AttributeSet import android.view.Gravity -import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView import coil.load @@ -13,6 +12,7 @@ import com.habitrpg.android.habitica.models.inventory.QuestContent import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils import com.habitrpg.android.habitica.ui.helpers.loadImage +import com.habitrpg.android.habitica.ui.views.PixelArtView abstract class PurchaseDialogContent @JvmOverloads constructor( context: Context, @@ -20,7 +20,7 @@ abstract class PurchaseDialogContent @JvmOverloads constructor( defStyleAttr: Int = 0 ) : LinearLayout(context, attrs, defStyleAttr) { - abstract val imageView: ImageView + abstract val imageView: PixelArtView abstract val titleTextView: TextView init { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogCustomizationContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogCustomizationContent.kt index 4b761f067..0da19e4f9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogCustomizationContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogCustomizationContent.kt @@ -1,14 +1,14 @@ package com.habitrpg.android.habitica.ui.views.shops import android.content.Context -import android.widget.ImageView import android.widget.TextView import com.habitrpg.android.habitica.databinding.DialogPurchaseCustomizationBinding import com.habitrpg.android.habitica.extensions.layoutInflater +import com.habitrpg.android.habitica.ui.views.PixelArtView class PurchaseDialogCustomizationContent(context: Context) : PurchaseDialogContent(context) { val binding = DialogPurchaseCustomizationBinding.inflate(context.layoutInflater, this) - override val imageView: ImageView + override val imageView: PixelArtView get() = binding.imageView override val titleTextView: TextView get() = binding.titleTextView diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogCustomizationSetContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogCustomizationSetContent.kt index a79d830a2..f55c36700 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogCustomizationSetContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogCustomizationSetContent.kt @@ -1,7 +1,6 @@ package com.habitrpg.android.habitica.ui.views.shops import android.content.Context -import android.widget.ImageView import android.widget.TextView import com.google.android.flexbox.FlexboxLayout import com.habitrpg.android.habitica.R @@ -10,11 +9,12 @@ import com.habitrpg.android.habitica.extensions.dpToPx import com.habitrpg.android.habitica.extensions.layoutInflater import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.ui.helpers.loadImage +import com.habitrpg.android.habitica.ui.views.PixelArtView class PurchaseDialogCustomizationSetContent(context: Context) : PurchaseDialogContent(context) { val binding = DialogPurchaseCustomizationsetBinding.inflate(context.layoutInflater, this) - override val imageView: ImageView - get() = ImageView(context) + override val imageView: PixelArtView + get() = PixelArtView(context) override val titleTextView: TextView get() = binding.titleTextView @@ -22,7 +22,7 @@ class PurchaseDialogCustomizationSetContent(context: Context) : PurchaseDialogCo titleTextView.text = item.text binding.imageViewWrapper.removeAllViews() item.setImageNames.forEach { - val imageView = ImageView(context) + val imageView = PixelArtView(context) imageView.setBackgroundResource(R.drawable.layout_rounded_bg_window) imageView.loadImage(it) imageView.layoutParams = FlexboxLayout.LayoutParams(76.dpToPx(context), 76.dpToPx(context)) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogGearContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogGearContent.kt index cb57e4a34..69f77237f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogGearContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogGearContent.kt @@ -9,10 +9,11 @@ import com.habitrpg.android.habitica.databinding.DialogPurchaseContentGearBindin import com.habitrpg.android.habitica.extensions.layoutInflater import com.habitrpg.android.habitica.models.inventory.Equipment import com.habitrpg.android.habitica.models.shops.ShopItem +import com.habitrpg.android.habitica.ui.views.PixelArtView internal class PurchaseDialogGearContent(context: Context) : PurchaseDialogContent(context) { val binding = DialogPurchaseContentGearBinding.inflate(context.layoutInflater, this) - override val imageView: ImageView + override val imageView: PixelArtView get() = binding.imageView override val titleTextView: TextView get() = binding.titleTextView diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogGemsContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogGemsContent.kt index 876c82d6e..f861526ea 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogGemsContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogGemsContent.kt @@ -8,10 +8,11 @@ import com.habitrpg.android.habitica.extensions.asDrawable import com.habitrpg.android.habitica.extensions.layoutInflater import com.habitrpg.android.habitica.models.shops.ShopItem import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper +import com.habitrpg.android.habitica.ui.views.PixelArtView internal class PurchaseDialogGemsContent(context: Context) : PurchaseDialogContent(context) { internal val binding = DialogPurchaseGemsBinding.inflate(context.layoutInflater, this) - override val imageView: ImageView + override val imageView: PixelArtView get() = binding.imageView override val titleTextView: TextView get() = binding.titleTextView diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogItemContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogItemContent.kt index 129542efe..948ba73fb 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogItemContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogItemContent.kt @@ -1,15 +1,15 @@ package com.habitrpg.android.habitica.ui.views.shops import android.content.Context -import android.widget.ImageView import android.widget.TextView import com.habitrpg.android.habitica.databinding.DialogPurchaseContentItemBinding import com.habitrpg.android.habitica.extensions.layoutInflater import com.habitrpg.android.habitica.models.shops.ShopItem +import com.habitrpg.android.habitica.ui.views.PixelArtView class PurchaseDialogItemContent(context: Context) : PurchaseDialogContent(context) { private val binding = DialogPurchaseContentItemBinding.inflate(context.layoutInflater, this) - override val imageView: ImageView + override val imageView: PixelArtView get() = binding.imageView override val titleTextView: TextView get() = binding.titleTextView diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogQuestContent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogQuestContent.kt index d3a2be4f5..ec3a500b2 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogQuestContent.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/shops/PurchaseDialogQuestContent.kt @@ -12,12 +12,13 @@ import com.habitrpg.android.habitica.databinding.DialogPurchaseContentQuestBindi import com.habitrpg.android.habitica.extensions.layoutInflater import com.habitrpg.android.habitica.models.inventory.QuestContent import com.habitrpg.android.habitica.models.inventory.QuestDropItem -import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper +import com.habitrpg.android.habitica.ui.views.PixelArtView class PurchaseDialogQuestContent(context: Context) : PurchaseDialogContent(context) { private val binding = DialogPurchaseContentQuestBinding.inflate(context.layoutInflater, this) - override val imageView: ImageView + override val imageView: PixelArtView get() = binding.imageView override val titleTextView: TextView get() = binding.titleTextView @@ -91,9 +92,9 @@ class PurchaseDialogQuestContent(context: Context) : PurchaseDialogContent(conte containerView: ViewGroup? ) { val view = inflater?.inflate(R.layout.row_quest_reward, containerView, false) as? ViewGroup - val imageView = view?.findViewById(R.id.imageView) as? ImageView + val imageView = view?.findViewById(R.id.imageView) as? PixelArtView val titleTextView = view?.findViewById(R.id.titleTextView) as? TextView - DataBindingUtils.loadImage(imageView, item.imageName) + imageView?.loadImage(item.imageName) if (item.count > 1) { titleTextView?.text = context.getString(R.string.quest_reward_count, item.text, item.count) } else { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/OldQuestProgressView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/OldQuestProgressView.kt index eedd0e479..23b1bb696 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/OldQuestProgressView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/OldQuestProgressView.kt @@ -6,11 +6,10 @@ import android.graphics.RectF import android.util.AttributeSet import android.view.LayoutInflater import android.view.View -import android.widget.ImageView import android.widget.LinearLayout -import android.widget.TextView import androidx.core.content.ContextCompat import com.habitrpg.android.habitica.R +import com.habitrpg.android.habitica.databinding.QuestCollectBinding import com.habitrpg.android.habitica.databinding.QuestProgressOldBinding import com.habitrpg.android.habitica.extensions.layoutInflater import com.habitrpg.android.habitica.extensions.setScaledPadding @@ -18,10 +17,9 @@ import com.habitrpg.android.habitica.models.inventory.QuestContent import com.habitrpg.android.habitica.models.inventory.QuestProgress import com.habitrpg.android.habitica.models.inventory.QuestProgressCollect import com.habitrpg.android.habitica.models.user.User -import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage import com.habitrpg.android.habitica.ui.views.HabiticaIcons import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper -import com.habitrpg.android.habitica.ui.views.ValueBar class OldQuestProgressView : LinearLayout { private val binding = QuestProgressOldBinding.inflate(context.layoutInflater, this) @@ -95,15 +93,10 @@ class OldQuestProgressView : LinearLayout { val inflater = LayoutInflater.from(context) for (collect in progress.collect ?: emptyList()) { val contentCollect = quest.getCollectWithKey(collect.key) ?: continue - val view = inflater.inflate(R.layout.quest_collect, binding.collectionContainer, false) - val iconView = view.findViewById(R.id.icon_view) as? ImageView - val nameView = view.findViewById(R.id.name_view) as? TextView - val valueView = view.findViewById(R.id.value_view) as? ValueBar - DataBindingUtils.loadImage(iconView, "quest_" + quest.key + "_" + collect.key) - nameView?.text = contentCollect.text - valueView?.set(collect.count.toDouble(), contentCollect.count.toDouble()) - - binding.collectionContainer.addView(view) + val collectBinding = QuestCollectBinding.inflate(inflater, binding.collectionContainer, true) + collectBinding.iconView.loadImage("quest_" + quest.key + "_" + collect.key) + collectBinding.nameView.text = contentCollect.text + collectBinding.valueView.set(collect.count.toDouble(), contentCollect.count.toDouble()) } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/QuestProgressView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/QuestProgressView.kt index f6ddb620d..b16876a7c 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/QuestProgressView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/social/QuestProgressView.kt @@ -12,12 +12,12 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.LinearLayout -import android.widget.TextView import androidx.appcompat.app.AlertDialog import androidx.core.content.ContextCompat import androidx.core.content.edit import androidx.core.graphics.drawable.toBitmap import com.habitrpg.android.habitica.R +import com.habitrpg.android.habitica.databinding.QuestCollectBinding import com.habitrpg.android.habitica.databinding.QuestProgressBinding import com.habitrpg.android.habitica.extensions.layoutInflater import com.habitrpg.android.habitica.helpers.RxErrorHandler @@ -26,11 +26,11 @@ import com.habitrpg.android.habitica.models.inventory.QuestContent import com.habitrpg.android.habitica.models.inventory.QuestProgressCollect import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils +import com.habitrpg.android.habitica.ui.helpers.loadImage import com.habitrpg.android.habitica.ui.helpers.setMarkdown import com.habitrpg.android.habitica.ui.views.HabiticaIcons import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper import com.habitrpg.android.habitica.ui.views.NPCBannerView -import com.habitrpg.android.habitica.ui.views.ValueBar import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Observable @@ -148,8 +148,8 @@ class QuestProgressView : LinearLayout { } } binding.questDescription.setMarkdown(quest.notes) - DataBindingUtils.loadImage(binding.questImageView, "quest_" + quest.key, "gif") - DataBindingUtils.loadImage(binding.questFlourishesImageView, "quest_" + quest.key + "_flourishes") + binding.questImageView.loadImage("quest_" + quest.key, "gif") + binding.questFlourishesImageView.loadImage("quest_" + quest.key + "_flourishes") val lightColor = quest.colors?.lightColor if (lightColor != null) { binding.questDescriptionSection.separatorColor = lightColor @@ -253,15 +253,10 @@ class QuestProgressView : LinearLayout { val inflater = LayoutInflater.from(context) for (collect in collection) { val contentCollect = quest.getCollectWithKey(collect.key) ?: continue - val view = inflater.inflate(R.layout.quest_collect, binding.collectionContainer, false) - val iconView: ImageView = view.findViewById(R.id.icon_view) - val nameView: TextView = view.findViewById(R.id.name_view) - val valueView: ValueBar = view.findViewById(R.id.value_view) - DataBindingUtils.loadImage(iconView, "quest_" + quest.key + "_" + collect.key) - nameView.text = contentCollect.text - valueView.set(collect.count.toDouble(), contentCollect.count.toDouble()) - - binding.collectionContainer.addView(view) + val collectBinding = QuestCollectBinding.inflate(inflater, binding.collectionContainer, true) + collectBinding.iconView.loadImage("quest_" + quest.key + "_" + collect.key) + collectBinding.nameView.text = contentCollect.text + collectBinding.valueView.set(collect.count.toDouble(), contentCollect.count.toDouble()) } } @@ -289,7 +284,7 @@ class QuestProgressView : LinearLayout { private fun showQuestImage() { binding.questImageWrapper.visibility = View.VISIBLE - DataBindingUtils.loadImage(binding.questImageView, "quest_" + quest?.key) + binding.questImageView.loadImage("quest_" + quest?.key) preferences?.edit { putBoolean("boss_art_collapsed", false) } updateCaretImage() }