Coverage Summary for Class: PermissionConstants (kr.open.library.simple_ui.core.permissions.vo)
| Class |
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| PermissionConstants |
100%
(3/3)
|
100%
(12/12)
|
100%
(32/32)
|
100%
(132/132)
|
| PermissionConstants$ApiLevelRequirements |
100%
(4/4)
|
|
100%
(4/4)
|
100%
(16/16)
|
| PermissionConstants$Defaults |
|
| PermissionConstants$WhenMappings |
|
| Total |
100%
(7/7)
|
100%
(12/12)
|
100%
(36/36)
|
100%
(148/148)
|
package kr.open.library.simple_ui.core.permissions.vo
import android.Manifest
import android.os.Build
import android.provider.Settings
import kr.open.library.simple_ui.core.extensions.conditional.checkSdkVersion
/**
* Centralizes permission-related constants shared across the library.<br><br>
* 라이브러리 전반에서 사용하는 권한 관련 상수를 모아둔 객체입니다.<br>
*/
public object PermissionConstants {
/**
* Maps each special permission to the Settings action required to grant it.<br><br>
* 특수 권한을 부여하기 위해 이동해야 하는 Settings 액션을 매핑합니다.<br>
*/
val SPECIAL_PERMISSION_ACTIONS: Map<String, String> = buildMap {
PermissionSpecialType.entries.forEach {
when (it) {
PermissionSpecialType.SYSTEM_ALERT_WINDOW -> put(it.permission, Settings.ACTION_MANAGE_OVERLAY_PERMISSION)
PermissionSpecialType.WRITE_SETTINGS -> put(it.permission, Settings.ACTION_MANAGE_WRITE_SETTINGS)
PermissionSpecialType.PACKAGE_USAGE_STATS -> put(it.permission, Settings.ACTION_USAGE_ACCESS_SETTINGS)
PermissionSpecialType.BIND_ACCESSIBILITY_SERVICE -> put(it.permission, Settings.ACTION_ACCESSIBILITY_SETTINGS)
PermissionSpecialType.REQUEST_INSTALL_PACKAGES -> put(it.permission, Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES)
PermissionSpecialType.ACCESS_NOTIFICATION_POLICY -> put(it.permission, Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS)
PermissionSpecialType.BIND_NOTIFICATION_LISTENER_SERVICE -> put(
it.permission,
Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS,
)
PermissionSpecialType.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS -> put(
it.permission,
Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
)
else -> {
checkSdkVersion(Build.VERSION_CODES.S) {
if (it == PermissionSpecialType.SCHEDULE_EXACT_ALARM) {
put(Manifest.permission.SCHEDULE_EXACT_ALARM, Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM)
}
}
checkSdkVersion(Build.VERSION_CODES.R) {
if (it == PermissionSpecialType.MANAGE_EXTERNAL_STORAGE) {
put(Manifest.permission.MANAGE_EXTERNAL_STORAGE, Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
}
}
}
}
}
}
/**
* Enumerates special permissions that require a package URI when launching settings.<br><br>
* 설정 화면 호출 시 package URI가 필요한 특수 권한 목록입니다.<br>
*/
val PERMISSIONS_REQUIRING_PACKAGE_URI = buildSet<String> {
add(Manifest.permission.SYSTEM_ALERT_WINDOW)
add(Manifest.permission.WRITE_SETTINGS)
add(Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
add(Manifest.permission.REQUEST_INSTALL_PACKAGES)
checkSdkVersion(Build.VERSION_CODES.R) { add(Manifest.permission.MANAGE_EXTERNAL_STORAGE) }
}
/**
* Groups permissions that only exist from specific API levels upward.<br><br>
* 특정 API 레벨 이상에서만 존재하는 권한을 묶어둔 영역입니다.<br>
*
* **Structural limitation / 구조적 한계:**<br>
* These sets are maintained manually. Permissions not listed here fall through to `else → true`
* in [PermissionClassifier.isSupported], which treats them as universally supported.
* When a new Android version introduces new dangerous permissions, the corresponding set
* must be added here and a matching branch must be added to [PermissionClassifier.isSupported].<br><br>
* 이 집합들은 수동으로 관리됩니다. 여기에 없는 권한은 [PermissionClassifier.isSupported]의
* `else → true` 분기로 흘러 모든 API 레벨에서 지원되는 것처럼 처리됩니다.
* 새 Android 버전에서 신규 dangerous 권한이 추가되면 해당 집합과 분기를 반드시 추가해야 합니다.<br>
*/
object ApiLevelRequirements {
/**
* Permissions that were introduced on Android R.<br><br>
* Android R에서 추가된 권한 목록입니다.<br>
*/
val ANDROID_R_PERMISSIONS: Set<String> = setOf(Manifest.permission.MANAGE_EXTERNAL_STORAGE)
/**
* Permissions that were introduced on Android S.<br><br>
* Android S에서 추가된 권한 목록입니다.<br>
*/
val ANDROID_S_PERMISSIONS: Set<String> = setOf(Manifest.permission.SCHEDULE_EXACT_ALARM)
/**
* Permissions that were introduced on Android 13 (Tiramisu).<br><br>
* Android 13(Tiramisu)에서 추가된 권한 목록입니다.<br>
*/
val ANDROID_TIRAMISU_PERMISSIONS: Set<String> = setOf(Manifest.permission.POST_NOTIFICATIONS)
/**
* Permissions that were introduced on Android 14 (U).<br><br>
* Android 14(U)에서 추가된 권한 목록입니다.<br>
*/
val ANDROID_U_PERMISSIONS: Set<String> = setOf(Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED)
}
/**
* Default configuration values used by permission components.<br><br>
* 권한 컴포넌트에서 사용하는 기본 설정 값입니다.<br>
*/
object Defaults {
/**
* Timeout (in milliseconds) after which pending requests are cleaned up.<br><br>
* 대기 중인 권한 요청을 정리하는 타임아웃(밀리초)입니다.<br>
*/
const val REQUEST_TIMEOUT_MS = 300_000L // 5분
}
}