Code cleanup

This commit is contained in:
Phillip Thelen 2023-09-15 12:10:14 +02:00
parent 6583b14b6e
commit 06cbc66f98
10 changed files with 18 additions and 401 deletions

View file

@ -18,17 +18,19 @@
android:background="?colorPrimaryOffset"
android:baselineAligned="false">
<com.habitrpg.android.habitica.ui.views.RoundedCornerLayout
<FrameLayout
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="@dimen/spacing_large"
android:background="@drawable/rounded_avatar_bg">
android:background="@drawable/rounded_avatar_bg"
android:clipToPadding="true"
android:clipChildren="true">
<com.habitrpg.common.habitica.views.AvatarView
android:id="@+id/avatarView"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_gravity="center"/>
</com.habitrpg.android.habitica.ui.views.RoundedCornerLayout>
</FrameLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_weight="1"
@ -156,12 +158,6 @@
tools:visibility="visible" />
</RelativeLayout>
</LinearLayout>
<com.habitrpg.android.habitica.ui.views.social.QuestMenuView
android:id="@+id/questMenuView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"

View file

@ -1,166 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:scrollbarSize="3dp"
android:scrollbarThumbVertical="@color/scrollbarThumb"
android:scrollbars="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingHorizontal="@dimen/spacing_medium">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/SectionTitle"
android:text="@string/avatar_body"
android:textAppearance="?android:attr/textAppearanceMedium" />
<LinearLayout
android:background="@drawable/layout_rounded_bg_window"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:divider="?android:listDivider"
android:showDividers="middle">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center_vertical">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginStart="@dimen/spacing_medium"
android:layout_marginEnd="@dimen/spacing_medium"
android:text="@string/avatar_size"
android:gravity="center_vertical"
android:textStyle="bold" />
<Spinner
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/avatarSizeSpinner"
android:spinnerMode="dropdown"
android:layout_marginEnd="8dp"
android:entries="@array/avatar_sizes"/>
</LinearLayout>
<com.habitrpg.android.habitica.ui.views.equipment.EquipmentItemRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/avatarShirtView"
app:equipmentTitle="@string/avatar_shirt"/>
<com.habitrpg.android.habitica.ui.views.equipment.EquipmentItemRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/avatarSkinView"
app:equipmentTitle="@string/avatar_skin"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/avatar_hair"
android:textAppearance="?android:attr/textAppearanceMedium"
style="@style/SectionTitle"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:divider="?android:listDivider"
android:showDividers="middle"
android:background="@drawable/layout_rounded_bg_window">
<com.habitrpg.android.habitica.ui.views.equipment.EquipmentItemRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/avatarHairColorView"
app:equipmentTitle="@string/avatar_color" />
<com.habitrpg.android.habitica.ui.views.equipment.EquipmentItemRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/avatarHairBaseView"
app:equipmentTitle="@string/avatar_style" />
<com.habitrpg.android.habitica.ui.views.equipment.EquipmentItemRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/avatarHairBangsView"
app:equipmentTitle="@string/avatar_bangs" />
<com.habitrpg.android.habitica.ui.views.equipment.EquipmentItemRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/avatarHairBeardView"
app:equipmentTitle="@string/avatar_beard" />
<com.habitrpg.android.habitica.ui.views.equipment.EquipmentItemRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/avatarHairMustacheView"
app:equipmentTitle="@string/avatar_mustache" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/avatar_extras"
android:textAppearance="?android:attr/textAppearanceMedium"
style="@style/SectionTitle"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="?android:listDivider"
android:showDividers="middle"
android:background="@drawable/layout_rounded_bg_window">
<com.habitrpg.android.habitica.ui.views.equipment.EquipmentItemRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/avatar_glasses_view"
app:equipmentTitle="@string/avatar_glasses"/>
<com.habitrpg.android.habitica.ui.views.equipment.EquipmentItemRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/avatarChairView"
app:equipmentTitle="@string/avatar_wheelchair"/>
<com.habitrpg.android.habitica.ui.views.equipment.EquipmentItemRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/avatar_accent_view"
app:equipmentTitle="@string/avatar_accent" />
<com.habitrpg.android.habitica.ui.views.equipment.EquipmentItemRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/avatar_animal_ears_view"
android:visibility="gone"
app:equipmentTitle="@string/animal_ears"/>
<com.habitrpg.android.habitica.ui.views.equipment.EquipmentItemRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/avatar_animal_tail_view"
android:visibility="gone"
app:equipmentTitle="@string/animal_tail"/>
<com.habitrpg.android.habitica.ui.views.equipment.EquipmentItemRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/avatar_headband_view"
app:equipmentTitle="@string/avatar_headband"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/avatar_background"
android:textAppearance="?android:attr/textAppearanceMedium"
style="@style/SectionTitle"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/layout_rounded_bg_window">
<com.habitrpg.android.habitica.ui.views.equipment.EquipmentItemRow
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/avatarBackgroundView"
app:equipmentTitle="@string/avatar_background" />
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View file

