Add detekt to github workflow

This commit is contained in:
Phillip Thelen 2021-09-14 13:41:33 +02:00
parent f480de06f7
commit 35a15299b2
13 changed files with 134 additions and 58 deletions

View file

@ -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

View file

@ -27,12 +27,19 @@
<com.habitrpg.android.habitica.ui.views.social.UsernameLabel
android:id="@+id/display_name_textview"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_marginBottom="@dimen/spacing_small" />
<androidx.legacy.widget.Space
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/you_pill"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/Pill"
android:text="@string/you"/>
<ImageButton
android:id="@+id/more_button"
android:src="@drawable/ic_more_horiz_black_18dp"
@ -41,12 +48,6 @@
android:layout_width="30dp"
android:layout_height="20dp"
android:layout_gravity="end"/>
<TextView
android:id="@+id/you_pill"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/Pill"
android:text="@string/you"/>
</LinearLayout>
<TableLayout
android:layout_width="match_parent"

View file

@ -120,7 +120,7 @@ class PurchaseHandler(activity: Activity, val analyticsManager: AnalyticsManager
onSuccess()
}
override fun onError(response: Int, e: java.lang.Exception) {}
override fun onError(response: Int, e: java.lang.Exception) { analyticsManager.logException(e) }
})
)
}

View file

@ -45,13 +45,10 @@ class SignInWebViewClient(
val userID = url.getQueryParameter("userID")
val apiKey = url.getQueryParameter("key")
when {
userID == null || apiKey == null -> {
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

View file

@ -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() {

View file

@ -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)
}
}

View file

@ -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())

View file

@ -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)
}
}

View file

@ -131,7 +131,6 @@ class ChallengesOverviewFragment : BaseMainFragment<FragmentViewpagerBinding>()
tab.text = when (position) {
0 -> getString(R.string.my_challenges)
1 -> getString(R.string.discover)
1 -> getString(R.string.discover)
else -> ""
}
}.attach()

View file

@ -96,23 +96,24 @@ class BugFixFragment : BaseMainFragment<FragmentSupportBugFixBinding>() {
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"

View file

@ -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)

View file

@ -157,7 +157,7 @@ complexity:
active: false
StringLiteralDuplication:
active: true
threshold: 4
threshold: 6
ignoreAnnotation: true
excludeStringsWithLessThan5Characters: true
ignoreStringsRegex: '$^'

61
detekt_baseline.xml Normal file
View file

