본문 바로가기

Android/Trouble Shoot

(9)
[Jetpack Compose] MinimumInteractiveComponentSize 동기디자인 파트와의 협업을 진행하다 보면, 툴팁 표시 등의 기능을 위한 UI 가 다소 작게 구성되어 있는 경우가 왕왕 있습니다. 이러한 경우, Jetpack Compose 는 자동으로 터치 영역을 확장하여 UX 를 개선하도록 구현되어 있습니다. 어떠한 방식으로 이러한 개선이 이루어지는지, 별도로 활용할 수 있는지, 이를 해제하고 싶다면 어떻게 하면 좋을지 등을 학습하고, 정리하고 싶어 포스트를 작성합니다.개요머티리얼 디자인 시스템의 규칙을 따라, 위젯은 최소 48dp 의 터치 영역을 확보하는 편이 좋은데요. Android View System 에는 이에 대한 자체 처리가 안 되어 있어, 마켓에 앱을 올리면 이에 대한 경고를 주기도 합니다. Jetpack Compose 에는 이를 간편히 만족시킬 수 있도록..
Third-Party-Library 없이 영상으로부터 빠르게 프레임 추출하기 (feat.YUV) 동기 네이버 부스트캠프에서 진행 중인 그룹 프로젝트가 드디어 개발 막바지 단계에 이르렀습니다. 영상 업로드 기능을 구현하면서, 영상의 썸네일을 추출하고 함께 전송하는 기능도 구현하였습니다. 해당 과정에 대해서는 다음 포스트에 자세히 기록되어 있습니다. Third-Party-Library 없이 비디오 컷 편집 기능 구현하기 동기 네이버 부스트캠프의 꽃, 그룹 프로젝트를 개발하고 있습니다. 실력있는 동료들과 함께 비디오와 관련된 앱 서비스를 기획, 디자인, 개발하고 있는데요. 제가 낸 주제이기도 하고, 비디오 blothhundr.tistory.com 위 포스트에는 썸네일을 얻어 오기 위해 MediaCodec 과 MediaMetadataRetriever 를 두고 고민했던 과정이 담겨있는데요. 당시에는 Medi..
AccessToken 재발급과 예외 처리 (feat.Ktor) 동기 예외는 전형적이지 않은 경우나 사건을 의미합니다. 프로그래밍을 하다보면 정말 수없이 겪게 되는 것이 예외 상황인데요. 오늘은 Ktor 와 JWT 사용에 있어서 발생할 수 있는 예외 상황에 대한 처리를 하였습니다. 그 과정 중 저는 어떤 문제를 만났고, 어떤 고민을 했는지, 또 그 고민을 어떻게 해결하였는지에 대해 포스팅하려 합니다. 주니어 개발자(지망생?)의 시선이므로, 잘못된 내용이 포함될 수 있어 해당 포스트에서 나올 기술적인 부분에 대해 참고하시는 것은 고려해보시면 좋을 것 같습니다. 요구 사항은 무엇이었나? 서버의 API 를 이용하기 위해 JWT 를 활용하는 상황입니다. 모든 API 통신에 대해 AccessToken 이 요구되고, AccessToken 이 만료되면 RefreshToken 을 ..
[Jetpack Compose] List 아이템의 필드 변경이 Recomposition 을 트리거 해야 할 때 어떤 이슈가 있었나? List 내 원소의 필드를 직접 수정하여 UI 를 업데이트 하려 하였으나, 생각하는 대로 되지 않았습니다. 당연히, 해당 List의 객체가 이전의 객체와 같으므로 UI 업데이트가 진행되지 않았으리라 판단하고, 해당 List에 대해 toMutableList() 메서드를 사용하여 새로운 객체로 반환했습니다. RecyclerView 와 RecyclerView.Adapter 를 사용할 때에 이러한 문제를 해결할 수 있었으니까요. 분명히 List 객체도 변경해주었고 State 객체를 업데이트 해주었음에도 불구하고, UI 가 업데이트되지 않고 있습니다. 어떻게 해결하였나? List의 toMutableList() 메서드는 List를 새로운 객체로 반환하지만, List 아이템의 객체들까지 새로운 ..
[Jetpack Compose] LazyColumn, LazyRow 의 항목 삭제가 정상적으로 이루어지지 않는 이슈 개발 도중, 제목과 같은 이슈가 발생했습니다. 아래는 이해를 돕기 위한 영상입니다. 야키토리, 휘낭시에, 스시, 생고기 네 장의 사진을 불러왔고, 그 중 두 개의 사진을 삭제합니다. LazyList 의 itemsIndexed() 메서드를 사용했고, 리스트에서의 삭제를 위해 index 를 인자로 넘깁니다. 첫번째로는 스시를 삭제하고, 두번째로는 휘낭시에를 삭제합니다. 그렇다면, 남아있어야 할 사진은 야키토리와 생고기이지만, 실제로 삭제 후 화면에 남은 사진은 야키토리와 휘낭시에 입니다. 즉, 의도와 다르게 엉뚱한 이미지가 삭제되는 것(처럼 보이는 상황)입니다. 위와 같은 상황을 겪고 계신다면, 당연히 디버깅을 진행하셨으리라 생각합니다. 디버깅 해보신 분들은 아시겠지만, 리스트에서는 정상적으로 의도한 사진이..
[Jetpack Compose] Column 속 LazyColumn 의 OverScroll 을 막는 방법 Nested Scroll Jetpack Compose 에서는 자손 Composable 의 터치 및 스크롤 이벤트가 조상 Composable 로 전파됩니다. DND 8기로 활동하면서 개발 중인 앱에는 Column 내에 LazyColumn 이 포함되어 있는 형태의 화면이 있습니다. 해당 스크린 UI 개발을 마치고 커밋하기 전, 기기에 빌드하고 실행해봤습니다. 문제 없이 모든 부분 정상 작동하여 커밋하려고 했는데, LazyColumn 에서 스크롤을 Over 하게 수행하니 화면 전체에 해당하는 Column 이 스크롤되고 있었습니다. 기능상 심각한 문제는 아니었지만, 해결하지 않으면 유저가 예상하는 UX 와는 거리가 멀어질 것이라 판단했습니다. LazyColumn 의 스크롤이 끝나면 Column 의 스크롤이 진행..
[Jetpack Compose] LazyColumn/LazyRow/Pager OverScrollEffect 없애기. 개발중인 앱에서 HorizontalPager(LazyColumn, LazyRow, VerticalPager 모두 해당 됩니다.) 를 사용중인데, OverScrollEffect 가 적용되어 있어, Fancy 하지 못한 느낌을 줍니다. CompositionLocalProvider(LocalOverscrollConfiguration.provides(null)) { // Composable } 사용하고자 하는 Composable 을 위 CompositonLocalProvider 블록으로 감싸주면 됩니다. 주의할 점은, 여전히 체험판이기에 @OptIn Annotation 이 필요합니다. @OptIn(ExperimentalPagerApi::class, ExperimentalFoundationApi::class) C..
ViewModel 의 illegalStateException: Can not perform this action after onSaveInstanceState 앱 리팩토링 중 만나게 된 예외입니다. 위치 서비스 권한을 획득하기 위해 Callback 을 두고 Intent 로 위치 서비스 설정 창으로 이동합니다. 위치 서비스를 사용하도록 설정한 뒤 돌아와 즉시 ViewModel 을 참조하니 발생한 에러입니다. java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState onSaveInstanceState() 이후에 해당 액션을 진행할 수 없다고 나옵니다. 이는 안드로이드 액티비티의 생명주기와 관련한 예외입니다. onSaveInstanceState() 에 액티비티에서 참조가 남아있는 객체들을 저장합니다. onSaveInstanceState() 는 onStop() 과 onD..