@ -6,6 +6,7 @@
tools:parentTag="android.widget.LinearLayout"
android:orientation="vertical">
<LinearLayout
android:id="@+id/benefit_gems_for_gold_wrapper"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

View file

@ -1463,6 +1463,7 @@
<string name="subscription_benefit_armoire_sub">Your subscription gives you an extra chance at the Armoire!</string>
<string name="subscriber_benefit_success_faint">You got a second chance with 1HP!</string>
<string name="revive_broken_equipment">Your %s broke</string>
<string name="subscribe_gems_for_gold_incentive_text">Subscribe to buy Gems with Gold and receive these other exclusive benefits!</string>
<plurals name="you_x_others">

View file

@ -268,7 +268,6 @@ class NavigationDrawerFragment : DialogFragment() {
setDisplayName(user.profile?.name)
setUsername(user.formattedUsername)
binding?.avatarView?.setAvatar(user)
binding?.questMenuView?.configure(user)
val userItems = user.items
var hasSpecialItems = false

View file

@ -1,17 +0,0 @@
package com.habitrpg.android.habitica.ui.views
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Outline
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.LayoutDirection
object AvatarCircleShape : Shape {
override fun createOutline(
size: Size,
layoutDirection: LayoutDirection,
density: Density
): Outline =
CircleShape.createOutline(size, 20f, 20f, 20f, 20f, layoutDirection)
}

View file

@ -1,79 +0,0 @@
package com.habitrpg.android.habitica.ui.views
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.PorterDuff
import android.graphics.PorterDuffXfermode
import android.graphics.RectF
import android.util.AttributeSet
import android.util.TypedValue
import android.widget.FrameLayout
// https://stackoverflow.com/a/26201117
class RoundedCornerLayout : FrameLayout {
private var maskBitmap: Bitmap? = null
private var paint: Paint? = null
private var maskPaint: Paint? = null
private var cornerRadius: Float = CORNER_RADIUS
constructor(context: Context) : super(context) {
init(context)
}
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
init(context)
}
constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {
init(context)
}
private fun init(context: Context) {
val metrics = context.resources.displayMetrics
cornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, CORNER_RADIUS, metrics)
paint = Paint(Paint.ANTI_ALIAS_FLAG)
maskPaint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG)
maskPaint?.xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)
setWillNotDraw(false)
}
override fun draw(canvas: Canvas) {
val offscreenBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
val offscreenCanvas = Canvas(offscreenBitmap)
super.draw(offscreenCanvas)
if (maskBitmap == null) {
maskBitmap = createMask(width, height)
}
maskBitmap?.let { offscreenCanvas.drawBitmap(it, 0f, 0f, maskPaint) }
canvas.drawBitmap(offscreenBitmap, 0f, 0f, paint)
}
private fun createMask(width: Int, height: Int): Bitmap {
val mask = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8)
val canvas = Canvas(mask)
val paint = Paint(Paint.ANTI_ALIAS_FLAG)
paint.color = Color.WHITE
canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), paint)
paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)
canvas.drawRoundRect(RectF(0f, 0f, width.toFloat(), height.toFloat()), cornerRadius, cornerRadius, paint)
return mask
}
companion object {
private const val CORNER_RADIUS = 40.0f
}
}

View file

