diff --git a/Habitica/build.gradle b/Habitica/build.gradle
index 33c6bb63a..6354a298a 100644
--- a/Habitica/build.gradle
+++ b/Habitica/build.gradle
@@ -158,7 +158,7 @@ android {
multiDexEnabled true
resConfigs "en", "bg", "de", "en-rGB", "es", "fr", "hr-rHR", "in", "it", "iw", "ja", "ko", "lt", "nl", "pl", "pt-rBR", "pt-rPT", "ru", "tr", "zh", "zh-rTW"
- versionCode 2518
+ versionCode 2519
versionName "2.8"
}
@@ -343,4 +343,4 @@ gradle.projectsEvaluated {
check { findbugs { skip true } }
-apply plugin: 'com.google.gms.google-services'
+apply plugin: 'com.google.gms.google-services'
diff --git a/Habitica/res/drawable-hdpi/fall_promo_banner_left.png b/Habitica/res/drawable-hdpi/fall_promo_banner_left.png
new file mode 100644
index 000000000..8e83fdd90
Binary files /dev/null and b/Habitica/res/drawable-hdpi/fall_promo_banner_left.png differ
diff --git a/Habitica/res/drawable-hdpi/fall_promo_banner_right.png b/Habitica/res/drawable-hdpi/fall_promo_banner_right.png
new file mode 100644
index 000000000..28b0ecffb
Binary files /dev/null and b/Habitica/res/drawable-hdpi/fall_promo_banner_right.png differ
diff --git a/Habitica/res/drawable-hdpi/fall_promo_info_left.png b/Habitica/res/drawable-hdpi/fall_promo_info_left.png
new file mode 100644
index 000000000..8772724bb
Binary files /dev/null and b/Habitica/res/drawable-hdpi/fall_promo_info_left.png differ
diff --git a/Habitica/res/drawable-hdpi/fall_promo_info_right.png b/Habitica/res/drawable-hdpi/fall_promo_info_right.png
new file mode 100644
index 000000000..6ab19947a
Binary files /dev/null and b/Habitica/res/drawable-hdpi/fall_promo_info_right.png differ
diff --git a/Habitica/res/drawable-hdpi/fall_promo_menu_description.png b/Habitica/res/drawable-hdpi/fall_promo_menu_description.png
new file mode 100644
index 000000000..370bdd3b2
Binary files /dev/null and b/Habitica/res/drawable-hdpi/fall_promo_menu_description.png differ
diff --git a/Habitica/res/drawable-hdpi/fall_promo_menu_left.png b/Habitica/res/drawable-hdpi/fall_promo_menu_left.png
new file mode 100644
index 000000000..6ec4da8dc
Binary files /dev/null and b/Habitica/res/drawable-hdpi/fall_promo_menu_left.png differ
diff --git a/Habitica/res/drawable-hdpi/fall_promo_menu_right.png b/Habitica/res/drawable-hdpi/fall_promo_menu_right.png
new file mode 100644
index 000000000..abad530d3
Binary files /dev/null and b/Habitica/res/drawable-hdpi/fall_promo_menu_right.png differ
diff --git a/Habitica/res/drawable-hdpi/fall_promo_title.png b/Habitica/res/drawable-hdpi/fall_promo_title.png
new file mode 100644
index 000000000..b40e24797
Binary files /dev/null and b/Habitica/res/drawable-hdpi/fall_promo_title.png differ
diff --git a/Habitica/res/drawable-hdpi/spooky_promo_banner_left.png b/Habitica/res/drawable-hdpi/spooky_promo_banner_left.png
new file mode 100644
index 000000000..db8435123
Binary files /dev/null and b/Habitica/res/drawable-hdpi/spooky_promo_banner_left.png differ
diff --git a/Habitica/res/drawable-hdpi/spooky_promo_banner_right.png b/Habitica/res/drawable-hdpi/spooky_promo_banner_right.png
new file mode 100644
index 000000000..f68774775
Binary files /dev/null and b/Habitica/res/drawable-hdpi/spooky_promo_banner_right.png differ
diff --git a/Habitica/res/drawable-hdpi/spooky_promo_info_left.png b/Habitica/res/drawable-hdpi/spooky_promo_info_left.png
new file mode 100644
index 000000000..de312ddc3
Binary files /dev/null and b/Habitica/res/drawable-hdpi/spooky_promo_info_left.png differ
diff --git a/Habitica/res/drawable-hdpi/spooky_promo_info_right.png b/Habitica/res/drawable-hdpi/spooky_promo_info_right.png
new file mode 100644
index 000000000..079755167
Binary files /dev/null and b/Habitica/res/drawable-hdpi/spooky_promo_info_right.png differ
diff --git a/Habitica/res/drawable-hdpi/spooky_promo_menu_description.png b/Habitica/res/drawable-hdpi/spooky_promo_menu_description.png
new file mode 100644
index 000000000..2040d041d
Binary files /dev/null and b/Habitica/res/drawable-hdpi/spooky_promo_menu_description.png differ
diff --git a/Habitica/res/drawable-hdpi/spooky_promo_menu_left.png b/Habitica/res/drawable-hdpi/spooky_promo_menu_left.png
new file mode 100644
index 000000000..20f3f6701
Binary files /dev/null and b/Habitica/res/drawable-hdpi/spooky_promo_menu_left.png differ
diff --git a/Habitica/res/drawable-hdpi/spooky_promo_menu_right.png b/Habitica/res/drawable-hdpi/spooky_promo_menu_right.png
new file mode 100644
index 000000000..ce594f2a2
Binary files /dev/null and b/Habitica/res/drawable-hdpi/spooky_promo_menu_right.png differ
diff --git a/Habitica/res/drawable-hdpi/spooky_promo_title.png b/Habitica/res/drawable-hdpi/spooky_promo_title.png
new file mode 100644
index 000000000..f1180a2e1
Binary files /dev/null and b/Habitica/res/drawable-hdpi/spooky_promo_title.png differ
diff --git a/Habitica/res/drawable-mdpi/fall_promo_banner_left.png b/Habitica/res/drawable-mdpi/fall_promo_banner_left.png
new file mode 100644
index 000000000..414408951
Binary files /dev/null and b/Habitica/res/drawable-mdpi/fall_promo_banner_left.png differ
diff --git a/Habitica/res/drawable-mdpi/fall_promo_banner_right.png b/Habitica/res/drawable-mdpi/fall_promo_banner_right.png
new file mode 100644
index 000000000..7defbae39
Binary files /dev/null and b/Habitica/res/drawable-mdpi/fall_promo_banner_right.png differ
diff --git a/Habitica/res/drawable-mdpi/fall_promo_info_left.png b/Habitica/res/drawable-mdpi/fall_promo_info_left.png
new file mode 100644
index 000000000..275c90f4d
Binary files /dev/null and b/Habitica/res/drawable-mdpi/fall_promo_info_left.png differ
diff --git a/Habitica/res/drawable-mdpi/fall_promo_info_right.png b/Habitica/res/drawable-mdpi/fall_promo_info_right.png
new file mode 100644
index 000000000..3495b4324
Binary files /dev/null and b/Habitica/res/drawable-mdpi/fall_promo_info_right.png differ
diff --git a/Habitica/res/drawable-mdpi/fall_promo_menu_description.png b/Habitica/res/drawable-mdpi/fall_promo_menu_description.png
new file mode 100644
index 000000000..b6f706f07
Binary files /dev/null and b/Habitica/res/drawable-mdpi/fall_promo_menu_description.png differ
diff --git a/Habitica/res/drawable-mdpi/fall_promo_menu_left.png b/Habitica/res/drawable-mdpi/fall_promo_menu_left.png
new file mode 100644
index 000000000..24ec38709
Binary files /dev/null and b/Habitica/res/drawable-mdpi/fall_promo_menu_left.png differ
diff --git a/Habitica/res/drawable-mdpi/fall_promo_menu_right.png b/Habitica/res/drawable-mdpi/fall_promo_menu_right.png
new file mode 100644
index 000000000..c48d7f64a
Binary files /dev/null and b/Habitica/res/drawable-mdpi/fall_promo_menu_right.png differ
diff --git a/Habitica/res/drawable-mdpi/fall_promo_title.png b/Habitica/res/drawable-mdpi/fall_promo_title.png
new file mode 100644
index 000000000..4da0ed0c1
Binary files /dev/null and b/Habitica/res/drawable-mdpi/fall_promo_title.png differ
diff --git a/Habitica/res/drawable-mdpi/spooky_promo_banner_left.png b/Habitica/res/drawable-mdpi/spooky_promo_banner_left.png
new file mode 100644
index 000000000..d9fa9f196
Binary files /dev/null and b/Habitica/res/drawable-mdpi/spooky_promo_banner_left.png differ
diff --git a/Habitica/res/drawable-mdpi/spooky_promo_banner_right.png b/Habitica/res/drawable-mdpi/spooky_promo_banner_right.png
new file mode 100644
index 000000000..88bf906d1
Binary files /dev/null and b/Habitica/res/drawable-mdpi/spooky_promo_banner_right.png differ
diff --git a/Habitica/res/drawable-mdpi/spooky_promo_info_left.png b/Habitica/res/drawable-mdpi/spooky_promo_info_left.png
new file mode 100644
index 000000000..ab4713e1e
Binary files /dev/null and b/Habitica/res/drawable-mdpi/spooky_promo_info_left.png differ
diff --git a/Habitica/res/drawable-mdpi/spooky_promo_info_right.png b/Habitica/res/drawable-mdpi/spooky_promo_info_right.png
new file mode 100644
index 000000000..a35568caa
Binary files /dev/null and b/Habitica/res/drawable-mdpi/spooky_promo_info_right.png differ
diff --git a/Habitica/res/drawable-mdpi/spooky_promo_menu_description.png b/Habitica/res/drawable-mdpi/spooky_promo_menu_description.png
new file mode 100644
index 000000000..10b57e82c
Binary files /dev/null and b/Habitica/res/drawable-mdpi/spooky_promo_menu_description.png differ
diff --git a/Habitica/res/drawable-mdpi/spooky_promo_menu_left.png b/Habitica/res/drawable-mdpi/spooky_promo_menu_left.png
new file mode 100644
index 000000000..cb3e9ed9d
Binary files /dev/null and b/Habitica/res/drawable-mdpi/spooky_promo_menu_left.png differ
diff --git a/Habitica/res/drawable-mdpi/spooky_promo_menu_right.png b/Habitica/res/drawable-mdpi/spooky_promo_menu_right.png
new file mode 100644
index 000000000..7433ac13a
Binary files /dev/null and b/Habitica/res/drawable-mdpi/spooky_promo_menu_right.png differ
diff --git a/Habitica/res/drawable-mdpi/spooky_promo_title.png b/Habitica/res/drawable-mdpi/spooky_promo_title.png
new file mode 100644
index 000000000..9fa3c9091
Binary files /dev/null and b/Habitica/res/drawable-mdpi/spooky_promo_title.png differ
diff --git a/Habitica/res/drawable-xhdpi/fall_promo_banner_left.png b/Habitica/res/drawable-xhdpi/fall_promo_banner_left.png
new file mode 100644
index 000000000..87e0c75a4
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/fall_promo_banner_left.png differ
diff --git a/Habitica/res/drawable-xhdpi/fall_promo_banner_right.png b/Habitica/res/drawable-xhdpi/fall_promo_banner_right.png
new file mode 100644
index 000000000..c2f872188
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/fall_promo_banner_right.png differ
diff --git a/Habitica/res/drawable-xhdpi/fall_promo_info_left.png b/Habitica/res/drawable-xhdpi/fall_promo_info_left.png
new file mode 100644
index 000000000..2f9cc19f8
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/fall_promo_info_left.png differ
diff --git a/Habitica/res/drawable-xhdpi/fall_promo_info_right.png b/Habitica/res/drawable-xhdpi/fall_promo_info_right.png
new file mode 100644
index 000000000..ddf7e4b48
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/fall_promo_info_right.png differ
diff --git a/Habitica/res/drawable-xhdpi/fall_promo_menu_description.png b/Habitica/res/drawable-xhdpi/fall_promo_menu_description.png
new file mode 100644
index 000000000..34ecbf70b
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/fall_promo_menu_description.png differ
diff --git a/Habitica/res/drawable-xhdpi/fall_promo_menu_left.png b/Habitica/res/drawable-xhdpi/fall_promo_menu_left.png
new file mode 100644
index 000000000..95df4f33d
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/fall_promo_menu_left.png differ
diff --git a/Habitica/res/drawable-xhdpi/fall_promo_menu_right.png b/Habitica/res/drawable-xhdpi/fall_promo_menu_right.png
new file mode 100644
index 000000000..1e67c810e
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/fall_promo_menu_right.png differ
diff --git a/Habitica/res/drawable-xhdpi/fall_promo_title.png b/Habitica/res/drawable-xhdpi/fall_promo_title.png
new file mode 100644
index 000000000..74c8b1aed
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/fall_promo_title.png differ
diff --git a/Habitica/res/drawable-xhdpi/spooky_promo_banner_left.png b/Habitica/res/drawable-xhdpi/spooky_promo_banner_left.png
new file mode 100644
index 000000000..13fbcc665
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/spooky_promo_banner_left.png differ
diff --git a/Habitica/res/drawable-xhdpi/spooky_promo_banner_right.png b/Habitica/res/drawable-xhdpi/spooky_promo_banner_right.png
new file mode 100644
index 000000000..d12501bcf
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/spooky_promo_banner_right.png differ
diff --git a/Habitica/res/drawable-xhdpi/spooky_promo_info_left.png b/Habitica/res/drawable-xhdpi/spooky_promo_info_left.png
new file mode 100644
index 000000000..5eeef6f4b
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/spooky_promo_info_left.png differ
diff --git a/Habitica/res/drawable-xhdpi/spooky_promo_info_right.png b/Habitica/res/drawable-xhdpi/spooky_promo_info_right.png
new file mode 100644
index 000000000..f4c6ed2ec
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/spooky_promo_info_right.png differ
diff --git a/Habitica/res/drawable-xhdpi/spooky_promo_menu_description.png b/Habitica/res/drawable-xhdpi/spooky_promo_menu_description.png
new file mode 100644
index 000000000..ae8fe2255
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/spooky_promo_menu_description.png differ
diff --git a/Habitica/res/drawable-xhdpi/spooky_promo_menu_left.png b/Habitica/res/drawable-xhdpi/spooky_promo_menu_left.png
new file mode 100644
index 000000000..8fc41444e
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/spooky_promo_menu_left.png differ
diff --git a/Habitica/res/drawable-xhdpi/spooky_promo_menu_right.png b/Habitica/res/drawable-xhdpi/spooky_promo_menu_right.png
new file mode 100644
index 000000000..22537285c
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/spooky_promo_menu_right.png differ
diff --git a/Habitica/res/drawable-xhdpi/spooky_promo_title.png b/Habitica/res/drawable-xhdpi/spooky_promo_title.png
new file mode 100644
index 000000000..e9f5240ce
Binary files /dev/null and b/Habitica/res/drawable-xhdpi/spooky_promo_title.png differ
diff --git a/Habitica/res/drawable-xxhdpi/fall_promo_banner_left.png b/Habitica/res/drawable-xxhdpi/fall_promo_banner_left.png
new file mode 100644
index 000000000..3704c2892
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/fall_promo_banner_left.png differ
diff --git a/Habitica/res/drawable-xxhdpi/fall_promo_banner_right.png b/Habitica/res/drawable-xxhdpi/fall_promo_banner_right.png
new file mode 100644
index 000000000..f3a0cd6d4
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/fall_promo_banner_right.png differ
diff --git a/Habitica/res/drawable-xxhdpi/fall_promo_info_left.png b/Habitica/res/drawable-xxhdpi/fall_promo_info_left.png
new file mode 100644
index 000000000..d8ae78d59
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/fall_promo_info_left.png differ
diff --git a/Habitica/res/drawable-xxhdpi/fall_promo_info_right.png b/Habitica/res/drawable-xxhdpi/fall_promo_info_right.png
new file mode 100644
index 000000000..6268cd692
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/fall_promo_info_right.png differ
diff --git a/Habitica/res/drawable-xxhdpi/fall_promo_menu_description.png b/Habitica/res/drawable-xxhdpi/fall_promo_menu_description.png
new file mode 100644
index 000000000..3058fd388
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/fall_promo_menu_description.png differ
diff --git a/Habitica/res/drawable-xxhdpi/fall_promo_menu_left.png b/Habitica/res/drawable-xxhdpi/fall_promo_menu_left.png
new file mode 100644
index 000000000..91fd819fc
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/fall_promo_menu_left.png differ
diff --git a/Habitica/res/drawable-xxhdpi/fall_promo_menu_right.png b/Habitica/res/drawable-xxhdpi/fall_promo_menu_right.png
new file mode 100644
index 000000000..0ca3841b1
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/fall_promo_menu_right.png differ
diff --git a/Habitica/res/drawable-xxhdpi/fall_promo_title.png b/Habitica/res/drawable-xxhdpi/fall_promo_title.png
new file mode 100644
index 000000000..da17339d5
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/fall_promo_title.png differ
diff --git a/Habitica/res/drawable-xxhdpi/spooky_promo_banner_left.png b/Habitica/res/drawable-xxhdpi/spooky_promo_banner_left.png
new file mode 100644
index 000000000..228314828
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/spooky_promo_banner_left.png differ
diff --git a/Habitica/res/drawable-xxhdpi/spooky_promo_banner_right.png b/Habitica/res/drawable-xxhdpi/spooky_promo_banner_right.png
new file mode 100644
index 000000000..4e2f3bd0d
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/spooky_promo_banner_right.png differ
diff --git a/Habitica/res/drawable-xxhdpi/spooky_promo_info_left.png b/Habitica/res/drawable-xxhdpi/spooky_promo_info_left.png
new file mode 100644
index 000000000..51cd671c5
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/spooky_promo_info_left.png differ
diff --git a/Habitica/res/drawable-xxhdpi/spooky_promo_info_right.png b/Habitica/res/drawable-xxhdpi/spooky_promo_info_right.png
new file mode 100644
index 000000000..6edc965ae
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/spooky_promo_info_right.png differ
diff --git a/Habitica/res/drawable-xxhdpi/spooky_promo_menu_description.png b/Habitica/res/drawable-xxhdpi/spooky_promo_menu_description.png
new file mode 100644
index 000000000..923680608
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/spooky_promo_menu_description.png differ
diff --git a/Habitica/res/drawable-xxhdpi/spooky_promo_menu_left.png b/Habitica/res/drawable-xxhdpi/spooky_promo_menu_left.png
new file mode 100644
index 000000000..60d6b65aa
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/spooky_promo_menu_left.png differ
diff --git a/Habitica/res/drawable-xxhdpi/spooky_promo_menu_right.png b/Habitica/res/drawable-xxhdpi/spooky_promo_menu_right.png
new file mode 100644
index 000000000..6d52f5a23
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/spooky_promo_menu_right.png differ
diff --git a/Habitica/res/drawable-xxhdpi/spooky_promo_title.png b/Habitica/res/drawable-xxhdpi/spooky_promo_title.png
new file mode 100644
index 000000000..c3f447cda
Binary files /dev/null and b/Habitica/res/drawable-xxhdpi/spooky_promo_title.png differ
diff --git a/Habitica/res/drawable-xxxhdpi/fall_promo_banner_left.png b/Habitica/res/drawable-xxxhdpi/fall_promo_banner_left.png
new file mode 100644
index 000000000..a68427b7c
Binary files /dev/null and b/Habitica/res/drawable-xxxhdpi/fall_promo_banner_left.png differ
diff --git a/Habitica/res/drawable-xxxhdpi/fall_promo_banner_right.png b/Habitica/res/drawable-xxxhdpi/fall_promo_banner_right.png
new file mode 100644
index 000000000..4b539b402
Binary files /dev/null and b/Habitica/res/drawable-xxxhdpi/fall_promo_banner_right.png differ
diff --git a/Habitica/res/drawable-xxxhdpi/fall_promo_info_left.png b/Habitica/res/drawable-xxxhdpi/fall_promo_info_left.png
new file mode 100644
index 000000000..86d729aa5
Binary files /dev/null and b/Habitica/res/drawable-xxxhdpi/fall_promo_info_left.png differ
diff --git a/Habitica/res/drawable-xxxhdpi/fall_promo_info_right.png b/Habitica/res/drawable-xxxhdpi/fall_promo_info_right.png
new file mode 100644
index 000000000..3f028870c
Binary files /dev/null and b/Habitica/res/drawable-xxxhdpi/fall_promo_info_right.png differ
diff --git a/Habitica/res/drawable-xxxhdpi/fall_promo_menu_description.png b/Habitica/res/drawable-xxxhdpi/fall_promo_menu_description.png
new file mode 100644
index 000000000..01aa6e2a8
Binary files /dev/null and b/Habitica/res/drawable-xxxhdpi/fall_promo_menu_description.png differ
diff --git a/Habitica/res/drawable-xxxhdpi/fall_promo_menu_left.png b/Habitica/res/drawable-xxxhdpi/fall_promo_menu_left.png
new file mode 100644
index 000000000..8657d3b72
Binary files /dev/null and b/Habitica/res/drawable-xxxhdpi/fall_promo_menu_left.png differ
diff --git a/Habitica/res/drawable-xxxhdpi/fall_promo_menu_right.png b/Habitica/res/drawable-xxxhdpi/fall_promo_menu_right.png
new file mode 100644
index 000000000..63b434730
Binary files /dev/null and b/Habitica/res/drawable-xxxhdpi/fall_promo_menu_right.png differ
diff --git a/Habitica/res/drawable-xxxhdpi/fall_promo_title.png b/Habitica/res/drawable-xxxhdpi/fall_promo_title.png
new file mode 100644
index 000000000..18a5b7be0
Binary files /dev/null and b/Habitica/res/drawable-xxxhdpi/fall_promo_title.png differ
diff --git a/Habitica/res/drawable-xxxhdpi/spooky_promo_banner_left.png b/Habitica/res/drawable-xxxhdpi/spooky_promo_banner_left.png
new file mode 100644
index 000000000..389ccb89d
Binary files /dev/null and b/Habitica/res/drawable-xxxhdpi/spooky_promo_banner_left.png differ
diff --git a/Habitica/res/drawable-xxxhdpi/spooky_promo_banner_right.png b/Habitica/res/drawable-xxxhdpi/spooky_promo_banner_right.png
new file mode 100644
index 000000000..f6d74941b
Binary files /dev/null and b/Habitica/res/drawable-xxxhdpi/spooky_promo_banner_right.png differ
diff --git a/Habitica/res/drawable-xxxhdpi/spooky_promo_info_left.png b/Habitica/res/drawable-xxxhdpi/spooky_promo_info_left.png
new file mode 100644
index 000000000..b5a335104
Binary files /dev/null and b/Habitica/res/drawable-xxxhdpi/spooky_promo_info_left.png differ
diff --git a/Habitica/res/drawable-xxxhdpi/spooky_promo_info_right.png b/Habitica/res/drawable-xxxhdpi/spooky_promo_info_right.png
new file mode 100644
index 000000000..63034541c
Binary files /dev/null and b/Habitica/res/drawable-xxxhdpi/spooky_promo_info_right.png differ
diff --git a/Habitica/res/drawable-xxxhdpi/spooky_promo_menu_description.png b/Habitica/res/drawable-xxxhdpi/spooky_promo_menu_description.png
new file mode 100644
index 000000000..e44dddbb6
Binary files /dev/null and b/Habitica/res/drawable-xxxhdpi/spooky_promo_menu_description.png differ
diff --git a/Habitica/res/drawable-xxxhdpi/spooky_promo_menu_left.png b/Habitica/res/drawable-xxxhdpi/spooky_promo_menu_left.png
new file mode 100644
index 000000000..9b8cd0aec
Binary files /dev/null and b/Habitica/res/drawable-xxxhdpi/spooky_promo_menu_left.png differ
diff --git a/Habitica/res/drawable-xxxhdpi/spooky_promo_menu_right.png b/Habitica/res/drawable-xxxhdpi/spooky_promo_menu_right.png
new file mode 100644
index 000000000..fae2bfae6
Binary files /dev/null and b/Habitica/res/drawable-xxxhdpi/spooky_promo_menu_right.png differ
diff --git a/Habitica/res/drawable-xxxhdpi/spooky_promo_title.png b/Habitica/res/drawable-xxxhdpi/spooky_promo_title.png
new file mode 100644
index 000000000..16b63d262
Binary files /dev/null and b/Habitica/res/drawable-xxxhdpi/spooky_promo_title.png differ
diff --git a/Habitica/res/drawable/fall_promo_button_bg.xml b/Habitica/res/drawable/fall_promo_button_bg.xml
new file mode 100644
index 000000000..8eb8143e7
--- /dev/null
+++ b/Habitica/res/drawable/fall_promo_button_bg.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/drawable/fall_promo_pill_bg.xml b/Habitica/res/drawable/fall_promo_pill_bg.xml
new file mode 100644
index 000000000..778233819
--- /dev/null
+++ b/Habitica/res/drawable/fall_promo_pill_bg.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/drawable/layout_rounded_bg_gray_1.xml b/Habitica/res/drawable/layout_rounded_bg_gray_1.xml
new file mode 100644
index 000000000..d20820b88
--- /dev/null
+++ b/Habitica/res/drawable/layout_rounded_bg_gray_1.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/drawable/spooky_promo_button_bg.xml b/Habitica/res/drawable/spooky_promo_button_bg.xml
new file mode 100644
index 000000000..4328a4de7
--- /dev/null
+++ b/Habitica/res/drawable/spooky_promo_button_bg.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/drawable/spooky_promo_pill_bg.xml b/Habitica/res/drawable/spooky_promo_pill_bg.xml
new file mode 100644
index 000000000..008272b58
--- /dev/null
+++ b/Habitica/res/drawable/spooky_promo_pill_bg.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/fragment_gem_purchase.xml b/Habitica/res/layout/fragment_gem_purchase.xml
index b921b3cac..2b49b5aca 100644
--- a/Habitica/res/layout/fragment_gem_purchase.xml
+++ b/Habitica/res/layout/fragment_gem_purchase.xml
@@ -49,6 +49,61 @@
android:layout_marginBottom="12dp"
android:layout_centerInParent="true"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/promo_menu.xml b/Habitica/res/layout/promo_menu.xml
new file mode 100644
index 000000000..e5d943f1d
--- /dev/null
+++ b/Habitica/res/layout/promo_menu.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/layout/purchase_gem_view.xml b/Habitica/res/layout/purchase_gem_view.xml
index 98da8d6f6..b02ee12fd 100644
--- a/Habitica/res/layout/purchase_gem_view.xml
+++ b/Habitica/res/layout/purchase_gem_view.xml
@@ -15,16 +15,28 @@
android:contentDescription="@string/gems"
android:layout_marginTop="20dp"/>
+
+
+
+
\ No newline at end of file
diff --git a/Habitica/res/navigation/navigation.xml b/Habitica/res/navigation/navigation.xml
index a8f2bfbbc..4a3af252c 100644
--- a/Habitica/res/navigation/navigation.xml
+++ b/Habitica/res/navigation/navigation.xml
@@ -431,4 +431,8 @@
android:id="@+id/adventureGuideActivity"
android:name="com.habitrpg.android.habitica.ui.activities.AdventureGuideActivity"
android:label="" />
+
\ No newline at end of file
diff --git a/Habitica/res/values/colors.xml b/Habitica/res/values/colors.xml
index f7db6cabc..2239551b5 100644
--- a/Habitica/res/values/colors.xml
+++ b/Habitica/res/values/colors.xml
@@ -56,6 +56,7 @@
#217AA6
+ #1A181D
#34313a
#4e4a57
#686274
diff --git a/Habitica/res/values/dimens.xml b/Habitica/res/values/dimens.xml
index 222be44ee..d043d5668 100644
--- a/Habitica/res/values/dimens.xml
+++ b/Habitica/res/values/dimens.xml
@@ -86,7 +86,7 @@
40dp
56dp
16dp
- 6dp
+ 8dp
18dp
21dp
6dp
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index ac03ad0b2..42bc04bfd 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -1092,4 +1092,15 @@
Disable Private Messages
Private Messages are disabled
You can still send messages, but no one can send them to you. You can enable again from Settings.
+ Usually %d Gems
+ %s to %s
+ How it works
+ Limitations
+ Between September 22nd and 30th, simply purchase any Gem bundle like usual and your account will be credited with the promotional amount of Gems. More Gems to spend, share, or save for any future releases!
+ This promotion only applies during the limited time event. This event starts on September 22nd at 8:00 AM EDT (12:00 UTC) and will end September 30th at 8:00 PM EDT (00:00 UTC). The promo offer is only available when buying Gems for yourself.
+ The Fall Gala is in full swing so we thought it was the perfect time to introduce our first ever Gem Sale! Now you will get more Gems with each purchase than ever before.
+ View Gem Bundles
+ Between October 29th and November 2nd, simply purchase any Gem bundle like usual and your account will be credited with the promotional amount of Gems. More Gems to spend, share, or save for any future releases!
+ This promotion only applies during the limited time event. This event starts on October 29th at 8:00 AM EDT (12:00 UTC) and will end November 2nd at 8:00 PM EDT (00:00 UTC). The promo offer is only available when buying Gems for yourself.
+ The Gem Sale is back to haunt the very end of this year’s Fall Gala! This is one last chance to get more Gems than ever, so stock up while it lasts!
diff --git a/Habitica/res/xml/remote_config_defaults.xml b/Habitica/res/xml/remote_config_defaults.xml
index 47ecea4e3..6b62b8d07 100644
--- a/Habitica/res/xml/remote_config_defaults.xml
+++ b/Habitica/res/xml/remote_config_defaults.xml
@@ -92,5 +92,9 @@
enableAdventureGuide
false
+
+ activePromo
+
+
\ No newline at end of file
diff --git a/Habitica/src/main/assets/HelveticaNeue.ttc b/Habitica/src/main/assets/HelveticaNeue.ttc
new file mode 100644
index 000000000..f3117ee70
Binary files /dev/null and b/Habitica/src/main/assets/HelveticaNeue.ttc differ
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.java b/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.java
index 91b6cab22..eecab8eb6 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.java
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/components/UserComponent.java
@@ -45,6 +45,7 @@ import com.habitrpg.android.habitica.ui.fragments.AboutFragment;
import com.habitrpg.android.habitica.ui.fragments.AchievementsFragment;
import com.habitrpg.android.habitica.ui.fragments.NavigationDrawerFragment;
import com.habitrpg.android.habitica.ui.fragments.NewsFragment;
+import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment;
import com.habitrpg.android.habitica.ui.fragments.StatsFragment;
import com.habitrpg.android.habitica.ui.fragments.inventory.customization.AvatarCustomizationFragment;
import com.habitrpg.android.habitica.ui.fragments.inventory.customization.AvatarEquipmentFragment;
@@ -343,4 +344,6 @@ public interface UserComponent {
void inject(@NotNull FAQDetailFragment faqDetailFragment);
void inject(@NotNull AdventureGuideActivity adventureGuideFragment);
+
+ void inject(@NotNull PromoInfoFragment promoInfoFragment);
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Date-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Date-Extensions.kt
index 3fb4b3e5d..9c81d4da3 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Date-Extensions.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Date-Extensions.kt
@@ -15,6 +15,18 @@ class DateUtils {
fun hoursInMs(hours: Int): Int {
return hours * minutesInMs(60)
}
+
+ fun createDate(year: Int, month: Int, day: Int): Date {
+ val cal = Calendar.getInstance()
+ cal.set(Calendar.YEAR, year)
+ cal.set(Calendar.MONTH, month)
+ cal.set(Calendar.DAY_OF_MONTH, day)
+ cal.set(Calendar.HOUR_OF_DAY, 0)
+ cal.set(Calendar.MINUTE, 0)
+ cal.set(Calendar.SECOND, 0)
+ cal.set(Calendar.MILLISECOND, 0)
+ return cal.time
+ }
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt
index 6a18d7bb3..7b52165cf 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/helpers/AppConfigManager.kt
@@ -6,6 +6,8 @@ import com.google.firebase.remoteconfig.FirebaseRemoteConfig
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.habitrpg.android.habitica.BuildConfig
+import com.habitrpg.android.habitica.models.promotions.HabiticaPromotion
+import com.habitrpg.android.habitica.models.promotions.getHabiticaPromotionFromKey
import java.util.*
class AppConfigManager {
@@ -105,4 +107,12 @@ class AppConfigManager {
fun enableAdventureGuide(): Boolean {
return remoteConfig.getBoolean("enableAdventureGuide")
}
+
+ fun activePromo(): HabiticaPromotion? {
+ val key = remoteConfig.getString("activePromo")
+ if (key.isNotBlank()) {
+ return getHabiticaPromotionFromKey(key)
+ }
+ return null
+ }
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/FallExtraGemsHabiticaPromotion.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/FallExtraGemsHabiticaPromotion.kt
new file mode 100644
index 000000000..59987f68f
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/FallExtraGemsHabiticaPromotion.kt
@@ -0,0 +1,141 @@
+package com.habitrpg.android.habitica.models.promotions
+
+import android.content.Context
+import android.graphics.Color
+import android.graphics.drawable.BitmapDrawable
+import android.graphics.drawable.Drawable
+import android.graphics.drawable.ShapeDrawable
+import android.view.View
+import androidx.core.content.ContextCompat
+import com.habitrpg.android.habitica.R
+import com.habitrpg.android.habitica.databinding.FragmentGemPurchaseBinding
+import com.habitrpg.android.habitica.databinding.PurchaseGemViewBinding
+import com.habitrpg.android.habitica.extensions.DateUtils
+import com.habitrpg.android.habitica.helpers.MainNavigationController
+import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment
+import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
+import com.habitrpg.android.habitica.ui.views.promo.PromoMenuView
+import java.text.SimpleDateFormat
+import java.util.*
+
+class FallExtraGemsHabiticaPromotion: HabiticaPromotion() {
+ override val identifier: String
+ get() = "fall_extra_gems"
+ override val promoType: PromoType
+ get() = PromoType.GEMS_AMOUNT
+ override val startDate: Date
+ get() = DateUtils.createDate(2020, 9, 22)
+ override val endDate: Date
+ get() = DateUtils.createDate(2020, 9, 30)
+
+ override fun pillBackgroundDrawable(context: Context): Drawable {
+ return ContextCompat.getDrawable(context, R.drawable.fall_promo_pill_bg) ?: ShapeDrawable()
+ }
+
+ override fun backgroundColor(context: Context): Int {
+ return ContextCompat.getColor(context, R.color.gray_10)
+ }
+
+ override fun promoBackgroundDrawable(context: Context): Drawable {
+ return ContextCompat.getDrawable(context, R.drawable.layout_rounded_bg_gray_10)
+ ?: ShapeDrawable()
+ }
+
+ override fun buttonDrawable(context: Context): Drawable {
+ return ContextCompat.getDrawable(context, R.drawable.fall_promo_button_bg)
+ ?: ShapeDrawable()
+ }
+
+ override fun configurePromoMenuView(view: PromoMenuView) {
+ val context = view.context
+ view.setBackgroundColor(backgroundColor(context))
+ view.setTitleImage(ContextCompat.getDrawable(context, R.drawable.fall_promo_title))
+ view.setTitleText(null)
+ view.setSubtitleImage(ContextCompat.getDrawable(context, R.drawable.fall_promo_menu_description))
+ view.setSubtitleText(null)
+
+ view.setDecoration(
+ ContextCompat.getDrawable(context, R.drawable.fall_promo_menu_left),
+ ContextCompat.getDrawable(context, R.drawable.fall_promo_menu_right)
+ )
+
+ view.binding.button.background = ContextCompat.getDrawable(context, R.drawable.layout_rounded_bg_gray_1)
+ view.binding.button.setText(R.string.learn_more)
+ view.binding.button.setTextColor(ContextCompat.getColor(context, R.color.white))
+ view.binding.button.setOnClickListener {
+ menuOnNavigation(context)
+ }
+ }
+
+ override fun menuOnNavigation(context: Context) {
+ MainNavigationController.navigate(R.id.promoInfoFragment)
+ }
+
+ override fun configurePurchaseBanner(binding: FragmentGemPurchaseBinding) {
+ val context = binding.root.context
+ binding.promoBanner.visibility = View.VISIBLE
+ binding.promoBanner.background = promoBackgroundDrawable(context)
+ binding.promoBannerLeftImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.fall_promo_banner_left))
+ binding.promoBannerRightImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.fall_promo_banner_right))
+ binding.promoBannerTitleImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.fall_promo_title))
+ val formatter = SimpleDateFormat("MMM d", Locale.getDefault())
+ binding.promoBannerDurationView.text = context.getString(R.string.x_to_y,
+ formatter.format(startDate),
+ formatter.format(endDate))
+ binding.promoBannerDurationView.setTextColor(Color.parseColor("#FEE2B6"))
+ }
+
+ override fun configureGemView(binding: PurchaseGemViewBinding, regularAmount: Int) {
+ val context = binding.root.context
+ binding.root.background = promoBackgroundDrawable(context)
+ binding.purchaseButton.background = buttonDrawable(context)
+ val colors = listOf(
+ ContextCompat.getColor(context, R.color.red_10),
+ ContextCompat.getColor(context, R.color.blue_50),
+ ContextCompat.getColor(context, R.color.green_50),
+ ContextCompat.getColor(context, R.color.brand_300)
+ ).shuffled()
+ binding.amountBackground.background = BitmapDrawable(context.resources,
+ HabiticaIconsHelper.imageOfFallGemPromoBG(
+ colors[0],
+ colors[1],
+ colors[2],
+ colors[3]
+ ))
+ binding.gemAmount.setTextColor(Color.parseColor("#FEE2B6"))
+ binding.gemsTextView.setTextColor(Color.parseColor("#FEE2B6"))
+ binding.footerTextView.visibility = View.VISIBLE
+ binding.footerTextView.text = context.getString(R.string.usually_x_gems, regularAmount)
+ binding.gemAmount.text = when (regularAmount) {
+ 4 -> "5"
+ 21 -> "30"
+ 42 -> "60"
+ 84 -> "125"
+ else -> regularAmount.toString()
+ }
+ }
+
+ override fun configureInfoFragment(fragment: PromoInfoFragment) {
+ val context = fragment.context ?: return
+ fragment.binding.promoBanner.background = promoBackgroundDrawable(context)
+ fragment.binding.promoBannerLeftImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.fall_promo_info_left))
+ fragment.binding.promoBannerRightImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.fall_promo_info_right))
+ fragment.binding.promoBannerTitleImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.fall_promo_title))
+ fragment.binding.promoBannerSubtitleView.setText(R.string.limited_event)
+ fragment.binding.promoBannerDurationView.setTextColor(Color.parseColor("#FEE2B6"))
+ val formatter = SimpleDateFormat("MMM d", Locale.getDefault())
+ fragment.binding.promoBannerDurationView.text = context.getString(R.string.x_to_y,
+ formatter.format(startDate),
+ formatter.format(endDate))
+ fragment.binding.promoBannerDurationView.setTextColor(ContextCompat.getColor(context, R.color.white))
+ fragment.binding.promptText.setText(R.string.fall_promo_info_prompt)
+ fragment.binding.promptText.setTextColor(Color.parseColor("#F78E2F"))
+ fragment.binding.promptButton.background = buttonDrawable(context)
+ fragment.binding.promptButton.setText(R.string.view_gem_bundles)
+ fragment.binding.promptButton.setTextColor(ContextCompat.getColor(context, R.color.white))
+ fragment.binding.promptButton.setOnClickListener { MainNavigationController.navigate(R.id.gemPurchaseActivity) }
+
+ fragment.binding.instructionDescriptionView.setText(R.string.fall_promo_info_instructions)
+ fragment.binding.limitationsDescriptionView.setText(R.string.fall_promo_info_limitations)
+ }
+}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/HabiticaPromotion.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/HabiticaPromotion.kt
new file mode 100644
index 000000000..79d60e96e
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/HabiticaPromotion.kt
@@ -0,0 +1,46 @@
+package com.habitrpg.android.habitica.models.promotions
+
+import android.content.Context
+import android.graphics.drawable.Drawable
+import com.habitrpg.android.habitica.databinding.FragmentGemPurchaseBinding
+import com.habitrpg.android.habitica.databinding.PurchaseGemViewBinding
+import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment
+import com.habitrpg.android.habitica.ui.views.promo.PromoMenuView
+import java.util.*
+
+enum class PromoType {
+ GEMS_AMOUNT,
+ GEMS_PRICE,
+ SUBSCRIPTION
+}
+
+abstract class HabiticaPromotion {
+ abstract val identifier: String
+ abstract val promoType: PromoType
+
+ abstract val startDate: Date
+ abstract val endDate: Date
+
+ abstract fun pillBackgroundDrawable(context: Context): Drawable
+ abstract fun backgroundColor(context: Context): Int
+ abstract fun promoBackgroundDrawable(context: Context): Drawable
+
+ abstract fun buttonDrawable(context: Context): Drawable
+
+ abstract fun configurePromoMenuView(view: PromoMenuView)
+ abstract fun menuOnNavigation(context: Context)
+
+ abstract fun configurePurchaseBanner(binding: FragmentGemPurchaseBinding)
+
+ abstract fun configureGemView(binding: PurchaseGemViewBinding, regularAmount: Int)
+ abstract fun configureInfoFragment(fragment: PromoInfoFragment)
+}
+
+fun getHabiticaPromotionFromKey(key: String): HabiticaPromotion? {
+ return when (key) {
+ "fall_extra_gems" -> FallExtraGemsHabiticaPromotion()
+ "spooky_extra_gems" -> SpookyExtraGemsHabiticaPromotion()
+ else -> null
+ }
+}
+
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/SpookyExtraGemsHabiticaPromo.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/SpookyExtraGemsHabiticaPromo.kt
new file mode 100644
index 000000000..b5b514d83
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/promotions/SpookyExtraGemsHabiticaPromo.kt
@@ -0,0 +1,130 @@
+package com.habitrpg.android.habitica.models.promotions
+
+import android.content.Context
+import android.graphics.Color
+import android.graphics.drawable.BitmapDrawable
+import android.graphics.drawable.Drawable
+import android.graphics.drawable.ShapeDrawable
+import android.view.View
+import androidx.core.content.ContextCompat
+import com.habitrpg.android.habitica.R
+import com.habitrpg.android.habitica.databinding.FragmentGemPurchaseBinding
+import com.habitrpg.android.habitica.databinding.PurchaseGemViewBinding
+import com.habitrpg.android.habitica.extensions.DateUtils
+import com.habitrpg.android.habitica.helpers.MainNavigationController
+import com.habitrpg.android.habitica.ui.fragments.PromoInfoFragment
+import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
+import com.habitrpg.android.habitica.ui.views.promo.PromoMenuView
+import java.text.SimpleDateFormat
+import java.util.*
+
+class SpookyExtraGemsHabiticaPromotion: HabiticaPromotion() {
+ override val identifier: String
+ get() = "spooky_extra_gems"
+ override val promoType: PromoType
+ get() = PromoType.GEMS_AMOUNT
+ override val startDate: Date
+ get() = DateUtils.createDate(2020, 10, 29)
+ override val endDate: Date
+ get() = DateUtils.createDate(2020, 11, 2)
+
+ override fun pillBackgroundDrawable(context: Context): Drawable {
+ return ContextCompat.getDrawable(context, R.drawable.spooky_promo_pill_bg) ?: ShapeDrawable()
+ }
+
+ override fun backgroundColor(context: Context): Int {
+ return ContextCompat.getColor(context, R.color.gray_1)
+ }
+
+ override fun promoBackgroundDrawable(context: Context): Drawable {
+ return ContextCompat.getDrawable(context, R.drawable.layout_rounded_bg_gray_1)
+ ?: ShapeDrawable()
+ }
+
+ override fun buttonDrawable(context: Context): Drawable {
+ return ContextCompat.getDrawable(context, R.drawable.spooky_promo_button_bg)
+ ?: ShapeDrawable()
+ }
+
+ override fun configurePromoMenuView(view: PromoMenuView) {
+ val context = view.context
+ view.setBackgroundColor(backgroundColor(context))
+ view.setTitleImage(ContextCompat.getDrawable(context, R.drawable.spooky_promo_title))
+ view.setTitleText(null)
+ view.setSubtitleImage(ContextCompat.getDrawable(context, R.drawable.spooky_promo_menu_description))
+ view.setSubtitleText(null)
+
+ view.setDecoration(
+ ContextCompat.getDrawable(context, R.drawable.spooky_promo_menu_left),
+ ContextCompat.getDrawable(context, R.drawable.spooky_promo_menu_right)
+ )
+
+ view.binding.button.background = ContextCompat.getDrawable(context, R.drawable.layout_rounded_bg_gray_10)
+ view.binding.button.setText(R.string.learn_more)
+ view.binding.button.setTextColor(ContextCompat.getColor(context, R.color.white))
+ view.binding.button.setOnClickListener {
+ menuOnNavigation(context)
+ }
+ }
+
+ override fun menuOnNavigation(context: Context) {
+ MainNavigationController.navigate(R.id.promoInfoFragment)
+ }
+
+ override fun configurePurchaseBanner(binding: FragmentGemPurchaseBinding) {
+ val context = binding.root.context
+ binding.promoBanner.visibility = View.VISIBLE
+ binding.promoBanner.background = promoBackgroundDrawable(context)
+ binding.promoBannerLeftImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.spooky_promo_banner_left))
+ binding.promoBannerRightImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.spooky_promo_banner_right))
+ binding.promoBannerTitleImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.spooky_promo_title))
+ val formatter = SimpleDateFormat("MMM d", Locale.getDefault())
+ binding.promoBannerDurationView.text = context.getString(R.string.x_to_y,
+ formatter.format(startDate),
+ formatter.format(endDate))
+ binding.promoBannerDurationView.setTextColor(ContextCompat.getColor(context, R.color.white))
+ }
+
+ override fun configureGemView(binding: PurchaseGemViewBinding, regularAmount: Int) {
+ val context = binding.root.context
+ binding.root.background = promoBackgroundDrawable(context)
+ binding.purchaseButton.background = buttonDrawable(context)
+ binding.amountBackground.background = BitmapDrawable(context.resources,
+ HabiticaIconsHelper.imageOfSpookyGemPromoBG())
+ binding.gemAmount.setTextColor(Color.parseColor("#FEE2B6"))
+ binding.gemsTextView.setTextColor(Color.parseColor("#FEE2B6"))
+ binding.footerTextView.visibility = View.VISIBLE
+ binding.footerTextView.text = context.getString(R.string.usually_x_gems, regularAmount)
+ binding.gemAmount.text = when (regularAmount) {
+ 4 -> "5"
+ 21 -> "30"
+ 42 -> "60"
+ 84 -> "125"
+ else -> regularAmount.toString()
+ }
+ }
+
+ override fun configureInfoFragment(fragment: PromoInfoFragment) {
+ val context = fragment.context ?: return
+ fragment.binding.promoBanner.background = promoBackgroundDrawable(context)
+ fragment.binding.promoBannerLeftImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.spooky_promo_info_left))
+ fragment.binding.promoBannerRightImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.spooky_promo_info_right))
+ fragment.binding.promoBannerTitleImage.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.spooky_promo_title))
+ fragment.binding.promoBannerSubtitleView.setText(R.string.limited_event)
+ fragment.binding.promoBannerDurationView.setTextColor(ContextCompat.getColor(context, R.color.white))
+ val formatter = SimpleDateFormat("MMM d", Locale.getDefault())
+ fragment.binding.promoBannerDurationView.text = context.getString(R.string.x_to_y,
+ formatter.format(startDate),
+ formatter.format(endDate))
+ fragment.binding.promoBannerDurationView.setTextColor(ContextCompat.getColor(context, R.color.white))
+ fragment.binding.promptText.setText(R.string.spooky_promo_info_prompt)
+ fragment.binding.promptText.setTextColor(ContextCompat.getColor(context, R.color.orange_50))
+ fragment.binding.promptButton.background = buttonDrawable(context)
+ fragment.binding.promptButton.setText(R.string.view_gem_bundles)
+ fragment.binding.promptButton.setTextColor(ContextCompat.getColor(context, R.color.white))
+ fragment.binding.promptButton.setOnClickListener { MainNavigationController.navigate(R.id.gemPurchaseActivity) }
+
+ fragment.binding.instructionDescriptionView.setText(R.string.spooky_promo_info_instructions)
+ fragment.binding.limitationsDescriptionView.setText(R.string.spooky_promo_info_limitations)
+ }
+}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/GemPurchaseOptionsView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/GemPurchaseOptionsView.kt
index 58396d5c0..c891c23dd 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/GemPurchaseOptionsView.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/GemPurchaseOptionsView.kt
@@ -10,11 +10,10 @@ import com.habitrpg.android.habitica.extensions.layoutInflater
class GemPurchaseOptionsView(context: Context, attrs: AttributeSet) : FrameLayout(context, attrs) {
- private var binding: PurchaseGemViewBinding = PurchaseGemViewBinding.inflate(context.layoutInflater, this, true)
+ var binding: PurchaseGemViewBinding = PurchaseGemViewBinding.inflate(context.layoutInflater, this, true)
var sku: String? = null
init {
-
val a = context.theme.obtainStyledAttributes(
attrs,
R.styleable.GemPurchaseOptionsView,
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/NavigationDrawerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/NavigationDrawerAdapter.kt
index 4a36f10f9..c3fc73de5 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/NavigationDrawerAdapter.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/NavigationDrawerAdapter.kt
@@ -8,10 +8,13 @@ import androidx.recyclerview.widget.RecyclerView
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.extensions.dpToPx
import com.habitrpg.android.habitica.extensions.inflate
+import com.habitrpg.android.habitica.models.promotions.HabiticaPromotion
import com.habitrpg.android.habitica.ui.helpers.bindOptionalView
import com.habitrpg.android.habitica.ui.menu.HabiticaDrawerItem
import com.habitrpg.android.habitica.ui.viewHolders.GiftOneGetOnePromoMenuView
import com.habitrpg.android.habitica.ui.views.adventureGuide.AdventureGuideMenuBanner
+import com.habitrpg.android.habitica.ui.views.promo.PromoMenuView
+import com.habitrpg.android.habitica.ui.views.promo.PromoMenuViewHolder
import com.habitrpg.android.habitica.ui.views.promo.SubscriptionBuyGemsPromoView
import com.habitrpg.android.habitica.ui.views.promo.SubscriptionBuyGemsPromoViewHolder
import io.reactivex.BackpressureStrategy
@@ -43,6 +46,7 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int): Recycle
private val itemSelectedEvents = PublishSubject.create()
+ var activePromo: HabiticaPromotion? = null
fun getItemSelectionEvents(): Flowable = itemSelectedEvents.toFlowable(BackpressureStrategy.DROP)
@@ -85,7 +89,11 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int): Recycle
getItemViewType(position) == 4 -> {
drawerItem.user?.let { (holder.itemView as? AdventureGuideMenuBanner)?.updateData(it) }
holder.itemView.setOnClickListener { itemSelectedEvents.onNext(drawerItem) }
-
+ }
+ getItemViewType(position) == 5 -> {
+ activePromo?.let { promo ->
+ (holder as? PromoMenuViewHolder)?.bind(promo)
+ }
}
}
}
@@ -128,6 +136,14 @@ class NavigationDrawerAdapter(tintColor: Int, backgroundTintColor: Int): Recycle
)
SubscriptionBuyGemsPromoViewHolder(itemView)
}
+ 5 -> {
+ val promoView = PromoMenuView(parent.context)
+ promoView.layoutParams = ViewGroup.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ 148.dpToPx(parent.context)
+ )
+ PromoMenuViewHolder(promoView)
+ }
1 -> SectionHeaderViewHolder(parent.inflate(R.layout.drawer_main_section_header))
else -> DrawerItemViewHolder(parent.inflate(R.layout.drawer_main_item))
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt
index 50c0cabe0..cd81eb485 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/NavigationDrawerFragment.kt
@@ -23,6 +23,8 @@ import com.habitrpg.android.habitica.extensions.subscribeWithErrorHandler
import com.habitrpg.android.habitica.helpers.AppConfigManager
import com.habitrpg.android.habitica.helpers.MainNavigationController
import com.habitrpg.android.habitica.helpers.RxErrorHandler
+import com.habitrpg.android.habitica.models.promotions.HabiticaPromotion
+import com.habitrpg.android.habitica.models.promotions.PromoType
import com.habitrpg.android.habitica.models.inventory.Quest
import com.habitrpg.android.habitica.models.inventory.QuestContent
import com.habitrpg.android.habitica.models.social.Group
@@ -60,6 +62,8 @@ class NavigationDrawerFragment : DialogFragment() {
@Inject
lateinit var configManager: AppConfigManager
+ var activePromo: HabiticaPromotion? = null
+
private var drawerLayout: androidx.drawerlayout.widget.DrawerLayout? = null
private var fragmentContainerView: View? = null
@@ -263,6 +267,13 @@ class NavigationDrawerFragment : DialogFragment() {
subscriptionItem?.pillText = context?.getString(R.string.sale)
context?.let { subscriptionItem?.pillBackground = ContextCompat.getDrawable(it, R.drawable.pill_bg_teal) }
}
+ if (activePromo != null) {
+ if (activePromo?.promoType == PromoType.GEMS_AMOUNT || activePromo?.promoType == PromoType.GEMS_PRICE) {
+ val gemPurchaseItem = getItemWithIdentifier(SIDEBAR_GEMS)
+ gemPurchaseItem?.pillText = context?.getString(R.string.sale)
+ gemPurchaseItem?.pillBackground = context?.let { activePromo?.pillBackgroundDrawable(it) }
+ }
+ }
subscriptionItem?.let { updateItem(it) }
val promoItem = getItemWithIdentifier(SIDEBAR_SUBSCRIPTION_PROMO)
@@ -292,6 +303,19 @@ class NavigationDrawerFragment : DialogFragment() {
}
}
+ override fun onResume() {
+ super.onResume()
+
+ activePromo = configManager.activePromo()
+ val promoItem = getItemWithIdentifier(SIDEBAR_PROMO) ?: return
+ if (activePromo != null) {
+ promoItem.isVisible = true
+ adapter.activePromo = activePromo
+ } else {
+ promoItem.isVisible = false
+ }
+ }
+
override fun onDestroy() {
subscriptions?.dispose()
socialRepository.close()
@@ -310,52 +334,39 @@ class NavigationDrawerFragment : DialogFragment() {
items.add(HabiticaDrawerItem(R.id.skillsFragment, SIDEBAR_SKILLS, context.getString(R.string.sidebar_skills)))
items.add(HabiticaDrawerItem(R.id.statsFragment, SIDEBAR_STATS, context.getString(R.string.sidebar_stats)))
items.add(HabiticaDrawerItem(R.id.achievementsFragment, SIDEBAR_ACHIEVEMENTS, context.getString(R.string.sidebar_achievements)))
- if (configManager.reorderMenu()) {
- items.add(HabiticaDrawerItem(0, SIDEBAR_INVENTORY, context.getString(R.string.sidebar_shops), true))
- items.add(HabiticaDrawerItem(R.id.marketFragment, SIDEBAR_SHOPS_MARKET, context.getString(R.string.market)))
- items.add(HabiticaDrawerItem(R.id.questShopFragment, SIDEBAR_SHOPS_QUEST, context.getString(R.string.questShop)))
- items.add(HabiticaDrawerItem(R.id.seasonalShopFragment, SIDEBAR_SHOPS_SEASONAL, context.getString(R.string.seasonalShop)))
- items.add(HabiticaDrawerItem(R.id.timeTravelersShopFragment, SIDEBAR_SHOPS_TIMETRAVEL, context.getString(R.string.timeTravelers)))
- items.add(HabiticaDrawerItem(0, SIDEBAR_INVENTORY, context.getString(R.string.sidebar_section_inventory), true))
- items.add(HabiticaDrawerItem(R.id.itemsFragment, SIDEBAR_ITEMS, context.getString(R.string.sidebar_items)))
- items.add(HabiticaDrawerItem(R.id.equipmentOverviewFragment, SIDEBAR_EQUIPMENT, context.getString(R.string.sidebar_equipment)))
- items.add(HabiticaDrawerItem(R.id.stableFragment, SIDEBAR_STABLE, context.getString(R.string.sidebar_stable)))
- items.add(HabiticaDrawerItem(R.id.avatarOverviewFragment, SIDEBAR_AVATAR, context.getString(R.string.sidebar_avatar)))
- items.add(HabiticaDrawerItem(R.id.gemPurchaseActivity, SIDEBAR_GEMS, context.getString(R.string.sidebar_gems)))
- items.add(HabiticaDrawerItem(R.id.subscriptionPurchaseActivity, SIDEBAR_SUBSCRIPTION, context.getString(R.string.sidebar_subscription), isHeader = false))
+ items.add(HabiticaDrawerItem(0, SIDEBAR_INVENTORY, context.getString(R.string.sidebar_shops), true))
+ items.add(HabiticaDrawerItem(R.id.marketFragment, SIDEBAR_SHOPS_MARKET, context.getString(R.string.market)))
+ items.add(HabiticaDrawerItem(R.id.questShopFragment, SIDEBAR_SHOPS_QUEST, context.getString(R.string.questShop)))
+ items.add(HabiticaDrawerItem(R.id.seasonalShopFragment, SIDEBAR_SHOPS_SEASONAL, context.getString(R.string.seasonalShop)))
+ items.add(HabiticaDrawerItem(R.id.timeTravelersShopFragment, SIDEBAR_SHOPS_TIMETRAVEL, context.getString(R.string.timeTravelers)))
- items.add(HabiticaDrawerItem(0, SIDEBAR_SOCIAL, context.getString(R.string.sidebar_section_social), true))
- items.add(HabiticaDrawerItem(R.id.tavernFragment, SIDEBAR_TAVERN, context.getString(R.string.sidebar_tavern), isHeader = false))
- items.add(HabiticaDrawerItem(R.id.partyFragment, SIDEBAR_PARTY, context.getString(R.string.sidebar_party)))
- items.add(HabiticaDrawerItem(R.id.guildsOverviewFragment, SIDEBAR_GUILDS, context.getString(R.string.sidebar_guilds)))
- items.add(HabiticaDrawerItem(R.id.challengesOverviewFragment, SIDEBAR_CHALLENGES, context.getString(R.string.sidebar_challenges)))
- } else {
- items.add(HabiticaDrawerItem(0, SIDEBAR_SOCIAL, context.getString(R.string.sidebar_section_social), true))
- items.add(HabiticaDrawerItem(R.id.tavernFragment, SIDEBAR_TAVERN, context.getString(R.string.sidebar_tavern), isHeader = false))
- items.add(HabiticaDrawerItem(R.id.partyFragment, SIDEBAR_PARTY, context.getString(R.string.sidebar_party)))
- items.add(HabiticaDrawerItem(R.id.guildsOverviewFragment, SIDEBAR_GUILDS, context.getString(R.string.sidebar_guilds)))
- items.add(HabiticaDrawerItem(R.id.challengesOverviewFragment, SIDEBAR_CHALLENGES, context.getString(R.string.sidebar_challenges)))
+ items.add(HabiticaDrawerItem(0, SIDEBAR_INVENTORY, context.getString(R.string.sidebar_section_inventory), true))
+ items.add(HabiticaDrawerItem(R.id.itemsFragment, SIDEBAR_ITEMS, context.getString(R.string.sidebar_items)))
+ items.add(HabiticaDrawerItem(R.id.equipmentOverviewFragment, SIDEBAR_EQUIPMENT, context.getString(R.string.sidebar_equipment)))
+ items.add(HabiticaDrawerItem(R.id.stableFragment, SIDEBAR_STABLE, context.getString(R.string.sidebar_stable)))
+ items.add(HabiticaDrawerItem(R.id.avatarOverviewFragment, SIDEBAR_AVATAR, context.getString(R.string.sidebar_avatar)))
+ items.add(HabiticaDrawerItem(R.id.gemPurchaseActivity, SIDEBAR_GEMS, context.getString(R.string.sidebar_gems)))
+ items.add(HabiticaDrawerItem(R.id.subscriptionPurchaseActivity, SIDEBAR_SUBSCRIPTION, context.getString(R.string.sidebar_subscription), isHeader = false))
- items.add(HabiticaDrawerItem(0, SIDEBAR_INVENTORY, context.getString(R.string.sidebar_shops), true))
- items.add(HabiticaDrawerItem(R.id.marketFragment, SIDEBAR_SHOPS_MARKET, context.getString(R.string.market)))
- items.add(HabiticaDrawerItem(R.id.questShopFragment, SIDEBAR_SHOPS_QUEST, context.getString(R.string.questShop)))
- items.add(HabiticaDrawerItem(R.id.seasonalShopFragment, SIDEBAR_SHOPS_SEASONAL, context.getString(R.string.seasonalShop)))
- items.add(HabiticaDrawerItem(R.id.timeTravelersShopFragment, SIDEBAR_SHOPS_TIMETRAVEL, context.getString(R.string.timeTravelers)))
+ items.add(HabiticaDrawerItem(0, SIDEBAR_SOCIAL, context.getString(R.string.sidebar_section_social), true))
+ items.add(HabiticaDrawerItem(R.id.tavernFragment, SIDEBAR_TAVERN, context.getString(R.string.sidebar_tavern), isHeader = false))
+ items.add(HabiticaDrawerItem(R.id.partyFragment, SIDEBAR_PARTY, context.getString(R.string.sidebar_party)))
+ items.add(HabiticaDrawerItem(R.id.guildsOverviewFragment, SIDEBAR_GUILDS, context.getString(R.string.sidebar_guilds)))
+ items.add(HabiticaDrawerItem(R.id.challengesOverviewFragment, SIDEBAR_CHALLENGES, context.getString(R.string.sidebar_challenges)))
- items.add(HabiticaDrawerItem(0, SIDEBAR_INVENTORY, context.getString(R.string.sidebar_section_inventory), true))
- items.add(HabiticaDrawerItem(R.id.avatarOverviewFragment, SIDEBAR_AVATAR, context.getString(R.string.sidebar_avatar)))
- items.add(HabiticaDrawerItem(R.id.equipmentOverviewFragment, SIDEBAR_EQUIPMENT, context.getString(R.string.sidebar_equipment)))
- items.add(HabiticaDrawerItem(R.id.itemsFragment, SIDEBAR_ITEMS, context.getString(R.string.sidebar_items)))
- items.add(HabiticaDrawerItem(R.id.stableFragment, SIDEBAR_STABLE, context.getString(R.string.sidebar_stable)))
- items.add(HabiticaDrawerItem(R.id.gemPurchaseActivity, SIDEBAR_GEMS, context.getString(R.string.sidebar_gems)))
- items.add(HabiticaDrawerItem(R.id.subscriptionPurchaseActivity, SIDEBAR_SUBSCRIPTION, context.getString(R.string.sidebar_subscription), isHeader = false))
- }
items.add(HabiticaDrawerItem(0, SIDEBAR_ABOUT_HEADER, context.getString(R.string.sidebar_about), true))
items.add(HabiticaDrawerItem(R.id.newsFragment, SIDEBAR_NEWS, context.getString(R.string.sidebar_news)))
items.add(HabiticaDrawerItem(R.id.supportMainFragment, SIDEBAR_HELP, context.getString(R.string.sidebar_help)))
items.add(HabiticaDrawerItem(R.id.aboutFragment, SIDEBAR_ABOUT, context.getString(R.string.sidebar_about)))
}
+
+
+ val promoItem = HabiticaDrawerItem(R.id.subscriptionPurchaseActivity, SIDEBAR_PROMO)
+ promoItem.itemViewType = 5
+ promoItem.isVisible = false
+ items.add(promoItem)
+
if (configManager.enableGiftOneGetOne()) {
val item = HabiticaDrawerItem(R.id.subscriptionPurchaseActivity, SIDEBAR_G1G1_PROMO)
item.itemViewType = 3
@@ -515,7 +526,6 @@ class NavigationDrawerFragment : DialogFragment() {
const val SIDEBAR_GUILDS = "guilds"
const val SIDEBAR_CHALLENGES = "challenges"
const val SIDEBAR_INVENTORY = "inventory"
- const val SIDEBAR_SHOPS = "shops"
const val SIDEBAR_SHOPS_MARKET = "market"
const val SIDEBAR_SHOPS_QUEST = "questShop"
const val SIDEBAR_SHOPS_SEASONAL = "seasonalShop"
@@ -528,6 +538,7 @@ class NavigationDrawerFragment : DialogFragment() {
const val SIDEBAR_SUBSCRIPTION = "subscription"
const val SIDEBAR_SUBSCRIPTION_PROMO = "subscriptionpromo"
const val SIDEBAR_G1G1_PROMO = "g1g1promo"
+ const val SIDEBAR_PROMO = "promo"
const val SIDEBAR_ADVENTURE_GUIDE = "adventureguide"
const val SIDEBAR_ABOUT_HEADER = "about_header"
const val SIDEBAR_NEWS = "news"
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PromoInfoFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PromoInfoFragment.kt
new file mode 100644
index 000000000..1786f7e3d
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/PromoInfoFragment.kt
@@ -0,0 +1,36 @@
+package com.habitrpg.android.habitica.ui.fragments
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.habitrpg.android.habitica.R
+import com.habitrpg.android.habitica.components.UserComponent
+import com.habitrpg.android.habitica.databinding.FragmentPromoInfoBinding
+import com.habitrpg.android.habitica.helpers.AppConfigManager
+import javax.inject.Inject
+
+class PromoInfoFragment : BaseMainFragment() {
+
+ internal lateinit var binding: FragmentPromoInfoBinding
+
+ @Inject
+ lateinit var configManager: AppConfigManager
+
+ override fun injectFragment(component: UserComponent) {
+ component.inject(this)
+ }
+
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+ this.hidesToolbar = true
+ super.onCreateView(inflater, container, savedInstanceState)
+ binding = FragmentPromoInfoBinding.inflate(inflater, container, false)
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ val promo = configManager.activePromo()
+ promo?.configureInfoFragment(this)
+ }
+}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt
index 4dad9611c..130b7debf 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/StatsFragment.kt
@@ -9,9 +9,9 @@ import com.habitrpg.android.habitica.HabiticaBaseApplication
import com.habitrpg.android.habitica.R
import com.habitrpg.android.habitica.components.UserComponent
import com.habitrpg.android.habitica.data.InventoryRepository
+import com.habitrpg.android.habitica.databinding.FragmentStatsBinding
import com.habitrpg.android.habitica.extensions.addOkButton
import com.habitrpg.android.habitica.extensions.getThemeColor
-import com.habitrpg.android.habitica.extensions.inflate
import com.habitrpg.android.habitica.extensions.setScaledPadding
import com.habitrpg.android.habitica.helpers.RxErrorHandler
import com.habitrpg.android.habitica.helpers.UserStatComputer
@@ -22,7 +22,6 @@ import com.habitrpg.android.habitica.ui.views.HabiticaIconsHelper
import com.habitrpg.android.habitica.ui.views.dialogs.HabiticaAlertDialog
import com.habitrpg.android.habitica.ui.views.stats.BulkAllocateStatsDialog
import io.reactivex.functions.Consumer
-import kotlinx.android.synthetic.main.fragment_stats.*
import java.util.*
import javax.inject.Inject
import javax.inject.Named
@@ -31,6 +30,7 @@ import kotlin.math.min
class StatsFragment: BaseMainFragment() {
+ private lateinit var binding: FragmentStatsBinding
private var canAllocatePoints: Boolean = false
@field:[Inject Named(AppModule.NAMED_USER_ID)]
lateinit var userId: String
@@ -41,22 +41,22 @@ class StatsFragment: BaseMainFragment() {
private var totalStrength = 0
set(value) {
field = value
- strengthStatsView.totalValue = value
+ binding.strengthStatsView.totalValue = value
}
private var totalIntelligence = 0
set(value) {
field = value
- intelligenceStatsView.totalValue = value
+ binding.intelligenceStatsView.totalValue = value
}
private var totalConstitution = 0
set(value) {
field = value
- constitutionStatsView.totalValue = value
+ binding.constitutionStatsView.totalValue = value
}
private var totalPerception = 0
set(value) {
field = value
- perceptionStatsView.totalValue = value
+ binding.perceptionStatsView.totalValue = value
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
@@ -64,8 +64,8 @@ class StatsFragment: BaseMainFragment() {
tutorialText = getString(R.string.tutorial_stats)
this.hidesToolbar = true
super.onCreateView(inflater, container, savedInstanceState)
-
- return container?.inflate(R.layout.fragment_stats)
+ binding = FragmentStatsBinding.inflate(inflater, container, false)
+ return binding.root
}
override fun onDestroy() {
@@ -76,52 +76,52 @@ class StatsFragment: BaseMainFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- leftSparklesView.setImageBitmap(HabiticaIconsHelper.imageOfAttributeSparklesLeft())
- rightSparklesView.setImageBitmap(HabiticaIconsHelper.imageOfAttributeSparklesRight())
+ binding.leftSparklesView.setImageBitmap(HabiticaIconsHelper.imageOfAttributeSparklesLeft())
+ binding.rightSparklesView.setImageBitmap(HabiticaIconsHelper.imageOfAttributeSparklesRight())
context?.let {
val color = it.getThemeColor(R.attr.colorPrimaryOffset)
- distributeEvenlyHelpButton.setImageBitmap(HabiticaIconsHelper.imageOfInfoIcon(color))
- distributeClassHelpButton.setImageBitmap(HabiticaIconsHelper.imageOfInfoIcon(color))
- distributeTaskHelpButton.setImageBitmap(HabiticaIconsHelper.imageOfInfoIcon(color))
+ binding.distributeEvenlyHelpButton.setImageBitmap(HabiticaIconsHelper.imageOfInfoIcon(color))
+ binding. distributeClassHelpButton.setImageBitmap(HabiticaIconsHelper.imageOfInfoIcon(color))
+ binding.distributeTaskHelpButton.setImageBitmap(HabiticaIconsHelper.imageOfInfoIcon(color))
}
compositeSubscription.add(userRepository.getUser(userId).subscribe(Consumer {
canAllocatePoints = user?.stats?.lvl ?: 0 >= 10 && user?.stats?.points ?: 0 > 0
- unlock_at_level.visibility = if (it?.stats?.lvl ?: 0 < 10) View.VISIBLE else View.GONE
+ binding.unlockAtLevel.visibility = if (it?.stats?.lvl ?: 0 < 10) View.VISIBLE else View.GONE
updateStats(it)
updateAttributePoints(it)
}, RxErrorHandler.handleEmptyError()))
- distributeEvenlyButton.setOnCheckedChangeListener { _, isChecked ->
+ binding.distributeEvenlyButton.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
changeAutoAllocationMode(Stats.AUTO_ALLOCATE_FLAT)
}
}
- distributeClassButton.setOnCheckedChangeListener { _, isChecked ->
+ binding.distributeClassButton.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
changeAutoAllocationMode(Stats.AUTO_ALLOCATE_CLASSBASED)
}
}
- distributeTaskButton.setOnCheckedChangeListener { _, isChecked ->
+ binding.distributeTaskButton.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
changeAutoAllocationMode(Stats.AUTO_ALLOCATE_TASKBASED)
}
}
- automaticAllocationSwitch.setOnCheckedChangeListener{ _, isChecked ->
+ binding.automaticAllocationSwitch.setOnCheckedChangeListener{ _, isChecked ->
userRepository.updateUser(user, "preferences.automaticAllocation", isChecked).subscribe(Consumer {}, RxErrorHandler.handleEmptyError())
}
- strengthStatsView.allocateAction = { allocatePoint(Stats.STRENGTH) }
- intelligenceStatsView.allocateAction = { allocatePoint(Stats.INTELLIGENCE) }
- constitutionStatsView.allocateAction = { allocatePoint(Stats.CONSTITUTION) }
- perceptionStatsView.allocateAction = { allocatePoint(Stats.PERCEPTION) }
+ binding.strengthStatsView.allocateAction = { allocatePoint(Stats.STRENGTH) }
+ binding.intelligenceStatsView.allocateAction = { allocatePoint(Stats.INTELLIGENCE) }
+ binding.constitutionStatsView.allocateAction = { allocatePoint(Stats.CONSTITUTION) }
+ binding.perceptionStatsView.allocateAction = { allocatePoint(Stats.PERCEPTION) }
- distributeEvenlyHelpButton.setOnClickListener { showHelpAlert(R.string.distribute_evenly_help) }
- distributeClassHelpButton.setOnClickListener { showHelpAlert(R.string.distribute_class_help) }
- distributeTaskHelpButton.setOnClickListener { showHelpAlert(R.string.distribute_task_help) }
+ binding.distributeEvenlyHelpButton.setOnClickListener { showHelpAlert(R.string.distribute_evenly_help) }
+ binding.distributeClassHelpButton.setOnClickListener { showHelpAlert(R.string.distribute_class_help) }
+ binding.distributeTaskHelpButton.setOnClickListener { showHelpAlert(R.string.distribute_task_help) }
- statsAllocationButton.setOnClickListener {
+ binding.statsAllocationButton.setOnClickListener {
if (canAllocatePoints) {
showBulkAllocateDialog()
}
@@ -137,9 +137,9 @@ class StatsFragment: BaseMainFragment() {
private fun changeAutoAllocationMode(allocationMode: String) {
compositeSubscription.add(userRepository.updateUser(user, "preferences.allocationMode", allocationMode).subscribe(Consumer {}, RxErrorHandler.handleEmptyError()))
- distributeEvenlyButton.isChecked = allocationMode == Stats.AUTO_ALLOCATE_FLAT
- distributeClassButton.isChecked = allocationMode == Stats.AUTO_ALLOCATE_CLASSBASED
- distributeTaskButton.isChecked = allocationMode == Stats.AUTO_ALLOCATE_TASKBASED
+ binding.distributeEvenlyButton.isChecked = allocationMode == Stats.AUTO_ALLOCATE_FLAT
+ binding.distributeClassButton.isChecked = allocationMode == Stats.AUTO_ALLOCATE_CLASSBASED
+ binding.distributeTaskButton.isChecked = allocationMode == Stats.AUTO_ALLOCATE_TASKBASED
}
@@ -156,43 +156,43 @@ class StatsFragment: BaseMainFragment() {
private fun updateAttributePoints(user: User) {
val automaticAllocation = user.preferences?.automaticAllocation ?: false
- automaticAllocationSwitch.isChecked = automaticAllocation
- autoAllocationModeWrapper.visibility = if (automaticAllocation) View.VISIBLE else View.GONE
+ binding.automaticAllocationSwitch.isChecked = automaticAllocation
+ binding.autoAllocationModeWrapper.visibility = if (automaticAllocation) View.VISIBLE else View.GONE
val allocationMode = user.preferences?.allocationMode ?: ""
- distributeEvenlyButton.isChecked = allocationMode == Stats.AUTO_ALLOCATE_FLAT
- distributeClassButton.isChecked = allocationMode == Stats.AUTO_ALLOCATE_CLASSBASED
- distributeTaskButton.isChecked = allocationMode == Stats.AUTO_ALLOCATE_TASKBASED
+ binding.distributeEvenlyButton.isChecked = allocationMode == Stats.AUTO_ALLOCATE_FLAT
+ binding.distributeClassButton.isChecked = allocationMode == Stats.AUTO_ALLOCATE_CLASSBASED
+ binding.distributeTaskButton.isChecked = allocationMode == Stats.AUTO_ALLOCATE_TASKBASED
val canDistributePoints = 0 < (user.stats?.points ?: 0) && 10 <= (user.stats?.lvl ?: 0)
if (10 <= (user.stats?.lvl ?: 0)) {
- automaticAllocationSwitch.visibility = View.VISIBLE
- automaticAllocationSwitch.visibility = View.VISIBLE
+ binding.automaticAllocationSwitch.visibility = View.VISIBLE
+ binding.automaticAllocationSwitch.visibility = View.VISIBLE
} else {
- automaticAllocationSwitch.visibility = View.GONE
- automaticAllocationSwitch.visibility = View.GONE
+ binding.automaticAllocationSwitch.visibility = View.GONE
+ binding.automaticAllocationSwitch.visibility = View.GONE
}
- strengthStatsView.canDistributePoints = canDistributePoints
- intelligenceStatsView.canDistributePoints = canDistributePoints
- constitutionStatsView.canDistributePoints = canDistributePoints
- perceptionStatsView.canDistributePoints = canDistributePoints
+ binding.strengthStatsView.canDistributePoints = canDistributePoints
+ binding.intelligenceStatsView.canDistributePoints = canDistributePoints
+ binding.constitutionStatsView.canDistributePoints = canDistributePoints
+ binding.perceptionStatsView.canDistributePoints = canDistributePoints
context?.let { context ->
if (canDistributePoints) {
val points = user.stats?.points ?: 0
- numberOfPointsTextView.text = getString(R.string.points_to_allocate, points)
- numberOfPointsTextView.setTextColor(ContextCompat.getColor(context, R.color.white))
- numberOfPointsTextView.background = ContextCompat.getDrawable(context, R.drawable.button_gray_100)
- leftSparklesView.visibility = View.VISIBLE
- rightSparklesView.visibility = View.VISIBLE
+ binding.numberOfPointsTextView.text = getString(R.string.points_to_allocate, points)
+ binding.numberOfPointsTextView.setTextColor(ContextCompat.getColor(context, R.color.white))
+ binding.numberOfPointsTextView.background = ContextCompat.getDrawable(context, R.drawable.button_gray_100)
+ binding.leftSparklesView.visibility = View.VISIBLE
+ binding.rightSparklesView.visibility = View.VISIBLE
} else {
- numberOfPointsTextView.text = getString(R.string.no_points_to_allocate)
- numberOfPointsTextView.setTextColor(ContextCompat.getColor(context, R.color.gray_300))
- numberOfPointsTextView.setBackgroundColor(ContextCompat.getColor(context, R.color.transparent))
- leftSparklesView.visibility = View.GONE
- rightSparklesView.visibility = View.GONE
+ binding.numberOfPointsTextView.text = getString(R.string.no_points_to_allocate)
+ binding.numberOfPointsTextView.setTextColor(ContextCompat.getColor(context, R.color.gray_300))
+ binding.numberOfPointsTextView.setBackgroundColor(ContextCompat.getColor(context, R.color.transparent))
+ binding.leftSparklesView.visibility = View.GONE
+ binding.rightSparklesView.visibility = View.GONE
}
}
- numberOfPointsTextView.setScaledPadding(context, 18, 4, 18, 4)
+ binding.numberOfPointsTextView.setScaledPadding(context, 18, 4, 18, 4)
}
override fun injectFragment(component: UserComponent) {
@@ -207,28 +207,28 @@ class StatsFragment: BaseMainFragment() {
totalConstitution = levelStat
totalPerception = levelStat
- strengthStatsView.levelValue = levelStat
- intelligenceStatsView.levelValue = levelStat
- constitutionStatsView.levelValue = levelStat
- perceptionStatsView.levelValue = levelStat
+ binding.strengthStatsView.levelValue = levelStat
+ binding.intelligenceStatsView.levelValue = levelStat
+ binding.constitutionStatsView.levelValue = levelStat
+ binding.perceptionStatsView.levelValue = levelStat
totalStrength += currentUser.stats?.buffs?.getStr()?.toInt() ?: 0
totalIntelligence += currentUser.stats?.buffs?.get_int()?.toInt() ?: 0
totalConstitution += currentUser.stats?.buffs?.getCon()?.toInt() ?: 0
totalPerception += currentUser.stats?.buffs?.getPer()?.toInt() ?: 0
- strengthStatsView.buffValue = currentUser.stats?.buffs?.getStr()?.toInt() ?: 0
- intelligenceStatsView.buffValue = currentUser.stats?.buffs?.get_int()?.toInt() ?: 0
- constitutionStatsView.buffValue = currentUser.stats?.buffs?.getCon()?.toInt() ?: 0
- perceptionStatsView.buffValue = currentUser.stats?.buffs?.getPer()?.toInt() ?: 0
+ binding.strengthStatsView.buffValue = currentUser.stats?.buffs?.getStr()?.toInt() ?: 0
+ binding.intelligenceStatsView.buffValue = currentUser.stats?.buffs?.get_int()?.toInt() ?: 0
+ binding.constitutionStatsView.buffValue = currentUser.stats?.buffs?.getCon()?.toInt() ?: 0
+ binding.perceptionStatsView.buffValue = currentUser.stats?.buffs?.getPer()?.toInt() ?: 0
totalStrength += currentUser.stats?.strength ?: 0
totalIntelligence += currentUser.stats?.intelligence ?: 0
totalConstitution += currentUser.stats?.constitution ?: 0
totalPerception += currentUser.stats?.per ?: 0
- strengthStatsView.allocatedValue = currentUser.stats?.strength ?: 0
- intelligenceStatsView.allocatedValue = currentUser.stats?.intelligence ?: 0
- constitutionStatsView.allocatedValue = currentUser.stats?.constitution ?: 0
- perceptionStatsView.allocatedValue = currentUser.stats?.per ?: 0
+ binding.strengthStatsView.allocatedValue = currentUser.stats?.strength ?: 0
+ binding.intelligenceStatsView.allocatedValue = currentUser.stats?.intelligence ?: 0
+ binding.constitutionStatsView.allocatedValue = currentUser.stats?.constitution ?: 0
+ binding.perceptionStatsView.allocatedValue = currentUser.stats?.per ?: 0
val outfit = currentUser.items?.gear?.equipped
val outfitList = ArrayList()
@@ -268,10 +268,10 @@ class StatsFragment: BaseMainFragment() {
totalIntelligence += intelligence
totalConstitution += constitution
totalPerception += perception
- strengthStatsView.equipmentValue = strength
- intelligenceStatsView.equipmentValue = intelligence
- constitutionStatsView.equipmentValue = constitution
- perceptionStatsView.equipmentValue = perception
+ binding.strengthStatsView.equipmentValue = strength
+ binding.intelligenceStatsView.equipmentValue = intelligence
+ binding.constitutionStatsView.equipmentValue = constitution
+ binding.perceptionStatsView.equipmentValue = perception
}, RxErrorHandler.handleEmptyError()))
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GemsPurchaseFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GemsPurchaseFragment.kt
index 177509804..a8a59b8a1 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GemsPurchaseFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/GemsPurchaseFragment.kt
@@ -55,22 +55,33 @@ class GemsPurchaseFragment : BaseFragment(), GemPurchaseActivity.CheckoutFragmen
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- binding.gems4View?.setOnPurchaseClickListener(View.OnClickListener { purchaseGems(PurchaseTypes.Purchase4Gems) })
- binding.gems21View?.setOnPurchaseClickListener(View.OnClickListener { purchaseGems(PurchaseTypes.Purchase21Gems) })
- binding.gems42View?.setOnPurchaseClickListener(View.OnClickListener { purchaseGems(PurchaseTypes.Purchase42Gems) })
- binding.gems84View?.setOnPurchaseClickListener(View.OnClickListener { purchaseGems(PurchaseTypes.Purchase84Gems) })
+ binding.gems4View.setOnPurchaseClickListener(View.OnClickListener { purchaseGems(PurchaseTypes.Purchase4Gems) })
+ binding.gems21View.setOnPurchaseClickListener(View.OnClickListener { purchaseGems(PurchaseTypes.Purchase21Gems) })
+ binding.gems42View.setOnPurchaseClickListener(View.OnClickListener { purchaseGems(PurchaseTypes.Purchase42Gems) })
+ binding.gems84View.setOnPurchaseClickListener(View.OnClickListener { purchaseGems(PurchaseTypes.Purchase84Gems) })
val heartDrawable = BitmapDrawable(resources, HabiticaIconsHelper.imageOfHeartLarge())
- binding.supportTextView?.setCompoundDrawablesWithIntrinsicBounds(null, null, null, heartDrawable)
+ binding.supportTextView.setCompoundDrawablesWithIntrinsicBounds(null, null, null, heartDrawable)
compositeSubscription.add(userRepository.getUser().subscribe(Consumer {
binding.subscriptionPromo.visibility = if (it.isSubscribed) View.GONE else View.VISIBLE
}, RxErrorHandler.handleEmptyError()))
- binding.giftGemsButton?.setOnClickListener { showGiftGemsDialog() }
+ binding.giftGemsButton.setOnClickListener { showGiftGemsDialog() }
- binding.giftSubscriptionContainer?.isVisible = appConfigManager.enableGiftOneGetOne()
+ binding.giftSubscriptionContainer.isVisible = appConfigManager.enableGiftOneGetOne()
binding.giftSubscriptionContainer.setOnClickListener { showGiftSubscriptionDialog() }
+
+ val promo = appConfigManager.activePromo()
+ if (promo != null) {
+ promo.configurePurchaseBanner(binding)
+ promo.configureGemView(binding.gems4View.binding, 4)
+ promo.configureGemView(binding.gems21View.binding, 21)
+ promo.configureGemView(binding.gems42View.binding, 42)
+ promo.configureGemView(binding.gems84View.binding, 84)
+ } else {
+ binding.promoBanner.visibility = View.GONE
+ }
}
override fun setupCheckout() {
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 7907c31ab..2c1f85505 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
@@ -1,34 +1,33 @@
package com.habitrpg.android.habitica.ui.views;
import android.content.Context;
-import android.content.res.AssetManager;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.Matrix;
+import android.graphics.PointF;
+import android.graphics.RectF;
+import android.graphics.Shader;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Color;
-import android.graphics.DashPathEffect;
-import android.graphics.Matrix;
-import android.graphics.Paint;
import android.graphics.Path;
-import android.graphics.PointF;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffXfermode;
-import android.graphics.RectF;
-import android.graphics.Shader;
-import android.graphics.Typeface;
+import android.graphics.DashPathEffect;
import android.text.Layout;
import android.text.StaticLayout;
import android.text.TextPaint;
-
-import java.lang.ref.WeakReference;
import java.util.Stack;
+import java.lang.ref.WeakReference;
+import android.graphics.Typeface;
+import android.content.res.AssetManager;
/**
- * Created by Phillip Thelen on 18. Mar 2020.
+ * Created by Phillip Thelen on 1. Sep 2020.
* Copyright © 2020 HabitRPG Inc.. All rights reserved.
*
* Generated by PaintCode
@@ -97,13 +96,13 @@ public class HabiticaIcons {
Paint paint = CacheForHeart.paint;
// Local Colors
- int fillColor2 = Color.argb(255, 255, 97, 101);
- int fillColor5 = Color.argb(64, 255, 255, 255);
int fillColor3 = Color.argb(128, 255, 255, 255);
- int fillColor4 = Color.argb(89, 181, 36, 40);
- int fillColor6 = Color.argb(128, 181, 36, 40);
int heartLightBackground = Color.argb(255, 247, 78, 82);
int heartDarkBackground = Color.argb(178, 255, 255, 255);
+ int fillColor6 = Color.argb(128, 181, 36, 40);
+ int fillColor4 = Color.argb(89, 181, 36, 40);
+ int fillColor2 = Color.argb(255, 255, 97, 101);
+ int fillColor5 = Color.argb(64, 255, 255, 255);
// Local Variables
int expression = darkBackground ? heartDarkBackground : heartLightBackground;
@@ -377,10 +376,10 @@ public class HabiticaIcons {
Paint paint = CacheForExperience.paint;
// Local Colors
- int fillColor12 = Color.argb(128, 191, 125, 26);
int fillColor11 = Color.argb(64, 191, 125, 26);
int fillColor5 = Color.argb(64, 255, 255, 255);
int fillColor10 = Color.argb(255, 255, 166, 35);
+ int fillColor12 = Color.argb(128, 191, 125, 26);
int fillColor3 = Color.argb(128, 255, 255, 255);
// Resize to Target Frame
@@ -608,10 +607,10 @@ public class HabiticaIcons {
Paint paint = CacheForMagic.paint;
// Local Colors
- int fillColor5 = Color.argb(64, 255, 255, 255);
int fillColor9 = Color.argb(64, 31, 112, 154);
int fillColor8 = Color.argb(255, 80, 181, 233);
int fillColor7 = Color.argb(255, 41, 149, 205);
+ int fillColor5 = Color.argb(64, 255, 255, 255);
int fillColor3 = Color.argb(128, 255, 255, 255);
// Resize to Target Frame
@@ -759,10 +758,10 @@ public class HabiticaIcons {
Paint paint = CacheForGold.paint;
// Local Colors
- int fillColor12 = Color.argb(128, 191, 125, 26);
int fillColor5 = Color.argb(64, 255, 255, 255);
int fillColor3 = Color.argb(128, 255, 255, 255);
int fillColor10 = Color.argb(255, 255, 166, 35);
+ int fillColor12 = Color.argb(128, 191, 125, 26);
int fillColor13 = Color.argb(191, 191, 125, 26);
// Resize to Target Frame
@@ -913,9 +912,9 @@ public class HabiticaIcons {
Paint paint = CacheForGem.paint;
// Local Colors
- int fillColor3 = Color.argb(128, 255, 255, 255);
int fillColor15 = Color.argb(89, 27, 153, 107);
int fillColor14 = Color.argb(255, 36, 204, 143);
+ int fillColor3 = Color.argb(128, 255, 255, 255);
int fillColor5 = Color.argb(64, 255, 255, 255);
// Resize to Target Frame
@@ -1122,10 +1121,10 @@ public class HabiticaIcons {
Paint paint = CacheForHourglass.paint;
// Local Colors
- int fillColor19 = Color.argb(255, 79, 42, 147);
- int fillColor18 = Color.argb(255, 154, 98, 255);
int fillColor17 = Color.argb(230, 255, 255, 255);
int fillColor16 = Color.argb(204, 169, 220, 246);
+ int fillColor18 = Color.argb(255, 154, 98, 255);
+ int fillColor19 = Color.argb(255, 79, 42, 147);
// Resize to Target Frame
canvas.save();
@@ -1540,14 +1539,14 @@ public class HabiticaIcons {
Paint paint = CacheForWarrior.paint;
// Local Colors
- int fillColor42 = Color.argb(255, 255, 149, 152);
- int fillColor = Color.argb(255, 240, 97, 102);
int fillColor43 = Color.argb(255, 200, 43, 43);
- int fillColor21 = Color.argb(255, 255, 182, 184);
+ int fillColor22 = Color.argb(255, 242, 123, 134);
int fillColor20 = Color.argb(255, 255, 181, 183);
+ int fillColor42 = Color.argb(255, 255, 149, 152);
+ int fillColor21 = Color.argb(255, 255, 182, 184);
int fillColor23 = Color.argb(255, 229, 65, 77);
int fillColor41 = Color.argb(255, 255, 149, 152);
- int fillColor22 = Color.argb(255, 242, 123, 134);
+ int fillColor = Color.argb(255, 240, 97, 102);
// Local Variables
boolean lightBackground = !darkBackground;
@@ -2714,10 +2713,10 @@ public class HabiticaIcons {
public static void drawDifficultyStars(Canvas canvas, RectF targetFrame, ResizingBehavior resizing, float difficulty) {
// Local Variables
- float _2StarDifficulty = difficulty >= 2f ? 1f : (difficulty >= 1.5f ? 0.5f : 0f);
- float _3StarDifficulty = difficulty >= 3f ? 1f : (difficulty >= 2.5f ? 0.5f : 0f);
float _4StarDifficulty = difficulty >= 4f ? 1f : (difficulty >= 3.5f ? 0.5f : 0f);
float _1StarDifficulty = difficulty >= 1f ? 1f : (difficulty >= 0.5f ? 0.5f : 0f);
+ float _3StarDifficulty = difficulty >= 3f ? 1f : (difficulty >= 2.5f ? 0.5f : 0f);
+ float _2StarDifficulty = difficulty >= 2f ? 1f : (difficulty >= 1.5f ? 0.5f : 0f);
// Resize to Target Frame
canvas.save();
@@ -2798,8 +2797,8 @@ public class HabiticaIcons {
int fillColor24 = Color.argb(255, 255, 166, 36);
// Local Variables
- boolean isFull = singleDifficulty == 1f;
boolean isHalf = singleDifficulty == 0.5f;
+ boolean isFull = singleDifficulty == 1f;
// Resize to Target Frame
canvas.save();
@@ -2904,8 +2903,8 @@ public class HabiticaIcons {
Paint paint = CacheForStarSmall.paint;
// Local Colors
- int fillColor27 = Color.argb(255, 229, 220, 255);
int fillColor26 = Color.argb(102, 229, 220, 255);
+ int fillColor27 = Color.argb(255, 229, 220, 255);
// Resize to Target Frame
canvas.save();
@@ -3047,11 +3046,11 @@ public class HabiticaIcons {
Paint paint = CacheForStarLarge.paint;
// Local Colors
- int fillColor30 = Color.argb(166, 229, 220, 255);
- int fillColor31 = Color.argb(191, 229, 220, 255);
- int fillColor29 = Color.argb(128, 229, 220, 255);
int fillColor27 = Color.argb(255, 229, 220, 255);
int fillColor28 = Color.argb(64, 229, 220, 255);
+ int fillColor31 = Color.argb(191, 229, 220, 255);
+ int fillColor30 = Color.argb(166, 229, 220, 255);
+ int fillColor29 = Color.argb(128, 229, 220, 255);
// Resize to Target Frame
canvas.save();
@@ -3452,9 +3451,9 @@ public class HabiticaIcons {
// Local Colors
int fillColor34 = Color.argb(38, 229, 220, 255);
+ int fillColor27 = Color.argb(255, 229, 220, 255);
int fillColor33 = Color.argb(77, 229, 220, 255);
int fillColor32 = Color.argb(153, 229, 220, 255);
- int fillColor27 = Color.argb(255, 229, 220, 255);
// Resize to Target Frame
canvas.save();
@@ -3762,7 +3761,7 @@ public class HabiticaIcons {
private static class CacheForAddRemovePin {
private static Paint paint = new Paint();
- private static RectF originalFrame = new RectF(0f, 0f, 40f, 40f);
+ private static RectF originalFrame = new RectF(0f, 0f, 24f, 24f);
private static RectF resizedFrame = new RectF();
private static RectF bezierRect = new RectF();
private static Path bezierPath = new Path();
@@ -3773,7 +3772,7 @@ public class HabiticaIcons {
}
public static void drawAddRemovePin(Canvas canvas, boolean addPin) {
- HabiticaIcons.drawAddRemovePin(canvas, new RectF(0f, 0f, 40f, 40f), ResizingBehavior.AspectFit, addPin);
+ HabiticaIcons.drawAddRemovePin(canvas, new RectF(0f, 0f, 24f, 24f), ResizingBehavior.AspectFit, addPin);
}
public static void drawAddRemovePin(Canvas canvas, RectF targetFrame, ResizingBehavior resizing, boolean addPin) {
@@ -3792,15 +3791,15 @@ public class HabiticaIcons {
RectF resizedFrame = CacheForAddRemovePin.resizedFrame;
HabiticaIcons.resizingBehaviorApply(resizing, CacheForAddRemovePin.originalFrame, targetFrame, resizedFrame);
canvas.translate(resizedFrame.left, resizedFrame.top);
- canvas.scale(resizedFrame.width() / 40f, resizedFrame.height() / 40f);
+ canvas.scale(resizedFrame.width() / 24f, resizedFrame.height() / 24f);
// Bezier
RectF bezierRect = CacheForAddRemovePin.bezierRect;
- bezierRect.set(10f, 11f, 16f, 11f);
+ bezierRect.set(2f, 4f, 8f, 4f);
Path bezierPath = CacheForAddRemovePin.bezierPath;
bezierPath.reset();
- bezierPath.moveTo(16f, 11f);
- bezierPath.lineTo(10f, 11f);
+ bezierPath.moveTo(8f, 4f);
+ bezierPath.lineTo(2f, 4f);
paint.reset();
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
@@ -3816,11 +3815,11 @@ public class HabiticaIcons {
// Bezier 2
if (addPin) {
RectF bezier2Rect = CacheForAddRemovePin.bezier2Rect;
- bezier2Rect.set(13f, 8f, 13f, 14f);
+ bezier2Rect.set(5f, 1f, 5f, 7f);
Path bezier2Path = CacheForAddRemovePin.bezier2Path;
bezier2Path.reset();
- bezier2Path.moveTo(13f, 8f);
- bezier2Path.lineTo(13f, 14f);
+ bezier2Path.moveTo(5f, 1f);
+ bezier2Path.lineTo(5f, 7f);
paint.reset();
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
@@ -3836,48 +3835,48 @@ public class HabiticaIcons {
// Bezier 3
RectF bezier3Rect = CacheForAddRemovePin.bezier3Rect;
- bezier3Rect.set(12f, 11f, 32f, 31f);
+ bezier3Rect.set(4f, 4f, 24f, 24f);
Path bezier3Path = CacheForAddRemovePin.bezier3Path;
bezier3Path.reset();
- bezier3Path.moveTo(22.42f, 25.1f);
- bezier3Path.lineTo(17.9f, 20.58f);
- bezier3Path.lineTo(25.57f, 14.61f);
- bezier3Path.lineTo(28.39f, 17.43f);
- bezier3Path.lineTo(22.42f, 25.1f);
+ bezier3Path.moveTo(14.42f, 18.1f);
+ bezier3Path.lineTo(9.9f, 13.58f);
+ bezier3Path.lineTo(17.57f, 7.61f);
+ bezier3Path.lineTo(20.39f, 10.43f);
+ bezier3Path.lineTo(14.42f, 18.1f);
bezier3Path.close();
- bezier3Path.moveTo(31.68f, 17.6f);
- bezier3Path.lineTo(30.63f, 16.56f);
- bezier3Path.cubicTo(30.63f, 16.56f, 30.63f, 16.56f, 30.63f, 16.56f);
- bezier3Path.lineTo(26.44f, 12.37f);
- bezier3Path.lineTo(25.4f, 11.32f);
- bezier3Path.cubicTo(24.97f, 10.89f, 24.27f, 10.89f, 23.84f, 11.32f);
- bezier3Path.cubicTo(23.41f, 11.75f, 23.41f, 12.45f, 23.84f, 12.88f);
- bezier3Path.lineTo(24f, 13.05f);
- bezier3Path.lineTo(16.33f, 19.01f);
- bezier3Path.lineTo(15.97f, 18.65f);
- bezier3Path.cubicTo(15.54f, 18.22f, 14.85f, 18.22f, 14.42f, 18.65f);
- bezier3Path.cubicTo(13.99f, 19.08f, 13.99f, 19.78f, 14.42f, 20.21f);
- bezier3Path.lineTo(15.46f, 21.25f);
- bezier3Path.cubicTo(15.46f, 21.25f, 15.46f, 21.26f, 15.46f, 21.26f);
- bezier3Path.lineTo(17.83f, 23.62f);
- bezier3Path.lineTo(12.32f, 29.12f);
- bezier3Path.cubicTo(11.89f, 29.55f, 11.89f, 30.25f, 12.32f, 30.68f);
- bezier3Path.cubicTo(12.54f, 30.89f, 12.82f, 31f, 13.1f, 31f);
- bezier3Path.cubicTo(13.38f, 31f, 13.66f, 30.89f, 13.88f, 30.68f);
- bezier3Path.lineTo(19.38f, 25.18f);
- bezier3Path.lineTo(21.74f, 27.54f);
- bezier3Path.cubicTo(21.75f, 27.54f, 21.75f, 27.54f, 21.75f, 27.54f);
- bezier3Path.lineTo(22.79f, 28.58f);
- bezier3Path.cubicTo(23.01f, 28.8f, 23.29f, 28.91f, 23.57f, 28.91f);
- bezier3Path.cubicTo(23.85f, 28.91f, 24.13f, 28.8f, 24.35f, 28.58f);
- bezier3Path.cubicTo(24.78f, 28.15f, 24.78f, 27.46f, 24.35f, 27.03f);
- bezier3Path.lineTo(23.99f, 26.67f);
- bezier3Path.lineTo(29.96f, 19f);
- bezier3Path.lineTo(30.12f, 19.16f);
- bezier3Path.cubicTo(30.34f, 19.38f, 30.62f, 19.48f, 30.9f, 19.48f);
- bezier3Path.cubicTo(31.18f, 19.48f, 31.46f, 19.38f, 31.68f, 19.16f);
- bezier3Path.cubicTo(32.11f, 18.73f, 32.11f, 18.03f, 31.68f, 17.6f);
- bezier3Path.lineTo(31.68f, 17.6f);
+ bezier3Path.moveTo(23.68f, 10.6f);
+ bezier3Path.lineTo(22.63f, 9.56f);
+ bezier3Path.cubicTo(22.63f, 9.56f, 22.63f, 9.56f, 22.63f, 9.56f);
+ bezier3Path.lineTo(18.44f, 5.37f);
+ bezier3Path.lineTo(17.4f, 4.32f);
+ bezier3Path.cubicTo(16.97f, 3.89f, 16.27f, 3.89f, 15.84f, 4.32f);
+ bezier3Path.cubicTo(15.41f, 4.75f, 15.41f, 5.45f, 15.84f, 5.88f);
+ bezier3Path.lineTo(16f, 6.05f);
+ bezier3Path.lineTo(8.33f, 12.01f);
+ bezier3Path.lineTo(7.97f, 11.65f);
+ bezier3Path.cubicTo(7.54f, 11.22f, 6.85f, 11.22f, 6.42f, 11.65f);
+ bezier3Path.cubicTo(5.99f, 12.08f, 5.99f, 12.78f, 6.42f, 13.21f);
+ bezier3Path.lineTo(7.46f, 14.25f);
+ bezier3Path.cubicTo(7.46f, 14.25f, 7.46f, 14.26f, 7.46f, 14.26f);
+ bezier3Path.lineTo(9.83f, 16.62f);
+ bezier3Path.lineTo(4.32f, 22.12f);
+ bezier3Path.cubicTo(3.89f, 22.55f, 3.89f, 23.25f, 4.32f, 23.68f);
+ bezier3Path.cubicTo(4.54f, 23.89f, 4.82f, 24f, 5.1f, 24f);
+ bezier3Path.cubicTo(5.38f, 24f, 5.66f, 23.89f, 5.88f, 23.68f);
+ bezier3Path.lineTo(11.38f, 18.18f);
+ bezier3Path.lineTo(13.74f, 20.54f);
+ bezier3Path.cubicTo(13.75f, 20.54f, 13.75f, 20.54f, 13.75f, 20.54f);
+ bezier3Path.lineTo(14.79f, 21.58f);
+ bezier3Path.cubicTo(15.01f, 21.8f, 15.29f, 21.91f, 15.57f, 21.91f);
+ bezier3Path.cubicTo(15.85f, 21.91f, 16.13f, 21.8f, 16.35f, 21.58f);
+ bezier3Path.cubicTo(16.78f, 21.15f, 16.78f, 20.46f, 16.35f, 20.03f);
+ bezier3Path.lineTo(15.99f, 19.67f);
+ bezier3Path.lineTo(21.96f, 12f);
+ bezier3Path.lineTo(22.12f, 12.16f);
+ bezier3Path.cubicTo(22.34f, 12.38f, 22.62f, 12.48f, 22.9f, 12.48f);
+ bezier3Path.cubicTo(23.18f, 12.48f, 23.46f, 12.38f, 23.68f, 12.16f);
+ bezier3Path.cubicTo(24.11f, 11.73f, 24.11f, 11.03f, 23.68f, 10.6f);
+ bezier3Path.lineTo(23.68f, 10.6f);
bezier3Path.close();
paint.reset();
@@ -3891,14 +3890,14 @@ public class HabiticaIcons {
}
private static class CacheForPinItem {
- private static RectF originalFrame = new RectF(0f, 0f, 40f, 40f);
+ private static RectF originalFrame = new RectF(0f, 0f, 24f, 24f);
private static RectF resizedFrame = new RectF();
private static RectF symbolRect = new RectF();
private static RectF symbolTargetRect = new RectF();
}
private static void drawPinItem(Canvas canvas) {
- HabiticaIcons.drawPinItem(canvas, new RectF(0f, 0f, 40f, 40f), ResizingBehavior.AspectFit);
+ HabiticaIcons.drawPinItem(canvas, new RectF(0f, 0f, 24f, 24f), ResizingBehavior.AspectFit);
}
private static void drawPinItem(Canvas canvas, RectF targetFrame, ResizingBehavior resizing) {
@@ -3907,11 +3906,11 @@ public class HabiticaIcons {
RectF resizedFrame = CacheForPinItem.resizedFrame;
HabiticaIcons.resizingBehaviorApply(resizing, CacheForPinItem.originalFrame, targetFrame, resizedFrame);
canvas.translate(resizedFrame.left, resizedFrame.top);
- canvas.scale(resizedFrame.width() / 40f, resizedFrame.height() / 40f);
+ canvas.scale(resizedFrame.width() / 24f, resizedFrame.height() / 24f);
// Symbol
RectF symbolRect = CacheForPinItem.symbolRect;
- symbolRect.set(0f, 0f, 40f, 40f);
+ symbolRect.set(2f, 2f, 22f, 22f);
canvas.save();
canvas.clipRect(symbolRect);
canvas.translate(symbolRect.left, symbolRect.top);
@@ -3924,14 +3923,14 @@ public class HabiticaIcons {
}
private static class CacheForUnpinItem {
- private static RectF originalFrame = new RectF(0f, 0f, 40f, 40f);
+ private static RectF originalFrame = new RectF(0f, 0f, 24f, 24f);
private static RectF resizedFrame = new RectF();
private static RectF symbolRect = new RectF();
private static RectF symbolTargetRect = new RectF();
}
private static void drawUnpinItem(Canvas canvas) {
- HabiticaIcons.drawUnpinItem(canvas, new RectF(0f, 0f, 40f, 40f), ResizingBehavior.AspectFit);
+ HabiticaIcons.drawUnpinItem(canvas, new RectF(0f, 0f, 24f, 24f), ResizingBehavior.AspectFit);
}
private static void drawUnpinItem(Canvas canvas, RectF targetFrame, ResizingBehavior resizing) {
@@ -3940,11 +3939,11 @@ public class HabiticaIcons {
RectF resizedFrame = CacheForUnpinItem.resizedFrame;
HabiticaIcons.resizingBehaviorApply(resizing, CacheForUnpinItem.originalFrame, targetFrame, resizedFrame);
canvas.translate(resizedFrame.left, resizedFrame.top);
- canvas.scale(resizedFrame.width() / 40f, resizedFrame.height() / 40f);
+ canvas.scale(resizedFrame.width() / 24f, resizedFrame.height() / 24f);
// Symbol
RectF symbolRect = CacheForUnpinItem.symbolRect;
- symbolRect.set(0f, 0f, 40f, 40f);
+ symbolRect.set(2f, 2f, 22f, 22f);
canvas.save();
canvas.clipRect(symbolRect);
canvas.translate(symbolRect.left, symbolRect.top);
@@ -3982,12 +3981,12 @@ public class HabiticaIcons {
// Local Colors
int fillColor38 = Color.argb(255, 165, 161, 172);
- int fillColor39 = Color.argb(255, 189, 168, 255);
int strokeColor2 = Color.argb(255, 189, 168, 255);
- int strokeColor = Color.argb(255, 97, 51, 180);
int indicatorLockedDark = Color.argb(255, 82, 82, 82);
int shadowTint = Color.argb(255, 26, 24, 29);
int indicatorLocked = Color.argb(255, 237, 236, 238);
+ int strokeColor = Color.argb(255, 97, 51, 180);
+ int fillColor39 = Color.argb(255, 189, 168, 255);
// Local Shadows
PaintCodeShadow shadow = CacheForItemIndicator.shadow.get(PaintCodeColor.colorByChangingAlpha(shadowTint, (int) (Color.alpha(shadowTint) * 0.12f * 255f)), 0f, 1f, 1f);
@@ -4371,11 +4370,11 @@ public class HabiticaIcons {
// Local Colors
int fillColor48 = Color.argb(255, 137, 102, 199);
- int fillColor36 = Color.argb(255, 97, 51, 180);
int fillColor45 = Color.argb(255, 155, 129, 226);
+ int fillColor36 = Color.argb(255, 97, 51, 180);
int fillColor47 = Color.argb(255, 198, 182, 228);
- int fillColor19 = Color.argb(255, 79, 42, 147);
int fillColor44 = Color.argb(255, 204, 190, 237);
+ int fillColor19 = Color.argb(255, 79, 42, 147);
int fillColor46 = Color.argb(255, 122, 84, 192);
// Local Variables
@@ -5167,18 +5166,18 @@ public class HabiticaIcons {
Paint paint = CacheForHealer.paint;
// Local Colors
- int fillColor53 = Color.argb(255, 206, 129, 41);
int fillColor57 = Color.argb(255, 255, 221, 181);
- int fillColor58 = Color.argb(255, 229, 144, 37);
- int fillColor54 = Color.argb(255, 207, 130, 41);
- int fillColor51 = Color.argb(255, 229, 144, 37);
- int fillColor50 = Color.argb(255, 226, 158, 69);
- int fillColor59 = Color.argb(255, 255, 228, 201);
- int fillColor55 = Color.argb(255, 253, 198, 126);
- int fillColor56 = Color.argb(255, 255, 166, 35);
int fillColor49 = Color.argb(255, 255, 215, 168);
- int fillColor52 = Color.argb(255, 253, 198, 126);
int fillColor10 = Color.argb(255, 255, 166, 35);
+ int fillColor56 = Color.argb(255, 255, 166, 35);
+ int fillColor55 = Color.argb(255, 253, 198, 126);
+ int fillColor54 = Color.argb(255, 207, 130, 41);
+ int fillColor53 = Color.argb(255, 206, 129, 41);
+ int fillColor52 = Color.argb(255, 253, 198, 126);
+ int fillColor59 = Color.argb(255, 255, 228, 201);
+ int fillColor51 = Color.argb(255, 229, 144, 37);
+ int fillColor58 = Color.argb(255, 229, 144, 37);
+ int fillColor50 = Color.argb(255, 226, 158, 69);
// Local Variables
boolean lightBackground = !darkBackground;
@@ -6004,17 +6003,17 @@ public class HabiticaIcons {
Paint paint = CacheForMage.paint;
// Local Colors
- int fillColor60 = Color.argb(255, 182, 225, 247);
- int fillColor62 = Color.argb(255, 83, 180, 229);
- int fillColor68 = Color.argb(255, 31, 110, 162);
- int fillColor65 = Color.argb(255, 107, 196, 233);
- int fillColor70 = Color.argb(255, 132, 207, 242);
- int fillColor63 = Color.argb(255, 42, 160, 207);
- int fillColor64 = Color.argb(255, 77, 178, 214);
- int fillColor67 = Color.argb(255, 83, 180, 229);
- int fillColor69 = Color.argb(255, 169, 219, 245);
int fillColor61 = Color.argb(255, 39, 138, 191);
+ int fillColor67 = Color.argb(255, 83, 180, 229);
+ int fillColor70 = Color.argb(255, 132, 207, 242);
int fillColor66 = Color.argb(255, 107, 196, 233);
+ int fillColor63 = Color.argb(255, 42, 160, 207);
+ int fillColor69 = Color.argb(255, 169, 219, 245);
+ int fillColor65 = Color.argb(255, 107, 196, 233);
+ int fillColor64 = Color.argb(255, 77, 178, 214);
+ int fillColor62 = Color.argb(255, 83, 180, 229);
+ int fillColor60 = Color.argb(255, 182, 225, 247);
+ int fillColor68 = Color.argb(255, 31, 110, 162);
// Local Variables
boolean lightBackground = !darkBackground;
@@ -6574,10 +6573,10 @@ public class HabiticaIcons {
Paint paint = CacheForHourglassShop.paint;
// Local Colors
- int fillColor19 = Color.argb(255, 79, 42, 147);
- int fillColor18 = Color.argb(255, 154, 98, 255);
int fillColor17 = Color.argb(230, 255, 255, 255);
int fillColor16 = Color.argb(204, 169, 220, 246);
+ int fillColor18 = Color.argb(255, 154, 98, 255);
+ int fillColor19 = Color.argb(255, 79, 42, 147);
// Resize to Target Frame
canvas.save();
@@ -6825,10 +6824,10 @@ public class HabiticaIcons {
Paint paint = CacheForAttributeSparklesLeft.paint;
// Local Colors
- int fillColor72 = Color.argb(255, 255, 97, 101);
- int fillColor18 = Color.argb(255, 154, 98, 255);
int fillColor71 = Color.argb(255, 80, 181, 233);
int fillColor73 = Color.argb(255, 255, 180, 69);
+ int fillColor72 = Color.argb(255, 255, 97, 101);
+ int fillColor18 = Color.argb(255, 154, 98, 255);
// Resize to Target Frame
canvas.save();
@@ -6951,10 +6950,10 @@ public class HabiticaIcons {
Paint paint = CacheForAttributeSparklesRight.paint;
// Local Colors
- int fillColor74 = Color.argb(255, 255, 190, 93);
- int fillColor18 = Color.argb(255, 154, 98, 255);
int fillColor72 = Color.argb(255, 255, 97, 101);
int fillColor71 = Color.argb(255, 80, 181, 233);
+ int fillColor18 = Color.argb(255, 154, 98, 255);
+ int fillColor74 = Color.argb(255, 255, 190, 93);
// Resize to Target Frame
canvas.save();
@@ -7203,37 +7202,37 @@ public class HabiticaIcons {
Paint paint = CacheForContributorBadge.paint;
// Local Colors
- int fillColor81 = Color.argb(255, 94, 221, 233);
- int fillColor79 = Color.argb(255, 255, 190, 93);
- int strokeColor4 = Color.argb(255, 136, 10, 10);
- int fillColor82 = Color.argb(255, 154, 98, 255);
- int strokeColor8 = Color.argb(255, 28, 163, 114);
- int strokeColor6 = Color.argb(255, 236, 109, 23);
- int strokeColor12 = Color.argb(255, 0, 87, 55);
- int fillColor77 = Color.argb(255, 201, 43, 43);
- int strokeColor10 = Color.argb(255, 5, 112, 168);
- int fillColor80 = Color.argb(255, 63, 218, 162);
- int fillColor78 = Color.argb(255, 255, 148, 76);
- int fillColor83 = Color.argb(255, 119, 244, 199);
- int strokeColor3 = Color.argb(255, 253, 124, 127);
- int strokeColor9 = Color.argb(255, 52, 181, 193);
- int fillColor2 = Color.argb(255, 255, 97, 101);
- int strokeColor7 = Color.argb(255, 238, 145, 9);
- int strokeColor5 = Color.argb(255, 225, 22, 27);
- int fillColor7 = Color.argb(255, 41, 149, 205);
- int strokeColor11 = Color.argb(255, 106, 52, 204);
int fillColor76 = Color.argb(255, 255, 182, 184);
+ int fillColor82 = Color.argb(255, 154, 98, 255);
+ int fillColor7 = Color.argb(255, 41, 149, 205);
+ int fillColor2 = Color.argb(255, 255, 97, 101);
+ int strokeColor5 = Color.argb(255, 225, 22, 27);
+ int strokeColor12 = Color.argb(255, 0, 87, 55);
+ int strokeColor11 = Color.argb(255, 106, 52, 204);
+ int strokeColor3 = Color.argb(255, 253, 124, 127);
+ int strokeColor8 = Color.argb(255, 28, 163, 114);
+ int strokeColor7 = Color.argb(255, 238, 145, 9);
+ int strokeColor6 = Color.argb(255, 236, 109, 23);
+ int fillColor77 = Color.argb(255, 201, 43, 43);
+ int strokeColor9 = Color.argb(255, 52, 181, 193);
+ int fillColor81 = Color.argb(255, 94, 221, 233);
+ int fillColor80 = Color.argb(255, 63, 218, 162);
+ int fillColor83 = Color.argb(255, 119, 244, 199);
+ int strokeColor10 = Color.argb(255, 5, 112, 168);
+ int strokeColor4 = Color.argb(255, 136, 10, 10);
+ int fillColor79 = Color.argb(255, 255, 190, 93);
+ int fillColor78 = Color.argb(255, 255, 148, 76);
// Local Variables
boolean isTier7 = _1 == 7f && !isNPC;
- boolean isTier1 = _1 == 1f && !isNPC;
- boolean isTier9 = _1 == 9f && !isNPC;
- boolean isTier6 = _1 == 6f && !isNPC;
- boolean isTier5 = _1 == 5f && !isNPC;
- boolean isTier4 = _1 == 4f && !isNPC;
- boolean isTier2 = _1 == 2f && !isNPC;
boolean isTier8 = _1 == 8f && !isNPC;
+ boolean isTier4 = _1 == 4f && !isNPC;
boolean isTier3 = _1 == 3f && !isNPC;
+ boolean isTier2 = _1 == 2f && !isNPC;
+ boolean isTier5 = _1 == 5f && !isNPC;
+ boolean isTier1 = _1 == 1f && !isNPC;
+ boolean isTier6 = _1 == 6f && !isNPC;
+ boolean isTier9 = _1 == 9f && !isNPC;
// Resize to Target Frame
canvas.save();
@@ -7576,8 +7575,8 @@ public class HabiticaIcons {
Paint paint = CacheForChatLikeIcon.paint;
// Local Colors
- int fillColor82 = Color.argb(255, 154, 98, 255);
int fillColor25 = Color.argb(255, 225, 224, 227);
+ int fillColor82 = Color.argb(255, 154, 98, 255);
// Local Variables
int expression2 = wasLiked ? fillColor82 : fillColor25;
@@ -8074,18 +8073,18 @@ public class HabiticaIcons {
Paint paint = CacheForDamage.paint;
// Local Colors
- int fillColor90 = Color.argb(179, 78, 74, 87);
int fillColor89 = Color.argb(255, 227, 143, 61);
- int fillColor88 = Color.argb(255, 179, 98, 19);
- int fillColor35 = Color.argb(255, 195, 192, 199);
- int fillColor25 = Color.argb(255, 225, 224, 227);
- int fillColor40 = Color.argb(255, 165, 161, 172);
int fillColor86 = Color.argb(255, 213, 200, 255);
- int fillColor87 = Color.argb(255, 189, 168, 255);
- int fillColor75 = Color.argb(255, 135, 129, 144);
- int fillColor85 = Color.argb(255, 237, 236, 238);
int fillColor37 = Color.argb(255, 255, 255, 255);
int fillColor84 = Color.argb(255, 240, 97, 102);
+ int fillColor87 = Color.argb(255, 189, 168, 255);
+ int fillColor40 = Color.argb(255, 165, 161, 172);
+ int fillColor35 = Color.argb(255, 195, 192, 199);
+ int fillColor88 = Color.argb(255, 179, 98, 19);
+ int fillColor75 = Color.argb(255, 135, 129, 144);
+ int fillColor90 = Color.argb(179, 78, 74, 87);
+ int fillColor25 = Color.argb(255, 225, 224, 227);
+ int fillColor85 = Color.argb(255, 237, 236, 238);
// Resize to Target Frame
canvas.save();
@@ -8963,13 +8962,13 @@ public class HabiticaIcons {
Paint paint = CacheForRage.paint;
// Local Colors
- int fillColor5 = Color.argb(64, 255, 255, 255);
- int fillColor15 = Color.argb(89, 27, 153, 107);
int fillColor93 = Color.argb(255, 244, 120, 37);
int fillColor3 = Color.argb(128, 255, 255, 255);
+ int fillColor15 = Color.argb(89, 27, 153, 107);
int fillColor92 = Color.argb(255, 90, 228, 178);
- int fillColor14 = Color.argb(255, 36, 204, 143);
int fillColor94 = Color.argb(89, 180, 89, 27);
+ int fillColor14 = Color.argb(255, 36, 204, 143);
+ int fillColor5 = Color.argb(64, 255, 255, 255);
// Resize to Target Frame
canvas.save();
@@ -9277,10 +9276,10 @@ public class HabiticaIcons {
public static void drawTaskDifficultyStars(Canvas canvas, RectF targetFrame, ResizingBehavior resizing, int taskTintColor, float difficulty, boolean isActive) {
// Local Variables
- boolean isTrivial = difficulty == 0.1f;
- boolean isMedium = difficulty == 1.5f;
boolean isHard = difficulty == 2f;
+ boolean isMedium = difficulty == 1.5f;
boolean isEasy = difficulty == 1f;
+ boolean isTrivial = difficulty == 0.1f;
// Resize to Target Frame
canvas.save();
@@ -9434,8 +9433,8 @@ public class HabiticaIcons {
int strokeColor15 = Color.argb(255, 195, 192, 199);
// Local Variables
- int starFillColor = isActive ? taskTintColor : transparent;
int borderColor = isActive ? taskTintColor : strokeColor15;
+ int starFillColor = isActive ? taskTintColor : transparent;
// Resize to Target Frame
canvas.save();
@@ -9498,13 +9497,13 @@ public class HabiticaIcons {
Paint paint = CacheForHabitControlPlus.paint;
// Local Colors
- int fillColor37 = Color.argb(255, 255, 255, 255);
int strokeColor15 = Color.argb(255, 195, 192, 199);
+ int fillColor37 = Color.argb(255, 255, 255, 255);
int transparent = Color.argb(0, 204, 82, 82);
// Local Variables
- int controlFillColor = isActive ? fillColor37 : strokeColor15;
int borderColor = isActive ? taskTintColor : strokeColor15;
+ int controlFillColor = isActive ? fillColor37 : strokeColor15;
int starFillColor = isActive ? taskTintColor : transparent;
// Resize to Target Frame
@@ -9586,13 +9585,13 @@ public class HabiticaIcons {
Paint paint = CacheForHabitControlMinus.paint;
// Local Colors
- int fillColor37 = Color.argb(255, 255, 255, 255);
int strokeColor15 = Color.argb(255, 195, 192, 199);
+ int fillColor37 = Color.argb(255, 255, 255, 255);
int transparent = Color.argb(0, 204, 82, 82);
// Local Variables
- int controlFillColor = isActive ? fillColor37 : strokeColor15;
int borderColor = isActive ? taskTintColor : strokeColor15;
+ int controlFillColor = isActive ? fillColor37 : strokeColor15;
int starFillColor = isActive ? taskTintColor : transparent;
// Resize to Target Frame
@@ -9850,33 +9849,33 @@ public class HabiticaIcons {
GlobalCache.initializeTypefaceBuilders(context.getAssets());
// Local Colors
- int crestBronze6 = Color.argb(255, 179, 98, 19);
int crestGold1 = Color.argb(255, 255, 188, 90);
- int crestSilver6 = Color.argb(255, 141, 141, 141);
- int crestSilver1 = Color.argb(255, 194, 194, 194);
- int crestBronze3 = Color.argb(255, 179, 98, 19);
- int crestSilver5 = Color.argb(255, 141, 141, 141);
- int crestBronze4 = Color.argb(255, 215, 122, 32);
- int crestGold4 = Color.argb(255, 255, 166, 35);
+ int crestBronze6 = Color.argb(255, 179, 98, 19);
int crestGold2 = Color.argb(255, 255, 210, 145);
- int crestBronze2 = Color.argb(255, 244, 165, 89);
- int crestGold6 = Color.argb(255, 223, 145, 30);
- int crestSilver3 = Color.argb(255, 141, 141, 141);
int crestSilver4 = Color.argb(255, 175, 175, 175);
+ int crestSilver3 = Color.argb(255, 141, 141, 141);
+ int crestGold6 = Color.argb(255, 223, 145, 30);
+ int crestBronze2 = Color.argb(255, 244, 165, 89);
+ int crestBronze3 = Color.argb(255, 179, 98, 19);
+ int crestBronze4 = Color.argb(255, 215, 122, 32);
+ int crestSilver1 = Color.argb(255, 194, 194, 194);
+ int crestSilver6 = Color.argb(255, 141, 141, 141);
+ int crestBronze5 = Color.argb(255, 179, 98, 19);
+ int crestGold4 = Color.argb(255, 255, 166, 35);
int crestSilver2 = Color.argb(255, 217, 217, 217);
int crestBronze1 = Color.argb(255, 234, 140, 49);
- int crestGold3 = Color.argb(255, 223, 145, 30);
- int crestBronze5 = Color.argb(255, 179, 98, 19);
int crestGold5 = Color.argb(255, 223, 145, 30);
+ int crestSilver5 = Color.argb(255, 141, 141, 141);
+ int crestGold3 = Color.argb(255, 223, 145, 30);
// Local Variables
- boolean isPrivate = !isPublic;
- int crestColor5 = memberCount < 100f ? crestBronze5 : (memberCount < 1000f ? crestSilver5 : crestGold5);
- int crestColor4 = memberCount < 100f ? crestBronze4 : (memberCount < 1000f ? crestSilver4 : crestGold4);
- int crestColor3 = memberCount < 100f ? crestBronze3 : (memberCount < 1000f ? crestSilver3 : crestGold3);
- int crestColor1 = memberCount < 100f ? crestBronze1 : (memberCount < 1000f ? crestSilver1 : crestGold1);
int crestColor6 = memberCount < 100f ? crestBronze6 : (memberCount < 1000f ? crestSilver6 : crestGold6);
+ int crestColor5 = memberCount < 100f ? crestBronze5 : (memberCount < 1000f ? crestSilver5 : crestGold5);
int crestColor2 = memberCount < 100f ? crestBronze2 : (memberCount < 1000f ? crestSilver2 : crestGold2);
+ boolean isPrivate = !isPublic;
+ int crestColor4 = memberCount < 100f ? crestBronze4 : (memberCount < 1000f ? crestSilver4 : crestGold4);
+ int crestColor1 = memberCount < 100f ? crestBronze1 : (memberCount < 1000f ? crestSilver1 : crestGold1);
+ int crestColor3 = memberCount < 100f ? crestBronze3 : (memberCount < 1000f ? crestSilver3 : crestGold3);
// Resize to Target Frame
canvas.save();
@@ -10379,28 +10378,28 @@ public class HabiticaIcons {
Paint paint = CacheForGuildCrestMedium.paint;
// Local Colors
- int crestBronze6 = Color.argb(255, 179, 98, 19);
int crestGold1 = Color.argb(255, 255, 188, 90);
- int crestSilver6 = Color.argb(255, 141, 141, 141);
- int crestSilver1 = Color.argb(255, 194, 194, 194);
+ int crestBronze6 = Color.argb(255, 179, 98, 19);
+ int crestGold2 = Color.argb(255, 255, 210, 145);
+ int crestSilver4 = Color.argb(255, 175, 175, 175);
+ int crestSilver3 = Color.argb(255, 141, 141, 141);
+ int crestGold6 = Color.argb(255, 223, 145, 30);
+ int crestBronze2 = Color.argb(255, 244, 165, 89);
int crestBronze3 = Color.argb(255, 179, 98, 19);
int crestBronze4 = Color.argb(255, 215, 122, 32);
+ int crestSilver1 = Color.argb(255, 194, 194, 194);
+ int crestSilver6 = Color.argb(255, 141, 141, 141);
int crestGold4 = Color.argb(255, 255, 166, 35);
- int crestGold2 = Color.argb(255, 255, 210, 145);
- int crestBronze2 = Color.argb(255, 244, 165, 89);
- int crestGold6 = Color.argb(255, 223, 145, 30);
- int crestSilver3 = Color.argb(255, 141, 141, 141);
- int crestSilver4 = Color.argb(255, 175, 175, 175);
int crestSilver2 = Color.argb(255, 217, 217, 217);
int crestBronze1 = Color.argb(255, 234, 140, 49);
int crestGold3 = Color.argb(255, 223, 145, 30);
// Local Variables
- int crestColor4 = memberCount < 100f ? crestBronze4 : (memberCount < 1000f ? crestSilver4 : crestGold4);
int crestColor3 = memberCount < 100f ? crestBronze3 : (memberCount < 1000f ? crestSilver3 : crestGold3);
int crestColor2 = memberCount < 100f ? crestBronze2 : (memberCount < 1000f ? crestSilver2 : crestGold2);
- int crestColor6 = memberCount < 100f ? crestBronze6 : (memberCount < 1000f ? crestSilver6 : crestGold6);
int crestColor1 = memberCount < 100f ? crestBronze1 : (memberCount < 1000f ? crestSilver1 : crestGold1);
+ int crestColor4 = memberCount < 100f ? crestBronze4 : (memberCount < 1000f ? crestSilver4 : crestGold4);
+ int crestColor6 = memberCount < 100f ? crestBronze6 : (memberCount < 1000f ? crestSilver6 : crestGold6);
// Resize to Target Frame
canvas.save();
@@ -10580,10 +10579,10 @@ public class HabiticaIcons {
Paint paint = CacheForGuildCrestSmall.paint;
// Local Colors
- int fillColor37 = Color.argb(255, 255, 255, 255);
int crestSilver4 = Color.argb(255, 175, 175, 175);
- int crestGold4 = Color.argb(255, 255, 166, 35);
+ int fillColor37 = Color.argb(255, 255, 255, 255);
int crestBronze4 = Color.argb(255, 215, 122, 32);
+ int crestGold4 = Color.argb(255, 255, 166, 35);
// Local Variables
int crestColor4 = memberCount < 100f ? crestBronze4 : (memberCount < 1000f ? crestSilver4 : crestGold4);
@@ -10700,8 +10699,8 @@ public class HabiticaIcons {
int guildHeaderDark7 = PaintCodeColor.colorByChangingValue(guildHeaderDark8, 1f);
int guildHeaderDark6 = PaintCodeColor.colorByApplyingHighlight(guildHeaderDark2, 0.3f);
int guildHeaderDark3 = PaintCodeColor.colorByChangingValue(guildHeader, 1f);
- int guildHeaderDark4 = PaintCodeColor.colorByApplyingHighlight(guildHeaderDark3, 0.15f);
int guildHeaderDark5 = PaintCodeColor.colorByApplyingHighlight(guildHeaderDark3, 0.7f);
+ int guildHeaderDark4 = PaintCodeColor.colorByApplyingHighlight(guildHeaderDark3, 0.15f);
int textForeground2 = Color.argb(255, 255, 255, 255);
// Resize to Target Frame
@@ -11365,8 +11364,8 @@ public class HabiticaIcons {
Paint paint = CacheForBlankAvatarIcon.paint;
// Local Colors
- int fillColor101 = Color.argb(255, 247, 78, 82);
int fillColor40 = Color.argb(255, 165, 161, 172);
+ int fillColor101 = Color.argb(255, 247, 78, 82);
// Resize to Target Frame
canvas.save();
@@ -11908,8 +11907,8 @@ public class HabiticaIcons {
Paint paint = CacheForBuffIcon.paint;
// Local Colors
- int fillColor18 = Color.argb(255, 154, 98, 255);
int fillColor85 = Color.argb(255, 237, 236, 238);
+ int fillColor18 = Color.argb(255, 154, 98, 255);
// Resize to Target Frame
canvas.save();
@@ -11989,9 +11988,9 @@ public class HabiticaIcons {
Paint paint = CacheForParticipantsIcon.paint;
// Local Colors
- int fillColor104 = Color.argb(255, 249, 249, 249);
- int fillColor39 = Color.argb(255, 189, 168, 255);
int fillColor25 = Color.argb(255, 225, 224, 227);
+ int fillColor39 = Color.argb(255, 189, 168, 255);
+ int fillColor104 = Color.argb(255, 249, 249, 249);
// Resize to Target Frame
canvas.save();
@@ -12553,8 +12552,8 @@ public class HabiticaIcons {
Paint paint = CacheForBuffIconDark.paint;
// Local Colors
- int fillColor39 = Color.argb(255, 189, 168, 255);
int buffBackgroundColorDark = Color.argb(255, 70, 40, 125);
+ int fillColor39 = Color.argb(255, 189, 168, 255);
// Resize to Target Frame
canvas.save();
@@ -12656,12 +12655,12 @@ public class HabiticaIcons {
Paint paint = CacheForStats.paint;
// Local Colors
- int fillColor89 = Color.argb(255, 227, 143, 61);
- int strokeColor21 = Color.argb(255, 135, 129, 144);
int fillColor25 = Color.argb(255, 225, 224, 227);
- int fillColor106 = Color.argb(255, 216, 216, 216);
- int fillColor107 = Color.argb(255, 179, 98, 19);
int fillColor35 = Color.argb(255, 195, 192, 199);
+ int fillColor106 = Color.argb(255, 216, 216, 216);
+ int strokeColor21 = Color.argb(255, 135, 129, 144);
+ int fillColor89 = Color.argb(255, 227, 143, 61);
+ int fillColor107 = Color.argb(255, 179, 98, 19);
int fillColor40 = Color.argb(255, 165, 161, 172);
// Resize to Target Frame
@@ -12944,6 +12943,1050 @@ public class HabiticaIcons {
canvas.restore();
}
+ private static class CacheForDashBorder {
+ private static Paint paint = new Paint();
+ private static RectF originalFrame = new RectF(0f, 0f, 113f, 116f);
+ private static RectF resizedFrame = new RectF();
+ private static RectF bezierRect = new RectF();
+ private static Path bezierPath = new Path();
+ private static RectF bezier2Rect = new RectF();
+ private static Path bezier2Path = new Path();
+ private static RectF bezier3Rect = new RectF();
+ private static Path bezier3Path = new Path();
+ private static RectF bezier4Rect = new RectF();
+ private static Path bezier4Path = new Path();
+ private static RectF bezier5Rect = new RectF();
+ private static Path bezier5Path = new Path();
+ private static PaintCodeDashPathEffect bezier5PathDashEffect = new PaintCodeDashPathEffect();
+ private static RectF bezier6Rect = new RectF();
+ private static Path bezier6Path = new Path();
+ private static PaintCodeDashPathEffect bezier6PathDashEffect = new PaintCodeDashPathEffect();
+ private static RectF bezier7Rect = new RectF();
+ private static Path bezier7Path = new Path();
+ private static PaintCodeDashPathEffect bezier7PathDashEffect = new PaintCodeDashPathEffect();
+ private static RectF bezier8Rect = new RectF();
+ private static Path bezier8Path = new Path();
+ private static PaintCodeDashPathEffect bezier8PathDashEffect = new PaintCodeDashPathEffect();
+ }
+
+ public static void drawDashBorder(Canvas canvas) {
+ HabiticaIcons.drawDashBorder(canvas, new RectF(0f, 0f, 113f, 116f), ResizingBehavior.AspectFit);
+ }
+
+ public static void drawDashBorder(Canvas canvas, RectF targetFrame, ResizingBehavior resizing) {
+ // General Declarations
+ Paint paint = CacheForDashBorder.paint;
+
+ // Local Colors
+ int strokeColor22 = Color.argb(255, 97, 51, 180);
+ int strokeColor23 = Color.argb(255, 213, 200, 255);
+
+ // Resize to Target Frame
+ canvas.save();
+ RectF resizedFrame = CacheForDashBorder.resizedFrame;
+ HabiticaIcons.resizingBehaviorApply(resizing, CacheForDashBorder.originalFrame, targetFrame, resizedFrame);
+ canvas.translate(resizedFrame.left, resizedFrame.top);
+ canvas.scale(resizedFrame.width() / 113f, resizedFrame.height() / 116f);
+
+ // Bezier
+ RectF bezierRect = CacheForDashBorder.bezierRect;
+ bezierRect.set(2f, 2f, 18f, 18f);
+ Path bezierPath = CacheForDashBorder.bezierPath;
+ bezierPath.reset();
+ bezierPath.moveTo(18f, 2f);
+ bezierPath.lineTo(2f, 2f);
+ bezierPath.lineTo(2f, 18f);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(3f);
+ paint.setStrokeMiter(10f);
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(strokeColor22);
+ canvas.drawPath(bezierPath, paint);
+ canvas.restore();
+
+ // Bezier 2
+ RectF bezier2Rect = CacheForDashBorder.bezier2Rect;
+ bezier2Rect.set(2f, 98f, 18f, 114f);
+ Path bezier2Path = CacheForDashBorder.bezier2Path;
+ bezier2Path.reset();
+ bezier2Path.moveTo(18f, 114f);
+ bezier2Path.lineTo(2f, 114f);
+ bezier2Path.lineTo(2f, 98f);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(3f);
+ paint.setStrokeMiter(10f);
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(strokeColor22);
+ canvas.drawPath(bezier2Path, paint);
+ canvas.restore();
+
+ // Bezier 3
+ RectF bezier3Rect = CacheForDashBorder.bezier3Rect;
+ bezier3Rect.set(95f, 2f, 111f, 18f);
+ Path bezier3Path = CacheForDashBorder.bezier3Path;
+ bezier3Path.reset();
+ bezier3Path.moveTo(95f, 2f);
+ bezier3Path.lineTo(111f, 2f);
+ bezier3Path.lineTo(111f, 18f);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(3f);
+ paint.setStrokeMiter(10f);
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(strokeColor22);
+ canvas.drawPath(bezier3Path, paint);
+ canvas.restore();
+
+ // Bezier 4
+ RectF bezier4Rect = CacheForDashBorder.bezier4Rect;
+ bezier4Rect.set(95f, 98f, 111f, 114f);
+ Path bezier4Path = CacheForDashBorder.bezier4Path;
+ bezier4Path.reset();
+ bezier4Path.moveTo(95f, 114f);
+ bezier4Path.lineTo(111f, 114f);
+ bezier4Path.lineTo(111f, 98f);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(3f);
+ paint.setStrokeMiter(10f);
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(strokeColor22);
+ canvas.drawPath(bezier4Path, paint);
+ canvas.restore();
+
+ // Bezier 5
+ RectF bezier5Rect = CacheForDashBorder.bezier5Rect;
+ bezier5Rect.set(2f, 22f, 2f, 94f);
+ Path bezier5Path = CacheForDashBorder.bezier5Path;
+ bezier5Path.reset();
+ bezier5Path.moveTo(2f, 22f);
+ bezier5Path.lineTo(2f, 94f);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(3f);
+ paint.setStrokeMiter(10f);
+ paint.setPathEffect(CacheForDashBorder.bezier5PathDashEffect.get(8f, 8f, 0f));
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(strokeColor23);
+ canvas.drawPath(bezier5Path, paint);
+ canvas.restore();
+
+ // Bezier 6
+ RectF bezier6Rect = CacheForDashBorder.bezier6Rect;
+ bezier6Rect.set(111f, 22f, 111f, 94f);
+ Path bezier6Path = CacheForDashBorder.bezier6Path;
+ bezier6Path.reset();
+ bezier6Path.moveTo(111f, 22f);
+ bezier6Path.lineTo(111f, 94f);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(3f);
+ paint.setStrokeMiter(10f);
+ paint.setPathEffect(CacheForDashBorder.bezier6PathDashEffect.get(8f, 8f, 0f));
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(strokeColor23);
+ canvas.drawPath(bezier6Path, paint);
+ canvas.restore();
+
+ // Bezier 7
+ RectF bezier7Rect = CacheForDashBorder.bezier7Rect;
+ bezier7Rect.set(22f, 114f, 94f, 114f);
+ Path bezier7Path = CacheForDashBorder.bezier7Path;
+ bezier7Path.reset();
+ bezier7Path.moveTo(22f, 114f);
+ bezier7Path.lineTo(94f, 114f);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(3f);
+ paint.setStrokeMiter(10f);
+ paint.setPathEffect(CacheForDashBorder.bezier7PathDashEffect.get(8f, 7f, 0f));
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(strokeColor23);
+ canvas.drawPath(bezier7Path, paint);
+ canvas.restore();
+
+ // Bezier 8
+ RectF bezier8Rect = CacheForDashBorder.bezier8Rect;
+ bezier8Rect.set(22f, 2f, 94f, 2f);
+ Path bezier8Path = CacheForDashBorder.bezier8Path;
+ bezier8Path.reset();
+ bezier8Path.moveTo(22f, 2f);
+ bezier8Path.lineTo(94f, 2f);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(3f);
+ paint.setStrokeMiter(10f);
+ paint.setPathEffect(CacheForDashBorder.bezier8PathDashEffect.get(8f, 7f, 0f));
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(strokeColor23);
+ canvas.drawPath(bezier8Path, paint);
+ canvas.restore();
+
+ canvas.restore();
+ }
+
+ private static class CacheForTaskFilterIcon {
+ private static Paint paint = new Paint();
+ private static RectF originalFrame = new RectF(0f, 0f, 30f, 28f);
+ private static RectF resizedFrame = new RectF();
+ private static RectF bezierRect = new RectF();
+ private static Path bezierPath = new Path();
+ private static RectF bezier2Rect = new RectF();
+ private static Path bezier2Path = new Path();
+ private static RectF bezier3Rect = new RectF();
+ private static Path bezier3Path = new Path();
+ private static RectF ovalRect = new RectF();
+ private static Path ovalPath = new Path();
+ }
+
+ public static void drawTaskFilterIcon(Canvas canvas, boolean filter_active) {
+ HabiticaIcons.drawTaskFilterIcon(canvas, new RectF(0f, 0f, 30f, 28f), ResizingBehavior.AspectFit, filter_active);
+ }
+
+ public static void drawTaskFilterIcon(Canvas canvas, RectF targetFrame, ResizingBehavior resizing, boolean filter_active) {
+ // General Declarations
+ Paint paint = CacheForTaskFilterIcon.paint;
+
+ // Local Colors
+ int fillColor108 = Color.argb(255, 78, 74, 87);
+ int strokeColor18 = Color.argb(255, 78, 74, 87);
+
+ // Resize to Target Frame
+ canvas.save();
+ RectF resizedFrame = CacheForTaskFilterIcon.resizedFrame;
+ HabiticaIcons.resizingBehaviorApply(resizing, CacheForTaskFilterIcon.originalFrame, targetFrame, resizedFrame);
+ canvas.translate(resizedFrame.left, resizedFrame.top);
+ canvas.scale(resizedFrame.width() / 30f, resizedFrame.height() / 28f);
+
+ // Group
+ {
+ // Group 2
+ {
+ // Bezier
+ RectF bezierRect = CacheForTaskFilterIcon.bezierRect;
+ bezierRect.set(4.5f, 7.5f, 24.5f, 7.5f);
+ Path bezierPath = CacheForTaskFilterIcon.bezierPath;
+ bezierPath.reset();
+ bezierPath.moveTo(4.5f, 7.5f);
+ bezierPath.lineTo(24.5f, 7.5f);
+
+ 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(strokeColor18);
+ canvas.drawPath(bezierPath, paint);
+ canvas.restore();
+
+ // Bezier 2
+ RectF bezier2Rect = CacheForTaskFilterIcon.bezier2Rect;
+ bezier2Rect.set(7.5f, 14.5f, 21.5f, 14.5f);
+ Path bezier2Path = CacheForTaskFilterIcon.bezier2Path;
+ bezier2Path.reset();
+ bezier2Path.moveTo(7.5f, 14.5f);
+ bezier2Path.lineTo(21.5f, 14.5f);
+
+ 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(strokeColor18);
+ canvas.drawPath(bezier2Path, paint);
+ canvas.restore();
+
+ // Bezier 3
+ RectF bezier3Rect = CacheForTaskFilterIcon.bezier3Rect;
+ bezier3Rect.set(10.5f, 21.5f, 18.5f, 21.5f);
+ Path bezier3Path = CacheForTaskFilterIcon.bezier3Path;
+ bezier3Path.reset();
+ bezier3Path.moveTo(10.5f, 21.5f);
+ bezier3Path.lineTo(18.5f, 21.5f);
+
+ 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(strokeColor18);
+ canvas.drawPath(bezier3Path, paint);
+ canvas.restore();
+ }
+
+ // Oval
+ if (filter_active) {
+ RectF ovalRect = CacheForTaskFilterIcon.ovalRect;
+ ovalRect.set(19.5f, 1f, 29.5f, 11f);
+ Path ovalPath = CacheForTaskFilterIcon.ovalPath;
+ ovalPath.reset();
+ ovalPath.addOval(ovalRect, Path.Direction.CW);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStyle(Paint.Style.FILL);
+ paint.setColor(fillColor108);
+ canvas.drawPath(ovalPath, paint);
+ }
+ }
+
+ canvas.restore();
+ }
+
+ private static class CacheForFallGemPromoBG {
+ private static Paint paint = new Paint();
+ private static RectF originalFrame = new RectF(0f, 0f, 132f, 35f);
+ private static RectF resizedFrame = new RectF();
+ private static RectF group = new RectF();
+ private static Path clip2Path = new Path();
+ private static RectF group2 = new RectF();
+ private static Path clipPath = new Path();
+ private static RectF bezierRect = new RectF();
+ private static Path bezierPath = new Path();
+ private static RectF group3 = new RectF();
+ private static Path clip4Path = new Path();
+ private static RectF group4 = new RectF();
+ private static Path clip3Path = new Path();
+ private static RectF bezier3Rect = new RectF();
+ private static Path bezier3Path = new Path();
+ private static RectF bezier5Rect = new RectF();
+ private static Path bezier5Path = new Path();
+ private static RectF bezier6Rect = new RectF();
+ private static Path bezier6Path = new Path();
+ private static RectF group5 = new RectF();
+ private static Path clip6Path = new Path();
+ private static RectF group6 = new RectF();
+ private static Path clip5Path = new Path();
+ private static RectF bezier7Rect = new RectF();
+ private static Path bezier7Path = new Path();
+ private static RectF group7 = new RectF();
+ private static Path clip8Path = new Path();
+ private static RectF group8 = new RectF();
+ private static Path clip7Path = new Path();
+ private static RectF bezier9Rect = new RectF();
+ private static Path bezier9Path = new Path();
+ private static RectF bezier11Rect = new RectF();
+ private static Path bezier11Path = new Path();
+ private static RectF bezier12Rect = new RectF();
+ private static Path bezier12Path = new Path();
+ }
+
+ public static void drawFallGemPromoBG(Canvas canvas, int redGemColor, int greenGemColor, int blueGemColor, int purpleGemColor) {
+ HabiticaIcons.drawFallGemPromoBG(canvas, new RectF(0f, 0f, 132f, 35f), ResizingBehavior.AspectFit, redGemColor, greenGemColor, blueGemColor, purpleGemColor);
+ }
+
+ public static void drawFallGemPromoBG(Canvas canvas, RectF targetFrame, ResizingBehavior resizing, int redGemColor, int greenGemColor, int blueGemColor, int purpleGemColor) {
+ // General Declarations
+ Paint paint = CacheForFallGemPromoBG.paint;
+
+ // Local Colors
+ int strokeColor26 = Color.argb(255, 255, 255, 255);
+
+ // Resize to Target Frame
+ canvas.save();
+ RectF resizedFrame = CacheForFallGemPromoBG.resizedFrame;
+ HabiticaIcons.resizingBehaviorApply(resizing, CacheForFallGemPromoBG.originalFrame, targetFrame, resizedFrame);
+ canvas.translate(resizedFrame.left, resizedFrame.top);
+ canvas.scale(resizedFrame.width() / 132f, resizedFrame.height() / 35f);
+
+ // Group
+ {
+ RectF group = CacheForFallGemPromoBG.group;
+ group.set(110.05f, 3.28f, 119.46f, 13.06f);
+ canvas.save();
+
+ // Clip 2
+ Path clip2Path = CacheForFallGemPromoBG.clip2Path;
+ clip2Path.reset();
+ clip2Path.moveTo(110.54f, 4.1f);
+ clip2Path.lineTo(110.05f, 8.37f);
+ clip2Path.lineTo(115.26f, 13.06f);
+ clip2Path.lineTo(119.46f, 12.13f);
+ clip2Path.lineTo(119.35f, 3.28f);
+ clip2Path.lineTo(110.54f, 4.1f);
+ clip2Path.close();
+ canvas.clipPath(clip2Path);
+
+ // Group 2
+ {
+ RectF group2 = CacheForFallGemPromoBG.group2;
+ group2.set(110f, 3f, 120f, 14f);
+ canvas.save();
+
+ // Clip
+ Path clipPath = CacheForFallGemPromoBG.clipPath;
+ clipPath.reset();
+ clipPath.addRect(group2, Path.Direction.CW);
+ canvas.clipPath(clipPath);
+
+ // Bezier
+ RectF bezierRect = CacheForFallGemPromoBG.bezierRect;
+ bezierRect.set(110.05f, 3.28f, 119.46f, 13.06f);
+ Path bezierPath = CacheForFallGemPromoBG.bezierPath;
+ bezierPath.reset();
+ bezierPath.moveTo(110.54f, 4.1f);
+ bezierPath.lineTo(110.05f, 8.37f);
+ bezierPath.lineTo(115.26f, 13.06f);
+ bezierPath.lineTo(119.46f, 12.13f);
+ bezierPath.lineTo(119.35f, 3.28f);
+ bezierPath.lineTo(110.54f, 4.1f);
+ bezierPath.close();
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(2f);
+ paint.setStrokeMiter(10f);
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(blueGemColor);
+ canvas.drawPath(bezierPath, paint);
+ canvas.restore();
+
+ canvas.restore();
+ }
+
+ canvas.restore();
+ }
+
+ // Group 3
+ {
+ RectF group3 = CacheForFallGemPromoBG.group3;
+ group3.set(114.54f, 23.3f, 126.18f, 33.85f);
+ canvas.save();
+
+ // Clip 4
+ Path clip4Path = CacheForFallGemPromoBG.clip4Path;
+ clip4Path.reset();
+ clip4Path.moveTo(126.18f, 29f);
+ clip4Path.lineTo(124.61f, 25f);
+ clip4Path.lineTo(117.81f, 23.3f);
+ clip4Path.lineTo(114.54f, 26.09f);
+ clip4Path.lineTo(118.79f, 33.85f);
+ clip4Path.lineTo(126.18f, 29f);
+ clip4Path.close();
+ canvas.clipPath(clip4Path);
+
+ // Group 4
+ {
+ RectF group4 = CacheForFallGemPromoBG.group4;
+ group4.set(114f, 23f, 127f, 34f);
+ canvas.save();
+
+ // Clip 3
+ Path clip3Path = CacheForFallGemPromoBG.clip3Path;
+ clip3Path.reset();
+ clip3Path.addRect(group4, Path.Direction.CW);
+ canvas.clipPath(clip3Path);
+
+ // Bezier 3
+ RectF bezier3Rect = CacheForFallGemPromoBG.bezier3Rect;
+ bezier3Rect.set(114.54f, 23.3f, 126.18f, 33.85f);
+ Path bezier3Path = CacheForFallGemPromoBG.bezier3Path;
+ bezier3Path.reset();
+ bezier3Path.moveTo(126.18f, 29f);
+ bezier3Path.lineTo(124.61f, 25f);
+ bezier3Path.lineTo(117.81f, 23.3f);
+ bezier3Path.lineTo(114.54f, 26.09f);
+ bezier3Path.lineTo(118.79f, 33.85f);
+ bezier3Path.lineTo(126.18f, 29f);
+ bezier3Path.close();
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(2f);
+ paint.setStrokeMiter(10f);
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(purpleGemColor);
+ canvas.drawPath(bezier3Path, paint);
+ canvas.restore();
+
+ canvas.restore();
+ }
+
+ canvas.restore();
+ }
+
+ // Bezier 5
+ RectF bezier5Rect = CacheForFallGemPromoBG.bezier5Rect;
+ bezier5Rect.set(104.86f, 16.84f, 109.14f, 21.16f);
+ Path bezier5Path = CacheForFallGemPromoBG.bezier5Path;
+ bezier5Path.reset();
+ bezier5Path.moveTo(109.08f, 21.16f);
+ bezier5Path.cubicTo(109.35f, 19.51f, 108.65f, 18.79f, 107f, 19f);
+ bezier5Path.cubicTo(105.35f, 19.21f, 104.65f, 18.49f, 104.92f, 16.84f);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(1f);
+ paint.setStrokeJoin(Paint.Join.ROUND);
+ paint.setStrokeCap(Paint.Cap.ROUND);
+ paint.setStrokeMiter(10f);
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(strokeColor26);
+ canvas.drawPath(bezier5Path, paint);
+ canvas.restore();
+
+ // Bezier 6
+ RectF bezier6Rect = CacheForFallGemPromoBG.bezier6Rect;
+ bezier6Rect.set(129.02f, 7.16f, 130.98f, 12.84f);
+ Path bezier6Path = CacheForFallGemPromoBG.bezier6Path;
+ bezier6Path.reset();
+ bezier6Path.moveTo(129.02f, 12.84f);
+ bezier6Path.cubicTo(130.61f, 12.33f, 130.94f, 11.38f, 130f, 10f);
+ bezier6Path.cubicTo(129.06f, 8.62f, 129.39f, 7.67f, 130.98f, 7.16f);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(1f);
+ paint.setStrokeJoin(Paint.Join.ROUND);
+ paint.setStrokeCap(Paint.Cap.ROUND);
+ paint.setStrokeMiter(10f);
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(strokeColor26);
+ canvas.drawPath(bezier6Path, paint);
+ canvas.restore();
+
+ // Group 5
+ {
+ RectF group5 = CacheForFallGemPromoBG.group5;
+ group5.set(12.78f, -0.1f, 22.85f, 10.19f);
+ canvas.save();
+
+ // Clip 6
+ Path clip6Path = CacheForFallGemPromoBG.clip6Path;
+ clip6Path.reset();
+ clip6Path.moveTo(12.78f, 1.47f);
+ clip6Path.lineTo(16.79f, -0.1f);
+ clip6Path.lineTo(22.66f, 3.71f);
+ clip6Path.lineTo(22.85f, 8.01f);
+ clip6Path.lineTo(14.28f, 10.19f);
+ clip6Path.lineTo(12.78f, 1.47f);
+ clip6Path.close();
+ canvas.clipPath(clip6Path);
+
+ // Group 6
+ {
+ RectF group6 = CacheForFallGemPromoBG.group6;
+ group6.set(12f, -1f, 23f, 11f);
+ canvas.save();
+
+ // Clip 5
+ Path clip5Path = CacheForFallGemPromoBG.clip5Path;
+ clip5Path.reset();
+ clip5Path.addRect(group6, Path.Direction.CW);
+ canvas.clipPath(clip5Path);
+
+ // Bezier 7
+ RectF bezier7Rect = CacheForFallGemPromoBG.bezier7Rect;
+ bezier7Rect.set(12.78f, -0.1f, 22.85f, 10.19f);
+ Path bezier7Path = CacheForFallGemPromoBG.bezier7Path;
+ bezier7Path.reset();
+ bezier7Path.moveTo(12.78f, 1.47f);
+ bezier7Path.lineTo(16.79f, -0.1f);
+ bezier7Path.lineTo(22.66f, 3.71f);
+ bezier7Path.lineTo(22.85f, 8.01f);
+ bezier7Path.lineTo(14.28f, 10.19f);
+ bezier7Path.lineTo(12.78f, 1.47f);
+ bezier7Path.close();
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(2f);
+ paint.setStrokeMiter(10f);
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(redGemColor);
+ canvas.drawPath(bezier7Path, paint);
+ canvas.restore();
+
+ canvas.restore();
+ }
+
+ canvas.restore();
+ }
+
+ // Group 7
+ {
+ RectF group7 = CacheForFallGemPromoBG.group7;
+ group7.set(6.82f, 22.23f, 18.35f, 32.81f);
+ canvas.save();
+
+ // Clip 8
+ Path clip8Path = CacheForFallGemPromoBG.clip8Path;
+ clip8Path.reset();
+ clip8Path.moveTo(6.82f, 28.21f);
+ clip8Path.lineTo(8.26f, 24.16f);
+ clip8Path.lineTo(14.99f, 22.23f);
+ clip8Path.lineTo(18.35f, 24.9f);
+ clip8Path.lineTo(14.38f, 32.81f);
+ clip8Path.lineTo(6.82f, 28.21f);
+ clip8Path.close();
+ canvas.clipPath(clip8Path);
+
+ // Group 8
+ {
+ RectF group8 = CacheForFallGemPromoBG.group8;
+ group8.set(6f, 22f, 19f, 33f);
+ canvas.save();
+
+ // Clip 7
+ Path clip7Path = CacheForFallGemPromoBG.clip7Path;
+ clip7Path.reset();
+ clip7Path.addRect(group8, Path.Direction.CW);
+ canvas.clipPath(clip7Path);
+
+ // Bezier 9
+ RectF bezier9Rect = CacheForFallGemPromoBG.bezier9Rect;
+ bezier9Rect.set(6.82f, 22.23f, 18.35f, 32.81f);
+ Path bezier9Path = CacheForFallGemPromoBG.bezier9Path;
+ bezier9Path.reset();
+ bezier9Path.moveTo(6.82f, 28.21f);
+ bezier9Path.lineTo(8.26f, 24.16f);
+ bezier9Path.lineTo(14.99f, 22.23f);
+ bezier9Path.lineTo(18.35f, 24.9f);
+ bezier9Path.lineTo(14.38f, 32.81f);
+ bezier9Path.lineTo(6.82f, 28.21f);
+ bezier9Path.close();
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(2f);
+ paint.setStrokeMiter(10f);
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(greenGemColor);
+ canvas.drawPath(bezier9Path, paint);
+ canvas.restore();
+
+ canvas.restore();
+ }
+
+ canvas.restore();
+ }
+
+ // Bezier 11
+ RectF bezier11Rect = CacheForFallGemPromoBG.bezier11Rect;
+ bezier11Rect.set(24.7f, 16.97f, 29.3f, 21.03f);
+ Path bezier11Path = CacheForFallGemPromoBG.bezier11Path;
+ bezier11Path.reset();
+ bezier11Path.moveTo(29.3f, 20.93f);
+ bezier11Path.cubicTo(27.68f, 21.31f, 26.91f, 20.66f, 27f, 19f);
+ bezier11Path.cubicTo(27.09f, 17.34f, 26.32f, 16.69f, 24.7f, 17.07f);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(1f);
+ paint.setStrokeJoin(Paint.Join.ROUND);
+ paint.setStrokeCap(Paint.Cap.ROUND);
+ paint.setStrokeMiter(10f);
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(strokeColor26);
+ canvas.drawPath(bezier11Path, paint);
+ canvas.restore();
+
+ // Bezier 12
+ RectF bezier12Rect = CacheForFallGemPromoBG.bezier12Rect;
+ bezier12Rect.set(0.84f, 11.02f, 3.16f, 16.98f);
+ Path bezier12Path = CacheForFallGemPromoBG.bezier12Path;
+ bezier12Path.reset();
+ bezier12Path.moveTo(1.69f, 16.98f);
+ bezier12Path.cubicTo(0.46f, 15.85f, 0.57f, 14.86f, 2f, 14f);
+ bezier12Path.cubicTo(3.43f, 13.14f, 3.54f, 12.15f, 2.31f, 11.02f);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(1f);
+ paint.setStrokeJoin(Paint.Join.ROUND);
+ paint.setStrokeCap(Paint.Cap.ROUND);
+ paint.setStrokeMiter(10f);
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(strokeColor26);
+ canvas.drawPath(bezier12Path, paint);
+ canvas.restore();
+
+ canvas.restore();
+ }
+
+ private static class CacheForSpookyGemPromoBG {
+ private static Paint paint = new Paint();
+ private static RectF originalFrame = new RectF(0f, 0f, 132f, 35f);
+ private static RectF resizedFrame = new RectF();
+ private static RectF rectangleRect = new RectF();
+ private static Path rectanglePath = new Path();
+ private static RectF bezierRect = new RectF();
+ private static Path bezierPath = new Path();
+ private static RectF bezier2Rect = new RectF();
+ private static Path bezier2Path = new Path();
+ private static RectF group = new RectF();
+ private static Path clipPath = new Path();
+ private static RectF rectangle2Rect = new RectF();
+ private static Path rectangle2Path = new Path();
+ private static RectF group2 = new RectF();
+ private static Path clip2Path = new Path();
+ private static RectF rectangle3Rect = new RectF();
+ private static Path rectangle3Path = new Path();
+ private static RectF bezier5Rect = new RectF();
+ private static Path bezier5Path = new Path();
+ private static RectF bezier6Rect = new RectF();
+ private static Path bezier6Path = new Path();
+ private static RectF group3 = new RectF();
+ private static Path clip3Path = new Path();
+ private static RectF rectangle4Rect = new RectF();
+ private static Path rectangle4Path = new Path();
+ private static RectF group4 = new RectF();
+ private static Path clip4Path = new Path();
+ private static RectF rectangle5Rect = new RectF();
+ private static Path rectangle5Path = new Path();
+ }
+
+ public static void drawSpookyGemPromoBG(Canvas canvas) {
+ HabiticaIcons.drawSpookyGemPromoBG(canvas, new RectF(0f, 0f, 132f, 35f), ResizingBehavior.AspectFit);
+ }
+
+ public static void drawSpookyGemPromoBG(Canvas canvas, RectF targetFrame, ResizingBehavior resizing) {
+ // General Declarations
+ Stack currentTransformation = new Stack();
+ currentTransformation.push(new Matrix());
+ Paint paint = CacheForSpookyGemPromoBG.paint;
+
+ // Local Colors
+ int fillColor109 = Color.argb(255, 250, 133, 55);
+ int strokeColor24 = Color.argb(255, 146, 92, 243);
+ int fillColor37 = Color.argb(255, 255, 255, 255);
+ int fillColor73 = Color.argb(255, 255, 180, 69);
+
+ // Resize to Target Frame
+ canvas.save();
+ RectF resizedFrame = CacheForSpookyGemPromoBG.resizedFrame;
+ HabiticaIcons.resizingBehaviorApply(resizing, CacheForSpookyGemPromoBG.originalFrame, targetFrame, resizedFrame);
+ canvas.translate(resizedFrame.left, resizedFrame.top);
+ canvas.scale(resizedFrame.width() / 132f, resizedFrame.height() / 35f);
+
+ // Rectangle
+ RectF rectangleRect = CacheForSpookyGemPromoBG.rectangleRect;
+ rectangleRect.set(-199f, -765f, 161f, 404f);
+ Path rectanglePath = CacheForSpookyGemPromoBG.rectanglePath;
+ rectanglePath.reset();
+ rectanglePath.addRect(rectangleRect, Path.Direction.CW);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStyle(Paint.Style.FILL);
+ paint.setColor(fillColor37);
+ canvas.drawPath(rectanglePath, paint);
+
+ // Bezier
+ RectF bezierRect = CacheForSpookyGemPromoBG.bezierRect;
+ bezierRect.set(22.7f, 18.97f, 27.3f, 23.03f);
+ Path bezierPath = CacheForSpookyGemPromoBG.bezierPath;
+ bezierPath.reset();
+ bezierPath.moveTo(27.3f, 22.93f);
+ bezierPath.cubicTo(25.68f, 23.31f, 24.91f, 22.66f, 25f, 21f);
+ bezierPath.cubicTo(25.09f, 19.34f, 24.32f, 18.69f, 22.7f, 19.07f);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(1f);
+ paint.setStrokeJoin(Paint.Join.ROUND);
+ paint.setStrokeCap(Paint.Cap.ROUND);
+ paint.setStrokeMiter(10f);
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(strokeColor24);
+ canvas.drawPath(bezierPath, paint);
+ canvas.restore();
+
+ // Bezier 2
+ RectF bezier2Rect = CacheForSpookyGemPromoBG.bezier2Rect;
+ bezier2Rect.set(1.84f, 8.02f, 4.16f, 13.98f);
+ Path bezier2Path = CacheForSpookyGemPromoBG.bezier2Path;
+ bezier2Path.reset();
+ bezier2Path.moveTo(2.69f, 13.98f);
+ bezier2Path.cubicTo(1.46f, 12.85f, 1.57f, 11.86f, 3f, 11f);
+ bezier2Path.cubicTo(4.43f, 10.14f, 4.54f, 9.15f, 3.31f, 8.02f);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(1f);
+ paint.setStrokeJoin(Paint.Join.ROUND);
+ paint.setStrokeCap(Paint.Cap.ROUND);
+ paint.setStrokeMiter(10f);
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(strokeColor24);
+ canvas.drawPath(bezier2Path, paint);
+ canvas.restore();
+
+ // Group
+ {
+ RectF group = CacheForSpookyGemPromoBG.group;
+ group.set(0.44f, 22.63f, 13.33f, 31.12f);
+ canvas.save();
+
+ // Clip
+ Path clipPath = CacheForSpookyGemPromoBG.clipPath;
+ clipPath.reset();
+ clipPath.moveTo(9.58f, 25.14f);
+ clipPath.cubicTo(9.58f, 25.14f, 10.18f, 27.22f, 8.95f, 28.1f);
+ clipPath.lineTo(8.57f, 27.2f);
+ clipPath.cubicTo(8.57f, 27.2f, 8.51f, 27.72f, 7.98f, 27.94f);
+ clipPath.cubicTo(7.44f, 28.17f, 7.03f, 27.85f, 7.03f, 27.85f);
+ clipPath.lineTo(7.41f, 28.75f);
+ clipPath.cubicTo(5.92f, 29.03f, 4.85f, 27.15f, 4.85f, 27.15f);
+ clipPath.cubicTo(2.67f, 26.45f, 0.44f, 28.1f, 0.44f, 28.1f);
+ clipPath.cubicTo(2.46f, 28.59f, 2.8f, 30.21f, 2.8f, 30.21f);
+ clipPath.cubicTo(4.9f, 29.25f, 5.83f, 31.12f, 5.83f, 31.12f);
+ clipPath.cubicTo(7.34f, 28.92f, 9.17f, 30.76f, 9.17f, 30.76f);
+ clipPath.cubicTo(9.17f, 30.76f, 9.12f, 28.17f, 11.75f, 28.61f);
+ clipPath.cubicTo(11.75f, 28.61f, 11.05f, 26.64f, 13.2f, 25.8f);
+ clipPath.cubicTo(13.2f, 25.8f, 12.27f, 24.42f, 13.33f, 22.63f);
+ clipPath.cubicTo(13.33f, 22.63f, 10.59f, 23.09f, 9.58f, 25.14f);
+ clipPath.close();
+ canvas.clipPath(clipPath);
+
+ // Rectangle 2
+ canvas.save();
+ canvas.translate(8f, 28f);
+ currentTransformation.peek().postTranslate(8f, 28f);
+ canvas.rotate(-23f);
+ currentTransformation.peek().postRotate(-23f);
+ RectF rectangle2Rect = CacheForSpookyGemPromoBG.rectangle2Rect;
+ rectangle2Rect.set(-12f, -8f, 12f, 8f);
+ Path rectangle2Path = CacheForSpookyGemPromoBG.rectangle2Path;
+ rectangle2Path.reset();
+ rectangle2Path.addRect(rectangle2Rect, Path.Direction.CW);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStyle(Paint.Style.FILL);
+ paint.setColor(fillColor109);
+ canvas.drawPath(rectangle2Path, paint);
+ canvas.restore();
+
+ canvas.restore();
+ }
+
+ // Group 2
+ {
+ RectF group2 = CacheForSpookyGemPromoBG.group2;
+ group2.set(14.31f, 1.02f, 27.55f, 8.96f);
+ canvas.save();
+
+ // Clip 2
+ Path clip2Path = CacheForSpookyGemPromoBG.clip2Path;
+ clip2Path.reset();
+ clip2Path.moveTo(27.55f, 5.58f);
+ clip2Path.cubicTo(27.55f, 5.58f, 25.21f, 4.08f, 23.08f, 4.93f);
+ clip2Path.cubicTo(23.08f, 4.93f, 22.14f, 6.88f, 20.64f, 6.71f);
+ clip2Path.lineTo(20.96f, 5.78f);
+ clip2Path.cubicTo(20.96f, 5.78f, 20.57f, 6.13f, 20.02f, 5.94f);
+ clip2Path.cubicTo(19.47f, 5.76f, 19.38f, 5.24f, 19.38f, 5.24f);
+ clip2Path.lineTo(19.06f, 6.16f);
+ clip2Path.cubicTo(17.77f, 5.38f, 18.23f, 3.26f, 18.23f, 3.26f);
+ clip2Path.cubicTo(17.07f, 1.28f, 14.31f, 1.02f, 14.31f, 1.02f);
+ clip2Path.cubicTo(15.49f, 2.73f, 14.65f, 4.17f, 14.65f, 4.17f);
+ clip2Path.cubicTo(16.86f, 4.86f, 16.31f, 6.87f, 16.31f, 6.87f);
+ clip2Path.cubicTo(18.9f, 6.25f, 19.02f, 8.84f, 19.02f, 8.84f);
+ clip2Path.cubicTo(19.02f, 8.84f, 20.72f, 6.87f, 22.38f, 8.96f);
+ clip2Path.cubicTo(22.38f, 8.96f, 23.18f, 7.03f, 25.34f, 7.84f);
+ clip2Path.cubicTo(25.34f, 7.84f, 25.57f, 6.2f, 27.55f, 5.58f);
+ clip2Path.close();
+ canvas.clipPath(clip2Path);
+
+ // Rectangle 3
+ canvas.save();
+ canvas.translate(20f, 6f);
+ currentTransformation.peek().postTranslate(20f, 6f);
+ canvas.rotate(19f);
+ currentTransformation.peek().postRotate(19f);
+ RectF rectangle3Rect = CacheForSpookyGemPromoBG.rectangle3Rect;
+ rectangle3Rect.set(-12f, -8f, 12f, 8f);
+ Path rectangle3Path = CacheForSpookyGemPromoBG.rectangle3Path;
+ rectangle3Path.reset();
+ rectangle3Path.addRect(rectangle3Rect, Path.Direction.CW);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStyle(Paint.Style.FILL);
+ paint.setColor(fillColor73);
+ canvas.drawPath(rectangle3Path, paint);
+ canvas.restore();
+
+ canvas.restore();
+ }
+
+ // Bezier 5
+ RectF bezier5Rect = CacheForSpookyGemPromoBG.bezier5Rect;
+ bezier5Rect.set(103.86f, 14.84f, 108.14f, 19.16f);
+ Path bezier5Path = CacheForSpookyGemPromoBG.bezier5Path;
+ bezier5Path.reset();
+ bezier5Path.moveTo(108.08f, 19.16f);
+ bezier5Path.cubicTo(108.35f, 17.51f, 107.65f, 16.79f, 106f, 17f);
+ bezier5Path.cubicTo(104.35f, 17.21f, 103.65f, 16.49f, 103.92f, 14.84f);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(1f);
+ paint.setStrokeJoin(Paint.Join.ROUND);
+ paint.setStrokeCap(Paint.Cap.ROUND);
+ paint.setStrokeMiter(10f);
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(strokeColor24);
+ canvas.drawPath(bezier5Path, paint);
+ canvas.restore();
+
+ // Bezier 6
+ RectF bezier6Rect = CacheForSpookyGemPromoBG.bezier6Rect;
+ bezier6Rect.set(128.02f, 8.16f, 129.98f, 13.84f);
+ Path bezier6Path = CacheForSpookyGemPromoBG.bezier6Path;
+ bezier6Path.reset();
+ bezier6Path.moveTo(128.02f, 13.84f);
+ bezier6Path.cubicTo(129.61f, 13.33f, 129.94f, 12.38f, 129f, 11f);
+ bezier6Path.cubicTo(128.06f, 9.62f, 128.39f, 8.67f, 129.98f, 8.16f);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStrokeWidth(1f);
+ paint.setStrokeJoin(Paint.Join.ROUND);
+ paint.setStrokeCap(Paint.Cap.ROUND);
+ paint.setStrokeMiter(10f);
+ canvas.save();
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setColor(strokeColor24);
+ canvas.drawPath(bezier6Path, paint);
+ canvas.restore();
+
+ // Group 3
+ {
+ RectF group3 = CacheForSpookyGemPromoBG.group3;
+ group3.set(107.98f, 1.43f, 121.5f, 8.9f);
+ canvas.save();
+
+ // Clip 3
+ Path clip3Path = CacheForSpookyGemPromoBG.clip3Path;
+ clip3Path.reset();
+ clip3Path.moveTo(117f, 4.72f);
+ clip3Path.cubicTo(117f, 4.72f, 116.2f, 6.73f, 114.69f, 6.66f);
+ clip3Path.lineTo(114.94f, 5.72f);
+ clip3Path.cubicTo(114.94f, 5.72f, 114.57f, 6.09f, 114.02f, 5.94f);
+ clip3Path.cubicTo(113.46f, 5.79f, 113.33f, 5.29f, 113.33f, 5.29f);
+ clip3Path.lineTo(113.07f, 6.23f);
+ clip3Path.cubicTo(111.73f, 5.53f, 112.04f, 3.39f, 112.04f, 3.39f);
+ clip3Path.cubicTo(110.75f, 1.5f, 107.98f, 1.43f, 107.98f, 1.43f);
+ clip3Path.cubicTo(109.27f, 3.05f, 108.54f, 4.54f, 108.54f, 4.54f);
+ clip3Path.cubicTo(110.79f, 5.08f, 110.37f, 7.12f, 110.37f, 7.12f);
+ clip3Path.cubicTo(112.92f, 6.32f, 113.22f, 8.9f, 113.22f, 8.9f);
+ clip3Path.cubicTo(113.22f, 8.9f, 114.78f, 6.82f, 116.58f, 8.79f);
+ clip3Path.cubicTo(116.58f, 8.79f, 117.24f, 6.81f, 119.46f, 7.47f);
+ clip3Path.cubicTo(119.46f, 7.47f, 119.57f, 5.81f, 121.5f, 5.05f);
+ clip3Path.cubicTo(121.5f, 5.05f, 119.06f, 3.72f, 117f, 4.72f);
+ clip3Path.close();
+ canvas.clipPath(clip3Path);
+
+ // Rectangle 4
+ canvas.save();
+ canvas.translate(114f, 6f);
+ currentTransformation.peek().postTranslate(114f, 6f);
+ canvas.rotate(15f);
+ currentTransformation.peek().postRotate(15f);
+ RectF rectangle4Rect = CacheForSpookyGemPromoBG.rectangle4Rect;
+ rectangle4Rect.set(-12f, -8f, 12f, 8f);
+ Path rectangle4Path = CacheForSpookyGemPromoBG.rectangle4Path;
+ rectangle4Path.reset();
+ rectangle4Path.addRect(rectangle4Rect, Path.Direction.CW);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStyle(Paint.Style.FILL);
+ paint.setColor(fillColor109);
+ canvas.drawPath(rectangle4Path, paint);
+ canvas.restore();
+
+ canvas.restore();
+ }
+
+ // Group 4
+ {
+ RectF group4 = CacheForSpookyGemPromoBG.group4;
+ group4.set(110.51f, 22.02f, 122.9f, 31.36f);
+ canvas.save();
+
+ // Clip 4
+ Path clip4Path = CacheForSpookyGemPromoBG.clip4Path;
+ clip4Path.reset();
+ clip4Path.moveTo(122.63f, 22.02f);
+ clip4Path.cubicTo(122.63f, 22.02f, 119.97f, 22.81f, 119.22f, 24.97f);
+ clip4Path.cubicTo(119.22f, 24.97f, 120.07f, 26.96f, 118.95f, 27.98f);
+ clip4Path.lineTo(118.47f, 27.14f);
+ clip4Path.cubicTo(118.47f, 27.14f, 118.47f, 27.66f, 117.97f, 27.95f);
+ clip4Path.cubicTo(117.47f, 28.24f, 117.02f, 27.97f, 117.02f, 27.97f);
+ clip4Path.lineTo(117.51f, 28.82f);
+ clip4Path.cubicTo(116.07f, 29.27f, 114.77f, 27.54f, 114.77f, 27.54f);
+ clip4Path.cubicTo(112.52f, 27.11f, 110.51f, 29.02f, 110.51f, 29.02f);
+ clip4Path.cubicTo(112.57f, 29.26f, 113.11f, 30.83f, 113.11f, 30.83f);
+ clip4Path.cubicTo(115.08f, 29.62f, 116.23f, 31.36f, 116.23f, 31.36f);
+ clip4Path.cubicTo(117.46f, 28.99f, 119.5f, 30.6f, 119.5f, 30.6f);
+ clip4Path.cubicTo(119.5f, 30.6f, 119.13f, 28.03f, 121.79f, 28.15f);
+ clip4Path.cubicTo(121.79f, 28.15f, 120.86f, 26.28f, 122.9f, 25.18f);
+ clip4Path.cubicTo(122.9f, 25.18f, 121.8f, 23.93f, 122.63f, 22.02f);
+ clip4Path.close();
+ canvas.clipPath(clip4Path);
+
+ // Rectangle 5
+ canvas.save();
+ canvas.translate(118f, 28f);
+ currentTransformation.peek().postTranslate(118f, 28f);
+ canvas.rotate(-30f);
+ currentTransformation.peek().postRotate(-30f);
+ RectF rectangle5Rect = CacheForSpookyGemPromoBG.rectangle5Rect;
+ rectangle5Rect.set(-12f, -8f, 12f, 8f);
+ Path rectangle5Path = CacheForSpookyGemPromoBG.rectangle5Path;
+ rectangle5Path.reset();
+ rectangle5Path.addRect(rectangle5Rect, Path.Direction.CW);
+
+ paint.reset();
+ paint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ paint.setStyle(Paint.Style.FILL);
+ paint.setColor(fillColor73);
+ canvas.drawPath(rectangle5Path, paint);
+ canvas.restore();
+
+ canvas.restore();
+ }
+
+ canvas.restore();
+ }
+
// Canvas Images
// Tab
@@ -13129,7 +14172,7 @@ public class HabiticaIcons {
if (imageOfPinItem != null)
return imageOfPinItem;
- imageOfPinItem = Bitmap.createBitmap(40, 40, Bitmap.Config.ARGB_8888);
+ imageOfPinItem = Bitmap.createBitmap(24, 24, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(imageOfPinItem);
HabiticaIcons.drawPinItem(canvas);
@@ -13141,7 +14184,7 @@ public class HabiticaIcons {
if (imageOfUnpinItem != null)
return imageOfUnpinItem;
- imageOfUnpinItem = Bitmap.createBitmap(40, 40, Bitmap.Config.ARGB_8888);
+ imageOfUnpinItem = Bitmap.createBitmap(24, 24, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(imageOfUnpinItem);
HabiticaIcons.drawUnpinItem(canvas);
@@ -13596,6 +14639,58 @@ public class HabiticaIcons {
return imageOfBuffIconDark;
}
+ private static Bitmap imageOfStats = null;
+ public static Bitmap imageOfStats() {
+ if (imageOfStats != null)
+ return imageOfStats;
+
+ imageOfStats = Bitmap.createBitmap(30, 22, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(imageOfStats);
+ HabiticaIcons.drawStats(canvas);
+
+ return imageOfStats;
+ }
+
+ private static Bitmap imageOfDashBorder = null;
+ public static Bitmap imageOfDashBorder() {
+ if (imageOfDashBorder != null)
+ return imageOfDashBorder;
+
+ imageOfDashBorder = Bitmap.createBitmap(113, 116, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(imageOfDashBorder);
+ HabiticaIcons.drawDashBorder(canvas);
+
+ return imageOfDashBorder;
+ }
+
+ public static Bitmap imageOfTaskFilterIcon(boolean filter_active) {
+ Bitmap imageOfTaskFilterIcon = Bitmap.createBitmap(30, 28, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(imageOfTaskFilterIcon);
+ HabiticaIcons.drawTaskFilterIcon(canvas, filter_active);
+
+ return imageOfTaskFilterIcon;
+ }
+
+ public static Bitmap imageOfFallGemPromoBG(int redGemColor, int greenGemColor, int blueGemColor, int purpleGemColor) {
+ Bitmap imageOfFallGemPromoBG = Bitmap.createBitmap(132, 35, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(imageOfFallGemPromoBG);
+ HabiticaIcons.drawFallGemPromoBG(canvas, redGemColor, greenGemColor, blueGemColor, purpleGemColor);
+
+ return imageOfFallGemPromoBG;
+ }
+
+ private static Bitmap imageOfSpookyGemPromoBG = null;
+ public static Bitmap imageOfSpookyGemPromoBG() {
+ if (imageOfSpookyGemPromoBG != null)
+ return imageOfSpookyGemPromoBG;
+
+ imageOfSpookyGemPromoBG = Bitmap.createBitmap(132, 35, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(imageOfSpookyGemPromoBG);
+ HabiticaIcons.drawSpookyGemPromoBG(canvas);
+
+ return imageOfSpookyGemPromoBG;
+ }
+
// Resizing Behavior
public static void resizingBehaviorApply(ResizingBehavior behavior, RectF rect, RectF target, RectF result) {
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 5e21ca8e9..e3c572a94 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
@@ -786,4 +786,22 @@ public class HabiticaIconsHelper {
return imageOfHabitControlMinus;
}
+
+ public static Bitmap imageOfFallGemPromoBG(int redGemColor, int greenGemColor, int blueGemColor, int purpleGemColor) {
+ Bitmap imageOfFallGemPromoBG = Bitmap.createBitmap(scaleSize(132), scaleSize(35), Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(imageOfFallGemPromoBG);
+ canvas.scale(displayDensity, displayDensity);
+ HabiticaIcons.drawFallGemPromoBG(canvas, redGemColor, greenGemColor, blueGemColor, purpleGemColor);
+
+ return imageOfFallGemPromoBG;
+ }
+
+ public static Bitmap imageOfSpookyGemPromoBG() {
+ Bitmap imageOfSpookyGemPromoBG = Bitmap.createBitmap(scaleSize(132), scaleSize(35), Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(imageOfSpookyGemPromoBG);
+ canvas.scale(displayDensity, displayDensity);
+ HabiticaIcons.drawSpookyGemPromoBG(canvas);
+
+ return imageOfSpookyGemPromoBG;
+ }
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/PromoMenuView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/PromoMenuView.kt
new file mode 100644
index 000000000..68d44d93f
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/PromoMenuView.kt
@@ -0,0 +1,66 @@
+package com.habitrpg.android.habitica.ui.views.promo
+
+import android.content.Context
+import android.graphics.drawable.Drawable
+import android.util.AttributeSet
+import android.view.View
+import android.widget.ImageView
+import android.widget.RelativeLayout
+import android.widget.TextView
+import androidx.core.content.ContextCompat
+import com.habitrpg.android.habitica.R
+import com.habitrpg.android.habitica.databinding.PromoMenuBinding
+import com.habitrpg.android.habitica.extensions.layoutInflater
+
+class PromoMenuView @JvmOverloads constructor(
+ context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : RelativeLayout(context, attrs, defStyleAttr) {
+
+ var binding: PromoMenuBinding = PromoMenuBinding.inflate(context.layoutInflater, this)
+
+ init {
+ setBackgroundColor(ContextCompat.getColor(context, R.color.gray_700))
+ clipToPadding = false
+ clipChildren = false
+ clipToOutline = false
+ }
+
+ fun setTitleText(title: String?) {
+ setText(binding.titleTextView, title)
+ }
+
+ fun setSubtitleText(subtitle: String?) {
+ setText(binding.descriptionView, subtitle)
+ }
+
+ fun setTitleImage(title: Drawable?) {
+ setImage(binding.titleImageView, title)
+ }
+
+ fun setSubtitleImage(subtitle: Drawable?) {
+ setImage(binding.descriptionImageView, subtitle)
+ }
+
+ fun setDecoration(leftDrawable: Drawable?, rightDrawable: Drawable?) {
+ binding.leftImageView.setImageDrawable(leftDrawable)
+ binding.rightImageView.setImageDrawable(rightDrawable)
+ }
+
+ private fun setImage(view: ImageView, drawable: Drawable?) {
+ if (drawable != null) {
+ view.setImageDrawable(drawable)
+ view.visibility = View.VISIBLE
+ } else {
+ view.visibility = View.GONE
+ }
+ }
+
+ private fun setText(view: TextView, text: String?) {
+ if (text != null) {
+ view.text = text
+ view.visibility = View.VISIBLE
+ } else {
+ view.visibility = View.GONE
+ }
+ }
+}
\ No newline at end of file
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/PromoMenuViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/PromoMenuViewHolder.kt
new file mode 100644
index 000000000..180c50317
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/promo/PromoMenuViewHolder.kt
@@ -0,0 +1,11 @@
+package com.habitrpg.android.habitica.ui.views.promo
+
+import androidx.recyclerview.widget.RecyclerView
+import com.habitrpg.android.habitica.models.promotions.HabiticaPromotion
+
+class PromoMenuViewHolder(val promoView: PromoMenuView) : RecyclerView.ViewHolder(promoView) {
+
+ fun bind(promo: HabiticaPromotion) {
+ promo.configurePromoMenuView(promoView)
+ }
+}
\ No newline at end of file