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

View File

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

View File

@ -5,12 +5,13 @@ import android.os.Bundle
import android.widget.Toast import android.widget.Toast
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope
import com.github.libretube.R import com.github.libretube.R
import com.github.libretube.databinding.DialogCustomInstanceBinding import com.github.libretube.databinding.DialogCustomInstanceBinding
import com.github.libretube.db.DatabaseHolder.Database import com.github.libretube.db.DatabaseHolder.Database
import com.github.libretube.db.obj.CustomInstance import com.github.libretube.db.obj.CustomInstance
import com.github.libretube.extensions.query
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.launch
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
class CustomInstanceDialog : DialogFragment() { class CustomInstanceDialog : DialogFragment() {
@ -28,13 +29,12 @@ class CustomInstanceDialog : DialogFragment() {
if (instanceName.isNotEmpty() && apiUrl.isNotEmpty() && frontendUrl.isNotEmpty()) { if (instanceName.isNotEmpty() && apiUrl.isNotEmpty() && frontendUrl.isNotEmpty()) {
if (apiUrl.toHttpUrlOrNull() != null && frontendUrl.toHttpUrlOrNull() != null) { if (apiUrl.toHttpUrlOrNull() != null && frontendUrl.toHttpUrlOrNull() != null) {
query { lifecycleScope.launch {
Database.customInstanceDao() Database.customInstanceDao()
.insertAll(CustomInstance(instanceName, apiUrl, frontendUrl)) .insertAll(listOf(CustomInstance(instanceName, apiUrl, frontendUrl)))
ActivityCompat.recreate(requireActivity())
dismiss()
} }
ActivityCompat.recreate(requireActivity())
dismiss()
} else { } else {
Toast.makeText(requireContext(), R.string.invalid_url, Toast.LENGTH_SHORT) Toast.makeText(requireContext(), R.string.invalid_url, Toast.LENGTH_SHORT)
.show() .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.databinding.DialogShareBinding
import com.github.libretube.db.DatabaseHolder.Database import com.github.libretube.db.DatabaseHolder.Database
import com.github.libretube.enums.ShareObjectType import com.github.libretube.enums.ShareObjectType
import com.github.libretube.extensions.awaitQuery
import com.github.libretube.helpers.PreferenceHelper import com.github.libretube.helpers.PreferenceHelper
import com.github.libretube.obj.ShareData import com.github.libretube.obj.ShareData
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
class ShareDialog( class ShareDialog(
private val id: String, private val id: String,
@ -32,7 +33,9 @@ class ShareDialog(
val instanceUrl = getCustomInstanceFrontendUrl() val instanceUrl = getCustomInstanceFrontendUrl()
val shareableTitle = getShareableTitle(shareData) val shareableTitle = getShareableTitle(shareData)
// add instanceUrl option if custom instance frontend url available // 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) { if (shareObjectType == ShareObjectType.VIDEO) {
setupTimeStampBinding() setupTimeStampBinding()
@ -97,15 +100,12 @@ class ShareDialog(
) )
// get the api urls of the other custom instances // get the api urls of the other custom instances
val customInstances = awaitQuery { val customInstances = runBlocking(Dispatchers.IO) {
Database.customInstanceDao().getAll() Database.customInstanceDao().getAll()
} }
// return the custom instance frontend url if available // return the custom instance frontend url if available
customInstances.forEach { instance -> return customInstances.firstOrNull { it.apiUrl == instancePref }?.frontendUrl.orEmpty()
if (instance.apiUrl == instancePref) return instance.frontendUrl
}
return ""
} }
private fun getShareableTitle(shareData: ShareData): String { 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.PIPED_INSTANCES_URL
import com.github.libretube.constants.PreferenceKeys import com.github.libretube.constants.PreferenceKeys
import com.github.libretube.db.DatabaseHolder.Database import com.github.libretube.db.DatabaseHolder.Database
import com.github.libretube.extensions.awaitQuery
import com.github.libretube.extensions.toastFromMainThread import com.github.libretube.extensions.toastFromMainThread
import com.github.libretube.helpers.PreferenceHelper import com.github.libretube.helpers.PreferenceHelper
import com.github.libretube.ui.base.BasePreferenceFragment 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.DeleteAccountDialog
import com.github.libretube.ui.dialogs.LoginDialog import com.github.libretube.ui.dialogs.LoginDialog
import com.github.libretube.ui.dialogs.LogoutDialog import com.github.libretube.ui.dialogs.LogoutDialog
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class InstanceSettings : BasePreferenceFragment() { class InstanceSettings : BasePreferenceFragment() {
override val titleResourceId: Int = R.string.instance override val titleResourceId: Int = R.string.instance
@ -82,10 +84,10 @@ class InstanceSettings : BasePreferenceFragment() {
val clearCustomInstances = findPreference<Preference>(PreferenceKeys.CLEAR_CUSTOM_INSTANCES) val clearCustomInstances = findPreference<Preference>(PreferenceKeys.CLEAR_CUSTOM_INSTANCES)
clearCustomInstances?.setOnPreferenceClickListener { clearCustomInstances?.setOnPreferenceClickListener {
awaitQuery { lifecycleScope.launch {
Database.customInstanceDao().deleteAll() Database.customInstanceDao().deleteAll()
ActivityCompat.recreate(requireActivity())
} }
ActivityCompat.recreate(requireActivity())
true true
} }
@ -116,7 +118,7 @@ class InstanceSettings : BasePreferenceFragment() {
private fun initCustomInstances(instancePref: ListPreference) { private fun initCustomInstances(instancePref: ListPreference) {
val appContext = requireContext().applicationContext val appContext = requireContext().applicationContext
lifecycleScope.launchWhenCreated { lifecycleScope.launchWhenCreated {
val customInstances = awaitQuery { val customInstances = withContext(Dispatchers.IO) {
Database.customInstanceDao().getAll() Database.customInstanceDao().getAll()
} }