@ -1,43 +0,0 @@
package com.habitrpg.android.habitica.ui.views.equipment
import android.content.Context
import android.util.AttributeSet
import android.view.View
import android.widget.LinearLayout
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.ItemImageRowBinding
import com.habitrpg.common.habitica.extensions.layoutInflater
import com.habitrpg.common.habitica.extensions.loadImage
class EquipmentItemRow(context: Context, attrs: AttributeSet?) : LinearLayout(context, attrs) {
private val binding: ItemImageRowBinding = ItemImageRowBinding.inflate(context.layoutInflater, this)
var equipmentIdentifier: String? = null
set(value) {
field = value
val imageName = if (equipmentIdentifier?.isNotEmpty() == true && equipmentIdentifier?.endsWith("base_0") == false) "shop_$equipmentIdentifier" else "icon_head_0"
binding.imageView.loadImage(imageName)
}
var customizationIdentifier: String? = null
set(value) {
field = value
val imageName = if (customizationIdentifier?.isNotEmpty() == true) "icon_$customizationIdentifier" else "icon_head_0"
binding.imageView.loadImage(imageName)
}
init {
View.inflate(context, R.layout.item_image_row, this)
isClickable = true
val attributes = context.theme?.obtainStyledAttributes(
attrs,
R.styleable.EquipmentItemRow,
0,
0
)
binding.titleTextView.text = attributes?.getString(R.styleable.EquipmentItemRow_equipmentTitle)
binding.valueTextView.visibility = View.GONE
}
}

View file

