diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
index d2e5c61b0..6ee5a04f4 100644
--- a/.github/workflows/android.yml
+++ b/.github/workflows/android.yml
@@ -37,7 +37,7 @@ jobs:
source: "Habitica/google-services.json.example"
target: "Habitica/google-services.json"
- name: Build with Gradle
- run: ./gradlew build
+ run: ./gradlew assembleDebug -PdisablePreDex
lint:
runs-on: ubuntu-latest
@@ -68,3 +68,33 @@ jobs:
run: chmod +x gradlew
- name: Run Ktlint
run: ./gradlew ktlint
+ detekt:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: set up JDK 11
+ uses: actions/setup-java@v2
+ with:
+ java-version: '11'
+ distribution: 'adopt'
+ cache: gradle
+ - name: copy properties file
+ uses: canastro/copy-file-action@master
+ with:
+ source: "habitica.properties.example"
+ target: "habitica.properties"
+ - name: copy resources file
+ uses: canastro/copy-file-action@master
+ with:
+ source: "habitica.resources.example"
+ target: "habitica.resources"
+ - name: copy google services file
+ uses: canastro/copy-file-action@master
+ with:
+ source: "Habitica/google-services.json.example"
+ target: "Habitica/google-services.json"
+ - name: Grant execute permission for gradlew
+ run: chmod +x gradlew
+ - name: Run detekt
+ run: ./gradlew detekt
diff --git a/Habitica/res/layout/party_member.xml b/Habitica/res/layout/party_member.xml
index a2115232a..bf6916cf3 100644
--- a/Habitica/res/layout/party_member.xml
+++ b/Habitica/res/layout/party_member.xml
@@ -27,12 +27,19 @@
+
-
{
- callback(SignInWithAppleResult.Failure(IllegalArgumentException("data not returned")))
- }
- else -> {
- callback(SignInWithAppleResult.Success(userID, apiKey, url.getQueryParameter("newUser") == "true"))
- }
+ if (userID == null || apiKey == null) {
+ callback(SignInWithAppleResult.Failure(IllegalArgumentException("data not returned")))
+ } else {
+ callback(SignInWithAppleResult.Success(userID, apiKey, url.getQueryParameter("newUser") == "true"))
}
true
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt
index 8aea401b0..e2cb49e60 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/AdventureGuideActivity.kt
@@ -70,13 +70,10 @@ class AdventureGuideActivity : BaseActivity() {
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
- return when (item.itemId) {
- android.R.id.home -> {
- NavUtils.navigateUpFromSameTask(this)
- true
- }
- else -> super.onOptionsItemSelected(item)
- }
+ return if (item.itemId == android.R.id.home) {
+ NavUtils.navigateUpFromSameTask(this)
+ true
+ } else super.onOptionsItemSelected(item)
}
override fun onStart() {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GuidelinesActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GuidelinesActivity.kt
index e5ba51b91..2665d7506 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GuidelinesActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/GuidelinesActivity.kt
@@ -42,12 +42,9 @@ class GuidelinesActivity : BaseActivity() {
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
- return when (item.itemId) {
- android.R.id.home -> {
- onBackPressed()
- true
- }
- else -> super.onOptionsItemSelected(item)
- }
+ return if (item.itemId == android.R.id.home) {
+ onBackPressed()
+ true
+ } else super.onOptionsItemSelected(item)
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt
index ee94c3086..00ddd3cb8 100755
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/MainActivity.kt
@@ -361,11 +361,9 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
MainNavigationController.setup(navigationController)
navigationController.addOnDestinationChangedListener { _, destination, arguments -> updateToolbarTitle(destination, arguments) }
- when (launchScreen) {
- "/party" -> {
- if (user == null || user?.party?.id != null) {
- MainNavigationController.navigate(R.id.partyFragment)
- }
+ if (launchScreen == "/party") {
+ if (user == null || user?.party?.id != null) {
+ MainNavigationController.navigate(R.id.partyFragment)
}
}
launchScreen = null
@@ -583,10 +581,7 @@ open class MainActivity : BaseActivity(), TutorialView.OnTutorialReaction {
)
}
- val showItemsFound = when (userQuestStatus) {
- UserQuestStatus.QUEST_COLLECT -> true
- else -> false
- }
+ val showItemsFound = userQuestStatus == UserQuestStatus.QUEST_COLLECT
compositeSubscription.add(
displayItemDropUseCase.observable(DisplayItemDropUseCase.RequestValues(data, this, snackbarContainer, showItemsFound))
.subscribe({ }, RxErrorHandler.handleEmptyError())
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.kt
index 2cf46f45d..f2da2a2de 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/SkillTasksActivity.kt
@@ -110,12 +110,9 @@ class SkillTasksActivity : BaseActivity() {
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
- return when (item.itemId) {
- android.R.id.home -> {
- onBackPressed()
- true
- }
- else -> super.onOptionsItemSelected(item)
- }
+ return if (item.itemId == android.R.id.home) {
+ onBackPressed()
+ true
+ } else super.onOptionsItemSelected(item)
}
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengesOverviewFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengesOverviewFragment.kt
index 2e7862706..d0f7e6166 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengesOverviewFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/challenges/ChallengesOverviewFragment.kt
@@ -131,7 +131,6 @@ class ChallengesOverviewFragment : BaseMainFragment()
tab.text = when (position) {
0 -> getString(R.string.my_challenges)
1 -> getString(R.string.discover)
- 1 -> getString(R.string.discover)
else -> ""
}
}.attach()
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/BugFixFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/BugFixFragment.kt
index 0b59035ab..a8d96e67d 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/BugFixFragment.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/support/BugFixFragment.kt
@@ -96,23 +96,24 @@ class BugFixFragment : BaseMainFragment() {
val version = Build.VERSION.SDK_INT
val deviceName = deviceInfo?.name ?: DeviceName.deviceName
val manufacturer = deviceInfo?.manufacturer ?: Build.MANUFACTURER
+ val newLine = "%0D%0A"
var bodyOfEmail = Uri.encode("Device: $manufacturer $deviceName") +
- "%0D%0A" + Uri.encode("Android Version: $version") +
- "%0D%0A" + Uri.encode("AppVersion: " + getString(R.string.version_info, versionName, versionCode))
+ newLine + Uri.encode("Android Version: $version") +
+ newLine + Uri.encode("AppVersion: " + getString(R.string.version_info, versionName, versionCode))
if (appConfigManager.testingLevel().name != AppTestingLevel.PRODUCTION.name) {
- bodyOfEmail += "%0D%0A" + Uri.encode(appConfigManager.testingLevel().name)
+ bodyOfEmail += newLine + Uri.encode(appConfigManager.testingLevel().name)
}
- bodyOfEmail += "%0D%0A" + Uri.encode("User ID: $userId")
+ bodyOfEmail += newLine + Uri.encode("User ID: $userId")
val user = this.user
if (user != null) {
- bodyOfEmail += "%0D%0A" + Uri.encode("Level: " + (user.stats?.lvl ?: 0)) +
- "%0D%0A" + Uri.encode("Class: " + (if (user.preferences?.disableClasses == true) "Disabled" else (user.stats?.habitClass ?: "None"))) +
- "%0D%0A" + Uri.encode("Is in Inn: " + (user.preferences?.sleep ?: false)) +
- "%0D%0A" + Uri.encode("Uses Costume: " + (user.preferences?.costume ?: false)) +
- "%0D%0A" + Uri.encode("Custom Day Start: " + (user.preferences?.dayStart ?: 0)) +
- "%0D%0A" + Uri.encode("Timezone Offset: " + (user.preferences?.timezoneOffset ?: 0))
+ bodyOfEmail += newLine + Uri.encode("Level: " + (user.stats?.lvl ?: 0)) +
+ newLine + Uri.encode("Class: " + (if (user.preferences?.disableClasses == true) "Disabled" else (user.stats?.habitClass ?: "None"))) +
+ newLine + Uri.encode("Is in Inn: " + (user.preferences?.sleep ?: false)) +
+ newLine + Uri.encode("Uses Costume: " + (user.preferences?.costume ?: false)) +
+ newLine + Uri.encode("Custom Day Start: " + (user.preferences?.dayStart ?: 0)) +
+ newLine + Uri.encode("Timezone Offset: " + (user.preferences?.timezoneOffset ?: 0))
}
bodyOfEmail += "%0D%0ADetails:%0D%0A%0D%0A"
diff --git a/build.gradle b/build.gradle
index 7cc211c36..721c918cc 100644
--- a/build.gradle
+++ b/build.gradle
@@ -33,6 +33,7 @@ allprojects {
detekt {
input = files("Habitica/src/main/java")
config = files("detekt.yml")
+ baseline = file("${rootProject.projectDir}/detekt_baseline.xml")
reports {
xml {
enabled = true // Enable/Disable XML report (default: true)
diff --git a/detekt.yml b/detekt.yml
index 406017e7b..d14593fe5 100644
--- a/detekt.yml
+++ b/detekt.yml
@@ -157,7 +157,7 @@ complexity:
active: false
StringLiteralDuplication:
active: true
- threshold: 4
+ threshold: 6
ignoreAnnotation: true
excludeStringsWithLessThan5Characters: true
ignoreStringsRegex: '$^'
diff --git a/detekt_baseline.xml b/detekt_baseline.xml
new file mode 100644
index 000000000..ad26c349e
--- /dev/null
+++ b/detekt_baseline.xml
@@ -0,0 +1,61 @@
+
+
+
+
+ DuplicateCaseInWhenExpression:Notification.kt$Notification$when (type) { Type.LOGIN_INCENTIVE.type -> LoginIncentiveData::class.java Type.NEW_STUFF.type -> NewStuffData::class.java Type.NEW_CHAT_MESSAGE.type -> NewChatMessageData::class.java Type.GROUP_TASK_NEEDS_WORK.type -> GroupTaskNeedsWorkData::class.java Type.GROUP_TASK_APPROVED.type -> GroupTaskApprovedData::class.java Type.GROUP_TASK_REQUIRES_APPROVAL.type -> GroupTaskRequiresApprovalData::class.java Type.UNALLOCATED_STATS_POINTS.type -> UnallocatedPointsData::class.java Type.GUILD_INVITATION.type -> GuildInvitationData::class.java Type.PARTY_INVITATION.type -> PartyInvitationData::class.java Type.QUEST_INVITATION.type -> QuestInvitationData::class.java Type.FIRST_DROP.type -> FirstDropData::class.java Type.ACHIEVEMENT_GENERIC.type -> AchievementData::class.java Type.WON_CHALLENGE.type -> ChallengeWonData::class.java Type.ACHIEVEMENT_ALL_YOUR_BASE.type -> AchievementData::class.java Type.ACHIEVEMENT_BACK_TO_BASICS.type -> AchievementData::class.java Type.ACHIEVEMENT_JUST_ADD_WATER.type -> AchievementData::class.java Type.ACHIEVEMENT_LOST_MASTERCLASSER.type -> AchievementData::class.java Type.ACHIEVEMENT_MIND_OVER_MATTER.type -> AchievementData::class.java Type.ACHIEVEMENT_DUST_DEVIL.type -> AchievementData::class.java Type.ACHIEVEMENT_ARID_AUTHORITY.type -> AchievementData::class.java Type.ACHIEVEMENT_MONSTER_MAGUS.type -> AchievementData::class.java Type.ACHIEVEMENT_UNDEAD_UNDERTAKER.type -> AchievementData::class.java Type.ACHIEVEMENT_PRIMED_FOR_PAINTING.type -> AchievementData::class.java Type.ACHIEVEMENT_PEARLY_PRO.type -> AchievementData::class.java Type.ACHIEVEMENT_TICKLED_PINK.type -> AchievementData::class.java Type.ACHIEVEMENT_ROSY_OUTLOOK.type -> AchievementData::class.java Type.ACHIEVEMENT_BUG_BONANZA.type -> AchievementData::class.java Type.ACHIEVEMENT_BARE_NECESSITIES.type -> AchievementData::class.java Type.ACHIEVEMENT_FRESHWATER_FRIENDS.type -> AchievementData::class.java Type.ACHIEVEMENT_GOOD_AS_GOLD.type -> AchievementData::class.java Type.ACHIEVEMENT_ALL_THAT_GLITTERS.type -> AchievementData::class.java Type.ACHIEVEMENT_GOOD_AS_GOLD.type -> AchievementData::class.java Type.ACHIEVEMENT_BONE_COLLECTOR.type -> AchievementData::class.java Type.ACHIEVEMENT_SKELETON_CREW.type -> AchievementData::class.java Type.ACHIEVEMENT_SEEING_RED.type -> AchievementData::class.java Type.ACHIEVEMENT_RED_LETTER_DAY.type -> AchievementData::class.java else -> null }
+ DuplicateCaseInWhenExpression:NotificationsManager.kt$NotificationsManager$when (it.type) { Notification.Type.LOGIN_INCENTIVE.type -> displayLoginIncentiveNotification(it) Notification.Type.ACHIEVEMENT_PARTY_UP.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_PARTY_ON.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_BEAST_MASTER.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_MOUNT_MASTER.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_TRIAD_BINGO.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_GUILD_JOINED.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_CHALLENGE_JOINED.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_INVITED_FRIEND.type -> displayAchievementNotification(it) Notification.Type.WON_CHALLENGE.type -> displayWonChallengeNotificaiton(it) Notification.Type.ACHIEVEMENT_ALL_YOUR_BASE.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_BACK_TO_BASICS.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_JUST_ADD_WATER.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_LOST_MASTERCLASSER.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_MIND_OVER_MATTER.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_DUST_DEVIL.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_ARID_AUTHORITY.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_MONSTER_MAGUS.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_UNDEAD_UNDERTAKER.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_PRIMED_FOR_PAINTING.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_PEARLY_PRO.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_TICKLED_PINK.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_ROSY_OUTLOOK.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_BUG_BONANZA.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_BARE_NECESSITIES.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_FRESHWATER_FRIENDS.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_GOOD_AS_GOLD.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_ALL_THAT_GLITTERS.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_GOOD_AS_GOLD.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_BONE_COLLECTOR.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_SKELETON_CREW.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_SEEING_RED.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_RED_LETTER_DAY.type -> displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_GENERIC.type -> displayAchievementNotification( it, notifications.find { notif -> notif.type == Notification.Type.ACHIEVEMENT_ONBOARDING_COMPLETE.type } != null ) Notification.Type.ACHIEVEMENT_ONBOARDING_COMPLETE.type -> displayAchievementNotification(it) Notification.Type.FIRST_DROP.type -> displayFirstDropNotification(it) else -> false }
+ EmptyCatchBlock:AmplitudeManager.kt$AmplitudeManager${ }
+ EmptyCatchBlock:WorldStateSerialization.kt$WorldStateSerialization${ }
+ EmptyDefaultConstructor:CustomizationRecyclerViewAdapter.kt$CustomizationRecyclerViewAdapter$()
+ EmptyFunctionBlock:FallExtraGemsHabiticaPromotion.kt$FallExtraGemsHabiticaPromotion${ }
+ EmptyFunctionBlock:GiftOneGetOneHabiticaPromotion.kt$GiftOneGetOneHabiticaPromotion${ }
+ EmptyFunctionBlock:MainActivity.kt$MainActivity.<no name provided>${ }
+ EmptyFunctionBlock:PurchaseHandler.kt$PurchaseHandler.<no name provided>${ }
+ EmptyFunctionBlock:RealmInventoryLocalRepository.kt$RealmInventoryLocalRepository${ }
+ EmptyFunctionBlock:ScoreTaskLocallyInteractor.kt$ScoreTaskLocallyInteractor.Companion${ }
+ EmptyFunctionBlock:SpookyExtraGemsHabiticaPromotion.kt$SpookyExtraGemsHabiticaPromotion${ }
+ EmptyFunctionBlock:Survey2021Promotion.kt$Survey2021Promotion${ }
+ EmptySecondaryConstructor:Server.kt$Server${}
+ ReturnCount:BaseTaskViewHolder.kt$BaseTaskViewHolder$override fun onTouch(view: View?, motionEvent: MotionEvent?): Boolean
+ ReturnCount:Customization.kt$Customization$fun getImageName(userSize: String?, hairColor: String?): String
+ ReturnCount:DeviceName.kt$DeviceName$ @WorkerThread fun getDeviceInfo(context: Context, codename: String?, model: String?): DeviceInfo
+ ReturnCount:DeviceName.kt$DeviceName$ fun getDeviceName(codename: String?, model: String?, fallback: String?): String?
+ ReturnCount:DragLinearLayout.kt$DragLinearLayout$override fun onInterceptTouchEvent(event: MotionEvent): Boolean
+ ReturnCount:DragLinearLayout.kt$DragLinearLayout$override fun onTouchEvent(event: MotionEvent): Boolean
+ ReturnCount:HabiticaAlertDialog.kt$HabiticaAlertDialog.Companion$private fun checkIfQueueAvailable(): Boolean
+ ReturnCount:PetDetailRecyclerAdapter.kt$PetDetailRecyclerAdapter$private fun canRaiseToMount(pet: Pet): Boolean
+ ReturnCount:PreferencesFragment.kt$PreferencesFragment$override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String)
+ ReturnCount:RealmBaseLocalRepository.kt$RealmBaseLocalRepository$override fun <T : BaseObject> getLiveObject(obj: T): T?
+ ReturnCount:RealmInventoryLocalRepository.kt$RealmInventoryLocalRepository$override fun feedPet(foodKey: String, petKey: String, feedValue: Int, userID: String)
+ ReturnCount:RealmInventoryLocalRepository.kt$RealmInventoryLocalRepository$override fun getLiveObject(obj: OwnedItem): OwnedItem?
+ ReturnCount:RealmInventoryLocalRepository.kt$RealmInventoryLocalRepository$override fun hatchPet(eggKey: String, potionKey: String, userID: String)
+ ReturnCount:RealmInventoryLocalRepository.kt$RealmInventoryLocalRepository$override fun unhatchPet(eggKey: String, potionKey: String, userID: String)
+ ReturnCount:StableRecyclerAdapter.kt$StableRecyclerAdapter$private fun canRaiseToMount(pet: Pet): Boolean
+ StringLiteralDuplication:GuildInviteLocalNotification.kt$GuildInviteLocalNotification$"groupID"
+ StringLiteralDuplication:RealmInventoryLocalRepository.kt$RealmInventoryLocalRepository$"animal"
+ StringLiteralDuplication:RealmSocialLocalRepository.kt$RealmSocialLocalRepository$"userID"
+ StringLiteralDuplication:RealmTaskLocalRepository.kt$RealmTaskLocalRepository$"position"
+ StringLiteralDuplication:RealmTaskLocalRepository.kt$RealmTaskLocalRepository$"userId"
+ StringLiteralDuplication:SafeDefaultItemAnimator.kt$SafeDefaultItemAnimator$"$toX, $fromX, $deltaX"
+ TooGenericExceptionCaught:CustomizationDeserializer.kt$CustomizationDeserializer$e: Exception
+ TooGenericExceptionCaught:DeviceName.kt$DeviceName$e: Exception
+ TooGenericExceptionCaught:DeviceName.kt$DeviceName.Request.GetDeviceRunnable$e: Exception
+ TooGenericExceptionCaught:HabiticaPurchaseVerifier.kt$HabiticaPurchaseVerifier$e: Exception
+ TooGenericExceptionCaught:KeyHelper.kt$KeyHelper$e: Exception
+ TooGenericExceptionCaught:LoginActivity.kt$LoginActivity$e: Exception
+ TooGenericExceptionCaught:MainActivity.kt$MainActivity$e: Exception
+ TooGenericExceptionCaught:MainNavigationController.kt$MainNavigationController$error: Exception
+ TooGenericExceptionCaught:PurchaseHandler.kt$PurchaseHandler$e: NullPointerException
+ TooGenericExceptionCaught:SectionViewHolder.kt$SectionViewHolder$e: Exception
+ TooGenericExceptionCaught:SetupCustomizationRepositoryImpl.kt$SetupCustomizationRepositoryImpl$e: Exception
+ TooGenericExceptionCaught:SoundFile.kt$SoundFile$e: Exception
+ TooGenericExceptionCaught:TaskListDeserializer.kt$TaskListDeserializer$e: RuntimeException
+ TooGenericExceptionCaught:TaskTagDeserializer.kt$TaskTagDeserializer$e: RuntimeException
+ TooGenericExceptionCaught:WorldStateSerialization.kt$WorldStateSerialization$e: Exception
+ UseIfInsteadOfWhen:MainActivity.kt$MainActivity$when (userQuestStatus) { UserQuestStatus.QUEST_BOSS -> data.questDamage else -> 0.0 }
+ UseIfInsteadOfWhen:MountDetailRecyclerAdapter.kt$MountDetailRecyclerAdapter$when (viewType) { 1 -> SectionViewHolder(parent) else -> MountViewHolder(parent, equipEvents) }
+ UseIfInsteadOfWhen:PetDetailRecyclerAdapter.kt$PetDetailRecyclerAdapter$when (viewType) { 1 -> SectionViewHolder(parent) else -> PetViewHolder(parent, equipEvents, animalIngredientsRetriever) }
+ UseIfInsteadOfWhen:RecyclerViewEmptySupport.kt$RecyclerViewEmptySupport$when (field) { RecyclerViewState.DISPLAYING_DATA -> updateAdapter(actualAdapter) else -> { updateAdapter(emptyAdapter) emptyAdapter.notifyDataSetChanged() } }
+ UseIfInsteadOfWhen:ShopItem.kt$ShopItem$when (currency) { "gold" -> (value * quantity) <= (user?.stats?.gp ?: 0.0) else -> true }
+
+