분류 전체보기 112

카카오톡 잠금화면 구현

"카카오톡 잠금화면처럼 해주세요" -> 사실 난 잠금화면 기능을 사용하지 않아 어떤 기능인지 몰랐다. 사실 근데 이런것 할때마다 두근두근 거린다. 분명히 내가 못하는거고 미지의 세계를 헤쳐 나가면서 해야하는데 한 단계씩 점점 나아갈때마다 희열을 느낀다. (우와 진짜 너무 재미있어!) 이런 느낌? 난 체질이 모험가인것같다. 기능 정의 사용자는 잠금화면을 설정하거나 제거할 수 있다. 잠금화면을 설정하면 앱이 백그라운드에 갔다 x초 후에 돌아오면 잠금화면이 보인다. ( 모든 화면에서 마찬가지 동작 ) 잠금화면은 Dismiss 할 수 없다. (기획상) 서버통신없이 로컬링으로만 작업하고 아이디별로 설정을 저장한다. 개발 과정 먼저 Dismiss 할 수 없는 Dialog 만들기 백그라운드에서 4초이상 갔다 온 경우..

Android 2022.09.29

소셜 로그인 모듈화 과정 ( 추상화 및 액티비티 의존성 제거 )

소셜 로그인할때 Util 로 만들어 액티비티에 종속되지 않는 방법으로 만들어 보려고 한다 현재 시점에서 최신 버전 SDK 이용 한꺼번에 컨트롤 토큰만 가져오는게 아닌 토큰으로 이메일등의 정보까지 가져올 수 있도록 한다. 한꺼번에 컨트롤이란 의미는 아래와 같은 사용법을 말한다. Activity google.setOnClickListener { viewModel.login(AuthType.GOOGLE) } kakao.setOnClickListener { viewModel.login(AuthType.KAKAO) } naver.setOnClickListener { viewModel.login(AuthType.NAVER) } ViewModel fun login(type: AuthType) = viewModelSc..

Android 2022.09.29

transition animation 적용

SharedElement를 이용해서 애니메이션 적용하기 LoginActivity -> RegisterActivity 1. transitionName 지정 이 이름을 찾아서 그 뷰로 이동해주세요 transitionName LoginActivity RegisterActivity 2. Activity :테마 지정 onCreate 전에 추가 RegisterActivity override fun onCreate(savedInstanceState: Bundle?) { setEnterSharedElementCallback(MaterialContainerTransformSharedElementCallback()) window.sharedElementEnterTransition = MaterialContainerTran..

Android 2022.08.14

Room With Coroutine Flow

Room과 Flow을 결합하는 방법을 학습하여 정리함 샘플 기능 내용 데이터 구조 data class User( val id : Long, val name :String, val favorites : List ){ data class Favirite( val id : Int, val name : String ) } 도메인 레이어에서는 User 모델을 사용하고 Local 레이어에서는 UserEntity, FavoriteEntity로 분리하여 저장 1 : N으로 정의된 Room 테이블에서 데이터가 업데이트 될때마다 Listen을 할 수 있게 만드는게 목적 1. 버튼을 누를때마다 현재 유저의 favoriteList에 추가된다. 2. 업데이트 될때마다 Flow형태로 구독할 수 있다. 3. Room Interf..

Android 2022.07.30

DataStore 적용하기

-> PrefrencesDatastore 를 사용하는 방법을 알아보자. ( 단순히 유저ID등을 저장하는 용도라 ProtoDatastore까지 사용할 필요는 없음 ) 기존 SharedPreference 를 사용하는 경우에는 + Rxjava override fun fetchUserId(): Flowable { return Flowable.create({ emitter -> val listener = SharedPreferences.OnSharedPreferenceChangeListener { sharedPref, key -> if (!emitter.isCancelled && key == KEY_CURRENT_USER_ID) { emitter.onNext(sharedPref.getLong(KEY_CURRENT..

Android 2022.07.27

코루틴 공부

Lazy = 큐에 올려놓고 start() 해야 동작할수있게 buffer() : collect 할때까지 기다리지 않고 다음꺼 미리 내놔 -> 일감 있으면 일단 먼저 줘봐 ! conflate() : collect 할때 처리하지 못했던 값은 누락시킴 collectLatest() : switchMap 같이 처리하다가 새로운값 들어오면 다시 시작 -> 옆치기 들어오면 그것만 하고 하고 있는건 안해! 채널(channels): 코루틴 간에 데이터를 안전하게 보내고 받는 데 사용할 수 있는 파이프다. 작업자풀(worker pools): 많은 스레드에서 연산 집합의 처리를 나눌 수 있는 코루틴의 풀이다. 액터(actors): 채널과 코루틴을 사용하는 상태를 감싼 래퍼로 여러 쓰레드에서 상태를 안전하게 수정하는 메커니즘을..

Android 2022.07.18

Facebook Login Trouble Shooting

1. 프래그먼트에서 콜백을 받지 못하는 현상 with(facebookLogin) { setPermissions(permissions) registerCallback(facebookCallbackManager, facebookCallback) fragment = this@LoginFragment } fragment 지정이 필수. 그렇지 않은 경우 parentActivity에서 콜백을 받게 된다. 2. 오류 대응 Unable to start activity ComponentInfo{net.wepla.baro/com.facebook.FacebookActivity}: java.lang.IllegalStateException: Only fullscreen opaque activities can request or..

Android 2022.07.18

Fragment 공부

configuration changed (화면 회전)이 일어나면 savedInstanceState는 null이 아닌 상태로 onCreate를 탄다 이런 상황에선 fragment를 add 할 필요가 없다 ( savedInstanceState에 의해 자동 복원되므로 ) 액티비티가 다시 restored 됐을때 savedInstanceState 조건을 넣지 않는다면 한번더 commit 하게 되고 그러면 프래그먼트가 2개가 생겨 버그가 발생할 수 있다 ( 예기치 못한 현상 ) setReorderingAllowed(true) 이유? setReorderingAllowed(true)는 애니메이션과 전환이 올바르게 작동하도록 트랜잭션과 관련된 프래그먼트의 상태 변경을 최적화합니다. fragment-ktx에 commit ..

Android 2022.06.24

WebView 파일 업로드

input type="file" 인 HTML 폼에 파일 업로드 하는 방법 및 추가적인 UI 설정 1. 파일 업로드 - Activity에 전역으로 ValueCallback 변수 생성 private var uploadMessage: ValueCallback? = null private val fileChooserCallback = //launch할 callback 설정 registerForActivityResult(ActivityResultContracts.OpenDocument()) { if (it == null) { // 아무것도 선택하지 않았을때 uploadMessage?.onReceiveValue(null) uploadMessage = null return@registerForActivityResul..

Android 2022.06.14