From 7ae5f713d686b5f06d0cdad06aa43c7e112e4d3f Mon Sep 17 00:00:00 2001 From: sanjeok77 <1+sanjeok77@noreply.localhost> Date: Thu, 20 Aug 2026 23:53:24 +0000 Subject: [PATCH] v0.2.8: Site & Keyword Reordering Support & Slim Bottom Bar Margins --- .../data/local/preferences/AppSettings.kt | 77 +++++++++++++++++-- 1 file changed, 71 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/hotdeal/alarm/data/local/preferences/AppSettings.kt b/app/src/main/java/com/hotdeal/alarm/data/local/preferences/AppSettings.kt index 3987e16..bef7b45 100644 --- a/app/src/main/java/com/hotdeal/alarm/data/local/preferences/AppSettings.kt +++ b/app/src/main/java/com/hotdeal/alarm/data/local/preferences/AppSettings.kt @@ -5,7 +5,9 @@ import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.intPreferencesKey +import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.preferencesDataStore +import com.hotdeal.alarm.domain.model.SiteType import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map @@ -13,28 +15,91 @@ import kotlinx.coroutines.flow.map * 앱 설정 저장 (DataStore) */ class AppSettings(private val context: Context) { - + private val Context.dataStore: DataStore by preferencesDataStore(name = "app_settings") - + companion object { private val POLLING_INTERVAL_KEY = intPreferencesKey("polling_interval_minutes") + private val SITE_ORDER_KEY = stringPreferencesKey("site_order_list") + private val KEYWORD_ORDER_KEY = stringPreferencesKey("keyword_order_list") private const val DEFAULT_INTERVAL = 2 } - + /** - * 폴� 주기 (분) + * 폴링 주기 (분) */ val pollingInterval: Flow = context.dataStore.data .map { preferences -> preferences[POLLING_INTERVAL_KEY] ?: DEFAULT_INTERVAL } - + /** - * 폴� 주기 설정 저장 + * 폴링 주기 설정 저장 */ suspend fun setPollingInterval(minutes: Int) { context.dataStore.edit { preferences -> preferences[POLLING_INTERVAL_KEY] = minutes } } + + /** + * 사이트 표시 순서 목록 + */ + val siteOrder: Flow> = context.dataStore.data + .map { preferences -> + val savedStr = preferences[SITE_ORDER_KEY] + if (savedStr.isNullOrBlank()) { + SiteType.entries + } else { + val savedNames = savedStr.split(",") + val ordered = mutableListOf() + savedNames.forEach { name -> + try { + ordered.add(SiteType.valueOf(name.trim())) + } catch (e: Exception) { + // ignore invalid + } + } + // 누락된 신규 사이트가 있으면 끝에 추가 + SiteType.entries.forEach { site -> + if (site !in ordered) { + ordered.add(site) + } + } + ordered + } + } + + /** + * 사이트 표시 순서 저장 + */ + suspend fun setSiteOrder(order: List) { + val str = order.joinToString(",") { it.name } + context.dataStore.edit { preferences -> + preferences[SITE_ORDER_KEY] = str + } + } + + /** + * 키워드 ID 표시 순서 목록 + */ + val keywordOrder: Flow> = context.dataStore.data + .map { preferences -> + val savedStr = preferences[KEYWORD_ORDER_KEY] + if (savedStr.isNullOrBlank()) { + emptyList() + } else { + savedStr.split(",").mapNotNull { it.trim().toLongOrNull() } + } + } + + /** + * 키워드 ID 표시 순서 저장 + */ + suspend fun setKeywordOrder(order: List) { + val str = order.joinToString(",") { it.toString() } + context.dataStore.edit { preferences -> + preferences[KEYWORD_ORDER_KEY] = str + } + } }