android 10

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

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

Android Launch Mode 및 Flag 알아보기

딥링크 이동 로직을 개선하던 중, 단순 화면 이동이 아니라 onNewIntent, Launch Mode를 활용하는 Task 관리를 마주하게 되었다. 딥링크 이동 로직을 수정하기 위해서는 앱 전체의 이동 로직을 수정해야 했기에 함부로 수정하기가 무서워서 우선 onNewIntent와 Launch Mode에 대해 알아보기로 했다. 😅 onNewIntent 보통 화면 전환을 할 때 아래와 같은 코드를 사용한다. val intent = Intent(this, MainActivity::class.java) startActivity(intent) 그런데 동일한 액티비티를 계속 startActivity() 메서드로 호출하게 되면 동일한 액티비티가 메모리에 여러 개 만들어지게 된다. 이를 방지하기 위해서 Flag(플래그..

카테고리 없음 2023.05.31

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

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

Android 2023.03.16

Kotlin Delegation 알아보기(1) - Delegated Class

안드로이드 개발을 하면서 by lazy {} , by remember {} 등 by 키워드를 자주 사용하고 있었다. 그런데 by 키워드가 Kotlin Delegation을 위한 문법이라는 것을 알고 있었지만, Delegation(위임)이라는 것에 대해 제대로 알고 있지 않다는 생각이 들어서 이번 기회에 알아보려고 한다. 👀 어떨 때 상속 대신 위임을 써야할까? 상속과 위임은 모두 객체지향 프로그래밍에서 사용되는 디자인 패턴으로, 두 방식 모두 클래스를 다른 클래스로부터 확장한다. 차이점을 살펴보자면 상속은 해당 클래스에 귀속되는 것이기 때문에 클래스가 다른 클래스들 사이에서 선택할 권한을 주지 않는다. 반면 위임은 객체 자신이 처리해야 할 일을 다른 클래스 인스턴스에게 위임할 수 있는 것이기 때문에 상속..

Kotlin 2023.02.16

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