diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/LevelUpUseCase.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/LevelUpUseCase.kt index 08223e653..996c907f8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/LevelUpUseCase.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/interactors/LevelUpUseCase.kt @@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.interactors import android.graphics.Bitmap import android.view.ViewGroup +import androidx.core.graphics.scale import com.habitrpg.android.habitica.R import com.habitrpg.android.habitica.databinding.DialogLevelup10Binding import com.habitrpg.android.habitica.helpers.SoundManager @@ -68,7 +69,7 @@ constructor( avatarView.setAvatar(requestValues.user) var sharedImage: Bitmap? = null avatarView.onAvatarImageReady { image -> - sharedImage = image + sharedImage = image?.scale(image.width * 3, image.height * 3, false) } val alert = HabiticaAlertDialog(requestValues.activity) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt index 16ceec178..786617a57 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/AvatarOverviewFragment.kt @@ -1,5 +1,6 @@ package com.habitrpg.android.habitica.ui.fragments.inventory.customization +import android.graphics.Bitmap import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -18,9 +19,11 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import androidx.core.graphics.scale import androidx.lifecycle.lifecycleScope import androidx.lifecycle.map import com.habitrpg.android.habitica.R @@ -28,13 +31,16 @@ import com.habitrpg.android.habitica.data.InventoryRepository import com.habitrpg.android.habitica.databinding.FragmentComposeScrollingBinding import com.habitrpg.android.habitica.helpers.MainNavigationController import com.habitrpg.android.habitica.models.inventory.Equipment +import com.habitrpg.android.habitica.ui.activities.BaseActivity import com.habitrpg.android.habitica.ui.fragments.BaseMainFragment import com.habitrpg.android.habitica.ui.theme.HabiticaTheme import com.habitrpg.android.habitica.ui.viewmodels.MainUserViewModel +import com.habitrpg.android.habitica.ui.views.HabiticaButton import com.habitrpg.android.habitica.ui.views.SegmentedControl import com.habitrpg.android.habitica.ui.views.equipment.AvatarCustomizationOverviewView import com.habitrpg.android.habitica.ui.views.equipment.EquipmentOverviewView import com.habitrpg.common.habitica.helpers.launchCatching +import com.habitrpg.common.habitica.views.AvatarView import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.firstOrNull import javax.inject.Inject @@ -88,6 +94,14 @@ open class AvatarOverviewFragment : }, { type, equipped, isCostume -> displayEquipmentFragment(type, equipped, isCostume) + }, { + val avatarView = AvatarView(requireActivity(), showBackground = true, showMount = true, showPet = true) + avatarView.layoutParams = ViewGroup.LayoutParams(140, 147) + userViewModel.user.value?.let { avatarView.setAvatar(it) } + avatarView.onAvatarImageReady { image -> + if (image == null) return@onAvatarImageReady + (requireActivity() as BaseActivity).shareContent("customization", "Look at my Avatar!", image.scale(image.width * 3, image.height * 3, false)) + } } ) } @@ -150,7 +164,8 @@ fun AvatarOverviewView( costumeTwoHanded: Boolean = false, onCustomizationTap: (String, String?) -> Unit, onAvatarEquipmentTap: (String, String?) -> Unit, - onEquipmentTap: (String, String?, Boolean) -> Unit + onEquipmentTap: (String, String?, Boolean) -> Unit, + onShareTap: () -> Unit ) { val user by userViewModel.user.observeAsState() Column( diff --git a/common/src/main/java/com/habitrpg/common/habitica/views/AvatarView.kt b/common/src/main/java/com/habitrpg/common/habitica/views/AvatarView.kt index 74cdcdcfd..2d0ace02f 100644 --- a/common/src/main/java/com/habitrpg/common/habitica/views/AvatarView.kt +++ b/common/src/main/java/com/habitrpg/common/habitica/views/AvatarView.kt @@ -8,6 +8,7 @@ import android.graphics.PointF import android.graphics.Rect import android.graphics.RectF import android.graphics.drawable.Animatable +import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import android.text.TextUtils import android.util.AttributeSet @@ -72,7 +73,9 @@ class AvatarView : FrameLayout { if (BuildConfig.DEBUG && (avatar == null || avatarRectF == null)) { error("Assertion failed") } - val canvasRect = Rect(0, 0, 140.dpToPx(context), 147.dpToPx(context)) + val viewWidth = if (width > 0) width else layoutParams.width + val viewHeight = if (height > 0) height else layoutParams.height + val canvasRect = Rect(0, 0, if (viewWidth > 0) viewWidth else 140.dpToPx(context), if (viewHeight > 0) viewHeight else 147.dpToPx(context)) if (canvasRect.isEmpty) return null avatarBitmap = Bitmap.createBitmap( canvasRect.width(), @@ -82,11 +85,11 @@ class AvatarView : FrameLayout { avatarBitmap?.let { avatarCanvas = Canvas(it) } imageViewHolder.forEach { val lp = it.layoutParams - val bitmap = it.drawable?.toBitmap(lp.width, lp.height) ?: return@forEach + val bitmap = (it.drawable as? BitmapDrawable)?.bitmap ?: return@forEach avatarCanvas?.drawBitmap( bitmap, Rect(0, 0, bitmap.width, bitmap.height), - Rect(it.marginStart, it.marginTop, bitmap.width, bitmap.height), + Rect(it.marginStart, it.marginTop, bitmap.width + it.marginStart, bitmap.height + it.marginTop), null ) } @@ -470,8 +473,10 @@ class AvatarView : FrameLayout { // full hero box when showMount and showPet is enabled (140w * 147h) // compact hero box when only showBackground is enabled (114w * 114h) // hero only box when all show settings disabled (90w * 90h) - val width = if (this.width > 0) this.width.toFloat() else 140.dpToPx(context).toFloat() - val height = if (this.height > 0) this.height.toFloat() else 147.dpToPx(context).toFloat() + val viewWidth = if (width > 0) width else layoutParams.width + val viewHeight = if (height > 0) height else layoutParams.height + val width = if (viewWidth > 0) viewWidth.toFloat() else 140.dpToPx(context).toFloat() + val height = if (viewHeight > 0) viewHeight.toFloat() else 147.dpToPx(context).toFloat() avatarRectF = RectF(0f, 0f, width, height) avatarMatrix.setRectToRect(RectF(srcRect), avatarRectF, Matrix.ScaleToFit.START) avatarRectF = RectF(srcRect)