diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index 27d232215..ad0c1e7db 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -277,6 +277,9 @@ + - \ No newline at end of file + diff --git a/Habitica/res/drawable/shop_limited.xml b/Habitica/res/drawable/shop_limited.xml new file mode 100644 index 000000000..5ecffe1d0 --- /dev/null +++ b/Habitica/res/drawable/shop_limited.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/Habitica/res/drawable/shop_locked.xml b/Habitica/res/drawable/shop_locked.xml index 59cfd6f02..22c200ab0 100644 --- a/Habitica/res/drawable/shop_locked.xml +++ b/Habitica/res/drawable/shop_locked.xml @@ -1,6 +1,6 @@ - + diff --git a/Habitica/res/drawable/shop_locked_limited.xml b/Habitica/res/drawable/shop_locked_limited.xml index 2005e5538..0cb35be30 100644 --- a/Habitica/res/drawable/shop_locked_limited.xml +++ b/Habitica/res/drawable/shop_locked_limited.xml @@ -1,6 +1,6 @@ - + diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index f9f8503a6..789459892 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -1526,6 +1526,7 @@ Rogues Warriors Mages + Customization Shop You diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarCustomizationFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarCustomizationFragment.kt index 82cac05fd..6e62cd836 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarCustomizationFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarCustomizationFragment.kt @@ -176,6 +176,8 @@ class ComposeAvatarCustomizationFragment : userRepository.useCustomization(type ?: "", category, activeCustomization ?: "") } else if (customization.identifier == activeCustomization && customization.type == "hair" && customization.category != "color") { userRepository.useCustomization(type ?: "", category, "0") + } else if (customization.identifier == activeCustomization && customization.type == "chair") { + userRepository.useCustomization(type ?: "", category, "none") } else if (customization.type == "background" && ownedCustomizations.value.firstOrNull { it.key == customization.identifier } == null) { userRepository.unlockPath(customization) userRepository.retrieveUser(false, true, true) @@ -357,7 +359,7 @@ class ComposeAvatarCustomizationFragment : "skin" -> prefs?.skin "shirt" -> prefs?.shirt "background" -> prefs?.background - "chair" -> prefs?.chair + "chair" -> prefs?.chair?.replace("chair_", "") "hair" -> when (this.category) { "bangs" -> prefs?.hair?.bangs.toString() @@ -519,7 +521,7 @@ private fun AvatarCustomizationView( } .background(colorResource(id = R.color.window_background)), ) { - if (item.identifier.isNullOrBlank() || item.identifier == "0") { + if (item.identifier.isNullOrBlank() || item.identifier == "0" || item.identifier == "none") { Image(painterResource(R.drawable.empty_slot), contentDescription = null, contentScale = ContentScale.None, modifier = Modifier.size(68.dp)) } else { PixelArtView( @@ -541,7 +543,7 @@ private fun AvatarCustomizationView( } } item(span = { GridItemSpan(3) }) { - EmptyFooter(type, items.size <= 1) + EmptyFooter(type, items.size > 1) } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarEquipmentFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarEquipmentFragment.kt index ec43c511e..13b5fb2fa 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarEquipmentFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/inventory/customization/ComposeAvatarEquipmentFragment.kt @@ -21,6 +21,7 @@ import androidx.compose.foundation.lazy.grid.GridItemSpan import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -38,8 +39,11 @@ import androidx.compose.ui.platform.rememberNestedScrollInteropConnection import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.withStyle import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.fragment.app.viewModels @@ -273,7 +277,7 @@ private fun AvatarEquipmentView( Image(painterResource(R.drawable.empty_slot), contentDescription = null, contentScale = ContentScale.None, modifier = Modifier.size(68.dp)) } else { PixelArtView( - imageName = "icon_" + item.key, + imageName = "shop_" + item.key, Modifier.size(68.dp), ) } @@ -291,7 +295,7 @@ private fun AvatarEquipmentView( } } item(span = { GridItemSpan(3) }) { - EmptyFooter(type, items.size <= 1) + EmptyFooter(type, items.size > 1) } } } @@ -318,13 +322,33 @@ internal fun EmptyFooter(type: String?, hasItems: Boolean) { stringResource(R.string.customizations_no_owned), fontSize = 16.sp, fontWeight = FontWeight.Bold, color = colorResource(R.color.text_secondary), modifier = Modifier.padding(bottom = 2.dp) ) - Text(stringResource(R.string.customization_shop_check_out), fontSize = 14.sp, color = colorResource(R.color.text_ternary), textAlign = TextAlign.Center) + Text(buildAnnotatedString { + val original = stringResource(id = R.string.customization_shop_check_out) + val customizationShopName = stringResource(id = R.string.customization_shop) + val first = original.substring(0, original.indexOf(customizationShopName)) + val second = original.substring(original.indexOf(customizationShopName) + customizationShopName.length, original.length) + append(first) + withStyle(SpanStyle(color = HabiticaTheme.colors.tintedUiMain)) { + append(customizationShopName) + } + append(second) + }, fontSize = 14.sp, fontWeight = FontWeight.Normal, color = colorResource(R.color.text_ternary), textAlign = TextAlign.Center) } else { Text( stringResource(R.string.looking_for_more), fontSize = 16.sp, fontWeight = FontWeight.Bold, color = colorResource(R.color.text_secondary), modifier = Modifier.padding(bottom = 2.dp) ) - Text(stringResource(R.string.customization_shop_more), fontSize = 14.sp, color = colorResource(R.color.text_ternary), textAlign = TextAlign.Center) + Text(buildAnnotatedString { + val original = stringResource(id = R.string.customization_shop_more) + val customizationShopName = stringResource(id = R.string.customization_shop) + val first = original.substring(0, original.indexOf(customizationShopName)) + val second = original.substring(original.indexOf(customizationShopName) + customizationShopName.length, original.length) + append(first) + withStyle(SpanStyle(color = HabiticaTheme.colors.tintedUiMain)) { + append(customizationShopName) + } + append(second) + }, fontSize = 14.sp, fontWeight = FontWeight.Normal, color = colorResource(R.color.text_ternary), textAlign = TextAlign.Center) } } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt index 602c67ffa..f101319d4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/ShopItemViewHolder.kt @@ -89,14 +89,9 @@ class ShopItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), Vi binding.itemDetailIndicator.visibility = View.VISIBLE } else if (isLimited) { if (numberOwned == 0) { - binding.itemDetailIndicator.background = - BitmapDrawable( - context.resources, - HabiticaIconsHelper.imageOfItemIndicatorLimited(), - ) + binding.itemDetailIndicator.background = AppCompatResources.getDrawable(context, R.drawable.shop_limited) } else { - binding.itemDetailIndicator.background = - AppCompatResources.getDrawable(context, R.drawable.pill_bg_purple_300) + binding.itemDetailIndicator.background = AppCompatResources.getDrawable(context, R.drawable.pill_bg_purple_300) } binding.itemDetailIndicator.visibility = View.VISIBLE } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaIcons.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaIcons.java index 358fdd5ee..0384edf2f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaIcons.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaIcons.java @@ -3522,143 +3522,6 @@ public class HabiticaIcons { canvas.restore(); } - - private static class CacheForItemIndicator { - private static final Paint paint = new Paint(); - private static final Paint shadowPaint = new Paint(); - private static final PaintCodeShadow shadow = new PaintCodeShadow(); - private static final RectF originalFrame = new RectF(0f, 0f, 28f, 28f); - private static final RectF resizedFrame = new RectF(); - private static final RectF oval2Rect = new RectF(); - private static final Path oval2Path = new Path(); - private static final RectF bezierRect = new RectF(); - private static final Path bezierPath = new Path(); - private static final RectF bezier2Rect = new RectF(); - private static final Path bezier2Path = new Path(); - private static final RectF symbolRect = new RectF(); - private static final RectF symbolTargetRect = new RectF(); - } - - public static void drawItemIndicator(Canvas canvas, int indicatorLocked, int lockColor, int indicatorLockedDark, int itemIndicatorColorBackground, boolean isLocked, boolean isLimited, boolean isDark) { - HabiticaIcons.drawItemIndicator(canvas, new RectF(0f, 0f, 28f, 28f), ResizingBehavior.AspectFit, indicatorLocked, lockColor, indicatorLockedDark, itemIndicatorColorBackground, isLocked, isLimited, isDark); - } - - public static void drawItemIndicator(Canvas canvas, RectF targetFrame, ResizingBehavior resizing, int indicatorLocked, int lockColor, int indicatorLockedDark, int itemIndicatorColorBackground, boolean isLocked, boolean isLimited, boolean isDark) { - // General Declarations - Paint paint = CacheForItemIndicator.paint; - - // Local Colors - int shadowTint = Color.argb(255, 26, 24, 29); - int fillColor39 = Color.argb(255, 189, 168, 255); - int strokeColor2 = Color.argb(255, 189, 168, 255); - int strokeColor = Color.argb(255, 97, 51, 180); - - // Local Shadows - PaintCodeShadow shadow = CacheForItemIndicator.shadow.get(PaintCodeColor.colorByChangingAlpha(shadowTint, (int) (Color.alpha(shadowTint) * 0.12f * 255f))); - - // Local Variables - int itemIndicatorColor = isLocked ? (isDark ? indicatorLockedDark : indicatorLocked) : (isLimited ? strokeColor : (isDark ? indicatorLockedDark : itemIndicatorColorBackground)); - - // Resize to Target Frame - canvas.save(); - RectF resizedFrame = CacheForItemIndicator.resizedFrame; - HabiticaIcons.resizingBehaviorApply(resizing, CacheForItemIndicator.originalFrame, targetFrame, resizedFrame); - canvas.translate(resizedFrame.left, resizedFrame.top); - canvas.scale(resizedFrame.width() / 28f, resizedFrame.height() / 28f); - - // Oval 2 - RectF oval2Rect = CacheForItemIndicator.oval2Rect; - oval2Rect.set(2f, 2f, 26f, 26f); - Path oval2Path = CacheForItemIndicator.oval2Path; - oval2Path.reset(); - oval2Path.addOval(oval2Rect, Path.Direction.CW); - - paint.reset(); - paint.setFlags(Paint.ANTI_ALIAS_FLAG); - canvas.saveLayerAlpha(null, 255, Canvas.ALL_SAVE_FLAG); - { - canvas.translate(shadow.dx, shadow.dy); - - Paint shadowPaint = CacheForItemIndicator.shadowPaint; - shadowPaint.set(paint); - shadow.setBlurOfPaint(shadowPaint); - canvas.drawPath(oval2Path, shadowPaint); - shadowPaint.setXfermode(GlobalCache.blendModeSourceIn); - canvas.saveLayer(null, shadowPaint, Canvas.ALL_SAVE_FLAG); - { - canvas.drawColor(shadow.color); - } - canvas.restore(); - } - canvas.restore(); - paint.setStyle(Paint.Style.FILL); - paint.setColor(itemIndicatorColor); - canvas.drawPath(oval2Path, paint); - - // Group 2 - if (isLimited) { - // Bezier - RectF bezierRect = CacheForItemIndicator.bezierRect; - bezierRect.set(6f, 6f, 22f, 22f); - Path bezierPath = CacheForItemIndicator.bezierPath; - bezierPath.reset(); - bezierPath.moveTo(14f, 6f); - bezierPath.cubicTo(9.58f, 6f, 6f, 9.58f, 6f, 14f); - bezierPath.cubicTo(6f, 18.42f, 9.58f, 22f, 14f, 22f); - bezierPath.cubicTo(18.42f, 22f, 22f, 18.42f, 22f, 14f); - bezierPath.cubicTo(22f, 9.58f, 18.42f, 6f, 14f, 6f); - bezierPath.close(); - bezierPath.moveTo(14f, 8f); - bezierPath.cubicTo(17.31f, 8f, 20f, 10.69f, 20f, 14f); - bezierPath.cubicTo(20f, 17.31f, 17.31f, 20f, 14f, 20f); - bezierPath.cubicTo(10.69f, 20f, 8f, 17.31f, 8f, 14f); - bezierPath.cubicTo(8f, 10.69f, 10.69f, 8f, 14f, 8f); - bezierPath.close(); - - paint.reset(); - paint.setFlags(Paint.ANTI_ALIAS_FLAG); - bezierPath.setFillType(Path.FillType.EVEN_ODD); - paint.setStyle(Paint.Style.FILL); - paint.setColor(fillColor39); - canvas.drawPath(bezierPath, paint); - - // Bezier 2 - RectF bezier2Rect = CacheForItemIndicator.bezier2Rect; - bezier2Rect.set(14f, 11f, 16f, 16f); - Path bezier2Path = CacheForItemIndicator.bezier2Path; - bezier2Path.reset(); - bezier2Path.moveTo(14f, 11f); - bezier2Path.lineTo(14f, 14.03f); - bezier2Path.lineTo(16f, 16f); - - paint.reset(); - paint.setFlags(Paint.ANTI_ALIAS_FLAG); - paint.setStrokeWidth(2f); - paint.setStrokeCap(Paint.Cap.ROUND); - paint.setStrokeMiter(10f); - canvas.save(); - paint.setStyle(Paint.Style.STROKE); - paint.setColor(strokeColor2); - canvas.drawPath(bezier2Path, paint); - canvas.restore(); - } - - // Symbol - if (isLocked) { - RectF symbolRect = CacheForItemIndicator.symbolRect; - symbolRect.set(9f, 7f, 19f, 19f); - canvas.save(); - canvas.clipRect(symbolRect); - canvas.translate(symbolRect.left, symbolRect.top); - RectF symbolTargetRect = CacheForItemIndicator.symbolTargetRect; - symbolTargetRect.set(0f, 0f, symbolRect.width(), symbolRect.height()); - HabiticaIcons.drawLocked(canvas, symbolTargetRect, ResizingBehavior.Stretch, lockColor); - canvas.restore(); - } - - canvas.restore(); - } - private static class CacheForWarriorLightBg { private static final RectF originalFrame = new RectF(0f, 0f, 32f, 32f); private static final RectF resizedFrame = new RectF(); diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaIconsHelper.java b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaIconsHelper.java index 25447c4fb..b056e2ca3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaIconsHelper.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaIconsHelper.java @@ -289,83 +289,6 @@ public class HabiticaIconsHelper { return imageOfUnpinItem; } - public static Bitmap imageOfItemIndicatorNumber(boolean isLimited) { - int size = scaleSize(28); - Bitmap imageOfItemIndicatorNumber = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(imageOfItemIndicatorNumber); - canvas.scale(displayDensity, displayDensity); - int lightColor = Color.parseColor("#A5A1AD"); - int darkColor = Color.parseColor("#525252"); - if (isLimited) { - lightColor = Color.parseColor("#6133B4"); - darkColor = Color.parseColor("#6133B4"); - } - HabiticaIcons.drawItemIndicator(canvas, lightColor, Color.parseColor("#C3C0C7"), darkColor, lightColor, false, false, false); - - return imageOfItemIndicatorNumber; - } - - public static Bitmap imageOfItemIndicatorNumberDark(boolean isLimited) { - int size = scaleSize(28); - Bitmap imageOfItemIndicatorNumberDark = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(imageOfItemIndicatorNumberDark); - canvas.scale(displayDensity, displayDensity); - int lightColor = Color.parseColor("#A5A1AD"); - int darkColor = Color.parseColor("#525252"); - if (isLimited) { - lightColor = Color.parseColor("#6133B4"); - darkColor = Color.parseColor("#6133B4"); - } - HabiticaIcons.drawItemIndicator(canvas, lightColor, Color.parseColor("#C3C0C7"), lightColor, darkColor, false, false, true); - - return imageOfItemIndicatorNumberDark; - } - - public static Bitmap imageOfItemIndicatorLocked(boolean isLimited) { - int size = scaleSize(28); - Bitmap imageOfItemIndicatorLocked = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(imageOfItemIndicatorLocked); - canvas.scale(displayDensity, displayDensity); - int lightColor = Color.parseColor("#EDECEE"); - int darkColor = Color.parseColor("#525252"); - if (isLimited) { - lightColor = Color.parseColor("#6133B4"); - darkColor = Color.parseColor("#6133B4"); - } - HabiticaIcons.drawItemIndicator(canvas, lightColor, Color.parseColor("#C3C0C7"), lightColor, darkColor, true, false, false); - return imageOfItemIndicatorLocked; - } - - public static Bitmap imageOfItemIndicatorLockedDark(boolean isLimited) { - int size = scaleSize(28); - Bitmap imageOfItemIndicatorLockedDark = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(imageOfItemIndicatorLockedDark); - canvas.scale(displayDensity, displayDensity); - int lightColor = Color.parseColor("#EDECEE"); - int darkColor = Color.parseColor("#525252"); - if (isLimited) { - lightColor = Color.parseColor("#6133B4"); - darkColor = Color.parseColor("#6133B4"); - } - HabiticaIcons.drawItemIndicator(canvas, lightColor, Color.parseColor("#C3C0C7"), lightColor, darkColor, true, false, true); - return imageOfItemIndicatorLockedDark; - } - - private static Bitmap imageOfItemIndicatorLimited = null; - - public static Bitmap imageOfItemIndicatorLimited() { - if (imageOfItemIndicatorLimited != null) - return imageOfItemIndicatorLimited; - - int size = scaleSize(28); - imageOfItemIndicatorLimited = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(imageOfItemIndicatorLimited); - canvas.scale(displayDensity, displayDensity); - HabiticaIcons.drawItemIndicator(canvas, Color.parseColor("#A5A1AD"), Color.parseColor("#C3C0C7"), Color.parseColor("#A5A1AD"), Color.parseColor("#525252"), false, true, false); - - return imageOfItemIndicatorLimited; - } - private static Bitmap imageOfGem_36 = null; public static Bitmap imageOfGem_36() { diff --git a/version.properties b/version.properties index c730b3e2b..b21d927e8 100644 --- a/version.properties +++ b/version.properties @@ -1,2 +1,2 @@ NAME=4.3.7 -CODE=7741 \ No newline at end of file +CODE=7781 \ No newline at end of file