@ -0,0 +1,61 @@
<?xml version="1.0" ?>
<SmellBaseline>
<Blacklist></Blacklist>
<Whitelist>
<ID>DuplicateCaseInWhenExpression:Notification.kt$Notification$when (type) { Type.LOGIN_INCENTIVE.type -&gt; LoginIncentiveData::class.java Type.NEW_STUFF.type -&gt; NewStuffData::class.java Type.NEW_CHAT_MESSAGE.type -&gt; NewChatMessageData::class.java Type.GROUP_TASK_NEEDS_WORK.type -&gt; GroupTaskNeedsWorkData::class.java Type.GROUP_TASK_APPROVED.type -&gt; GroupTaskApprovedData::class.java Type.GROUP_TASK_REQUIRES_APPROVAL.type -&gt; GroupTaskRequiresApprovalData::class.java Type.UNALLOCATED_STATS_POINTS.type -&gt; UnallocatedPointsData::class.java Type.GUILD_INVITATION.type -&gt; GuildInvitationData::class.java Type.PARTY_INVITATION.type -&gt; PartyInvitationData::class.java Type.QUEST_INVITATION.type -&gt; QuestInvitationData::class.java Type.FIRST_DROP.type -&gt; FirstDropData::class.java Type.ACHIEVEMENT_GENERIC.type -&gt; AchievementData::class.java Type.WON_CHALLENGE.type -&gt; ChallengeWonData::class.java Type.ACHIEVEMENT_ALL_YOUR_BASE.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_BACK_TO_BASICS.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_JUST_ADD_WATER.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_LOST_MASTERCLASSER.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_MIND_OVER_MATTER.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_DUST_DEVIL.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_ARID_AUTHORITY.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_MONSTER_MAGUS.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_UNDEAD_UNDERTAKER.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_PRIMED_FOR_PAINTING.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_PEARLY_PRO.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_TICKLED_PINK.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_ROSY_OUTLOOK.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_BUG_BONANZA.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_BARE_NECESSITIES.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_FRESHWATER_FRIENDS.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_GOOD_AS_GOLD.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_ALL_THAT_GLITTERS.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_GOOD_AS_GOLD.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_BONE_COLLECTOR.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_SKELETON_CREW.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_SEEING_RED.type -&gt; AchievementData::class.java Type.ACHIEVEMENT_RED_LETTER_DAY.type -&gt; AchievementData::class.java else -&gt; null }</ID>
<ID>DuplicateCaseInWhenExpression:NotificationsManager.kt$NotificationsManager$when (it.type) { Notification.Type.LOGIN_INCENTIVE.type -&gt; displayLoginIncentiveNotification(it) Notification.Type.ACHIEVEMENT_PARTY_UP.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_PARTY_ON.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_BEAST_MASTER.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_MOUNT_MASTER.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_TRIAD_BINGO.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_GUILD_JOINED.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_CHALLENGE_JOINED.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_INVITED_FRIEND.type -&gt; displayAchievementNotification(it) Notification.Type.WON_CHALLENGE.type -&gt; displayWonChallengeNotificaiton(it) Notification.Type.ACHIEVEMENT_ALL_YOUR_BASE.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_BACK_TO_BASICS.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_JUST_ADD_WATER.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_LOST_MASTERCLASSER.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_MIND_OVER_MATTER.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_DUST_DEVIL.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_ARID_AUTHORITY.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_MONSTER_MAGUS.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_UNDEAD_UNDERTAKER.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_PRIMED_FOR_PAINTING.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_PEARLY_PRO.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_TICKLED_PINK.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_ROSY_OUTLOOK.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_BUG_BONANZA.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_BARE_NECESSITIES.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_FRESHWATER_FRIENDS.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_GOOD_AS_GOLD.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_ALL_THAT_GLITTERS.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_GOOD_AS_GOLD.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_BONE_COLLECTOR.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_SKELETON_CREW.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_SEEING_RED.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_RED_LETTER_DAY.type -&gt; displayAchievementNotification(it) Notification.Type.ACHIEVEMENT_GENERIC.type -&gt; displayAchievementNotification( it, notifications.find { notif -&gt; notif.type == Notification.Type.ACHIEVEMENT_ONBOARDING_COMPLETE.type } != null ) Notification.Type.ACHIEVEMENT_ONBOARDING_COMPLETE.type -&gt; displayAchievementNotification(it) Notification.Type.FIRST_DROP.type -&gt; displayFirstDropNotification(it) else -&gt; false }</ID>
<ID>EmptyCatchBlock:AmplitudeManager.kt$AmplitudeManager${ }</ID>
<ID>EmptyCatchBlock:WorldStateSerialization.kt$WorldStateSerialization${ }</ID>
<ID>EmptyDefaultConstructor:CustomizationRecyclerViewAdapter.kt$CustomizationRecyclerViewAdapter$()</ID>
<ID>EmptyFunctionBlock:FallExtraGemsHabiticaPromotion.kt$FallExtraGemsHabiticaPromotion${ }</ID>
<ID>EmptyFunctionBlock:GiftOneGetOneHabiticaPromotion.kt$GiftOneGetOneHabiticaPromotion${ }</ID>
<ID>EmptyFunctionBlock:MainActivity.kt$MainActivity.&lt;no name provided&gt;${ }</ID>
<ID>EmptyFunctionBlock:PurchaseHandler.kt$PurchaseHandler.&lt;no name provided&gt;${ }</ID>
<ID>EmptyFunctionBlock:RealmInventoryLocalRepository.kt$RealmInventoryLocalRepository${ }</ID>
<ID>EmptyFunctionBlock:ScoreTaskLocallyInteractor.kt$ScoreTaskLocallyInteractor.Companion${ }</ID>
<ID>EmptyFunctionBlock:SpookyExtraGemsHabiticaPromotion.kt$SpookyExtraGemsHabiticaPromotion${ }</ID>
<ID>EmptyFunctionBlock:Survey2021Promotion.kt$Survey2021Promotion${ }</ID>
<ID>EmptySecondaryConstructor:Server.kt$Server${}</ID>
<ID>ReturnCount:BaseTaskViewHolder.kt$BaseTaskViewHolder$override fun onTouch(view: View?, motionEvent: MotionEvent?): Boolean</ID>
<ID>ReturnCount:Customization.kt$Customization$fun getImageName(userSize: String?, hairColor: String?): String</ID>
<ID>ReturnCount:DeviceName.kt$DeviceName$ @WorkerThread fun getDeviceInfo(context: Context, codename: String?, model: String?): DeviceInfo</ID>
<ID>ReturnCount:DeviceName.kt$DeviceName$ fun getDeviceName(codename: String?, model: String?, fallback: String?): String?</ID>
<ID>ReturnCount:DragLinearLayout.kt$DragLinearLayout$override fun onInterceptTouchEvent(event: MotionEvent): Boolean</ID>
<ID>ReturnCount:DragLinearLayout.kt$DragLinearLayout$override fun onTouchEvent(event: MotionEvent): Boolean</ID>
<ID>ReturnCount:HabiticaAlertDialog.kt$HabiticaAlertDialog.Companion$private fun checkIfQueueAvailable(): Boolean</ID>
<ID>ReturnCount:PetDetailRecyclerAdapter.kt$PetDetailRecyclerAdapter$private fun canRaiseToMount(pet: Pet): Boolean</ID>
<ID>ReturnCount:PreferencesFragment.kt$PreferencesFragment$override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String)</ID>
<ID>ReturnCount:RealmBaseLocalRepository.kt$RealmBaseLocalRepository$override fun &lt;T : BaseObject&gt; getLiveObject(obj: T): T?</ID>
<ID>ReturnCount:RealmInventoryLocalRepository.kt$RealmInventoryLocalRepository$override fun feedPet(foodKey: String, petKey: String, feedValue: Int, userID: String)</ID>
<ID>ReturnCount:RealmInventoryLocalRepository.kt$RealmInventoryLocalRepository$override fun getLiveObject(obj: OwnedItem): OwnedItem?</ID>
<ID>ReturnCount:RealmInventoryLocalRepository.kt$RealmInventoryLocalRepository$override fun hatchPet(eggKey: String, potionKey: String, userID: String)</ID>
<ID>ReturnCount:RealmInventoryLocalRepository.kt$RealmInventoryLocalRepository$override fun unhatchPet(eggKey: String, potionKey: String, userID: String)</ID>
<ID>ReturnCount:StableRecyclerAdapter.kt$StableRecyclerAdapter$private fun canRaiseToMount(pet: Pet): Boolean</ID>
<ID>StringLiteralDuplication:GuildInviteLocalNotification.kt$GuildInviteLocalNotification$"groupID"</ID>
<ID>StringLiteralDuplication:RealmInventoryLocalRepository.kt$RealmInventoryLocalRepository$"animal"</ID>
<ID>StringLiteralDuplication:RealmSocialLocalRepository.kt$RealmSocialLocalRepository$"userID"</ID>
<ID>StringLiteralDuplication:RealmTaskLocalRepository.kt$RealmTaskLocalRepository$"position"</ID>
<ID>StringLiteralDuplication:RealmTaskLocalRepository.kt$RealmTaskLocalRepository$"userId"</ID>
<ID>StringLiteralDuplication:SafeDefaultItemAnimator.kt$SafeDefaultItemAnimator$"$toX, $fromX, $deltaX"</ID>
<ID>TooGenericExceptionCaught:CustomizationDeserializer.kt$CustomizationDeserializer$e: Exception</ID>
<ID>TooGenericExceptionCaught:DeviceName.kt$DeviceName$e: Exception</ID>
<ID>TooGenericExceptionCaught:DeviceName.kt$DeviceName.Request.GetDeviceRunnable$e: Exception</ID>
<ID>TooGenericExceptionCaught:HabiticaPurchaseVerifier.kt$HabiticaPurchaseVerifier$e: Exception</ID>
<ID>TooGenericExceptionCaught:KeyHelper.kt$KeyHelper$e: Exception</ID>
<ID>TooGenericExceptionCaught:LoginActivity.kt$LoginActivity$e: Exception</ID>
<ID>TooGenericExceptionCaught:MainActivity.kt$MainActivity$e: Exception</ID>
<ID>TooGenericExceptionCaught:MainNavigationController.kt$MainNavigationController$error: Exception</ID>
<ID>TooGenericExceptionCaught:PurchaseHandler.kt$PurchaseHandler$e: NullPointerException</ID>
<ID>TooGenericExceptionCaught:SectionViewHolder.kt$SectionViewHolder$e: Exception</ID>
<ID>TooGenericExceptionCaught:SetupCustomizationRepositoryImpl.kt$SetupCustomizationRepositoryImpl$e: Exception</ID>
<ID>TooGenericExceptionCaught:SoundFile.kt$SoundFile$e: Exception</ID>
<ID>TooGenericExceptionCaught:TaskListDeserializer.kt$TaskListDeserializer$e: RuntimeException</ID>
<ID>TooGenericExceptionCaught:TaskTagDeserializer.kt$TaskTagDeserializer$e: RuntimeException</ID>
<ID>TooGenericExceptionCaught:WorldStateSerialization.kt$WorldStateSerialization$e: Exception</ID>
<ID>UseIfInsteadOfWhen:MainActivity.kt$MainActivity$when (userQuestStatus) { UserQuestStatus.QUEST_BOSS -&gt; data.questDamage else -&gt; 0.0 }</ID>
<ID>UseIfInsteadOfWhen:MountDetailRecyclerAdapter.kt$MountDetailRecyclerAdapter$when (viewType) { 1 -&gt; SectionViewHolder(parent) else -&gt; MountViewHolder(parent, equipEvents) }</ID>
<ID>UseIfInsteadOfWhen:PetDetailRecyclerAdapter.kt$PetDetailRecyclerAdapter$when (viewType) { 1 -&gt; SectionViewHolder(parent) else -&gt; PetViewHolder(parent, equipEvents, animalIngredientsRetriever) }</ID>
<ID>UseIfInsteadOfWhen:RecyclerViewEmptySupport.kt$RecyclerViewEmptySupport$when (field) { RecyclerViewState.DISPLAYING_DATA -&gt; updateAdapter(actualAdapter) else -&gt; { updateAdapter(emptyAdapter) emptyAdapter.notifyDataSetChanged() } }</ID>
<ID>UseIfInsteadOfWhen:ShopItem.kt$ShopItem$when (currency) { "gold" -&gt; (value * quantity) &lt;= (user?.stats?.gp ?: 0.0) else -&gt; true }</ID>
</Whitelist>
</SmellBaseline>