Android 10

RecyclerView Compose로 마이그레이션 해보기 (1)

Mash-Up(Android)앱은 처음에는 xml로 개발했지만 새로 추가되는 기능은 Compose를 사용해서 개발하고 있고, 그 과정에서 일부 단순한 화면을 Compose로 변환하는 작업도 틈틈히 진행 중이다. 🗺 작업 계획 이번에 작업하게 된 내용은 “마이페이지 개선”이다. 그런데 이번에는 단순한 화면이 아닌 Full RecyclerView였던 화면을 개선하게 되었고 그 과정에서 ViewHolder가 추가되어야 했다. (새로운 화면은 Compose로 만들고 있음) 그래서 이 참에 새롭게 만들어야하는 "활동카드 ViewHolder"는 우선 Compose로 만들고, 다른 ViewHolder들도 Compose로 하나씩 바꿔 볼 예정이다. 그리고 최종적으로는 마이페이지 전체가 Compose화면이 되는 것이 목..

Firebase 핸드폰 번호 인증 관련 GooglePlay 대응기

약 1년동안 진행했던 사이드 프로젝트가 드디어 릴리즈를 하게 되었다. 🥳 구글 플레이 스토어에 올리기위해 앱을 release 빌드를 했는데 이게 무슨 일이지?! 지금까지 별다른 문제가 없었던 Firebase Auth 부분이 뭔가 이상했다. 첫번째 문제. 핸드폰 번호 인증 문자가 오지 않는다.. 보통 핸드폰 번호 인증을 보내면 늦어도 1-2분 후에는 문자 메시지가 왔는데 Release 빌드된 앱으로 인증을 보내면 아무리 기다려도 문자가 오지 않는 것이다. 😱 심지어 에러도 안 뱉음..ㅠㅠ (더 골때리는건 똑같은 버전을 Debug로 빌드했을 때는 정상적으로 문자가 온다…) 여러가지 이유를 생각해보다가 내가 추리했던 것들은 1) 난독화가 잘못 되었나? 2) Firebase에 릴리즈 관련 설정을 해줘야 하나? ..

Android 2023.03.16

새로운 버전의 로그캣 등장, 5가지 꿀기능을 알아보자!

새로운 버전의 로그캣?! 😺 회사 안드로이드 스튜디오를 Electric Eel로 업데이트 했다. 꽤 많은 것들이 바뀌어 있었는데, 그 중에서도 Logcat이 특히 많은 변화가 있었던 것 같다. 디자인부터 굉장히 화려해진 느낌.. ◟(ᵔ ̮ ᵔ)͜💐 찾아보니 새로운 버전의 로그캣이 등장했다고 하는데... 새로운 버전의 로그캣은 이미 Dolphin 버전부터 적용되어 있었고, Dolphin에서는 Experimental Feature였어서 따로 설정을 통해 새 버전을 사용할 수 있었다고 한다. 그리고 내 Android Studio 버전인 Electric Eel(2022.01)부터는 새로운 로그캣이 기본 값이 Android Studio Dolphin 에서 새로운 버전의 로그캣을 사용하려면 Settings > Ex..

Android 2023.02.01

Jetpack Compose State 정리

Jetpack Compose는 리액티브한 프레임워크다. 그래서 UI를 변경하기 위해서 setText()나 setColor() 같은 함수를 부르지 않고, 상태를 변경해주면 UI도 자동으로 변경된다. 그럼 컴포즈는 UI 상태가 변했음을 어떻게 인식할까? 바로 Jetpack Compose State Object를 사용하는 것이다. 이번 글에서는 바로 이 State에 대해 알아본 것을 정리해봐야겠다. ദ്ദി˙∇˙)ว 💡 Jetpack Compose에서 상태(State)란? Jetpack Compose에서 상태란 UI의 업데이트와 관련있다. 위에서 언급한 것 처럼 상태 값이 변경될 때 마다 UI가 업데이트되기 때문이다. 상태 값은 어떤 타입이든 될 수 있다. Boolean, String 같은 단순한 값일 수도 ..

Firebase Crashlytics 적용하기

작년 여름부터 진행하던 사이드 프로젝트가 드디어 어느정도 마무리 되었다. 그래서 사이드 프로젝트를 스토어에 올리기 전에 Firebase Crashlytics를 적용하려고 한다. Firebase Crashlytics에 대해 간단히 소개하자면 “앱이 비정상적으로 종료되었을 때 개발자에게 알려주는 일종의 오류 보고 도구”이다. 그리고 공식 문서에서는 아래와 같이 소개한다. 실시간 비정상 종료 보고 도구인 Firebase Crashlytics는 실제 사용자에 미치는 영향을 기반으로 가장 심각한 비정상 종료의 우선순위를 지정하고 문제를 해결하는 데 도움을 줍니다. https://firebase.google.com/products/crashlytics?hl=ko Firebase Crashlytics | 강력한 An..

Android 2022.12.08

안드로이드 접근성 - 대체 텍스트를 적용해보자!

