159 lines
6.3 KiB
Kotlin
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
|
|
}
|
|
}
|