Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.afternote.core.ui.icon

import androidx.annotation.DrawableRes
import com.afternote.core.ui.R

/**
* 애프터노트 **종류** 아이콘의 core 정본 (#926).
*
* 수신자 홈이 이 아이콘을 쓰는데, 종전에는 `feature:afternote:presentation` 의 `R` 을 직접
* 빌려 왔다. 형제 feature 의 리소스를 가로지르는 참조라 두 모듈이 리소스 수준에서 묶인다.
*
* 종류는 도메인 개념이지만 **아이콘 선택은 표현**이라, 화면 사이에 오가는 값은 res id 가
* 아니라 이 enum 이다. ViewModel 이 res id 를 들면 상태가 Android 리소스에 묶여
* 단위 테스트에서도 리소스가 필요해진다.
*/
enum class AfternoteSourceIcon(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blocking] 이 타입이 feature:receiver:presentation 의 home.model 에서 여기로 올라오면서 같은 모듈의 screenshotTest 소스셋이 따라오지 않았습니다. data class(drawableResId) → enum 이라 import 경로뿐 아니라 생성자 호출도 함께 바뀌어야 하는데, 그쪽은 옛 형태 그대로입니다.

e: .../screenshotTest/.../home/ReceiverHomeScreenScreenshotTest.kt:6:63 Unresolved reference 'AfternoteSourceIcon'.
e: .../screenshotTest/.../home/ReceiverHomeScreenScreenshotTest.kt:53:29 Unresolved reference 'AfternoteSourceIcon'.
e: .../screenshotTest/.../home/component/AfternoteSectionScreenshotTest.kt:9:63 Unresolved reference 'AfternoteSourceIcon'.
e: .../screenshotTest/.../home/component/AfternoteSectionScreenshotTest.kt:21:21 Unresolved reference 'AfternoteSourceIcon'.
e: .../screenshotTest/.../home/component/AfternoteSectionScreenshotTest.kt:22:21 Unresolved reference 'AfternoteSourceIcon'.
> Task :feature:receiver:presentation:compileDebugScreenshotTestKotlin FAILED

본문 검증 목록이 assembleDebug·testDebugUnitTest·konsist:test 로 끝나 screenshotTest 소스셋만 컴파일 범위 밖에 있었던 것으로 보입니다. 이 모듈은 enableScreenshotTest 가 켜져 있어 소스셋이 하나 더 있습니다 — 타입을 옮길 때는 :feature:receiver:presentation:compileDebugScreenshotTestKotlin 까지 걸어 두시면 같은 누락이 다시 안 납니다.

