Merge pull request #1772 from Hafizzle/Hafiz/#1417

#1417 - Improve Avatar customization Buy Modals
This commit is contained in:
Phillip Thelen 2022-05-27 10:05:40 +02:00 committed by GitHub
commit 73d63073c6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 68 additions and 30 deletions

View file

@ -26,4 +26,12 @@
android:gravity="center"
android:layout_marginTop="14dp"
android:layout_marginBottom="4dp"/>
<TextView
android:id="@+id/notesTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Body2"
android:textColor="@color/text_ternary"
tools:text="These are the notes"
android:gravity="center"/>
</merge>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/colorContentBackground">
<com.habitrpg.android.habitica.ui.AvatarView
android:id="@+id/avatar_view"
android:layout_centerHorizontal="true"
android:layout_width="@dimen/avatar_width"
android:layout_height="@dimen/avatar_height"
android:layout_marginTop="24dp"/>
</RelativeLayout>

View file

@ -35,6 +35,8 @@ class AvatarView : FrameLayout {
private var showPet = true
private var showSleeping = true
private var hasBackground: Boolean = false
private var preview: Map<LayerType, String>? = null
private var backgroundForPurchase: String? = null
private var hasMount: Boolean = false
private var hasPet: Boolean = false
private val imageViewHolder = mutableListOf<ImageView>()
@ -203,7 +205,11 @@ class AvatarView : FrameLayout {
}
var backgroundName = avatar.preferences?.background
if (showBackground && backgroundName?.isNotEmpty() == true) {
// if (backgroundForPurchase != null) {
if (preview != null) {
layerMap[preview?.keys?.first()] = preview?.values?.first()
if (resetHasAttributes) hasBackground = true
} else if (showBackground && backgroundName?.isNotEmpty() == true) {
backgroundName = substituteOrReturn(spriteSubstitutions["backgrounds"], backgroundName)
layerMap[LayerType.BACKGROUND] = "background_$backgroundName"
if (resetHasAttributes) hasBackground = true
@ -418,9 +424,10 @@ class AvatarView : FrameLayout {
}
}
fun setAvatar(avatar: Avatar) {
fun setAvatar(avatar: Avatar, preview: Map<LayerType, String>? = null) {
val oldUser = this.avatar
this.avatar = avatar
preview?.let { this.preview = preview }
var equals = false
if (oldUser != null) {

View file

@ -12,21 +12,25 @@ import com.habitrpg.android.habitica.databinding.CustomizationGridItemBinding
import com.habitrpg.android.habitica.databinding.CustomizationSectionFooterBinding
import com.habitrpg.android.habitica.databinding.CustomizationSectionHeaderBinding
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.models.Avatar
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.AvatarView
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
import io.reactivex.rxjava3.core.Flowable
import io.reactivex.rxjava3.subjects.PublishSubject
import java.util.Date
import java.util.*
import kotlin.collections.ArrayList
class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.RecyclerView.Adapter<androidx.recyclerview.widget.RecyclerView.ViewHolder>() {
var userSize: String? = null
var hairColor: String? = null
var avatar: Avatar? = null
var customizationType: String? = null
var gemBalance: Int = 0
var unsortedCustomizations: List<Customization> = ArrayList()
@ -194,8 +198,27 @@ class CustomizationRecyclerViewAdapter() : androidx.recyclerview.widget.Recycler
return
}
customization?.let {
selectCustomizationEvents.onNext(it)
if (customization?.type == "background" && avatar != null){
val alert = HabiticaAlertDialog(context = itemView.context)
val purchasedCustomizationView: View = LayoutInflater.from(itemView.context).inflate(R.layout.purchased_equip_dialog, null)
val layerMap = EnumMap<AvatarView.LayerType, String>(AvatarView.LayerType::class.java)
layerMap[AvatarView.LayerType.BACKGROUND] = customization?.let { ShopItem.fromCustomization(it, userSize, hairColor).imageName }
purchasedCustomizationView.findViewById<AvatarView>(R.id.avatar_view).setAvatar(avatar!!, layerMap)
alert.setAdditionalContentView(purchasedCustomizationView)
alert.addButton(R.string.equip, true) { _, _ ->
customization?.let {
selectCustomizationEvents.onNext(it)
}
}
alert.addButton(R.string.close, false) { _, _ ->
alert.dismiss()
}
alert.show()
} else {
customization?.let {
selectCustomizationEvents.onNext(it)
}
}
}
}

View file

@ -221,6 +221,7 @@ class AvatarCustomizationFragment :
this.adapter.userSize = user.preferences?.size
this.adapter.hairColor = user.preferences?.hair?.color
this.adapter.gemBalance = user.gemCount
this.adapter.avatar = user
adapter.notifyDataSetChanged()
}

View file

@ -288,7 +288,7 @@ class PurchaseDialog(context: Context, component: UserComponent?, val item: Shop
setLimitedTextView()
if (additionalContentView is PurchaseDialogBackgroundContent) {
(additionalContentView as PurchaseDialogBackgroundContent).setAvatar(userRepository.getUnmanagedCopy(user))
(additionalContentView as PurchaseDialogBackgroundContent).setAvatarWithBackgroundPreview(userRepository.getUnmanagedCopy(user), shopItem)
}
}

View file

@ -6,7 +6,9 @@ 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.AvatarView
import com.habitrpg.android.habitica.ui.views.PixelArtView
import java.util.*
class PurchaseDialogBackgroundContent(context: Context) : PurchaseDialogContent(context) {
val binding = PurchaseDialogBackgroundBinding.inflate(context.layoutInflater, this)
@ -20,7 +22,10 @@ class PurchaseDialogBackgroundContent(context: Context) : PurchaseDialogContent(
binding.notesTextView.text = item.notes
}
fun setAvatar(avatar: Avatar) {
binding.avatarView.setAvatar(avatar)
fun setAvatarWithBackgroundPreview(avatar: Avatar, item: ShopItem) {
val layerMap = EnumMap<AvatarView.LayerType, String>(AvatarView.LayerType::class.java)
layerMap[AvatarView.LayerType.BACKGROUND] = item.imageName
binding.avatarView.setAvatar(avatar, layerMap)
}
}

View file

@ -28,5 +28,6 @@ class PurchaseDialogCustomizationSetContent(context: Context) : PurchaseDialogCo
imageView.layoutParams = FlexboxLayout.LayoutParams(76.dpToPx(context), 76.dpToPx(context))
binding.imageViewWrapper.addView(imageView)
}
binding.notesTextView.text = item.notes
}
}

View file

@ -1,18 +0,0 @@
# Habitica Server Port
# local instance
# PORT=3000
PORT=80
# Genymotion
# BASE_URL=http://10.0.3.2:3000
# Android Emulator
# see: http://developer.android.com/tools/help/emulator.html#networkaddresses
# BASE_URL=http://10.0.2.2:3000
# Production
BASE_URL=https://habitica.com
STAGING_KEY=
ANDROID_TESTING_UUID=
APPLE_AUTH_CLIENT_ID=

View file

@ -1,4 +0,0 @@
fabric_key=CHANGE_ME
facebook_app_id=CHANGE_ME
amplitude_app_id=CHANGE_ME
application_ad_id=CHANGE_ME