Rewrite sprite rendering to not make things blurry

This commit is contained in:
Phillip Thelen 2022-05-12 13:32:36 +02:00
parent 409c3f6a34
commit 67dd4bda78
80 changed files with 254 additions and 203 deletions

View file

@ -22,7 +22,7 @@
<FrameLayout
android:layout_width="match_parent"
android:layout_height="66dp">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/achievement_icon"
android:layout_width="64dp"
android:layout_height="56dp"

View file

@ -9,7 +9,7 @@
<RelativeLayout
android:layout_width="100dp"
android:layout_height="86dp">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/achievement_icon"
android:layout_width="64dp"
android:layout_height="56dp"

View file

@ -48,7 +48,7 @@
android:layout_height="158dp"
android:layout_centerInParent="true"
android:src="@drawable/circle_gray_700" />
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/icon_view"
android:layout_width="136dp"
android:layout_height="136dp"

View file

@ -350,7 +350,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="#" />
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/current_pet_drawee"
android:layout_width="40dp"
android:layout_height="40dp"/>
@ -369,7 +369,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="#" />
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/current_mount_drawee"
android:layout_width="40dp"
android:layout_height="40dp"/>

View file

@ -4,7 +4,7 @@
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/icon_view"
android:layout_width="52dp"
android:layout_height="56dp"

View file

@ -18,13 +18,13 @@
android:layout_width="86dp"
android:layout_height="68dp"
android:layout_gravity="center">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/hatchingPotion_view"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true" />
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/egg_view"
android:layout_width="72dp"
android:layout_height="72dp"

View file

@ -11,7 +11,7 @@
<FrameLayout
android:layout_width="76dp"
android:layout_height="76dp">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/imageView"
android:layout_width="60dp"
android:layout_height="68dp"

View file

@ -16,7 +16,7 @@
android:layout_width="41dp"
android:layout_height="wrap_content"
android:src="@drawable/sparkles_left" />
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/icon_view"
android:layout_width="52dp"
android:layout_height="56dp"

View file

@ -46,7 +46,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"/>
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View file

@ -15,7 +15,7 @@
android:layout_height="80dp"
android:background="@drawable/layout_rounded_bg_window"
android:layout_marginEnd="@dimen/spacing_large">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/egg_view"
android:layout_width="@dimen/gear_image_size"
android:layout_height="@dimen/gear_image_size"
@ -25,7 +25,7 @@
android:layout_width="80dp"
android:layout_height="80dp"
android:background="@drawable/layout_rounded_bg_window">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/hatchingPotion_view"
android:layout_width="@dimen/gear_image_size"
android:layout_height="@dimen/gear_image_size"

View file

@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:layout_width="@dimen/shopitem_image_size"
android:layout_height="@dimen/shopitem_image_size"
android:id="@+id/imageView"

View file

@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/icon_view"
android:layout_height="@dimen/shopitem_image_size"
android:layout_width="@dimen/shopitem_image_size" />

View file

@ -21,7 +21,7 @@
android:background="@drawable/layout_rounded_bg_window"
android:layout_centerVertical="true"
android:layout_alignParentStart="true">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/egg_view"
android:layout_width="@dimen/gear_image_size"
android:layout_height="@dimen/gear_image_size"
@ -46,7 +46,7 @@
android:background="@drawable/layout_rounded_bg_window"
android:layout_marginEnd="13dp"
android:layout_marginStart="@dimen/spacing_small">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/pet_view"
android:layout_width="@dimen/gear_image_size"
android:layout_height="@dimen/gear_image_size"
@ -63,7 +63,7 @@
android:background="@drawable/layout_rounded_bg_window"
android:layout_centerVertical="true"
android:layout_alignParentStart="true">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/hatchingPotion_view"
android:layout_width="@dimen/gear_image_size"
android:layout_height="@dimen/gear_image_size"

View file

@ -10,7 +10,7 @@
tools:parentTag="LinearLayout"
tools:orientation="vertical">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/imageView"
android:layout_width="@dimen/shopitem_image_size"
android:layout_height="@dimen/shopitem_image_size" />

View file

@ -11,7 +11,7 @@
tools:parentTag="LinearLayout"
tools:orientation="vertical">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/imageView"
android:layout_width="@dimen/shopitem_image_size"
android:layout_height="@dimen/shopitem_image_size" />

View file

@ -10,7 +10,7 @@
tools:parentTag="LinearLayout"
tools:orientation="vertical">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/imageView"
android:layout_width="@dimen/shopitem_image_size"
android:layout_height="@dimen/shopitem_image_size" />

View file