@param:DrawableRes val drawableResId: Int,
) {
SocialNetwork(R.drawable.core_ui_afternote_social_pattern),
GalleryAndFiles(R.drawable.core_ui_afternote_gallery_pattern),
Memorial(R.drawable.core_ui_afternote_memorial_guideline),

/** 위 셋으로 갈리지 않는 종류 — 로고로 받는다. */
Other(R.drawable.core_ui_afternote_logo),
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import com.afternote.feature.afternote.presentation.author.home.AfternoteCategor
import com.afternote.feature.afternote.presentation.shared.body.infinite.content.list.AfternoteList
import com.afternote.feature.afternote.presentation.shared.body.infinite.content.list.item.ListItemUiModel
import kotlinx.coroutines.flow.flowOf
import com.afternote.core.ui.R as CoreUiR

@Composable
fun AfternoteListContent(
Expand Down Expand Up @@ -73,14 +74,14 @@ private fun AfternoteListContentPreview() {
id = 1L,
serviceName = "추억 노트",
date = "2025.12.01",
iconResId = R.drawable.feature_afternote_img_logo,
iconResId = CoreUiR.drawable.core_ui_afternote_logo,
type = AfternoteType.MEMORIAL,
),
ListItemUiModel(
id = 2L,
serviceName = "인스타그램",
date = "2025.11.26",
iconResId = R.drawable.feature_afternote_img_logo,
iconResId = CoreUiR.drawable.core_ui_afternote_logo,
type = AfternoteType.SOCIAL_NETWORK,
),
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import com.afternote.core.ui.theme.AfternoteDesign
import com.afternote.core.ui.theme.AfternoteTheme
import com.afternote.feature.afternote.presentation.R
import com.afternote.feature.afternote.presentation.shared.model.AfternoteServiceDisplay
import com.afternote.core.ui.R as CoreUiR

/**
* 애프터노트 작성자 상세 공통 상단: 서비스 아이콘·이름·최종 작성일.
Expand Down Expand Up @@ -78,7 +79,7 @@ private fun AfternoteDetailServiceHeaderPreview() {
service =
AfternoteServiceDisplay(
serviceName = "서비스 이름",
iconResId = R.drawable.feature_afternote_ic_memorial_guideline,
iconResId = CoreUiR.drawable.core_ui_afternote_memorial_guideline,
),
finalWriteDate = "2024.05.20",
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.afternote.feature.afternote.presentation.shared.model
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import com.afternote.feature.afternote.presentation.R
import com.afternote.core.ui.R as CoreUiR

/**
* Maps API [typeKey] (when present), UI display keys / service titles, and label + icon resources.
Expand All @@ -19,19 +20,19 @@ enum class AfternoteService(
typeKey = "SOCIAL_NETWORK",
displayKey = "SOCIAL_NETWORK",
stringResId = R.string.afternote_category_social_network,
iconResId = R.drawable.feature_afternote_ic_social_pattern,
iconResId = CoreUiR.drawable.core_ui_afternote_social_pattern,
),
GALLERY_AND_FILES_CATEGORY(
typeKey = "GALLERY_AND_FILES",
displayKey = "GALLERY_AND_FILES",
stringResId = R.string.receiver_afternote_item_gallery,
iconResId = R.drawable.feature_afternote_ic_gallery_pattern,
iconResId = CoreUiR.drawable.core_ui_afternote_gallery_pattern,
),
MEMORIAL_CATEGORY(
typeKey = "MEMORIAL",
displayKey = "MEMORIAL",
stringResId = R.string.receiver_afternote_item_memorial_guideline,
iconResId = R.drawable.feature_afternote_ic_memorial_guideline,
iconResId = CoreUiR.drawable.core_ui_afternote_memorial_guideline,
),
INSTAGRAM(
typeKey = "INSTAGRAM",
Expand All @@ -43,13 +44,13 @@ enum class AfternoteService(
typeKey = "GALLERY",
displayKey = "갤러리",
stringResId = R.string.receiver_afternote_item_gallery,
iconResId = R.drawable.feature_afternote_ic_gallery_pattern,
iconResId = CoreUiR.drawable.core_ui_afternote_gallery_pattern,
),
MEMORIAL_GUIDELINE(
typeKey = "GUIDE",
displayKey = "추억 노트",
stringResId = R.string.receiver_afternote_item_memorial_guideline,
iconResId = R.drawable.feature_afternote_ic_memorial_guideline,
iconResId = CoreUiR.drawable.core_ui_afternote_memorial_guideline,
),
NAVER_MAIL(
typeKey = "NAVER_MAIL",
Expand Down Expand Up @@ -175,7 +176,7 @@ enum class AfternoteService(
typeKey = null,
displayKey = "파일",
stringResId = R.string.receiver_afternote_item_gallery,
iconResId = R.drawable.feature_afternote_ic_gallery_pattern,
iconResId = CoreUiR.drawable.core_ui_afternote_gallery_pattern,
),
;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import androidx.annotation.StringRes
import com.afternote.feature.afternote.domain.AfternoteType
import com.afternote.feature.afternote.presentation.R
import com.afternote.feature.afternote.presentation.shared.model.AfternoteService
import com.afternote.core.ui.R as CoreUiR

/**
* 종류 필터 탭 순서. `null` 은 "전체" 탭이다.
Expand Down Expand Up @@ -32,7 +33,7 @@ fun categoryLabelResFor(type: AfternoteType?): Int =
/** Icon drawable res for an [AfternoteType]. */
fun getIconResForType(type: AfternoteType): Int =
AfternoteService.fromTypeKeyOrNull(type.name)?.iconResId
?: R.drawable.feature_afternote_img_logo
?: CoreUiR.drawable.core_ui_afternote_logo

/**
* Icon drawable res for a service title shown on a card.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.afternote.core.ui.button.AfternoteButton
import com.afternote.core.ui.button.AfternoteButtonType
import com.afternote.core.ui.icon.AfternoteSourceIcon
import com.afternote.core.ui.popup.Popup
import com.afternote.core.ui.popup.PopupType
import com.afternote.core.ui.theme.AfternoteDesign
Expand All @@ -38,12 +39,10 @@ import com.afternote.feature.receiver.presentation.home.component.AfternoteSecti
import com.afternote.feature.receiver.presentation.home.component.MindRecordSection
import com.afternote.feature.receiver.presentation.home.component.SenderMessageHeroCard
import com.afternote.feature.receiver.presentation.home.component.TimeLetterSection
import com.afternote.feature.receiver.presentation.home.model.AfternoteSourceIcon
import com.afternote.feature.receiver.presentation.home.model.MindRecordSummary
import com.afternote.feature.receiver.presentation.home.model.ReceiverDownloadState
import com.afternote.feature.receiver.presentation.home.model.ReceiverHomeUiState
import com.afternote.feature.receiver.presentation.home.model.SenderMessage
import com.afternote.feature.afternote.presentation.R as AfternoteFeatureR

/**
* 수신자 홈 화면 — 한 마디 + 마음의 기록·타임레터·애프터노트 카드 + 모든 기록 내려받기 버튼.
Expand Down Expand Up @@ -236,10 +235,10 @@ private fun ReceiverHomeScreenPreview() {
afternoteTotalCount = 10,
afternoteIcons =
listOf(
AfternoteSourceIcon(AfternoteFeatureR.drawable.feature_afternote_img_insta_pattern),
AfternoteSourceIcon(AfternoteFeatureR.drawable.feature_afternote_img_googlephoto_pattern),
AfternoteSourceIcon(AfternoteFeatureR.drawable.feature_afternote_img_naver_mail_pattern),
AfternoteSourceIcon(AfternoteFeatureR.drawable.feature_afternote_img_kakaotalk_pattern),
AfternoteSourceIcon.SocialNetwork,
AfternoteSourceIcon.GalleryAndFiles,
AfternoteSourceIcon.Memorial,
AfternoteSourceIcon.Other,
),
),
onEvent = {},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.afternote.core.common.reporting.ErrorReporter
import com.afternote.core.common.result.runCatchingCancellable
import com.afternote.feature.afternote.presentation.shared.util.getIconResForType
import com.afternote.core.ui.icon.AfternoteSourceIcon
import com.afternote.feature.afternote.domain.AfternoteType
import com.afternote.feature.mindrecord.domain.model.ReceiverMindRecords
import com.afternote.feature.mindrecord.domain.repository.MindRecordReceiverRepository
import com.afternote.feature.receiver.domain.model.AfterNoteListItem
import com.afternote.feature.receiver.domain.repository.ReceiverRepository
import com.afternote.feature.receiver.presentation.R
import com.afternote.feature.receiver.presentation.home.model.AfternoteSourceIcon
import com.afternote.feature.receiver.presentation.home.model.MindRecordSummary
import com.afternote.feature.receiver.presentation.home.model.ReceiverDownloadState
import com.afternote.feature.receiver.presentation.home.model.ReceiverHomeUiState
Expand Down Expand Up @@ -183,5 +183,19 @@ private fun List<AfterNoteListItem>.toAfternoteIcons(): List<AfternoteSourceIcon
.mapNotNull { it.type }
.distinct()
.take(MAX_AFTERNOTE_ICONS)
.map { AfternoteSourceIcon(drawableResId = getIconResForType(it)) }
.map { it.toSourceIcon() }
.toList()

/**
* 애프터노트 종류를 홈이 그릴 아이콘으로 옮긴다 (#926).
*
* res id 를 상태에 담지 않는다 — 담으면 ViewModel 이 Android 리소스에 묶이고, 형제
* feature 의 `R` 을 가로질러 참조하게 된다. 어떤 그림인지는 core:ui 가 안다.
*/
private fun AfternoteType.toSourceIcon(): AfternoteSourceIcon =
when (this) {
AfternoteType.SOCIAL_NETWORK -> AfternoteSourceIcon.SocialNetwork
AfternoteType.GALLERY_AND_FILES -> AfternoteSourceIcon.GalleryAndFiles
AfternoteType.MEMORIAL -> AfternoteSourceIcon.Memorial
AfternoteType.BUSINESS, AfternoteType.ESTATE -> AfternoteSourceIcon.Other
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,10 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.afternote.core.ui.icon.AfternoteSourceIcon
import com.afternote.core.ui.theme.AfternoteDesign
import com.afternote.core.ui.theme.AfternoteTheme
import com.afternote.feature.receiver.presentation.R
import com.afternote.feature.receiver.presentation.home.model.AfternoteSourceIcon
import com.afternote.feature.afternote.presentation.R as AfternoteFeatureR

private const val MAX_VISIBLE_ICONS = 4
private val ICON_SIZE = 32.dp
Expand Down Expand Up @@ -127,10 +126,10 @@ private fun AfternoteSectionPreview() {
totalCount = 10,
icons =
listOf(
AfternoteSourceIcon(AfternoteFeatureR.drawable.feature_afternote_img_insta_pattern),
AfternoteSourceIcon(AfternoteFeatureR.drawable.feature_afternote_img_googlephoto_pattern),
AfternoteSourceIcon(AfternoteFeatureR.drawable.feature_afternote_img_naver_mail_pattern),
AfternoteSourceIcon(AfternoteFeatureR.drawable.feature_afternote_img_kakaotalk_pattern),
AfternoteSourceIcon.SocialNetwork,
AfternoteSourceIcon.GalleryAndFiles,
AfternoteSourceIcon.Memorial,
AfternoteSourceIcon.Other,
),
onGoClick = {},
modifier = Modifier.padding(20.dp),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.afternote.feature.receiver.presentation.home.model

import androidx.annotation.StringRes
import androidx.compose.runtime.Immutable
import com.afternote.core.ui.icon.AfternoteSourceIcon

/**
* 수신자 홈 화면 UI 상태.
Expand Down Expand Up @@ -46,10 +47,6 @@ data class MindRecordSummary(
}

@Immutable
data class AfternoteSourceIcon(
val drawableResId: Int,
)

sealed interface ReceiverDownloadState {
data object Idle : ReceiverDownloadState

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package com.afternote.feature.receiver.presentation.home

import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import com.afternote.core.ui.icon.AfternoteSourceIcon

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blocking] 같은 위반이 이 파일에도 있습니다 — core.ui.icon 이 core.ui.theme 뒤에 놓였습니다.

import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import com.afternote.core.ui.icon.AfternoteSourceIcon
import com.afternote.core.ui.theme.AfternoteTheme
import com.afternote.feature.receiver.presentation.home.model.MindRecordSummary

두 파일 다 ktlintFormat 한 번이면 함께 정리됩니다.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blocking] (직전 리뷰 4번 — 아직 그대로입니다) core.ui.icon 이 core.ui.theme 뒤에 놓여 standard:import-ordering 을 깹니다. 이 줄과 바로 위 theme 줄을 맞바꾸면 끝납니다.

import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import com.afternote.core.ui.icon.AfternoteSourceIcon
import com.afternote.core.ui.theme.AfternoteTheme
import com.afternote.feature.receiver.presentation.home.model.MindRecordSummary

import com.afternote.core.ui.theme.AfternoteTheme
import com.afternote.feature.receiver.presentation.home.model.AfternoteSourceIcon
import com.afternote.feature.receiver.presentation.home.model.MindRecordSummary
import com.afternote.feature.receiver.presentation.home.model.ReceiverHomeUiState
import com.afternote.feature.receiver.presentation.home.model.SenderMessage
Expand Down Expand Up @@ -50,7 +50,7 @@ internal fun receiverHomeScreenSuccessScreenshot() {
afternoteTotalCount = 5,
afternoteIcons =
listOf(
AfternoteSourceIcon(drawableResId = com.afternote.core.ui.R.drawable.core_ui_ic_tabler_search),
AfternoteSourceIcon.SocialNetwork,
),
),
onEvent = {},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.afternote.core.ui.icon.AfternoteSourceIcon

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blocking] 이 import 가 standard:import-ordering 을 깨서 CI 의 Ktlint 가 red 입니다.

AfternoteSectionScreenshotTest.kt:3:1 Imports must be ordered in lexicographic order without any
empty lines in-between with "java", "javax", "kotlin" and aliases in the end (standard:import-ordering)
> Task :feature:receiver:presentation:ktlintScreenshotTestSourceSetCheck FAILED

core.ui.icon 이 core.ui.theme 보다 앞이라 두 줄을 맞바꾸면 끝납니다.

import com.afternote.core.ui.icon.AfternoteSourceIcon
import com.afternote.core.ui.theme.AfternoteTheme

(위반 위치가 3:1 로 보고되는 것은 ktlint 가 import 블록 전체를 첫 줄에 앵커하기 때문이고, 실제로 순서를 깨는 것은 이 줄입니다.)

import com.afternote.core.ui.theme.AfternoteTheme
import com.afternote.feature.receiver.presentation.home.model.AfternoteSourceIcon
import com.android.tools.screenshot.PreviewTest

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[blocking] (직전 리뷰 4번 — 아직 그대로입니다) 같은 위반이 이 파일에도 남아 있습니다. icon 을 theme 앞으로 올리면 됩니다.

import androidx.compose.ui.unit.dp
import com.afternote.core.ui.icon.AfternoteSourceIcon
import com.afternote.core.ui.theme.AfternoteTheme
import com.android.tools.screenshot.PreviewTest

(ktlint 가 위반 위치를 3:1 로 보고하는 것은 import 블록 전체를 첫 줄에 앵커하기 때문이고, 실제로 순서를 깨는 것은 이 줄입니다.)


@PreviewTest
Expand All @@ -18,8 +18,8 @@ internal fun afternoteSectionScreenshot() {
totalCount = 5,
icons =
listOf(
AfternoteSourceIcon(drawableResId = com.afternote.core.ui.R.drawable.core_ui_ic_tabler_search),
AfternoteSourceIcon(drawableResId = com.afternote.core.ui.R.drawable.core_ui_ic_link),
AfternoteSourceIcon.SocialNetwork,
AfternoteSourceIcon.GalleryAndFiles,
),
onGoClick = {},
modifier = Modifier.padding(16.dp),
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.afternote.konsist

import com.lemonappdev.konsist.api.Konsist
import com.lemonappdev.konsist.api.ext.list.withPackage
import com.lemonappdev.konsist.api.verify.assertFalse
import org.junit.Test

/**
* 수신자 홈이 형제 feature 의 리소스를 빌려 쓰지 않는지 (#926).
*
* 종전에는 수신자 홈이 `feature:afternote:presentation` 의 `R` 을 직접 import 해 소셜 패턴
* 아이콘을 그렸다. 리소스는 모듈 경계를 가장 조용히 넘는 의존이다 — 컴파일은 되고,
* 그림도 뜨고, 다른 모듈이 리소스를 지우거나 이름을 바꿀 때에야 드러난다.
*
* 아이콘의 정본은 `core:ui` 이고, 화면 사이에 오가는 값은 res id 가 아니라
* `AfternoteSourceIcon` 이다.
*/
class ReceiverHomeResourceKonsistTest {
@Test
fun `수신자 홈은 다른 feature 의 R 을 참조하지 않는다`() {
Konsist
.scopeFromProject()
.files
.withPackage("com.afternote.feature.receiver.presentation.home..")
.assertFalse { file ->
file.imports.any { import -> FOREIGN_FEATURE_RESOURCE.matches(import.name) } ||
// import 만 보면 FQN 참조가 그대로 빠져나간다 — 이 패키지의 screenshotTest 가
// 실제로 `com.afternote.core.ui.R.drawable.…` 를 FQN 으로 쓰는 손버릇이라,
// 같은 손버릇으로 형제 feature 의 R 을 쓰면 가드가 침묵한다. 본문도 본다.
FOREIGN_FEATURE_RESOURCE_REFERENCE.containsMatchIn(file.text)
}
}

private companion object {
/** 수신자 자신이 아닌 feature 의 `R` (또는 그 하위 참조). */
val FOREIGN_FEATURE_RESOURCE =
Regex("""^com\.afternote\.feature\.(?!receiver\.)[a-z]+\.presentation\.R(\..*)?$""")

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[normal] 가드가 import 문만 봅니다(file.imports.any { … }). 그래서 fully-qualified 로 쓰면 그대로 통과합니다.

// 이건 잡힌다
import com.afternote.feature.afternote.presentation.R as AfternoteFeatureR

// 이건 안 잡힌다 — import 가 없다
painterResource(com.afternote.feature.afternote.presentation.R.drawable.feature_afternote_img_logo)

가정이 아니라 이 모듈에 이미 있는 코드 습관입니다 — 같은 패키지의 screenshotTest 두 파일이 지금도 com.afternote.core.ui.R.drawable.… 를 FQN 으로 씁니다. 그 손버릇으로 형제 feature 의 R 을 쓰면 가드가 침묵합니다.

file.text 에 같은 정규식을 한 번 더 걸거나(주석·문자열 오탐은 감수), import 검사에 더해 참조 텍스트까지 보는 쪽으로 좁혀 두면 구멍이 막힙니다. 지금 범위에서 blocking 은 아니니 후속으로 잡으셔도 됩니다.


/** 같은 참조를 본문 어디서든 — FQN 으로 쓴 자리를 잡는다. 주석·문자열 오탐은 감수한다. */
val FOREIGN_FEATURE_RESOURCE_REFERENCE =
Regex("""com\.afternote\.feature\.(?!receiver\.)[a-z]+\.presentation\.R\.""")
}
}
Loading