1package com.peachpasswords.sync23import android.content.Context4import dagger.hilt.android.qualifiers.ApplicationContext5import javax.inject.Inject6import javax.inject.Singleton78910111213141516171819enum class SyncMode {20 PUBLIC,21 PRIVATE,22 OFF,23 ;2425 fun wire(): String = when (this) {26 PUBLIC -> "public"27 PRIVATE -> "private"28 OFF -> "off"29 }3031 companion object {32 fun parse(raw: String?): SyncMode? = when (raw) {33 "public" -> PUBLIC34 "private" -> PRIVATE35 "off" -> OFF36 else -> null37 }38 }39}40414243444546@Singleton47class RelaySettingsStore @Inject constructor(48 @ApplicationContext context: Context,49) {50 private val prefs = context.getSharedPreferences(PREFS_FILE, Context.MODE_PRIVATE)5152 fun syncMode(): SyncMode {53 SyncMode.parse(prefs.getString(KEY_MODE, null))?.let { return it }54 55 56 57 58 return when {59 prefs.getBoolean(LEGACY_KEY_LAN_ONLY, false) -> SyncMode.OFF60 storedRelayUrl() != Rendezvous.DEFAULT_RELAY_URL -> SyncMode.PRIVATE61 else -> SyncMode.PUBLIC62 }63 }6465 fun setSyncMode(mode: SyncMode) {66 prefs.edit().putString(KEY_MODE, mode.wire()).apply()67 }6869 fun isSyncEnabled(): Boolean = syncMode() != SyncMode.OFF7071 72 fun relayUrl(): String =73 if (syncMode() == SyncMode.PUBLIC) Rendezvous.DEFAULT_RELAY_URL else storedRelayUrl()7475 76777879 fun setPrivateRelayUrl(input: String): String {80 val normalized = Rendezvous.normalizeRelayUrl(input)81 prefs.edit()82 .putString(KEY_URL, normalized)83 .putString(KEY_MODE, SyncMode.PRIVATE.wire())84 .apply()85 return normalized86 }8788 private fun storedRelayUrl(): String = prefs.getString(KEY_URL, null)89 ?.let { runCatching { Rendezvous.normalizeRelayUrl(it) }.getOrNull() }90 ?: Rendezvous.DEFAULT_RELAY_URL9192 companion object {93 const val PREFS_FILE = "peach_relay_settings"94 const val KEY_URL = "relay_url"95 const val KEY_MODE = "sync_mode"96 97 const val LEGACY_KEY_LAN_ONLY = "lan_only"9899 fun readRelayUrl(context: Context): String =100 context.getSharedPreferences(PREFS_FILE, Context.MODE_PRIVATE)101 .getString(KEY_URL, null)102 ?.let { runCatching { Rendezvous.normalizeRelayUrl(it) }.getOrNull() }103 ?: Rendezvous.DEFAULT_RELAY_URL104 }105}