2021-02-08 21:46:31 +01:00
|
|
|
package org.moire.ultrasonic.fragment
|
2020-09-18 09:37:19 +02:00
|
|
|
|
|
|
|
import android.app.AlertDialog
|
|
|
|
import android.os.Bundle
|
2021-02-08 21:46:31 +01:00
|
|
|
import android.view.LayoutInflater
|
|
|
|
import android.view.View
|
|
|
|
import android.view.ViewGroup
|
2020-09-18 09:37:19 +02:00
|
|
|
import android.widget.AdapterView
|
|
|
|
import android.widget.ListView
|
2021-02-08 21:46:31 +01:00
|
|
|
import androidx.fragment.app.Fragment
|
|
|
|
import androidx.navigation.fragment.findNavController
|
2020-09-18 09:37:19 +02:00
|
|
|
import com.google.android.material.floatingactionbutton.FloatingActionButton
|
|
|
|
import kotlinx.coroutines.Dispatchers
|
|
|
|
import kotlinx.coroutines.runBlocking
|
|
|
|
import kotlinx.coroutines.withContext
|
|
|
|
import org.koin.android.ext.android.inject
|
2021-05-27 12:15:56 +02:00
|
|
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
2020-09-18 09:37:19 +02:00
|
|
|
import org.moire.ultrasonic.R
|
|
|
|
import org.moire.ultrasonic.data.ActiveServerProvider
|
2021-02-08 21:46:31 +01:00
|
|
|
import org.moire.ultrasonic.fragment.EditServerFragment.Companion.EDIT_SERVER_INTENT_INDEX
|
2020-09-18 09:37:19 +02:00
|
|
|
import org.moire.ultrasonic.service.MediaPlayerController
|
|
|
|
import org.moire.ultrasonic.util.Util
|
2020-09-30 14:47:59 +02:00
|
|
|
import timber.log.Timber
|
2020-09-18 09:37:19 +02:00
|
|
|
|
2021-03-01 17:24:25 +01:00
|
|
|
/**
|
|
|
|
* Displays the list of configured servers, they can be selected or edited
|
|
|
|
*/
|
2021-02-14 15:55:16 +01:00
|
|
|
class ServerSelectorFragment : Fragment() {
|
2020-09-18 09:37:19 +02:00
|
|
|
companion object {
|
|
|
|
const val SERVER_SELECTOR_MANAGE_MODE = "manageMode"
|
|
|
|
}
|
|
|
|
|
|
|
|
private var listView: ListView? = null
|
|
|
|
private val serverSettingsModel: ServerSettingsModel by viewModel()
|
|
|
|
private val service: MediaPlayerController by inject()
|
|
|
|
private val activeServerProvider: ActiveServerProvider by inject()
|
|
|
|
private var serverRowAdapter: ServerRowAdapter? = null
|
|
|
|
|
2021-02-08 21:46:31 +01:00
|
|
|
@Override
|
2020-09-18 09:37:19 +02:00
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
2021-02-08 21:46:31 +01:00
|
|
|
Util.applyTheme(this.context)
|
2020-09-18 09:37:19 +02:00
|
|
|
super.onCreate(savedInstanceState)
|
2021-02-08 21:46:31 +01:00
|
|
|
}
|
2020-09-18 09:37:19 +02:00
|
|
|
|
2021-02-14 15:55:16 +01:00
|
|
|
override fun onCreateView(
|
|
|
|
inflater: LayoutInflater,
|
|
|
|
container: ViewGroup?,
|
|
|
|
savedInstanceState: Bundle?
|
|
|
|
): View? {
|
2021-02-08 21:46:31 +01:00
|
|
|
return inflater.inflate(R.layout.server_selector, container, false)
|
|
|
|
}
|
2020-09-18 09:37:19 +02:00
|
|
|
|
2021-02-08 21:46:31 +01:00
|
|
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
|
|
super.onViewCreated(view, savedInstanceState)
|
2020-09-18 09:37:19 +02:00
|
|
|
|
2021-02-08 21:46:31 +01:00
|
|
|
val manageMode = arguments?.getBoolean(
|
|
|
|
SERVER_SELECTOR_MANAGE_MODE,
|
|
|
|
false
|
|
|
|
) ?: false
|
2020-09-18 09:37:19 +02:00
|
|
|
if (manageMode) {
|
2021-02-08 21:46:31 +01:00
|
|
|
FragmentTitle.setTitle(this, R.string.settings_server_manage_servers)
|
2020-09-18 09:37:19 +02:00
|
|
|
} else {
|
2021-02-08 21:46:31 +01:00
|
|
|
FragmentTitle.setTitle(this, R.string.server_selector_label)
|
2020-09-18 09:37:19 +02:00
|
|
|
}
|
|
|
|
|
2021-02-08 21:46:31 +01:00
|
|
|
listView = view.findViewById(R.id.server_list)
|
2020-09-18 09:37:19 +02:00
|
|
|
serverRowAdapter = ServerRowAdapter(
|
2021-02-08 21:46:31 +01:00
|
|
|
view.context,
|
2020-09-18 09:37:19 +02:00
|
|
|
arrayOf(),
|
|
|
|
serverSettingsModel,
|
|
|
|
activeServerProvider,
|
|
|
|
manageMode,
|
|
|
|
{
|
|
|
|
i ->
|
|
|
|
onServerDeleted(i)
|
|
|
|
},
|
|
|
|
{
|
|
|
|
i ->
|
|
|
|
editServer(i)
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
listView?.adapter = serverRowAdapter
|
|
|
|
|
|
|
|
listView?.onItemClickListener = AdapterView.OnItemClickListener {
|
|
|
|
_, _, position, _ ->
|
|
|
|
if (manageMode) {
|
|
|
|
editServer(position + 1)
|
|
|
|
} else {
|
|
|
|
setActiveServer(position)
|
2021-02-08 21:46:31 +01:00
|
|
|
findNavController().navigateUp()
|
2020-09-18 09:37:19 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-08 21:46:31 +01:00
|
|
|
val fab = view.findViewById<FloatingActionButton>(R.id.server_add_fab)
|
2020-09-18 09:37:19 +02:00
|
|
|
fab.setOnClickListener {
|
|
|
|
editServer(-1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onResume() {
|
|
|
|
super.onResume()
|
|
|
|
val serverList = serverSettingsModel.getServerList()
|
|
|
|
serverList.observe(
|
|
|
|
this,
|
2021-06-20 16:31:08 +02:00
|
|
|
{ t ->
|
2020-09-18 09:37:19 +02:00
|
|
|
serverRowAdapter!!.setData(t.toTypedArray())
|
|
|
|
}
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the active server when a list item is clicked
|
|
|
|
*/
|
|
|
|
private fun setActiveServer(index: Int) {
|
|
|
|
// TODO this is still a blocking call - we shouldn't leave this activity before the active server is updated.
|
|
|
|
// Maybe this can be refactored by using LiveData, or this can be made more user friendly with a ProgressDialog
|
|
|
|
runBlocking {
|
|
|
|
withContext(Dispatchers.IO) {
|
|
|
|
if (activeServerProvider.getActiveServer().index != index) {
|
|
|
|
service.clearIncomplete()
|
|
|
|
activeServerProvider.setActiveServerByIndex(index)
|
2020-09-25 11:15:19 +02:00
|
|
|
service.isJukeboxEnabled =
|
|
|
|
activeServerProvider.getActiveServer().jukeboxByDefault
|
2020-09-18 09:37:19 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-09-30 14:47:59 +02:00
|
|
|
Timber.i("Active server was set to: $index")
|
2020-09-18 09:37:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This Callback handles the deletion of a Server Setting
|
|
|
|
*/
|
|
|
|
private fun onServerDeleted(index: Int) {
|
2021-02-08 21:46:31 +01:00
|
|
|
AlertDialog.Builder(context)
|
2020-09-18 09:37:19 +02:00
|
|
|
.setIcon(android.R.drawable.ic_dialog_alert)
|
|
|
|
.setTitle(R.string.server_menu_delete)
|
|
|
|
.setMessage(R.string.server_selector_delete_confirmation)
|
|
|
|
.setPositiveButton(R.string.common_delete) { dialog, _ ->
|
|
|
|
dialog.dismiss()
|
|
|
|
|
|
|
|
val activeServerIndex = activeServerProvider.getActiveServer().index
|
2021-06-20 16:31:08 +02:00
|
|
|
val id = ActiveServerProvider.getActiveServerId()
|
|
|
|
|
2020-09-18 09:37:19 +02:00
|
|
|
// If the currently active server is deleted, go offline
|
|
|
|
if (index == activeServerIndex) setActiveServer(-1)
|
|
|
|
|
|
|
|
serverSettingsModel.deleteItem(index)
|
2021-06-20 16:31:08 +02:00
|
|
|
|
|
|
|
// Clear the metadata cache
|
|
|
|
activeServerProvider.deleteMetaDatabase(id)
|
|
|
|
|
2020-09-30 14:47:59 +02:00
|
|
|
Timber.i("Server deleted: $index")
|
2020-09-18 09:37:19 +02:00
|
|
|
}
|
|
|
|
.setNegativeButton(R.string.common_cancel) { dialog, _ ->
|
|
|
|
dialog.dismiss()
|
|
|
|
}
|
|
|
|
.show()
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2021-02-08 21:46:31 +01:00
|
|
|
* Starts the Edit Server Fragment to edit the details of a server
|
2020-09-18 09:37:19 +02:00
|
|
|
*/
|
|
|
|
private fun editServer(index: Int) {
|
2021-02-08 21:46:31 +01:00
|
|
|
val bundle = Bundle()
|
|
|
|
bundle.putInt(EDIT_SERVER_INTENT_INDEX, index)
|
|
|
|
findNavController().navigate(R.id.serverSelectorToEditServer, bundle)
|
2020-09-18 09:37:19 +02:00
|
|
|
}
|
2021-02-14 15:55:16 +01:00
|
|
|
}
|