Coverage Summary for Class: LogxConfigStore (kr.open.library.simple_ui.core.logcat.config)
| Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| LogxConfigStore |
100%
(1/1)
|
100%
(20/20)
|
50%
(1/2)
|
100%
(63/63)
|
100%
(437/437)
|
package kr.open.library.simple_ui.core.logcat.config
import kr.open.library.simple_ui.core.logcat.internal.common.LogxConstants
import java.util.Collections
/**
* Logx 설정을 메모리에서 중앙 관리하는 저장소입니다.<br><br>
* Central in-memory configuration store for Logx.<br>
*/
internal object LogxConfigStore {
private val snapshotLock = Any()
private val defaultSkipPackages = Collections.unmodifiableSet(linkedSetOf(
"kr.open.library.simple_ui.core.logcat",
"java.",
"kotlin.",
"kotlinx.coroutines.",
"kotlin.coroutines",
"android.util.",
"android.os.",
"dalvik.system.",
))
/**
* 현재 설정 상태를 나타내는 불변 스냅샷입니다.<br><br>
* Immutable snapshot that represents the current configuration.<br>
*/
@Volatile
private var snapshot: LogxConfigSnapshot = LogxConfigSnapshot(
isLogging = true,
logTypes = Collections.unmodifiableSet(enumValues<LogType>().toSet()),
isLogTagBlockListEnabled = false,
logTagBlockList = Collections.unmodifiableSet(emptySet()),
isSaveEnabled = false,
storageType = LogStorageType.APP_EXTERNAL,
saveDirectory = null,
appName = LogxConstants.DEFAULT_APP_NAME,
skipPackages = defaultSkipPackages,
)
/**
* 로그 출력 활성화 여부를 설정합니다.<br><br>
* Sets logging enabled state.<br>
*
* @param enabled 로그 출력 활성화 여부입니다.<br><br>
* Whether to enable logging.<br>
*/
fun setLogging(enabled: Boolean) {
synchronized(snapshotLock) {
snapshot = snapshot.copy(isLogging = enabled)
}
}
/**
* 현재 로그 출력 활성화 여부를 반환합니다.<br><br>
* Returns current logging enabled state.<br>
*/
fun isLogging(): Boolean = snapshot.isLogging
/**
* 허용할 로그 타입 목록을 설정합니다.<br><br>
* Sets allowed log types (allowlist).<br>
*
* @param types 허용할 로그 타입 집합입니다.<br><br>
* Allowed log types.<br>
*/
fun setLogTypes(types: Set<LogType>) {
val sanitized = Collections.unmodifiableSet(types.toSet())
synchronized(snapshotLock) {
snapshot = snapshot.copy(logTypes = sanitized)
}
}
/**
* 허용된 로그 타입 집합을 반환합니다.<br><br>
* Returns allowed log types.<br>
*/
fun getLogTypes(): Set<LogType> = snapshot.logTypes
/**
* 태그 차단 목록 필터 활성화 여부를 설정합니다.<br><br>
* Enables or disables tag blocklist filtering.<br>
*
* @param enabled 차단 목록 필터 활성화 여부입니다.<br><br>
* Whether to enable blocklist filtering.<br>
*/
fun setLogTagBlockListEnabled(enabled: Boolean) {
synchronized(snapshotLock) {
snapshot = snapshot.copy(isLogTagBlockListEnabled = enabled)
}
}
/**
* 태그 차단 목록 필터 활성화 여부를 반환합니다.<br><br>
* Returns whether tag blocklist filtering is enabled.<br>
*/
fun isLogTagBlockListEnabled(): Boolean = snapshot.isLogTagBlockListEnabled
/**
* 태그 차단 목록을 설정합니다.<br><br>
* Sets tag blocklist entries.<br>
*
* @param tags 차단할 태그 집합입니다.<br><br>
* Tags to block.<br>
*/
fun setLogTagBlockList(tags: Set<String>) {
val sanitized = Collections.unmodifiableSet(tags.toSet())
synchronized(snapshotLock) {
snapshot = snapshot.copy(logTagBlockList = sanitized)
}
}
/**
* 현재 태그 차단 목록을 반환합니다.<br><br>
* Returns current tag blocklist entries.<br>
*/
fun getLogTagBlockList(): Set<String> = snapshot.logTagBlockList
/**
* 파일 저장 활성화 여부를 설정합니다.<br><br>
* Sets file logging enabled state.<br>
*
* @param enabled 파일 저장 활성화 여부입니다.<br><br>
* Whether to enable file logging.<br>
*/
fun setSaveEnabled(enabled: Boolean) {
synchronized(snapshotLock) {
snapshot = snapshot.copy(isSaveEnabled = enabled)
}
}
/**
* 파일 저장 활성화 여부를 반환합니다.<br><br>
* Returns file logging enabled state.<br>
*/
fun isSaveEnabled(): Boolean = snapshot.isSaveEnabled
/**
* 파일 저장소 타입을 설정합니다.<br><br>
* Sets storage type for file output.<br>
*
* @param type 사용할 저장소 타입입니다.<br><br>
* Storage type to use.<br>
*/
fun setStorageType(type: LogStorageType) {
synchronized(snapshotLock) {
snapshot = snapshot.copy(storageType = type)
}
}
/**
* 현재 저장소 타입을 반환합니다.<br><br>
* Returns current storage type.<br>
*/
fun getStorageType(): LogStorageType = snapshot.storageType
/**
* 사용자 지정 저장 디렉터리를 설정합니다.<br><br>
* Sets custom save directory path.<br>
*
* @param path 저장 디렉터리 경로입니다. `null`이면 기본 경로를 사용합니다.<br><br>
* Directory path or null to use default.<br>
*/
fun setSaveDirectory(path: String?) {
synchronized(snapshotLock) {
snapshot = snapshot.copy(saveDirectory = path)
}
}
/**
* 사용자 지정 저장 디렉터리 경로를 반환합니다.<br><br>
* Returns custom save directory path.<br>
*/
fun getSaveDirectory(): String? = snapshot.saveDirectory
/**
* 로그 접두사와 파일명에 사용할 앱 이름을 설정합니다.<br><br>
* Sets application name used in log prefix and file name.<br>
*
* @param name 앱 이름입니다.<br><br>
* Application name.<br>
*/
fun setAppName(name: String) {
synchronized(snapshotLock) {
snapshot = snapshot.copy(appName = name)
}
}
/**
* 현재 앱 이름을 반환합니다.<br><br>
* Returns current application name.<br>
*/
fun getAppName(): String = snapshot.appName
/**
* 스택 트레이스 해석에서 제외할 패키지 접두사를 추가합니다.<br><br>
* Adds package prefixes to skip during stack trace resolution.<br>
*
* @param packages 추가할 패키지 접두사 집합입니다.<br><br>
* Package prefixes to add.<br>
*/
fun addSkipPackages(packages: Set<String>) {
val filtered = packages.filter { it.isNotBlank() }.toSet()
if (filtered.isEmpty()) return
synchronized(snapshotLock) {
val merged = snapshot.skipPackages.toMutableSet()
merged.addAll(filtered)
snapshot = snapshot.copy(skipPackages = Collections.unmodifiableSet(merged))
}
}
/**
* 현재 제외 패키지 접두사 목록을 반환합니다.<br><br>
* Returns current skip package prefixes.<br>
*/
fun getSkipPackages(): Set<String> = snapshot.skipPackages
/**
* 현재 설정의 불변 스냅샷을 생성해 반환합니다.<br><br>
* Creates an immutable snapshot of current configuration.<br>
*/
fun snapshot(): LogxConfigSnapshot = snapshot
}