Coverage Summary for Class: RootFragment (kr.open.library.simple_ui.xml.ui.components.fragment.root)
| Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| RootFragment |
100%
(1/1)
|
50%
(3/6)
|
10%
(2/20)
|
31.2%
(5/16)
|
24.3%
(34/140)
|
package kr.open.library.simple_ui.xml.ui.components.fragment.root
import android.os.Bundle
import androidx.annotation.CallSuper
import androidx.fragment.app.Fragment
import kr.open.library.simple_ui.core.permissions.model.OrphanedDeniedRequestResult
import kr.open.library.simple_ui.core.permissions.model.PermissionDeniedItem
import kr.open.library.simple_ui.core.permissions.model.PermissionRationaleRequest
import kr.open.library.simple_ui.core.permissions.model.PermissionSettingsRequest
import kr.open.library.simple_ui.xml.permissions.api.PermissionRequester
import kr.open.library.simple_ui.xml.permissions.register.PermissionRequestInterface
/**
* Root Fragment class providing runtime permission management.<br>
* Serves as the foundation for all Fragment classes in the library.<br><br>
* 런타임 권한 관리를 제공하는 루트 Fragment 클래스입니다.<br>
* 라이브러리의 모든 Fragment 클래스의 기반이 됩니다.<br>
*
* @see BaseFragment For simple layout-based Fragment.<br><br>
* 간단한 레이아웃 기반 Fragment.<br>
*
* @see ParentsBindingFragment For binding-enabled Fragment base class.<br><br>
* 바인딩을 지원하는 Fragment 기본 클래스.<br>
*/
abstract class RootFragment :
Fragment(),
PermissionRequestInterface {
private lateinit var permissionRequester: PermissionRequester
@CallSuper
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
permissionRequester = PermissionRequester(this)
permissionRequester.restoreState(savedInstanceState)
}
@CallSuper
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
if (::permissionRequester.isInitialized) {
permissionRequester.saveState(outState)
}
}
/**
* Requests permissions using the delegate.<br>
* Call only after the Fragment is attached (isAdded == true).<br><br>
* 델리게이트를 사용하여 권한을 요청합니다.<br>
* Fragment가 attach된 이후(isAdded == true)에만 호출하세요.<br>
*
* @param permissions List of permissions to request.<br><br>
* 요청할 권한 목록.<br>
* @param onDeniedResult Callback for denied results.<br><br>
* 거부 결과에 대한 콜백.<br>
* @param onRationaleNeeded Callback for rationale UI when needed.<br><br>
* Call `proceed()`, `cancel()`, or `defer(policy)` inside the callback; returning without an action auto-cancels the flow.<br>
* 콜백 안에서 `proceed()`, `cancel()`, `defer(policy)` 중 하나를 호출해야 하며, 아무 액션 없이 반환되면 흐름은 자동 취소됩니다.<br>
* 필요 시 rationale UI를 제공하는 콜백입니다.<br>
* @param onNavigateToSettings Callback for settings navigation when needed.<br><br>
* Call `proceed()`, `cancel()`, or `defer(policy)` inside the callback; returning without an action auto-cancels the flow.<br>
* 콜백 안에서 `proceed()`, `cancel()`, `defer(policy)` 중 하나를 호출해야 하며, 아무 액션 없이 반환되면 흐름은 자동 취소됩니다.<br>
* 필요 시 설정 이동을 안내하는 콜백입니다.<br>
*/
@CallSuper
final override fun requestPermissions(
permissions: List<String>,
onDeniedResult: (List<PermissionDeniedItem>) -> Unit,
onRationaleNeeded: ((PermissionRationaleRequest) -> Unit)?,
onNavigateToSettings: ((PermissionSettingsRequest) -> Unit)?
) {
check(::permissionRequester.isInitialized) { "permissionRequester is not initialized. Please call super.onCreate() first." }
check(isAdded) { "Permission request must be called after Fragment is attached (isAdded == true)." }
permissionRequester.requestPermissions(permissions, onDeniedResult, onRationaleNeeded, onNavigateToSettings)
}
/**
* Returns and clears denied results that lost their callbacks after process restore.<br>
* Call this in [onCreate] to handle results from requests that were interrupted by process kill.<br><br>
* 프로세스 복원 후 콜백을 잃은 거부 결과를 반환하고 비웁니다.<br>
* 프로세스 킬로 중단된 요청의 결과를 처리하려면 [onCreate]에서 호출하세요.<br>
*
* @return Return value: list of orphaned denied request results. Log behavior: none.<br><br>
* 반환값: orphaned 거부 요청 결과 목록. 로그 동작: 없음.<br>
*/
fun consumeOrphanedDeniedResults(): List<OrphanedDeniedRequestResult> {
check(::permissionRequester.isInitialized) {
"PermissionRequester is not initialized. Please call super.onCreate() first."
}
return permissionRequester.consumeOrphanedDeniedResults()
}
/**
* Requests permissions using the delegate.<br>
* Call only after the Fragment is attached (isAdded == true).<br><br>
* 델리게이트를 사용하여 권한을 요청합니다.<br>
* Fragment가 attach된 이후(isAdded == true)에만 호출하세요.<br>
*
* @param permissions Permissions to request.<br><br>
* 요청할 권한 목록입니다.<br>
* @param onDeniedResult Callback invoked with denied items.<br><br>
* 거부 항목을 전달받는 콜백입니다.<br>
*/
@CallSuper
final override fun requestPermissions(permissions: List<String>, onDeniedResult: (List<PermissionDeniedItem>) -> Unit) {
check(::permissionRequester.isInitialized) { "permissionRequester is not initialized. Please call super.onCreate() first." }
check(isAdded) { "Permission request must be called after Fragment is attached (isAdded == true)." }
permissionRequester.requestPermissions(permissions, onDeniedResult, null, null)
}
}