From f2e0c610107e0d992ab9bc15066de120581f11cc Mon Sep 17 00:00:00 2001 From: Ivan Fontosh Date: Sun, 28 Jun 2026 13:52:32 +0800 Subject: [PATCH] Hardcode production license server URL in app. Remove editable server URL from settings; only admin token is configured by user. Co-authored-by: Cursor --- .../ttrpg/licensemanager/data/Repositories.kt | 15 ++++++------ .../licensemanager/ui/LicenseViewModel.kt | 12 ++++------ .../ui/screens/SettingsScreen.kt | 23 +++++++++++-------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/ru/mailib/ttrpg/licensemanager/data/Repositories.kt b/app/src/main/java/ru/mailib/ttrpg/licensemanager/data/Repositories.kt index 430f4db..37ae89c 100644 --- a/app/src/main/java/ru/mailib/ttrpg/licensemanager/data/Repositories.kt +++ b/app/src/main/java/ru/mailib/ttrpg/licensemanager/data/Repositories.kt @@ -17,30 +17,29 @@ import retrofit2.converter.gson.GsonConverterFactory private val Context.dataStore: DataStore by preferencesDataStore(name = "settings") data class AppSettings( - val serverUrl: String = DEFAULT_SERVER_URL, + val serverUrl: String = SERVER_URL, val adminToken: String = "", ) { companion object { - const val DEFAULT_SERVER_URL = "https://license.mailib.ru/" + /** Продакшен-сервер лицензий (захардкожен, не меняется в UI). */ + const val SERVER_URL = "https://license.mailib.ru/" + @Deprecated("Use SERVER_URL", ReplaceWith("SERVER_URL")) + const val DEFAULT_SERVER_URL = SERVER_URL } } class SettingsRepository(private val context: Context) { - private val serverUrlKey = stringPreferencesKey("server_url") private val adminTokenKey = stringPreferencesKey("admin_token") val settings: Flow = context.dataStore.data.map { prefs -> AppSettings( - serverUrl = prefs[serverUrlKey] ?: AppSettings.DEFAULT_SERVER_URL, + serverUrl = AppSettings.SERVER_URL, adminToken = prefs[adminTokenKey].orEmpty(), ) } - suspend fun save(serverUrl: String, adminToken: String) { + suspend fun save(adminToken: String) { context.dataStore.edit { prefs -> - prefs[serverUrlKey] = serverUrl.trim().let { url -> - if (url.endsWith("/")) url else "$url/" - } prefs[adminTokenKey] = adminToken.trim() } } diff --git a/app/src/main/java/ru/mailib/ttrpg/licensemanager/ui/LicenseViewModel.kt b/app/src/main/java/ru/mailib/ttrpg/licensemanager/ui/LicenseViewModel.kt index c3efff1..11ae2de 100644 --- a/app/src/main/java/ru/mailib/ttrpg/licensemanager/ui/LicenseViewModel.kt +++ b/app/src/main/java/ru/mailib/ttrpg/licensemanager/ui/LicenseViewModel.kt @@ -37,7 +37,6 @@ data class GenerateKeyUiState( ) data class SettingsUiState( - val serverUrl: String = AppSettings.DEFAULT_SERVER_URL, val adminToken: String = "", val savedMessage: String? = null, ) @@ -62,10 +61,7 @@ class LicenseViewModel(application: Application) : AndroidViewModel(application) viewModelScope.launch { settings.collect { appSettings -> _settingsState.update { - it.copy( - serverUrl = appSettings.serverUrl, - adminToken = appSettings.adminToken, - ) + it.copy(adminToken = appSettings.adminToken) } } } @@ -159,16 +155,16 @@ class LicenseViewModel(application: Application) : AndroidViewModel(application) } } - fun updateSettingsDraft(serverUrl: String, adminToken: String) { + fun updateAdminToken(value: String) { _settingsState.update { - it.copy(serverUrl = serverUrl, adminToken = adminToken, savedMessage = null) + it.copy(adminToken = value, savedMessage = null) } } fun saveSettings() { val draft = _settingsState.value viewModelScope.launch { - settingsRepository.save(draft.serverUrl, draft.adminToken) + settingsRepository.save(draft.adminToken) _settingsState.update { it.copy(savedMessage = "Сохранено") } } } diff --git a/app/src/main/java/ru/mailib/ttrpg/licensemanager/ui/screens/SettingsScreen.kt b/app/src/main/java/ru/mailib/ttrpg/licensemanager/ui/screens/SettingsScreen.kt index e401692..7cb56d4 100644 --- a/app/src/main/java/ru/mailib/ttrpg/licensemanager/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/ru/mailib/ttrpg/licensemanager/ui/screens/SettingsScreen.kt @@ -16,6 +16,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import ru.mailib.ttrpg.licensemanager.data.AppSettings import ru.mailib.ttrpg.licensemanager.ui.LicenseViewModel @Composable @@ -29,23 +30,27 @@ fun SettingsScreen(viewModel: LicenseViewModel, onBack: () -> Unit) { verticalArrangement = Arrangement.spacedBy(12.dp), ) { Text( - text = "Настройки сервера", + text = "Настройки", style = MaterialTheme.typography.headlineSmall, fontWeight = FontWeight.SemiBold, ) - OutlinedTextField( - value = state.serverUrl, - onValueChange = { value -> viewModel.updateSettingsDraft(value, state.adminToken) }, - label = { Text("URL сервера") }, - modifier = Modifier.fillMaxWidth(), - singleLine = true, + Text( + text = "Сервер: ${AppSettings.SERVER_URL}", + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + + Text( + text = "Токен администратора (LICENSE_ADMIN_TOKEN) — см. инструкцию в README или спросите у администратора сервера.", + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, ) OutlinedTextField( value = state.adminToken, - onValueChange = { value -> viewModel.updateSettingsDraft(state.serverUrl, value) }, - label = { Text("Admin token (LICENSE_ADMIN_TOKEN)") }, + onValueChange = viewModel::updateAdminToken, + label = { Text("Admin token") }, modifier = Modifier.fillMaxWidth(), singleLine = true, visualTransformation = PasswordVisualTransformation(),