Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/explore #22

Merged
merged 13 commits into from
Dec 26, 2024
Merged

Feature/explore #22

merged 13 commits into from
Dec 26, 2024

Conversation

Guri999
Copy link
Collaborator

@Guri999 Guri999 commented Dec 8, 2024

Explore 화면
LocalStorage 접근

@Guri999 Guri999 added the ✨ feat 기능 개발 label Dec 8, 2024
@Guri999 Guri999 self-assigned this Dec 8, 2024
Copy link

@f-lab-dean f-lab-dean left a comment

Choose a reason for hiding this comment

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

PR 생성 시 효과적이고 의미있는 리뷰를 위해 다음과 같은 부분을 고려해주시면 좋겠습니다.

  1. PR의 제목은 이 PR에서 어떤 작업이 있었는지, 무엇을 중점으로 보아야 하는지를 요약합니다. 따라서 리뷰어는 어떤 작업이 있을지 예상이 가능합니다. Feature/explore와 같은 제목은 리뷰어에게 그 어떤 단서도 주어지지 않습니다.

  2. PR의 내용은 작업물의 내용에 대한 상세를 작성해주시기 바랍니다. 이러한 내용을 토대로 작업물의 이해도를 높이고, 어떤 부분을 고려하면 좋을지 리뷰어에게 단서를 제공합니다. 리뷰를 하는 사람은 현재 PR이 어떤 작업인지 컨텍스트가 전혀 없다는 것을 고려하여 가능한 간결하고 정확한 데이터를 제공해주어야 합니다.

  3. 하나의 PR은 하나의 작업만을 포함하는게 좋습니다. 현재의 PR은 작업 내용이 다양하고, 커밋이 많습니다. 이것은 리뷰어에게 혼란을 주기 쉽습니다. 일반적으로 효율적인 리뷰를 위한 변화량은 400라인을 권장합니다.

  4. 일관적인 PR 생성을 위해 템플릿 작성을 권장합니다.


if (checkStoragePermission(this)) {

Choose a reason for hiding this comment

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

onResume에서 storage permission을 체크하여 setContent를 호출하는 것은 바람직하지 않은 구조같습니다.
권한에 따라 UI의 상태가 변경되어야 한다면, 그에 따른 UI 상태를 Composable에 넘겨주어 리컴포지션할 수 있도록 구조를 변경하는게 좋을 것 같습니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

추상 클래스로 변경했습니다


internal fun checkStoragePermission(
activity: ComponentActivity,
): Boolean =
Copy link

@f-lab-dean f-lab-dean Dec 8, 2024

Choose a reason for hiding this comment

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

Util함수로 구현하는 것 보다, 외부 스토리지 권한 로직을 캡슐화한 클래스 또는 인터페이스로 제공하는 것이 좋을 것 같습니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

추상 클래스로 변경 했습니다

activity.startActivityForResult(intent, MANAGE_EXTERNAL_STORAGE_PERMISSION_REQUEST)
}

fun requestStoragePermissionApi19(activity: ComponentActivity) {

Choose a reason for hiding this comment

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

이 함수가 public인 이유가 무엇일까요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

단순 실수였습니다 바로 위 PR에서 수정했습니다

.clearAndSetSemantics { },
imageVector = SeeDocsIcon.PDF,
contentDescription = null,
tint = Color.Unspecified

Choose a reason for hiding this comment

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

tint는 Color.Unspecified로 적용되는 것이 맞나요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

네 혹시 뭔가 이상한점이 있나요?

Choose a reason for hiding this comment

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

구현의 의도, 실수를 확인하기 위한 질문입니다.
보통 tint 파라미터를 넘기는 경우는 특정한 컬러로 표현하기 위함인데, Color.Unspecified 를 지정하는 이유가 궁금해서요.

color = Theme.colors.text
)
Text(
text = "2023.01.01",

Choose a reason for hiding this comment

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

하드코딩된 이유가 궁금합니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

외부로 부터 데이터를 받을 부분이라 UI를 보기위한 더미 데이터입니다.

기능 구현 이후 수정하였습니다.

Choose a reason for hiding this comment

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

나중에 구현이 되어야할 부분이라면 TODO 코멘트를 남겨주시는 것이 좋을 것 같습니다.

private fun readPDFOrDirectory(
path: String,
): List<Item> =
File(path).listFiles()?.filter { !it.isHidden && (it.isDirectory || it.extension == "pdf") }?.map {

Choose a reason for hiding this comment

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

이 함수를 UI 쓰레드에서 호출해도 괜찮을까요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

백그라운드 스레드에서 호출하는게 맞을 것 같네요

Choose a reason for hiding this comment

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

네, TODO 등의 코멘트를 달고 다른 PR에서 수정하시면 될 것 같습니다.

)
}?: emptyList()