@ -6,7 +6,7 @@
android:layout_height="wrap_content"
tools:parentTag="android.widget.LinearLayout">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:layout_width="@dimen/customization_width"
android:layout_height="@dimen/customization_width"
android:id="@+id/imageView"

View file

@ -12,7 +12,7 @@
tools:background="?attr/colorContentBackground"
tools:orientation="vertical">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/imageView"
android:layout_width="@dimen/shopitem_image_size"
android:layout_height="@dimen/shopitem_image_size" />

View file

@ -25,7 +25,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/sparkles_left" />
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/achievement_view"
android:layout_width="48dp"
android:layout_height="52dp"

View file

@ -11,7 +11,7 @@
android:layout_height="70dp"
android:layout_gravity="center_horizontal"
android:background="@drawable/layout_rounded_bg_content">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/icon_view"
android:layout_width="@dimen/gear_image_size"
android:layout_height="@dimen/gear_image_size"

View file

@ -65,7 +65,7 @@
android:gravity="center_vertical"
android:layout_marginBottom="@dimen/spacing_medium"
android:visibility="gone">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/quest_scroll_image_view"
android:layout_width="@dimen/gear_image_size"
android:layout_height="@dimen/gear_image_size" />
@ -101,7 +101,7 @@
android:background="@drawable/layout_rounded_bg_window"
android:padding="@dimen/spacing_medium"
android:layout_marginBottom="@dimen/spacing_medium">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/quest_image_view"
android:layout_width="@dimen/quest_image_width"
android:layout_height="wrap_content"

View file

@ -17,7 +17,7 @@
android:paddingTop="12dp"
android:paddingBottom="12dp"
>
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/quest_scroll_image_view"
android:layout_width="63dp"
android:layout_height="63dp"

View file

@ -187,7 +187,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/sub_benefits_mystery_item_icon"
android:layout_width="68dp"
android:layout_height="68dp"

View file

@ -14,7 +14,7 @@
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginEnd="@dimen/row_padding">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:layout_width="@dimen/gear_image_size"
android:layout_height="@dimen/gear_image_size"
android:layout_gravity="center"

View file

@ -8,7 +8,7 @@
android:clickable="true"
android:focusable="true"
tools:parentTag="android.widget.LinearLayout">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/imageView"
android:layout_width="@dimen/gear_image_size"
android:layout_height="@dimen/gear_image_size"

View file

@ -6,7 +6,7 @@
android:layout_height="wrap_content"
style="@style/RowWrapper"
android:clickable="true">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/imageView"
android:layout_width="@dimen/gear_image_size"
android:layout_height="@dimen/gear_image_size"

View file

@ -21,7 +21,7 @@
android:layout_width="68dp"
android:layout_height="66dp"
android:layout_gravity="center">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/imageView"
android:layout_width="68dp"
android:layout_height="68dp"

View file

@ -14,7 +14,7 @@
android:background="@drawable/layout_rounded_bg_window"
android:orientation="vertical"
android:layout_centerInParent="true">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/imageView"
android:layout_width="68dp"
android:layout_height="68dp"

View file

@ -2,7 +2,8 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/pet_image_width" android:layout_height="@dimen/pet_image_height"
android:layout_gravity="center">
<ImageView android:id="@+id/pet_imageview"
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/pet_imageview"
android:layout_width="68dp"
android:layout_height="68dp"
android:layout_gravity="center" />

View file

@ -18,7 +18,7 @@
android:layout_width="68dp"
android:layout_height="58dp"
android:layout_gravity="center">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/imageView"
android:layout_width="68dp"
android:layout_height="68dp"

View file

@ -10,7 +10,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/achievement_drawee"
android:layout_width="64dp"
android:layout_height="56dp"

View file

@ -30,7 +30,7 @@
</LinearLayout>
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/gear_drawee"
android:layout_width="40dp"
android:layout_height="40dp"

View file

@ -8,7 +8,7 @@
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/icon_view"
android:layout_width="40dp"
android:layout_height="wrap_content"

View file

@ -47,7 +47,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipChildren="true">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/questImageView"
android:layout_width="219dp"
android:layout_height="wrap_content"
@ -56,7 +56,7 @@
android:paddingStart="@dimen/spacing_large"
android:paddingEnd="@dimen/spacing_large"
android:layout_gravity="center_horizontal" />
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/questFlourishesImageView"
android:layout_width="310dp"
android:layout_height="219dp"

View file

@ -6,7 +6,7 @@
android:gravity="center_vertical"
android:layout_marginBottom="4dp">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/imageView"
android:layout_width="@dimen/shopitem_image_size"
android:layout_height="@dimen/shopitem_image_size"

