Convert CustomInstanceDao methods to suspend functions.

This commit is contained in:
Isira Seneviratne 2023-02-10 07:14:20 +05:30
parent cabbef23b3
commit 3ef8dc0092
5 changed files with 23 additions and 27 deletions

View File

@ -1,7 +1,6 @@
package com.github.libretube.db.dao
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
@ -10,14 +9,11 @@ import com.github.libretube.db.obj.CustomInstance
@Dao
interface CustomInstanceDao {
@Query("SELECT * FROM customInstance")
fun getAll(): List<CustomInstance>
suspend fun getAll(): List<CustomInstance>
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertAll(vararg customInstances: CustomInstance)
@Delete
fun delete(customInstance: CustomInstance)
suspend fun insertAll(customInstances: List<CustomInstance>)
@Query("DELETE FROM customInstance")
fun deleteAll()
suspend fun deleteAll()
}

View File

@ -54,9 +54,7 @@ object BackupHelper {
*backupFile.watchPositions.orEmpty().toTypedArray()
)
Database.localSubscriptionDao().insertAll(backupFile.localSubscriptions.orEmpty())
Database.customInstanceDao().insertAll(
*backupFile.customInstances.orEmpty().toTypedArray()
)
Database.customInstanceDao().insertAll(backupFile.customInstances.orEmpty())
Database.playlistBookmarkDao().insertAll(
*backupFile.playlistBookmarks.orEmpty().toTypedArray()
)

View File

@ -5,12 +5,13 @@ import android.os.Bundle
import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope
import com.github.libretube.R
import com.github.libretube.databinding.DialogCustomInstanceBinding
import com.github.libretube.db.DatabaseHolder.Database
import com.github.libretube.db.obj.CustomInstance
import com.github.libretube.extensions.query
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.launch
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
class CustomInstanceDialog : DialogFragment() {
@ -28,13 +29,12 @@ class CustomInstanceDialog : DialogFragment() {
if (instanceName.isNotEmpty() && apiUrl.isNotEmpty() && frontendUrl.isNotEmpty()) {
if (apiUrl.toHttpUrlOrNull() != null && frontendUrl.toHttpUrlOrNull() != null) {
query {
lifecycleScope.launch {
Database.customInstanceDao()
.insertAll(CustomInstance(instanceName, apiUrl, frontendUrl))
.insertAll(listOf(CustomInstance(instanceName, apiUrl, frontendUrl)))
ActivityCompat.recreate(requireActivity())
dismiss()
}
ActivityCompat.recreate(requireActivity())
dismiss()
} else {
Toast.makeText(requireContext(), R.string.invalid_url, Toast.LENGTH_SHORT)
.show()

View File

@ -12,10 +12,11 @@ import com.github.libretube.constants.YOUTUBE_FRONTEND_URL
import com.github.libretube.databinding.DialogShareBinding
import com.github.libretube.db.DatabaseHolder.Database
import com.github.libretube.enums.ShareObjectType
import com.github.libretube.extensions.awaitQuery
import com.github.libretube.helpers.PreferenceHelper
import com.github.libretube.obj.ShareData
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
class ShareDialog(
private val id: String,
@ -32,7 +33,9 @@ class ShareDialog(
val instanceUrl = getCustomInstanceFrontendUrl()
val shareableTitle = getShareableTitle(shareData)
// add instanceUrl option if custom instance frontend url available
if (instanceUrl != "") shareOptions += getString(R.string.instance)
if (instanceUrl.isNotEmpty()) {
shareOptions += getString(R.string.instance)
}
if (shareObjectType == ShareObjectType.VIDEO) {
setupTimeStampBinding()
@ -97,15 +100,12 @@ class ShareDialog(
)
// get the api urls of the other custom instances
val customInstances = awaitQuery {
val customInstances = runBlocking(Dispatchers.IO) {
Database.customInstanceDao().getAll()
}
// return the custom instance frontend url if available
customInstances.forEach { instance ->
if (instance.apiUrl == instancePref) return instance.frontendUrl
}
return ""
return customInstances.firstOrNull { it.apiUrl == instancePref }?.frontendUrl.orEmpty()
}
private fun getShareableTitle(shareData: ShareData): String {

View File

@ -13,7 +13,6 @@ import com.github.libretube.constants.FALLBACK_INSTANCES_URL
import com.github.libretube.constants.PIPED_INSTANCES_URL
import com.github.libretube.constants.PreferenceKeys
import com.github.libretube.db.DatabaseHolder.Database
import com.github.libretube.extensions.awaitQuery
import com.github.libretube.extensions.toastFromMainThread
import com.github.libretube.helpers.PreferenceHelper
import com.github.libretube.ui.base.BasePreferenceFragment
@ -21,6 +20,9 @@ import com.github.libretube.ui.dialogs.CustomInstanceDialog
import com.github.libretube.ui.dialogs.DeleteAccountDialog
import com.github.libretube.ui.dialogs.LoginDialog
import com.github.libretube.ui.dialogs.LogoutDialog
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class InstanceSettings : BasePreferenceFragment() {
override val titleResourceId: Int = R.string.instance
@ -82,10 +84,10 @@ class InstanceSettings : BasePreferenceFragment() {
val clearCustomInstances = findPreference<Preference>(PreferenceKeys.CLEAR_CUSTOM_INSTANCES)
clearCustomInstances?.setOnPreferenceClickListener {
awaitQuery {
lifecycleScope.launch {
Database.customInstanceDao().deleteAll()
ActivityCompat.recreate(requireActivity())
}
ActivityCompat.recreate(requireActivity())
true
}
@ -116,7 +118,7 @@ class InstanceSettings : BasePreferenceFragment() {
private fun initCustomInstances(instancePref: ListPreference) {
val appContext = requireContext().applicationContext
lifecycleScope.launchWhenCreated {
val customInstances = awaitQuery {
val customInstances = withContext(Dispatchers.IO) {
Database.customInstanceDao().getAll()
}