-
Notifications
You must be signed in to change notification settings - Fork 1
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
PDF 화면 구성 및 PDF 렌더링 #27
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
현재는 UI에서 데이터 소스에 접근하고 모든 상태를 관리하는 구조로 보입니다.
앞으로 아키텍처가 MVVM 등으로 변경되는지, 아니면 이러한 구조를 선택한 이유가 있는지 궁금합니다.
하나의 PR에는 하나의 작업만이 포함되는 것이 좋습니다.
현재의 PR에서 기능추가와 리팩토링은 연관이 없어 보이므로 PR을 분리하는 것이 좋고,
연관이 있다 하더라도 변화량을 최대한 줄여 리뷰가 원활히 진행되도록 분리하는 것이 좋습니다.
PdfScreen( | ||
popBackStack = popBackStack | ||
) | ||
val uri = Uri.fromFile(File(path)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
리컴포지션시에 Uri를 읽어오는 작업이 반복 될 것 같습니다.
uri를 remember와 같은 것으로 처리하지 않아도 무방한가요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
remember로 처리하는게 맞는것 같습니다
} | ||
} | ||
|
||
@Preview | ||
@Composable | ||
private fun Preview() { | ||
SeeDocsTheme { | ||
PdfScreen() | ||
// PdfScreen() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
프리뷰에 내용이 없다면 삭제해도 될 것 같습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
삭제하겠습니다
@@ -73,22 +84,46 @@ private fun PdfImage( | |||
var bitmap by remember { | |||
mutableStateOf<Bitmap?>(null) | |||
} | |||
var isLoading by remember { mutableStateOf(true) } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
의견)
PdfRenderer를 내부적으로 사용하는 Pdf to Bitmap 클래스를 만들어서 로직을 캡슐화하고, 렌더링 상태(ex. 로딩, 렌더링 완료)를 StateFlow로 구독할 수 있게 하는 방법은 어떠신가요?
@@ -89,8 +89,8 @@ private fun PdfImage( | |||
LaunchedEffect(Unit) { | |||
isLoading = true | |||
val page = renderer.openPage(pageIndex) | |||
Bitmap.createBitmap(page.width, page.height, Bitmap.Config.ARGB_8888).also { | |||
page.render(it, null, null, PdfRenderer.Page.RENDER_MODE_FOR_PRINT) | |||
Bitmap.createBitmap(page.width * 3, page.height * 3, Bitmap.Config.ARGB_8888).also { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
기기의 메모리 상태 등에 의해 문제가 발생할 위험은 없나요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
디바이스 하나에 2~3페이지 정도만 랜더링이 되어서 괜찮을 것 같다 판단했습니다
크기를 1배로 랜더링 하면 확대할때 이미지 화질이 많이 낮아서 기존 이미지보다 높은 화질로 랜더링 하긴 해야됐는데, 이때 처음부터 3배로 할지 아니면 확대할때 새로 랜더링을 할지 고민을 했습니다
그런데 어차피 읽을때 대부분 확대를 해야될테니 랜더링하는 과정이 많아지면 오히려 성능적으로 좋지 않을것 같다고 생각들었습니다
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
확대할때 새로 렌더링을 하는 것은 성능적인 부분에서 리스크가 있겠지만,
메모리 상황을 고려하지 않고 3배로 확대하는 것 또한 리스크가 있는 부분일 것 같습니다.
수정하실 필요는 없지만, 이런 부분을 개선할 수 있는 방법을 고민해봐도 좋을 것 같아요.
3배로 늘린 크기의 최대치를 지정해놓는다던가 하는 방법이 있을 듯 합니다.
@@ -89,8 +89,8 @@ private fun PdfImage( | |||
LaunchedEffect(Unit) { | |||
isLoading = true | |||
val page = renderer.openPage(pageIndex) | |||
Bitmap.createBitmap(page.width, page.height, Bitmap.Config.ARGB_8888).also { | |||
page.render(it, null, null, PdfRenderer.Page.RENDER_MODE_FOR_PRINT) | |||
Bitmap.createBitmap(page.width * 3, page.height * 3, Bitmap.Config.ARGB_8888).also { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
매직넘버는 상수로 만들어 사용하는 것이 좋을 것 같습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
수정하겠습니다
when(extension) { | ||
"pdf" -> PDF | ||
"jpg", "jpeg", "png", "gif" -> IMAGE | ||
else -> IMAGE |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이외의 확장자를 IMAGE로 했을 때 문제가 되는 부분은 없을까요?
.idea/deploymentTargetSelector.xml
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
필요하지 않은 파일 확인해주세요.
keyboardOptions = keyboardOptions, | ||
) { | ||
Box( | ||
modifier = Modifier |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OutlinedTextField를 사용하지 않은 이유는 contentPadding 때문일까요?
|
||
var isTopBarVisible by remember { mutableStateOf(false) } | ||
|
||
var tobBarJob by remember { mutableStateOf<Job?>(null) } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
또는 탑바의 Visibility를 관리하는 rememberTopBarState 같은 상태나 혹은 타이머 등의 구현도 가능할 듯 한데,
현재의 방식을 선택하신 이유가 궁금합니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
화면을 터치했을때 보여주는 작업인데, 누르고 3초뒤엔 안보이지만 사용자가 계속해서 화면을 터치하고 있다면 작업을 취소하고 계속해서 보여주기 위해 이렇게 구현했습니다
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
어떤 기능인지는 이해를 했구요.
기능의 동작이나 구현 자체도 문제가 아니라 더 좋은 구조는 없을까에 대한 의논을 펼치고자 하는것이 의도입니다.
- onTopBarVisibleChange 는 onPdfBodyPressed 와 같은 내용이 더 맞지 않을까 합니다. PdfScreen 입장에서는 LazyColumn을 tap한 것이 isTopBarVisible를 변경하게 하는 것인지 모르기 때문입니다. tap했을 때 isTopBarVisible를 변경하는 것은 상위에서 결정하는 동작으로 보입니다.
- 만약 PdfScreen이 isTopBarVisible의 구체적인 동작을 알아야 한다면, isTopBarVisible의 상태 관리를 상위에서 할 필요가 없어보입니다.
- TopBar의 상태 처리를 하나로 캡슐화하는 것을 고려해보면 좋겠습니다. TopBar라는 하나의 View에 대한 상태, 처리로직이 산발적으로 위치한다면, 협업의 관점에서 의도치 않은 결과가 생길 수 있습니다. 예를들어 다른 코루틴 잡을 tobBarJob에 할당한다던지, 다른 콜백, 로직에서 isTopBarVisible를 변경할 때 tobBarJob의 동작을 cancel하지 않는다던가 등의 상황이 있을 수 있습니다. 코드가 복잡해질수록 구체적인 사항을 놓칠 수 있기 때문입니다.
|
||
abstract class SeeDocsDatabase : RoomDatabase() { | ||
|
||
abstract fun recentFileDao(): RecentFileDao |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
현재의 PR에서 SeeDocsDatabase가 사용되는 곳은 없는데, 이 PR에 포함된 이유가 있을까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
잘못 포함된 커밋입니다,, revert해서 도려낼까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
가급적 PR에 포함되지 않아야할 내용은 포함되지 않도록 하는것이 좋습니다.
다음 PR부터 잘 챙겨주세요.
개발 계획을 좀 더 명확히 하고 진행하면 이런일이 줄어들 것 같습니다.
var isTopBarVisible by remember { mutableStateOf(false) } | ||
|
||
var tobBarJob by remember { mutableStateOf<Job?>(null) } | ||
val tabBarState = rememberTopBarState() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
tabBarState -> topBarState로 변경되어야 할 것 같습니다.
|
||
private var currentScope: Job? = null | ||
|
||
fun onBodyPress() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
TopBarState에 onBodyPress는 조금 어색한 것 같습니다.
PdfScreen의 Body 부분이 클릭되었을 때 TopBarState의 상태를 변경해야 하므로, TopBarState의 입장에서의 함수명은 show 와 같은 느낌의 방향은 어떠신가요?
예를 들어 저라면 아래와 같은 형태로 작성할 것 같습니다.
fun show(hideInterval: Long = DEFAULT_HIDE_INTERVAL) {
...
}
var topBarVisible by mutableStateOf(false) | ||
private set | ||
|
||
private var currentScope: Job? = null |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
currentJob으로 변경해야 할 것 같습니다.
fun onBodyPress() { | ||
currentScope?.cancel() | ||
|
||
currentScope = scope.launch { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
CoroutineScope(Dispatchers.IO) 와 같은 잘못된 Scope가 전달되었을 때 문제는 없을까요?
val page = renderer.openPage(pageIndex) | ||
|
||
val bitmap = | ||
Bitmap.createBitmap( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
의도된 줄내림 일까요?
|
||
suspend fun renderPage(pageIndex: Int) { | ||
mutex.withLock { | ||
if (renderingPages.contains(pageIndex)) return |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if문 다음에 이어지는 줄이 있다면 {}를 생략하지 않는것이 가독성에 도움이 됩니다.
return문이 있기 때문에 이 상황에서는 좀 더 낫지만, 일관적인 컨벤션을 위해 괄호를 사용하는 것을 추천드립니다.
page.close() | ||
} | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
new line이 두 개인데, 의도된 것일까요?
@@ -11,7 +11,7 @@ import androidx.annotation.RequiresApi | |||
import androidx.core.app.ActivityCompat | |||
import androidx.core.content.ContextCompat | |||
|
|||
abstract class PermissionActivity : ComponentActivity() { | |||
internal class PermissionManager { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 리팩토링은 이 브랜치에 어울리지 않는 커밋인 것 같습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
프로젝트 진행을 위해 머지 승인을 드리겠습니다.
다음을 확인해주세요.
- 모든 코멘트에 답변을 달아 의견을 말씀해주세요.
- 코멘트 내용을 코드에 반영했다면 반영한 커밋을 남겨주세요.
- 포함될 필요가 없는 파일이 있는지 확인해주세요.
.idea/deploymentTargetSelector.xml
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
.idea 폴더의 파일이 포함되지 않도록 gitignore를 수정해주세요.
Quality Gate passedIssues Measures |
#️⃣연관된 이슈
📝작업 내용