Files
android-tv/app/src/main/java/com/videoapp/tv/SettingsActivity.kt

159 lines
6.3 KiB
Kotlin

package com.videoapp.tv
import android.os.Bundle
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Button
import android.widget.EditText
import android.widget.Spinner
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.videoapp.tv.data.ConfigRepository
import com.videoapp.tv.data.SiteConfig
import com.videoapp.tv.engine.SourceHandler
import com.videoapp.tv.engine.SourceRegistry
class SettingsActivity : AppCompatActivity() {
private lateinit var configRepo: ConfigRepository
private lateinit var spinnerPreset: Spinner
private lateinit var editBaseUrl: EditText
private lateinit var editSearchPath: EditText
private lateinit var editSearchMethod: EditText
private lateinit var editKeywordParam: EditText
private lateinit var editExtraParams: EditText
private lateinit var editResultSelector: EditText
private lateinit var editTitleSelector: EditText
private lateinit var editCoverSelector: EditText
private lateinit var editLinkSelector: EditText
private lateinit var editSourceSelector: EditText
private lateinit var editSourceEpisodeGroupSelector: EditText
private lateinit var btnSave: Button
private lateinit var btnRestore: Button
private var ignoringSpinner = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_settings)
configRepo = ConfigRepository(this)
spinnerPreset = findViewById(R.id.spinner_preset)
editBaseUrl = findViewById(R.id.edit_base_url)
editSearchPath = findViewById(R.id.edit_search_path)
editSearchMethod = findViewById(R.id.edit_search_method)
editKeywordParam = findViewById(R.id.edit_keyword_param)
editExtraParams = findViewById(R.id.edit_extra_params)
editResultSelector = findViewById(R.id.edit_result_selector)
editTitleSelector = findViewById(R.id.edit_title_selector)
editCoverSelector = findViewById(R.id.edit_cover_selector)
editLinkSelector = findViewById(R.id.edit_link_selector)
editSourceSelector = findViewById(R.id.edit_source_selector)
editSourceEpisodeGroupSelector = findViewById(R.id.edit_source_episode_group_selector)
btnSave = findViewById(R.id.btn_save)
btnRestore = findViewById(R.id.btn_restore)
setupSourceSpinner()
loadConfig()
btnSave.setOnClickListener { saveConfig() }
btnRestore.setOnClickListener {
configRepo.restoreDefault()
loadConfig()
Toast.makeText(this, R.string.config_restored, Toast.LENGTH_SHORT).show()
}
}
private fun setupSourceSpinner() {
val handlers = SourceRegistry.getAll()
val names = handlers.map { it.displayName }
val adapter = ArrayAdapter(
this,
android.R.layout.simple_spinner_item,
names
)
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinnerPreset.adapter = adapter
val currentId = configRepo.getCurrentSourceId()
val currentIndex = handlers.indexOfFirst { it.id == currentId }
if (currentIndex >= 0) {
spinnerPreset.setSelection(currentIndex)
}
spinnerPreset.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
if (ignoringSpinner) return
val handler = handlers[position]
configRepo.setCurrentSourceId(handler.id)
}
override fun onNothingSelected(parent: AdapterView<*>?) {}
}
}
private fun loadConfigFromPreset(config: SiteConfig) {
editBaseUrl.setText(config.baseUrl)
editSearchPath.setText(config.searchPath)
editSearchMethod.setText(config.searchMethod)
editKeywordParam.setText(config.keywordParam)
editExtraParams.setText(
config.extraParams.entries.joinToString("&") { "${it.key}=${it.value}" }
)
editResultSelector.setText(config.resultSelector)
editTitleSelector.setText(config.titleSelector)
editCoverSelector.setText(config.coverSelector)
editLinkSelector.setText(config.linkSelector)
editSourceSelector.setText(config.sourceSelector)
editSourceEpisodeGroupSelector.setText(config.sourceEpisodeGroupSelector)
}
private fun loadConfig() {
val config = configRepo.getConfig()
loadConfigFromPreset(config)
val handlers = SourceRegistry.getAll()
val currentId = configRepo.getCurrentSourceId()
val matchedIndex = handlers.indexOfFirst { it.id == currentId }
if (matchedIndex >= 0) {
ignoringSpinner = true
spinnerPreset.setSelection(matchedIndex)
ignoringSpinner = false
}
}
private fun saveConfig() {
val extraParams = parseExtraParams(editExtraParams.text.toString())
val config = SiteConfig(
baseUrl = editBaseUrl.text.toString().trim(),
searchPath = editSearchPath.text.toString().trim(),
searchMethod = editSearchMethod.text.toString().trim(),
keywordParam = editKeywordParam.text.toString().trim(),
extraParams = extraParams,
resultSelector = editResultSelector.text.toString().trim(),
titleSelector = editTitleSelector.text.toString().trim(),
coverSelector = editCoverSelector.text.toString().trim(),
linkSelector = editLinkSelector.text.toString().trim(),
sourceSelector = editSourceSelector.text.toString().trim(),
sourceEpisodeGroupSelector = editSourceEpisodeGroupSelector.text.toString().trim()
)
configRepo.saveConfig(config)
Toast.makeText(this, R.string.config_saved, Toast.LENGTH_SHORT).show()
finish()
}
private fun parseExtraParams(paramStr: String): Map<String, String> {
val map = mutableMapOf<String, String>()
if (paramStr.isBlank()) return map
paramStr.split("&").forEach { pair ->
val parts = pair.split("=", limit = 2)
if (parts.size == 2) {
map[parts[0].trim()] = parts[1].trim()
}
}
return map
}
}