From 35a15299b2e1c6ac47d96322c6e76e3cd25497ff Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Tue, 14 Sep 2021 13:41:33 +0200 Subject: [PATCH] Add detekt to github workflow --- .github/workflows/android.yml | 32 +++++++++- Habitica/res/layout/party_member.xml | 15 ++--- .../habitica/helpers/PurchaseHandler.kt | 2 +- .../habitica/helpers/SignInWebViewClient.kt | 11 ++-- .../ui/activities/AdventureGuideActivity.kt | 11 ++-- .../ui/activities/GuidelinesActivity.kt | 11 ++-- .../habitica/ui/activities/MainActivity.kt | 13 ++-- .../ui/activities/SkillTasksActivity.kt | 11 ++-- .../challenges/ChallengesOverviewFragment.kt | 1 - .../ui/fragments/support/BugFixFragment.kt | 21 ++++--- build.gradle | 1 + detekt.yml | 2 +- detekt_baseline.xml | 61 +++++++++++++++++++ 13 files changed, 134 insertions(+), 58 deletions(-) create mode 100644 detekt_baseline.xml 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 } + +