Current scope: simple_xml| all classes
|
kr.open.library.simple_ui.xml.ui.components.activity.binding
Coverage Summary for Class: ParentsBindingActivity (kr.open.library.simple_ui.xml.ui.components.activity.binding)
| Class | Class, % | Method, % | Branch, % | Line, % | Instruction, % |
|---|---|---|---|---|---|
| ParentsBindingActivity | 100% (1/1) | 62.5% (5/8) | 100% (4/4) | 73.3% (11/15) | 68.7% (68/99) |
package kr.open.library.simple_ui.xml.ui.components.activity.binding
import android.os.Bundle
import android.os.PersistableBundle
import androidx.annotation.CallSuper
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.viewbinding.ViewBinding
import kr.open.library.simple_ui.xml.ui.base.helper.ParentBindingHelperForActivity
import kr.open.library.simple_ui.xml.ui.base.lifecycle.ParentBindingInterfaceForActivity
import kr.open.library.simple_ui.xml.ui.components.activity.root.RootActivity
/**
* Base Activity with ViewBinding support and single-shot ViewModel event collection.<br>
* Provides a consistent binding lifecycle and helper ViewModel accessors.<br><br>
* ViewBinding 지원과 단일 ViewModel 이벤트 수집을 제공하는 기본 Activity입니다.<br>
* 일관된 바인딩 생명주기와 ViewModel 접근 헬퍼를 제공합니다.<br>
*
* **Key points:**<br>
* - Call super.onCreate() first.<br>
* - onEventVmCollect() is invoked once after binding initialization.<br><br>
* **핵심 포인트:**<br>
* - 반드시 super.onCreate()를 먼저 호출하세요.<br>
* - onEventVmCollect()는 바인딩 초기화 이후 1회 호출됩니다.<br>
*
* @param BINDING The type of ViewBinding to be used.<br><br>
* 사용할 ViewBinding 타입.<br>
*/
abstract class ParentsBindingActivity<BINDING : ViewBinding> :
RootActivity(),
ParentBindingInterfaceForActivity<BINDING> {
/**
* Holds the ViewBinding instance for this Activity.<br><br>
* 이 Activity의 ViewBinding 인스턴스를 보관합니다.<br>
*/
private lateinit var binding: BINDING
/**
* Returns the initialized binding instance.<br>
* Call only after super.onCreate() completes.<br><br>
* 초기화된 바인딩 인스턴스를 반환합니다.<br>
* super.onCreate() 완료 이후에만 호출하세요.<br>
*
* @return The initialized ViewBinding instance.<br><br>
* 초기화된 ViewBinding 인스턴스.<br>
*
* @throws IllegalStateException If binding is accessed before initialization.<br><br>
* 바인딩 초기화 전에 접근하면 예외가 발생합니다.<br>
*/
protected fun getBinding(): BINDING {
check(::binding.isInitialized) {
"Binding is not initialized. Please call super.onCreate() first."
}
return binding
}
/**
* Helper to ensure one-time event collection for this Activity instance.<br><br>
* 이 Activity 인스턴스에서 이벤트 수집을 1회만 보장하는 헬퍼입니다.<br>
*/
private val helper = ParentBindingHelperForActivity()
/**
* Creates the ViewBinding instance.<br><br>
* ViewBinding 인스턴스를 생성합니다.<br>
*
* @return The initialized ViewBinding instance.<br><br>
* 초기화된 ViewBinding 인스턴스.<br>
*/
protected abstract fun createBinding(): BINDING
@CallSuper
override fun onCreate(savedInstanceState: Bundle?) {
super<RootActivity>.onCreate(savedInstanceState)
createInitData(savedInstanceState)
}
@CallSuper
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super<RootActivity>.onCreate(savedInstanceState, persistentState)
createInitData(savedInstanceState)
}
private fun createInitData(savedInstanceState: Bundle?) {
binding = createBinding()
onCreate(binding, savedInstanceState)
helper.startEventVmCollect { onEventVmCollect(binding) }
}
/**
* Collect ViewModel events here.<br>
* Use repeatOnLifecycle(Lifecycle.State.STARTED) to avoid duplicate collectors.<br><br>
* ViewModel 이벤트를 수집하는 훅입니다.<br>
* 중복 수집 방지를 위해 repeatOnLifecycle(Lifecycle.State.STARTED)를 사용하세요.<br>
*
* @param binding The initialized ViewBinding instance.<br><br>
* 초기화된 ViewBinding 인스턴스.<br>
*/
override fun onEventVmCollect(binding: BINDING) {}
/**
* Obtains a ViewModel of the specified type using ViewModelProvider.<br><br>
* ViewModelProvider로 지정한 타입의 ViewModel을 가져옵니다.<br>
*
* @param T The type of the ViewModel to obtain.<br><br>
* 가져올 ViewModel 타입.<br>
* @return The ViewModel instance of type T.<br><br>
* T 타입의 ViewModel 인스턴스.<br>
*/
protected inline fun <reified T : ViewModel> getViewModel(): T =
ViewModelProvider(this, defaultViewModelProviderFactory)[T::class.java]
/**
* Obtains a ViewModel of the specified type using ViewModelProvider with a custom factory.<br><br>
* 커스텀 Factory로 지정한 타입의 ViewModel을 가져옵니다.<br>
*
* @param T The type of the ViewModel to obtain.<br><br>
* 가져올 ViewModel 타입.<br>
* @param factory The Factory to use for creating the ViewModel instance.<br><br>
* ViewModel 생성에 사용할 Factory.<br>
* @return The ViewModel instance of type T.<br><br>
* T 타입의 ViewModel 인스턴스.<br>
*/
protected inline fun <reified T : ViewModel> getViewModel(factory: ViewModelProvider.Factory): T =
ViewModelProvider(this, factory)[T::class.java]
}