private data class Item(

Choose a reason for hiding this comment

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

UI 모델이라면 분리된 파일 또는 패키지에 위치하는 것은 어떤가요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

여러 화면에서 사용될 모델 이라 생각해서 임시로 안에 적은 뒤
다른 화면 로컬 파일 설정등을 하며 데이터 윤곽이 잡히면 수정할 계획이었습니다.


import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject

Choose a reason for hiding this comment

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

미완성된 또는 미사용되는 코드는 포함하지 않아도 될 것 같습니다.

),
) {
tabs.forEach { tab ->
Item(

Choose a reason for hiding this comment

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

BottomTabItem과 같이 명확한 이름을 주는 것은 어떤가요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

수정하겠습니다

.idea/gradle.xml Outdated
@@ -37,6 +37,7 @@
<option value="$PROJECT_DIR$/feature/bookmark" />
<option value="$PROJECT_DIR$/feature/explore" />
<option value="$PROJECT_DIR$/feature/main" />
<option value="$PROJECT_DIR$/feature/pdf" />

Choose a reason for hiding this comment

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

이 파일은 git에 올릴 필요가 있는 파일인가요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

필요없는걸 같이 PR 한것 같습니다

@f-lab-dean
Copy link

Quality Gate Failed Quality Gate failed

Failed conditions 1 Security Hotspot 9.0% Duplication on New Code (required ≤ 3%)

See analysis details on SonarQube Cloud

@Guri999 SonarQube 결과가 실패인 이유를 확인하고 수정해주세요.

Copy link

Copy link

@f-lab-dean f-lab-dean left a comment

Choose a reason for hiding this comment

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

LGTM + 코멘트를 확인해주세요.
꼭 반영해야할 필요는 없습니다만, 한번 고민해보시면 좋을 것 같아요.

import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat

abstract class PermissionActivity : ComponentActivity() {

Choose a reason for hiding this comment

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

추상화된 함수를 제공하지 않는다면 open class가 더 어울릴 것 같습니다.


abstract class PermissionActivity : ComponentActivity() {

internal fun ComponentActivity.checkStoragePermission(): Boolean =

Choose a reason for hiding this comment

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

함수들이 이미 ComponentActivity 내에 있으므로 확장함수로 구현하지 않아도 될 것 같아요.

import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat

abstract class PermissionActivity : ComponentActivity() {

Choose a reason for hiding this comment

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

권한이 Storage permission으로 한정되어 있으므로 이름을 명확하게 하는것이 좋을 것 같아요.

import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat

abstract class PermissionActivity : ComponentActivity() {

Choose a reason for hiding this comment

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

어차피 캡슐화를 할 것이라면, 스토리지 권한만을 위한 로직의 책임을 가진 class로 만들고, 사용하는 곳에서 활용하도록 하는것도 좋을 것 같아요.

@Guri999 Guri999 merged commit 1f48fd7 into main Dec 26, 2024
2 checks passed
@Guri999 Guri999 deleted the feature/explore branch December 26, 2024 10:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
✨ feat 기능 개발
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants