diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 2488a6b15..2b70e4e69 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -150,7 +150,7 @@ android { buildConfigField "String", "TESTING_LEVEL", "\"production\"" 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 2847 + versionCode 2858 versionName "3.2.1" } diff --git a/Habitica/res/values-bg/strings.xml b/Habitica/res/values-bg/strings.xml index 7f34d4aa8..a0fdcb1ed 100644 --- a/Habitica/res/values-bg/strings.xml +++ b/Habitica/res/values-bg/strings.xml @@ -344,7 +344,6 @@ Абониране Александър Търговеца вече ще Ви продава диаманти на цената от 20 злато за диамант.\n\nМесечните му доставки отначало ще бъдат ограничени до 25 диаманта на месец, но може да се увеличат в зависимост от продължителността на абонамента Ви.\n\nОграничението се вдига с по 5 диаманта след всеки три месеца непрекъснат абонамент, докато не достигне 50 диаманта на месец! Всеки месец ще получавате уникален козметичен предмет за героя си!\n\nОсвен това, за всеки три месеца непрекъснат абонамент, тайнствените пътешественици във времето ще Ви дават достъп до исторически козметични предмети (както и такива от бъдещето). - Прави завършените задачи и историята на задачите налични за по-дълго време. С двойно увеличеното ограничение на паданията ще получавате повече предмети от завършените си задачи всеки ден, което ще Ви помогне да завършите конюшнята си по-бързо! Ограничение от 25 диаманта Ограничение от 30 диаманта diff --git a/Habitica/res/values-en-rGB/strings.xml b/Habitica/res/values-en-rGB/strings.xml index 7575a9406..0918cdf79 100644 --- a/Habitica/res/values-en-rGB/strings.xml +++ b/Habitica/res/values-en-rGB/strings.xml @@ -393,8 +393,8 @@ Dailies are tasks that repeat on a regular basis. Choose the schedule that works for you! You don\'t have any To Do\'s To Do\'s are tasks that only need to be completed once. Add checklists to your To Do\'s to increase their value. - You don&rsquo;t have any Rewards - Reset Justin&rsquo;s Walkthrough + You don\'t have any Rewards + Reset Justins Walkthrough Review our Community Guidelines before posting Maintenance Reload Content diff --git a/Habitica/res/values-ru/strings.xml b/Habitica/res/values-ru/strings.xml index 19afc99ed..35fbcf108 100644 --- a/Habitica/res/values-ru/strings.xml +++ b/Habitica/res/values-ru/strings.xml @@ -942,7 +942,6 @@ Вырастить питомца Выполните эти задания и в итоге получите <b>5 достижений</b> и <font color=#EE9109><b>100 золота</b></font>! %1$d / %2$d - Подпишитесь сейчас, чтобы сразу же получить , а также получать новые предметы каждый месяц! Удвойте количество выпадающих предметов Личные сообщения заблокированы Заблокировать получение личных сообщений diff --git a/Habitica/res/values-zh-rTW/strings.xml b/Habitica/res/values-zh-rTW/strings.xml index 825132fdf..c5097c126 100644 --- a/Habitica/res/values-zh-rTW/strings.xml +++ b/Habitica/res/values-zh-rTW/strings.xml @@ -339,7 +339,6 @@ 加入會員 您將可以從市場上以每枚20金幣的價格購買寶石! 獲得神秘沙漏在時空穿越者的商店購買物品! - 現在訂閱,可以得到贈品,和每月得到新的物品! %d 個神秘沙漏 付款方式 訂閱 @@ -702,7 +701,7 @@ 不想再繼續捐助了?你可以在Google應用商店裡的“我的應用程序”部分找到退訂選項。 在Habitica發現更多的物品,每天享受雙倍的物品掉落上限。 如果您變成訂閱者,您可以獲得紫禦鹿角兔寵物。 - 現在訂閱,可以得到%@和每月得到新的物品! + 現在訂閱,可以得到%s和每月得到新的物品! 雙倍掉落 創建一個帳戶 簽到%d次 diff --git a/Habitica/res/values-zh/strings.xml b/Habitica/res/values-zh/strings.xml index b36f2c6eb..be6e5633c 100644 --- a/Habitica/res/values-zh/strings.xml +++ b/Habitica/res/values-zh/strings.xml @@ -344,7 +344,6 @@ 订阅 您将可以从市场上以每枚20金币的价格购买宝石! 获得神秘沙漏在时空穿越者的商店购买物品! - 现在订阅,可以得到赠品,和每月得到新的物品! 如果您变成订阅者,您可以获得紫御鹿角兔宠物。 25 宝石 30 宝石 @@ -898,7 +897,7 @@ Facebook登录 Apple登录 在Habitica发现更多的物品,每天享受双倍的物品掉落上限。 - 现在订阅,可以得到%@和每月得到新的物品! + 现在订阅,可以得到%s和每月得到新的物品! 双倍掉落 创建一个帐户 签到%d次 diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ContentRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ContentRepository.kt index f72a0aa83..201fd838e 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ContentRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ContentRepository.kt @@ -12,4 +12,5 @@ interface ContentRepository { fun retrieveContent(context: Context?, forced: Boolean): Flowable fun retrieveWorldState(context: Context?): Flowable + fun getWorldState(): Flowable } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ContentRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ContentRepositoryImpl.kt index 61caa63e7..e154872f4 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ContentRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ContentRepositoryImpl.kt @@ -43,16 +43,13 @@ abstract class ContentRepositoryImpl(localRepository lastWorldStateSync = now apiClient.worldState.doOnNext { localRepository.saveWorldState(it) - - val editor = PreferenceManager.getDefaultSharedPreferences(context).edit() - editor.putString("currentEvent", it.currentEventKey) - editor.putString("currentEventPromo", it.currentEventPromo) - editor.putLong("currentEventStartDate", it.currentEventStartDate?.time ?: 0) - editor.putLong("currentEventEndDate", it.currentEventEndDate?.time ?: 0) - editor.apply() } } else { Flowable.empty() } } + + override fun getWorldState(): Flowable { + return localRepository.getWorldState() + } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt index c75388bc2..5c9bbcb80 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt @@ -5,6 +5,7 @@ import com.habitrpg.android.habitica.data.TaskRepository import com.habitrpg.android.habitica.data.UserRepository import com.habitrpg.android.habitica.data.local.UserLocalRepository import com.habitrpg.android.habitica.data.local.UserQuestStatus +import com.habitrpg.android.habitica.extensions.skipNull import com.habitrpg.android.habitica.helpers.AppConfigManager import com.habitrpg.android.habitica.helpers.RxErrorHandler import com.habitrpg.android.habitica.models.Achievement @@ -164,7 +165,7 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli path = path.substring(1) return Flowable.zip(apiClient.unlockPath(path), localRepository.getUser(userID).firstElement().toFlowable() .map { localRepository.getUnmanagedCopy(it) } - .skipNil(), { unlockResponse, copiedUser -> + .skipNull(), { unlockResponse, copiedUser -> copiedUser.preferences = unlockResponse.preferences copiedUser.purchased = unlockResponse.purchased copiedUser.items = unlockResponse.items @@ -380,7 +381,7 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli private fun getLiveUser(): Flowable { return localRepository.getUser(userID) .map { localRepository.getLiveObject(it) } - .skipNil() + .skipNull() } private fun zipWithLiveUser(flowable: Flowable, mergeFunc: BiFunction): Flowable { @@ -424,8 +425,3 @@ class UserRepositoryImpl(localRepository: UserLocalRepository, apiClient: ApiCli return copiedUser } } - -private fun Flowable.skipNil(): Flowable { - @Suppress("UNCHECKED_CAST") - return skipWhile { it == null } as? Flowable ?: Flowable.empty() -} diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/ContentLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/ContentLocalRepository.kt index 4798a35d7..a3f601ab9 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/ContentLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/ContentLocalRepository.kt @@ -2,8 +2,10 @@ package com.habitrpg.android.habitica.data.local import com.habitrpg.android.habitica.models.ContentResult import com.habitrpg.android.habitica.models.WorldState +import io.reactivex.rxjava3.core.Flowable interface ContentLocalRepository : BaseLocalRepository { fun saveContent(contentResult: ContentResult) fun saveWorldState(worldState: WorldState) + fun getWorldState(): Flowable } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmContentLocalRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmContentLocalRepository.kt index 36665ba91..5c89ffe95 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmContentLocalRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/local/implementation/RealmContentLocalRepository.kt @@ -1,10 +1,13 @@ package com.habitrpg.android.habitica.data.local.implementation import com.habitrpg.android.habitica.data.local.ContentLocalRepository +import com.habitrpg.android.habitica.extensions.skipNull import com.habitrpg.android.habitica.models.ContentResult import com.habitrpg.android.habitica.models.WorldState import com.habitrpg.android.habitica.models.inventory.Quest import com.habitrpg.android.habitica.models.social.Group +import hu.akarnokd.rxjava3.bridge.RxJavaBridge +import io.reactivex.rxjava3.core.Flowable import io.realm.Realm @@ -33,6 +36,15 @@ open class RealmContentLocalRepository(realm: Realm) : RealmBaseLocalRepository( } } + override fun getWorldState(): Flowable { + return RxJavaBridge.toV3Flowable(realm.where(WorldState::class.java) + .findAll() + .asFlowable() + .filter { it.isLoaded && it.size > 0 } + .map { it.first() }) + .skipNull() + } + override fun saveWorldState(worldState: WorldState) { val tavern = getUnmanagedCopy(realm.where(Group::class.java) .equalTo("id", Group.TAVERN_ID) @@ -47,5 +59,6 @@ open class RealmContentLocalRepository(realm: Realm) : RealmBaseLocalRepository( tavern.quest?.key = worldState.worldBossKey tavern.quest?.progress = worldState.progress save(tavern) + save(worldState) } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Flowable-Extensions.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Flowable-Extensions.kt index ab67bc6db..4c4ba113b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Flowable-Extensions.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/extensions/Flowable-Extensions.kt @@ -7,4 +7,9 @@ import io.reactivex.rxjava3.functions.Consumer fun Flowable.subscribeWithErrorHandler(function: Consumer): Disposable { return subscribe(function, RxErrorHandler.handleEmptyError()) +} + +fun Flowable.skipNull(): Flowable { + @Suppress("UNCHECKED_CAST") + return skipWhile { it == null } as? Flowable ?: Flowable.empty() } \ No newline at end of file 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 09f1ef2cb..f565b3501 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,16 +6,26 @@ 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.data.ContentRepository +import com.habitrpg.android.habitica.models.WorldState import com.habitrpg.android.habitica.models.promotions.HabiticaPromotion import com.habitrpg.android.habitica.models.promotions.getHabiticaPromotionFromKey import java.util.* -class AppConfigManager { +class AppConfigManager(private val contentRepository: ContentRepository?) { + + private var worldState: WorldState? = null + + init { + contentRepository?.getWorldState()?.subscribe( { + worldState = it + }, RxErrorHandler.handleEmptyError()) + } private val remoteConfig = FirebaseRemoteConfig.getInstance() fun shopSpriteSuffix(): String { - return remoteConfig.getString("shopSpriteSuffix") + return worldState?.npcImageSuffix ?: remoteConfig.getString("shopSpriteSuffix") } fun maxChatLength(): Long { @@ -59,10 +69,6 @@ class AppConfigManager { return remoteConfig.getBoolean("enableLocalTaskScoring") } - fun flipAddTaskBehaviour(): Boolean { - return remoteConfig.getBoolean("flipAddTaskBehaviour") - } - fun insufficientGemPurchase(): Boolean { return remoteConfig.getBoolean("insufficientGemPurchase") } @@ -100,15 +106,12 @@ class AppConfigManager { return remoteConfig.getBoolean("enableAdventureGuide") } - fun activePromo(context: Context): HabiticaPromotion? { - val preferences = PreferenceManager.getDefaultSharedPreferences(context) - val key = preferences.getString("currentEvent", null) - if (key?.isNotBlank() == true) { - val startDateLong = preferences.getLong("currentEventStartDate", 0) - val startDate = if (startDateLong > 0) Date(startDateLong) else null - val endDateLong = preferences.getLong("currentEventEndDate", 0) - val endDate = if (endDateLong > 0) Date(endDateLong) else null - return getHabiticaPromotionFromKey(preferences.getString("currentEventPromo", null) ?: key, startDate, endDate) + fun activePromo(): HabiticaPromotion? { + for (event in worldState?.events ?: listOf(worldState?.currentEvent)) { + if (event == null) return null + if (event.promo != null) { + return getHabiticaPromotionFromKey(event.promo ?: "", event.start, event.end) + } } return null } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/WorldState.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/WorldState.kt index 3cadec4ed..02b703fd8 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/WorldState.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/WorldState.kt @@ -2,17 +2,19 @@ package com.habitrpg.android.habitica.models import com.habitrpg.android.habitica.models.inventory.QuestProgress import com.habitrpg.android.habitica.models.inventory.QuestRageStrike +import io.realm.RealmList +import io.realm.RealmModel +import io.realm.RealmObject import java.util.* -class WorldState { - +open class WorldState: RealmObject() { var worldBossKey: String = "" var worldBossActive: Boolean = false var progress: QuestProgress? = null - var rageStrikes: MutableList? = null + var rageStrikes: RealmList? = null - var currentEventKey: String? = null - var currentEventPromo: String? = null - var currentEventStartDate: Date? = null - var currentEventEndDate: Date? = null + var npcImageSuffix: String? = null + + var currentEvent: WorldStateEvent? = null + var events: RealmList = RealmList() } \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/WorldStateEvent.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/WorldStateEvent.kt new file mode 100644 index 000000000..de2219c16 --- /dev/null +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/WorldStateEvent.kt @@ -0,0 +1,24 @@ +package com.habitrpg.android.habitica.models + +import com.google.gson.annotations.SerializedName +import io.realm.RealmModel +import io.realm.RealmObject +import io.realm.annotations.PrimaryKey +import java.util.* + +open class WorldStateEvent: RealmObject(), BaseObject { + @PrimaryKey + @SerializedName("event") + var eventKey: String? = null + var start: Date? = null + var end: Date? = null + var promo: String? = null + var npcImageSuffix: String? = null + + override val realmClass: Class + get() = WorldStateEvent::class.java + override val primaryIdentifier: String? + get() = eventKey + override val primaryIdentifierName: String + get() = "eventKey" +} \ No newline at end of file diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.java b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.java index 728630ab0..5b9d50519 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.java +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/modules/AppModule.java @@ -8,6 +8,7 @@ import android.content.res.Resources; import androidx.preference.PreferenceManager; import com.habitrpg.android.habitica.data.ApiClient; +import com.habitrpg.android.habitica.data.ContentRepository; import com.habitrpg.android.habitica.executors.JobExecutor; import com.habitrpg.android.habitica.executors.PostExecutionThread; import com.habitrpg.android.habitica.executors.ThreadExecutor; @@ -126,7 +127,7 @@ public class AppModule { @Provides @Singleton - AppConfigManager providesRemoteConfigManager() { - return new AppConfigManager(); + AppConfigManager providesRemoteConfigManager(ContentRepository contentRepository) { + return new AppConfigManager(contentRepository); } } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarView.kt index 211053f05..41acac0f3 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarView.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/AvatarView.kt @@ -50,6 +50,16 @@ class AvatarView : View { return getLayerMap(avatar, true) } + private var spriteSubstitutions: Map> = HashMap() + get() { + if (Date().time - (lastSubstitutionCheck?.time ?: 0) > 180000) { + field = AppConfigManager(null).spriteSubstitutions() + lastSubstitutionCheck = Date() + } + return field + } + private var lastSubstitutionCheck: Date? = null + private val originalRect: Rect get() = if (showMount || showPet) FULL_HERO_RECT else if (showBackground) COMPACT_HERO_RECT else HERO_ONLY_RECT @@ -151,8 +161,7 @@ class AvatarView : View { } private fun getLayerMap(avatar: Avatar, resetHasAttributes: Boolean): Map { - val substitutions = AppConfigManager().spriteSubstitutions() - val layerMap = getAvatarLayerMap(avatar, substitutions) + val layerMap = getAvatarLayerMap(avatar, spriteSubstitutions) if (resetHasAttributes) { hasPet = false @@ -162,7 +171,7 @@ class AvatarView : View { var mountName = avatar.currentMount if (showMount && mountName?.isNotEmpty() == true) { - mountName = substituteOrReturn(substitutions["mounts"], mountName) + mountName = substituteOrReturn(spriteSubstitutions["mounts"], mountName) layerMap[LayerType.MOUNT_BODY] = "Mount_Body_$mountName" layerMap[LayerType.MOUNT_HEAD] = "Mount_Head_$mountName" if (resetHasAttributes) hasMount = true @@ -170,14 +179,14 @@ class AvatarView : View { var petName = avatar.currentPet if (showPet && petName?.isNotEmpty() == true) { - petName = substituteOrReturn(substitutions["pets"], petName) + petName = substituteOrReturn(spriteSubstitutions["pets"], petName) layerMap[LayerType.PET] = "Pet-$petName" if (resetHasAttributes) hasPet = true } var backgroundName = avatar.preferences?.background if (showBackground && backgroundName?.isNotEmpty() == true) { - backgroundName = substituteOrReturn(substitutions["backgrounds"], backgroundName) + backgroundName = substituteOrReturn(spriteSubstitutions["backgrounds"], backgroundName) layerMap[LayerType.BACKGROUND] = "background_$backgroundName" if (resetHasAttributes) hasBackground = true } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftSubscriptionActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftSubscriptionActivity.kt index d71e6a20e..34db00f38 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftSubscriptionActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GiftSubscriptionActivity.kt @@ -198,7 +198,7 @@ class GiftSubscriptionActivity : BaseActivity() { } private fun displayConfirmationDialog() { - val message = getString(if (appConfigManager.activePromo(this)?.identifier == "g1g1"){ + val message = getString(if (appConfigManager.activePromo()?.identifier == "g1g1"){ R.string.gift_confirmation_text_sub_g1g1 } else { R.string.gift_confirmation_text_sub 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 43872f3cd..ba27d35de 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 @@ -502,7 +502,7 @@ class NavigationDrawerFragment : DialogFragment() { } fun updatePromo() { - activePromo = context?.let { configManager.activePromo(it) } + activePromo = configManager.activePromo() val promoItem = getItemWithIdentifier(SIDEBAR_PROMO) ?: return if (activePromo != null) { promoItem.isVisible = true 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 index b3524874e..42adfbb40 100644 --- 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 @@ -31,7 +31,7 @@ class PromoInfoFragment : BaseMainFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val promo = context?.let { configManager.activePromo(it) } + val promo = configManager.activePromo() promo?.configureInfoFragment(this) } 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 fa7c8ed43..7cd1b9ffb 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 @@ -63,7 +63,7 @@ class GemsPurchaseFragment : BaseFragment(), GemPurc binding?.headerImageView?.setImageResource(R.drawable.gem_purchase_header_dark) } - val promo = context?.let { appConfigManager.activePromo(it) } + val promo = appConfigManager.activePromo() if (promo != null) { binding?.let { promo.configurePurchaseBanner(it) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt index 149fe769c..38c5db502 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/purchases/SubscriptionFragment.kt @@ -77,7 +77,7 @@ class SubscriptionFragment : BaseFragment(), GemPur binding?.subscriptionDetails?.visibility = View.GONE binding?.subscriptionDetails?.onShowSubscriptionOptions = { showSubscriptionOptions() } - binding?.giftSubscriptionButton?.setOnClickListener { context?.let { context -> showGiftSubscriptionDialog(context, appConfigManager.activePromo(context)?.identifier == "g1g1") } } + binding?.giftSubscriptionButton?.setOnClickListener { context?.let { context -> showGiftSubscriptionDialog(context, appConfigManager.activePromo()?.identifier == "g1g1") } } binding?.subscription1month?.setOnPurchaseClickListener { selectSubscription(PurchaseTypes.Subscription1Month) } binding?.subscription3month?.setOnPurchaseClickListener { selectSubscription(PurchaseTypes.Subscription3Month) } @@ -86,7 +86,7 @@ class SubscriptionFragment : BaseFragment(), GemPur binding?.subscribeButton?.setOnClickListener { subscribeUser() } - val promo = context?.let { appConfigManager.activePromo(it) } + val promo = appConfigManager.activePromo() if (promo != null) { binding?.let { promo.configurePurchaseBanner(it) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.kt index 0f0552b5b..2107737b6 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/helpers/DataBindingUtils.kt @@ -132,7 +132,7 @@ object DataBindingUtils { private var spriteSubstitutions: Map = HashMap() get() { if (Date().time - (lastSubstitutionCheck?.time ?: 0) > 180000) { - field = AppConfigManager().spriteSubstitutions().get("generic") ?: HashMap() + field = AppConfigManager(null).spriteSubstitutions()["generic"] ?: HashMap() lastSubstitutionCheck = Date() } return field diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/WorldStateSerialization.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/WorldStateSerialization.kt index 01f2a0f67..2c5f136fd 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/utils/WorldStateSerialization.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/utils/WorldStateSerialization.kt @@ -5,8 +5,10 @@ import com.google.gson.JsonDeserializer import com.google.gson.JsonElement import com.habitrpg.android.habitica.extensions.getAsString import com.habitrpg.android.habitica.models.WorldState +import com.habitrpg.android.habitica.models.WorldStateEvent import com.habitrpg.android.habitica.models.inventory.QuestProgress import com.habitrpg.android.habitica.models.inventory.QuestRageStrike +import io.realm.RealmList import java.lang.reflect.Type import java.util.* @@ -37,7 +39,7 @@ class WorldStateSerialization: JsonDeserializer { val extra = worldBossObject["extra"].asJsonObject if (extra.has("worldDmg")) { val worldDmg = extra["worldDmg"].asJsonObject - state.rageStrikes = mutableListOf() + state.rageStrikes = RealmList() worldDmg.entrySet().forEach { (key, value) -> val strike = QuestRageStrike(key, value.asBoolean) state.rageStrikes?.add(strike) @@ -46,14 +48,20 @@ class WorldStateSerialization: JsonDeserializer { } } + state.npcImageSuffix = json?.asJsonObject.getAsString("npcImageSuffix") + try { if (json?.asJsonObject?.has("currentEvent") == true && json.asJsonObject?.get("currentEvent")?.isJsonObject == true) { val event = json.asJsonObject?.getAsJsonObject("currentEvent") if (event != null) { - state.currentEventKey = event.getAsString("event") - state.currentEventPromo = if (event.has("promo")) event.getAsString("promo") else null - state.currentEventStartDate = context?.deserialize(event.get("start"), Date::class.java) - state.currentEventEndDate = context?.deserialize(event.get("end"), Date::class.java) + state.currentEvent = context?.deserialize(event, WorldStateEvent::class.java) + } + if (json.asJsonObject.has("events")) { + val events = RealmList() + for (element in json.asJsonObject.getAsJsonArray("events")) { + context?.deserialize(element, WorldStateEvent::class.java)?.let { events.add(it) } + } + state.events = events } } } catch (e: Exception) {