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