이번 주제는 제목 그대로 이미지 파일을 2가지 방법으로 소개하는 것이다. 근데 굳이 2가지 방법을..?나도 굳이 같은 기능을 2가지 방법을 생각하면서 개발하고 싶지는 않았다. 처음 프로젝트에서 사용한 방법은 ShareCompat을 사용하는 것이었다. 최대한 Jetpack 라이브러리를 활용하고 싶었고 그 욕심이 철저히 반영된 코드였다. 물론 기능도 무사히 동작했다. 하지만 또다른 프로젝트는 android support 버전을 사용 중이다.(Jetpack이 없다는 말이다.) 따라서 Jetpack ShareCompat을 사용할 수 없었고, 그에 따라 기본 Intent를 사용해 처리해야만 했다. support library에도 ShareCompat은 있지만 해당 클래스의 동작이 동일하다는 보장을 하기 어렵다.(..
toml 파일을 사용하게 된 계기이번 신규 프로젝트를 진행하게 되었는데,그에 따라 프로젝트 자체를 새로 생성하면서 build.gradle 언어를 Kotlin DSL로 설정했더니Android Studio Koala를 쓰는 나에게 toml이 포함된 프로젝트가 생성되었다. 여기저기 오픈소스 라이브러리에서 혹은 developer 사이트에서도 자주 볼 수 있는 녀석이라이번 기회에 써보기로 했다. Retrofit 추가해보기어차피 대부분 앱은 네트워크 작업이 필요하고 그에 따라 가장 대중적인 라이브러리는 단연 Retrofit일 것이다. 하지만, 기존 toml을 사용해본적 없는 나로서는 상당히 검색할 시간이 필요했다. 먼저 toml 파일 수정하기[versions]... //retrofit = "2.11.0"serial..
기능 추가 배경QR코드를 통해 로그인 정보를 공유한다. 물론 로그인 정보는 민감한 정보이므로 암호화가 필요하다. 장점서버가 필요없다.OS간 직접 파일을 옮기는 것이 아니기에 플랫폼 제약이 없다. 단점길이에 제한이 있다.카메라만으로도 정보가 보일 수 있어 비교적 보안에 약한 편이다.(암호화를 한다고 해도 말이다.) 라이브러리 추가하기여기서 사용한 라이브러리는 이전 글에서도 등장한 적이 있다.https://github.com/journeyapps/zxing-android-embedded GitHub - journeyapps/zxing-android-embedded: Barcode scanner library for Android, based on the ZXing decoderBarcode scanner l..
이번 글은 기능에 대해 소개하기 전, 먼저 OS 9(Pie)을 타겟으로 만든 기능임을 알린다. 기능 및 배경 소개우리가 어떤 프로그램이 지속 실행되어야하는 상황에 만약을 대비해 넣는 기능 중에 하나가한번쯤은 봤을만한 꺼지면 재실행하는 기능이다. 이 기능은 보통 Watchdog(와치독, 워치독)이라 불린다. 이번에 안드로이드 셋톱박스에 맞추어 앱을 제작하게 됐는데이 때, 꺼지지 않는 앱이 필요했고 만에 하나를 대비해 이 기능을 준비하게 되었다. Manifest 수정하기먼저 Foreground Service 권한을 설정해야 한다. 갑자기 무슨 Foreground Service인가 싶을 수 있다. Background Service에서 Activity를 실행할 수는 있지만(하위 OS이기에 가능하지만)OS에서 S..
내가 지금까지 개발한 앱은 신기하게도 휴대폰 번호 입력 칸이 필요한 경우가 없었다. 하지만, 이번에 해당 UI가 필요해져 추가하다보니01011112222처럼 하이픈이 없는 텍스트로만 입력이 되었다. 팀장님은 입력된 길이를 기반으로 하이픈을 추가하면 되지 않냐고 하셨지만,안드로이드에서 제공하는 기능이 있을 것이라 생각했고 그렇게 찾은 기능을 공유해본다. 정말 간단한 적용법먼저 xml EditText의 inputType을 phone으로 설정한다. 그럼 아래와 같은 키보드 형식이 보이게 된다. 이후 TextChangedListener를 설정해준다.binding.editPhoneNumber.addTextChangedListener(PhoneNumberFormattingTextWatcher()) 결과 확인해보기영..
이번 글에서는 전에 다루었던 withContext로 스레드를 전환 후 연산 작업을 더 빠르게 수행해보려고 한다. 기존에는 팩토리얼 계산을 Default Dispatcher를 사용해 하나의 코루틴에서 연산을 수행했다.이번에는 여러 개의 코루틴에서 연산을 수행한다. 어떤 구조로 실행할까팩토리얼을 몇개의 코루틴으로 나눠 실행할지 정해야 한다.실행할 코루틴 갯수만큼 연산할 숫자의 길이를 동등하게 분배한다.작은 범위를 계산하는 서브 코루틴을 동시에 실행시킨다.모든 서브 코루틴이 종료되는 것을 기다린다.모든 서브 코루틴이 종료되면 fold 함수를 사용해 작은 범위들을 모두 곱한다. 코드suspend fun calculateFactorial( factorialOf: Int, numberOfC..
제목에서 본 기능은 갤럭시 유저라면 삼성 브라우저를 통해 익숙한 기능일 것이다. 다만, 이 기능을 앱의 웹뷰에서 적용해야하는지는 기획에 따라 달라지겠지만나는 이번에 Compose 공부도 하는 겸 추가해보았다. 본격적으로 글을 시작하기 전 내가 Compose에 대한 이해가 상당히 미진하다는 점을 알린다. Material3 라이브러리 버전먼저 나는 이번 프로젝트에서 compose material3 라이브러리 최신 버전인 1.3.1을 사용했다. pullToRefresh가 1.3.0 버전에서 추가되었기 때문이다. 제목에 굳이 웹뷰를 적은 이유보통 android compose pulltorefresh를 검색어로 입력하면LazyColumn에 있는 리스트를 갱신하는 예제가 매우 많다. 하지만, 나는 전체화면인 웹뷰 ..
기능이 필요해진 배경이번에 새로운 앱을 준비하며 폴드(플립이 아닌) 디바이스인지 확인해야만 하는 상황이 생겼다. 그렇게 폴드 디바이스인 경우, layout constraints를 조정해 다른 UI를 구성해주기 위함이었다. 다만, 폴드 디바이스를 어떻게 체크할 것인가에 대해 찾아보던 중"2가지 조건을 충족하면 폴드 디바이스다!" 라는 결론을 낼 수 있었다. 1번째 조건WindowInfoTracker를 사용해 폴더블 디바이스인지 확인하는 것이다. developer 사이트 문서에서 확인해보면WindowInfoTracker에서 FoldingFeature가 있는 경우, 폴더블 디바이스라는 것을 알 수 있다. https://developer.android.com/develop/ui/compose/layouts/ad..
Material theme을 사용하면서 왜 Elevation 설정을 해제하려고 할까앱에서 원하는 색상을 적용하기 어렵다. Material theme만 적용하게 되면 상관이 없겠지만,iOS나 다른 플랫폼과 색상을 맞추기 위해서는 Material theme만을 사용할 수가 없다. 왜 하필 elevation이냐... 그건 바로 elevation을 통해 shadow를 적용했는데Material theme 설정 때문에 내가 지정한 View의 backgroundTint를 적용할 수 없었다. 예를 들면?MaterialCardView가 있다. Appcompat의 CardView를 상속받아 만들어졌는데cardElevation을 0 초과로 설정하는 순간 내 기본 테마 색상에서더 진한 채도를 가진 색상으로 background..
CoroutineScope(이하 Scope)는 CoroutineContext(이하 Context)라는 하나의 프로퍼티를 가지고 있다. 더불어 모든 Coroutine은 특정 Scope에서 실행된다. 그리고 여러 개의 Coroutine은 같은 Scope에서 실행될 수 있다. 특정 Coroutine과 그 자식 Coroutine을같은 Scope에서 실행하게 되면 Job 객체들이 부모-자식 계층을 구성하게 된다. 이렇게 형성된 부모-자식 계층은 구조적 동시성에서 중요한 부분이다. 같은 Scope에서 실행된 Coroutine은기본적으로 해당 Scope의 Context를 상속받는다. 하지만 각 Coroutine은 다른 Context로 실행될 수 있고,이것도 계층 구조를 따라 특정 Coroutine이 A라는 Conte..