View file

@ -14,7 +14,7 @@
android:orientation="vertical"
android:background="@drawable/layout_rounded_bg_shopitem"
android:layout_centerInParent="true">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/imageView"
android:layout_width="@dimen/shopitem_image_size"
android:layout_height="@dimen/shopitem_image_size"

View file

@ -16,7 +16,7 @@
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp">
<ImageView
<com.habitrpg.android.habitica.ui.views.PixelArtView
android:id="@+id/skill_image"
android:layout_width="40dp"
android:layout_height="40dp"

View file

@ -14,6 +14,8 @@ import com.habitrpg.android.habitica.models.inventory.Pet
import com.habitrpg.android.habitica.models.responses.FeedResponse
import com.habitrpg.android.habitica.ui.activities.BaseActivity
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.SnackbarActivity
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import io.reactivex.rxjava3.core.Flowable
@ -36,12 +38,9 @@ constructor(
null
) as? FrameLayout
val mountImageView =
mountWrapper?.findViewById(R.id.pet_imageview) as? ImageView
mountWrapper?.findViewById(R.id.pet_imageview) as? PixelArtView
DataBindingUtils.loadImage(
mountImageView,
"Mount_Icon_" + requestValues.pet.key
)
mountImageView?.loadImage("Mount_Icon_" + requestValues.pet.key)
val dialog = HabiticaAlertDialog(requestValues.context)
dialog.setTitle(
requestValues.context.getString(

View file

@ -5,7 +5,6 @@ import android.graphics.Bitmap
import android.graphics.Canvas
import android.view.View
import android.widget.FrameLayout
import android.widget.ImageView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.executors.PostExecutionThread
@ -14,7 +13,8 @@ import com.habitrpg.android.habitica.models.inventory.Egg
import com.habitrpg.android.habitica.models.inventory.HatchingPotion
import com.habitrpg.android.habitica.models.user.Items
import com.habitrpg.android.habitica.ui.activities.BaseActivity
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.HabiticaAlertDialog
import io.reactivex.rxjava3.core.Flowable
import javax.inject.Inject
@ -27,9 +27,9 @@ constructor(
override fun buildUseCaseObservable(requestValues: RequestValues): Flowable<Items> {
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)

View file

@ -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

View file

@ -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) {

View file

@ -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))

View file

@ -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" -> {

View file

@ -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<ImageView>(R.id.gear_drawee)
val draweeView = gearRow?.findViewById<PixelArtView>(R.id.gear_drawee)
draweeView?.loadImage("shop_$gearKey")

View file

@ -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<RecyclerView.ViewHolder>() {
@ -75,7 +75,7 @@ class AchievementsAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
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<RecyclerView.ViewHolder>() {
} else {
"achievement-unearned2x"
}
DataBindingUtils.loadImage(achievementIconView, iconName)
achievementIconView.loadImage(iconName)
achievementTitleView.text = achievement.title
achievementDescriptionView?.text = achievement.text
if (achievement.optionalCount ?: 0 > 0) {

View file

@ -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<ImageView>(R.id.imageView)
DataBindingUtils.loadImage(imageView, "shop_" + this.equipment?.key)
val imageView = dialogContent.findViewById<PixelArtView>(R.id.imageView)
imageView.loadImage("shop_" + this.equipment?.key)
val priceLabel = dialogContent.findViewById<TextView>(R.id.priceLabel)
priceLabel.text = if (equipment?.gearSet == "animal") {

View file

@ -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))) {

View file

@ -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<SkillsRecyclerViewAdapter
binding.priceLabel.visibility = View.GONE
}
}
DataBindingUtils.loadImage(binding.skillImage, "shop_" + skill.key)
binding.skillImage.loadImage("shop_" + skill.key)
}
override fun onClick(v: View) {

View file

@ -12,7 +12,7 @@ import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.GearListItemBinding
import com.habitrpg.android.habitica.models.inventory.Equipment
import com.habitrpg.android.habitica.ui.adapter.BaseRecyclerViewAdapter
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.subjects.PublishSubject
@ -71,7 +71,7 @@ class EquipmentRecyclerViewAdapter : BaseRecyclerViewAdapter<Equipment, Equipmen
binding.gearIconBackgroundView.background = ContextCompat.getDrawable(context, R.drawable.layout_rounded_bg_window)
}
binding.twoHandedView.visibility = if (gear.twoHanded) View.VISIBLE else View.GONE
DataBindingUtils.loadImage(binding.gearImage, "shop_" + gear.key)
binding.gearImage.loadImage("shop_" + gear.key)
set(binding.strLabel, binding.strValue, gear.str)
set(binding.conLabel, binding.conValue, gear.con)