@ -18,6 +18,8 @@ import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.data.InventoryRepository
import com.habitrpg.android.habitica.data.UserRepository
import com.habitrpg.android.habitica.databinding.DialogPurchaseShopitemButtonBinding
import com.habitrpg.android.habitica.databinding.DialogPurchaseShopitemHeaderBinding
import com.habitrpg.android.habitica.extensions.addCancelButton
import com.habitrpg.android.habitica.extensions.addCloseButton
import com.habitrpg.android.habitica.extensions.getShortRemainingString
@ -31,7 +33,6 @@ import com.habitrpg.android.habitica.models.shops.ShopItem
import com.habitrpg.android.habitica.models.user.OwnedItem
import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.activities.ArmoireActivityDirections
import com.habitrpg.android.habitica.ui.fragments.purchases.SubscriptionBottomSheetFragment
import com.habitrpg.android.habitica.ui.views.CurrencyView
import com.habitrpg.android.habitica.ui.views.CurrencyViews
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
@ -42,6 +43,7 @@ import com.habitrpg.android.habitica.ui.views.insufficientCurrency.InsufficientG
import com.habitrpg.android.habitica.ui.views.insufficientCurrency.InsufficientHourglassesDialog
import com.habitrpg.android.habitica.ui.views.insufficientCurrency.InsufficientSubscriberGemsDialog
import com.habitrpg.android.habitica.ui.views.tasks.form.StepperValueFormView
import com.habitrpg.common.habitica.extensions.layoutInflater
import com.habitrpg.common.habitica.helpers.ExceptionHandler
import com.habitrpg.common.habitica.helpers.launchCatching
import dagger.hilt.android.internal.managers.ViewComponentManager
@ -62,11 +64,11 @@ class PurchaseDialog(
private val userRepository: UserRepository,
private val inventoryRepository: InventoryRepository,
val item: ShopItem,
val parentActivity: AppCompatActivity? = null
private val parentActivity: AppCompatActivity? = null
) : HabiticaAlertDialog(context) {
private val customHeader: View by lazy {
LayoutInflater.from(context).inflate(R.layout.dialog_purchase_shopitem_header, null)
DialogPurchaseShopitemHeaderBinding.inflate(context.layoutInflater).root
}
private val currencyView: CurrencyViews
private val limitedTextView: TextView
@ -80,7 +82,7 @@ class PurchaseDialog(
private var purchaseQuantity = 1
var purchaseCardAction: ((ShopItem) -> Unit)? = null
private var purchaseCardAction: ((ShopItem) -> Unit)? = null
var onShopNeedsRefresh: ((ShopItem) -> Unit)? = null
private var shopItem: ShopItem = item
@ -270,7 +272,7 @@ class PurchaseDialog(
pinTextView = customHeader.findViewById(R.id.pin_text)
addCloseButton()
buyButton = addButton(layoutInflater.inflate(R.layout.dialog_purchase_shopitem_button, null), autoDismiss = false) { _, _ ->
buyButton = addButton(DialogPurchaseShopitemButtonBinding.inflate(layoutInflater).root, autoDismiss = false) { _, _ ->
onBuyButtonClicked()
}
priceLabel = buyButton.findViewById(R.id.priceLabel)
@ -368,7 +370,6 @@ class PurchaseDialog(
parentActivity?.let { activity -> InsufficientGemsDialog(activity, shopItem.value).show() }
}
"hourglasses" == shopItem.currency -> InsufficientHourglassesDialog(context).show()
else -> null
}
return
}
@ -484,7 +485,10 @@ class PurchaseDialog(
val alert = HabiticaAlertDialog(context)
alert.setTitle(R.string.excess_items)
alert.setMessage(context.getString(R.string.excessItemsNoneLeft, item.text, purchaseQuantity, item.text))
alert.addButton(context.getString(R.string.purchaseX, purchaseQuantity), true, false) { _, _ ->
alert.addButton(context.getString(R.string.purchaseX, purchaseQuantity),
isPrimary = true,
isDestructive = false
) { _, _ ->
buyItem(purchaseQuantity)
}
alert.addCancelButton()

View file

@ -1,79 +0,0 @@
package com.habitrpg.android.habitica.ui.views.social
import android.content.Context
import android.util.AttributeSet
import android.view.Gravity
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import androidx.core.content.ContextCompat
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.databinding.QuestMenuViewBinding
import com.habitrpg.android.habitica.models.inventory.Quest
import com.habitrpg.android.habitica.models.inventory.QuestContent
import com.habitrpg.android.habitica.models.user.User
import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
import com.habitrpg.common.habitica.extensions.layoutInflater
import java.util.Locale
class QuestMenuView : LinearLayout {
private val binding = QuestMenuViewBinding.inflate(context.layoutInflater, this)
private var questContent: QuestContent? = null
constructor(context: Context) : super(context) {
setupView()
}
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
setupView()
}
private fun setupView() {
orientation = VERTICAL
binding.heartIconView.setImageBitmap(HabiticaIconsHelper.imageOfHeartDarkBg())
binding.rageIconView.setImageBitmap(HabiticaIconsHelper.imageOfRage())
binding.pendingDamageIconView.setImageBitmap(HabiticaIconsHelper.imageOfDamage())
}
fun configure(quest: Quest) {
binding.healthBarView.currentValue = quest.progress?.hp ?: 0.0
binding.rageBarView.currentValue = quest.progress?.rage ?: 0.0
}
fun configure(questContent: QuestContent) {
this.questContent = questContent
binding.healthBarView.maxValue = questContent.boss?.hp?.toDouble() ?: 0.0
binding.bossNameView.text = questContent.boss?.name
binding.typeTextView.text = context.getString(R.string.boss_quest)
if (questContent.boss?.hasRage == true) {
binding.rageView.visibility = View.VISIBLE
binding.rageBarView.maxValue = questContent.boss?.rage?.value ?: 0.0
} else {
binding.rageView.visibility = View.GONE
}
}
fun configure(user: User) {
binding.pendingDamageTextView.text = String.format(Locale.getDefault(), "%.01f", (user.party?.quest?.progress?.up ?: 0f))
}
fun hideBossArt() {
binding.topView.orientation = HORIZONTAL
binding.topView.setBackgroundColor(questContent?.colors?.mediumColor ?: 0)
binding.bossNameView.gravity = Gravity.START
binding.bossNameView.layoutParams = LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT, 1F)
binding.typeTextView.setTextColor(questContent?.colors?.extraLightColor ?: 0)
}
fun showBossArt() {
binding.topView.orientation = VERTICAL
binding.topView.setBackgroundColor(ContextCompat.getColor(context, R.color.transparent))
binding.bossNameView.gravity = Gravity.END
binding.bossNameView.layoutParams = LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
binding.typeTextView.setTextColor(ContextCompat.getColor(context, R.color.white))
}
}