📱 접근성이란 모바일 접근성이란 웹 접근성과 같은 개념으로 장애를 가진 사람이든 일반인이든 구애를 받지 않고 동등하게 정보에 접근할 수 있도록 설계하고 디자인/개발하는 것을 의미한다. 즉, 모두에게 유용하게 사용되는 앱이 되기 위해서는 접근성 처리가 필요하다. 안드로이드에서는 “TalkBack”, “시인성 향상”, “청각보조” 등 다양한 방법으로 접근성을 제공하고 있는데 이번 글에서는 그 중에서도 대체 텍스트(talkback)를 통해 음성 피드백을 제공할 수 있는 방법을 알아보겠다. ꈍꈊꈍ 🗣 TalkBack이란? TalkBack은 Android 기기에 포함된 Google 스크린 리더입니다. TalkBack을 사용하면 기기를 보지 않고도 제어할 수 있습니다. 출처: https://support.googl..

Android 2022.11.22

InputFilter로 입력값을 제어해보자! (feat. 이모지만 입력받기)

사이드 프로젝트를 진행하던 중 한 가지 문제가 생겼다. 테마별 지도를 주제로 하는 앱이어서 지도를 생성할 때 그 지도의 테마를 잘 나타낼 수 있는 이모지를 등록해야 하는데 만약 사용자가 이모지가 아닌 다른 텍스트를 입력할 경우 앱의 의도와 디자인이 와장창 깨지기 때문에 이모지만 입력할 수 있도록 제재가 필요했다. 🥸 이모지 키보드만 보여주고 싶었지만.. 그래서 inputType=“number” 같은 속성을 사용해서 숫자 키보드만 보여주고, 입력도 숫자만 받을 수 있는 것처럼 이모지 키보드만 보여주고 싶었는데... 인생은 절대 호락호락하지 않지. EditText의 속성 중에 이모지만 보여주거나 입력할 수 있는 속성은 없었다.. ㅇ

Android/UI(XML) 2022.11.10

안드로이드 저장소 권한의 변화와 새롭게 등장한 Photo Picker!

프로필 사진 변경, SNS 피드 작성 등 모바일 앱에서 사진을 가져오는 기능은 정말 많이 쓰이는 것 같다. 내가 지금 하고 있는 사이드 프로젝트에서도 사진을 가져오는 기능이 있어서 안드로이드 EXTERNAL_STORAGE_READ 권한이 필요했다. 그런데 권한 동의를 해고 권한이 부여되었다고 판단되지 않았다! 안드로이드 10 이상의 기기에서만 이런 상황이 발생했는데, 이에 대해 알아보던 중 “Permissionless is the future of Storage on Android” 라는 아티클을 발견했고 이 글에서 약간의 힌트와 Photo Picker라는 새로운 툴에 대해 알 수 있었다. 💀 기존 storage 권한 지원 중단 많은 사용자들이 외부 저장소 접근 권한에 대해서 앱이 어떤 파일에 접근하려는..

Android 2022.10.27

Android 그림자 살펴보기

🌚 그림자 그거 그냥 넣으면 되는거 아닌가? ㅋㅋ 프로젝트를 하다보면 디자이너들이 화면에 그림자를 적용해달라고 하는 경우가 꽤 많다. 그런데 그림자를 코드로 커스텀할 수 있는 iOS와 달리 안드로이드에서는 elevation 속성을 사용해서 깊이감을 주는 것 외에는 그림자를 따로 커스텀할 수 있는 방법이 없어서 보통 9-patch 이미지를 만들어서 사용한다. ( ɵ̥̥ ˑ̫ ɵ̥̥) 참고) iOS & Android: UI 디자인 - DesignCompass 9-patch 이미지가 하나의 리소스로 여러 사이즈의 View에 대응할 수 있다는 장점 때문에 주로 사용되는 것 같은데, 단점도 있다. 그림자로 표시될 부분의 간격 조절에 신경을 많이 써야하고, 또 View 마다 이미지를 뒤에 깔아주는 것이기 때문에 오..

Android/UI(XML) 2022.10.13

Rx 말고, Flow로 다중클릭 방지하기 (throttleFirst)

🤔 고민의 시작 기존의 RxJava를 사용했던 코드들을 Flow로 교체하다가 막힌 부분이 바로 throttleFirst()이다. 다중클릭 방지 등을 위해서는 일정 시간동안 들어온 값 중에서 가장 첫번째 것만 발행하고 나머지는 무시하는 RxJava의 throttleFirst()연산자가 필요한데, Flow에서는 해당 기능의 연산자를 지원하지 않는다. 그래서 이 연산자를 직접 구현해보기로 했다. 🆖 기존 RxJava를 사용한 다중클릭 방지 코드 private fun View.setRxBindingClicks() { this.clicks() .throttleFirst(1000, TimeUnit.MILLISECONDS) .subscribe { onClick(id) } .addTo(disposeBag) } priv..

Android/Coroutine 2022.09.25