View file

@ -20,7 +20,7 @@ import com.habitrpg.android.habitica.models.user.OwnedItem
import com.habitrpg.android.habitica.models.user.OwnedPet
import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.adapter.BaseRecyclerViewAdapter
import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils
import com.habitrpg.android.habitica.ui.helpers.loadImage
import com.habitrpg.android.habitica.ui.menu.BottomSheetMenu
import com.habitrpg.android.habitica.ui.menu.BottomSheetMenuItem
import com.habitrpg.android.habitica.ui.views.dialogs.DetailDialog
@ -143,7 +143,7 @@ class ItemRecyclerAdapter(val context: Context, val user: User?) : BaseRecyclerV
disabled = !this.canHatch
}
}
DataBindingUtils.loadImage(binding.imageView, imageName)
binding.imageView.loadImage(imageName)
var alpha = 1.0f
if (disabled) {

View file

@ -16,7 +16,7 @@ import com.habitrpg.android.habitica.models.inventory.StableSection
import com.habitrpg.android.habitica.models.user.OwnedItem
import com.habitrpg.android.habitica.models.user.OwnedMount
import com.habitrpg.android.habitica.models.user.OwnedPet
import com.habitrpg.android.habitica.ui.helpers.DataBindingUtils
import com.habitrpg.android.habitica.ui.helpers.loadImage
import com.habitrpg.android.habitica.ui.viewHolders.PetViewHolder
import com.habitrpg.android.habitica.ui.viewHolders.SectionViewHolder
import com.habitrpg.android.habitica.ui.views.dialogs.PetSuggestHatchDialog
@ -187,11 +187,8 @@ class PetDetailRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapt
this.hasUnlockedPotion = hasUnlockedPotion
this.hasMount = hasMount
DataBindingUtils.loadImage(binding.eggView, "Pet_Egg_${item.animal}")
DataBindingUtils.loadImage(
binding.hatchingPotionView,
"Pet_HatchingPotion_${item.color}"
)
binding.eggView.loadImage("Pet_Egg_${item.animal}")
binding.hatchingPotionView.loadImage("Pet_HatchingPotion_${item.color}")
binding.eggView.startAnimation(Animations.bobbingAnimation(4f))
binding.hatchingPotionView.startAnimation(Animations.bobbingAnimation(-4f))

View file

@ -2,7 +2,6 @@ package com.habitrpg.android.habitica.ui.adapter.inventory
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.GridLayoutManager
@ -25,6 +24,7 @@ import com.habitrpg.android.habitica.ui.helpers.loadImage
import com.habitrpg.android.habitica.ui.viewHolders.MountViewHolder
import com.habitrpg.android.habitica.ui.viewHolders.PetViewHolder
import com.habitrpg.android.habitica.ui.viewHolders.SectionViewHolder
import com.habitrpg.android.habitica.ui.views.PixelArtView
import io.reactivex.rxjava3.core.BackpressureStrategy
import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.subjects.PublishSubject
@ -192,7 +192,7 @@ class StableRecyclerAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
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)

View file

@ -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<FragmentSubscriptionBinding>() {
@ -90,7 +90,7 @@ class SubscriptionFragment : BaseFragment<FragmentSubscriptionBinding>() {
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()

View file

@ -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<FragmentQuestDetailBinding>() {
// 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<Member>?) {

View file

@ -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<FragmentPartyDetailBinding>() {
@ -218,9 +219,9 @@ class PartyDetailFragment : BaseFragment<FragmentPartyDetailBinding>() {
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<FragmentPartyDetailBinding>() {
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

View file

@ -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)
}

View file

@ -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()
}
}

View file

@ -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()
}
}

View file

@ -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

View file

@ -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 {

View file

@ -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

View file

@ -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)
}
}

View file

@ -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)
}
}

View file

@ -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)

View file

@ -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")
}
}

View file

@ -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()
)

View file

@ -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 {

View file

@ -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<ImageView>(R.id.achievement_view)
DataBindingUtils.loadImage(imageView, "achievement-karaoke-2x")
val imageView = additionalContentView?.findViewById<PixelArtView>(R.id.achievement_view)
imageView?.loadImage("achievement-karaoke-2x")
if (data?.name != null) {
additionalContentView?.findViewById<TextView>(R.id.description_view)?.text = context.getString(R.string.won_achievement_description, data.name).fromHtml()

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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 {

View file

@ -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

View file

@ -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))

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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 {

View file

@ -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<QuestProgressCollect>()) {
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())
}
}
}

View file

@ -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()
}