diff --git a/app/src/main/java/com/github/libretube/db/dao/SubscriptionGroupsDao.kt b/app/src/main/java/com/github/libretube/db/dao/SubscriptionGroupsDao.kt index 56fa1e187..7b4279f4d 100644 --- a/app/src/main/java/com/github/libretube/db/dao/SubscriptionGroupsDao.kt +++ b/app/src/main/java/com/github/libretube/db/dao/SubscriptionGroupsDao.kt @@ -11,6 +11,9 @@ interface SubscriptionGroupsDao { @Query("SELECT * FROM subscriptionGroups") suspend fun getAll(): List + @Query("SELECT EXISTS(SELECT * FROM subscriptionGroups WHERE name = :name)") + suspend fun exists(name: String): Boolean + @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun createGroup(subscriptionGroup: SubscriptionGroup) diff --git a/app/src/main/java/com/github/libretube/ui/sheets/EditChannelGroupSheet.kt b/app/src/main/java/com/github/libretube/ui/sheets/EditChannelGroupSheet.kt index 728f6a59a..c8ff20315 100644 --- a/app/src/main/java/com/github/libretube/ui/sheets/EditChannelGroupSheet.kt +++ b/app/src/main/java/com/github/libretube/ui/sheets/EditChannelGroupSheet.kt @@ -9,14 +9,17 @@ import androidx.core.widget.addTextChangedListener import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager +import com.github.libretube.R import com.github.libretube.api.SubscriptionHelper import com.github.libretube.api.obj.Subscription import com.github.libretube.databinding.DialogEditChannelGroupBinding +import com.github.libretube.db.DatabaseHolder import com.github.libretube.db.obj.SubscriptionGroup import com.github.libretube.ui.adapters.SubscriptionGroupChannelsAdapter import com.github.libretube.ui.models.SubscriptionsViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext class EditChannelGroupSheet( @@ -31,13 +34,17 @@ class EditChannelGroupSheet( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { + ): View { binding = DialogEditChannelGroupBinding.inflate(layoutInflater) binding.groupName.setText(group.name) binding.channelsRV.layoutManager = LinearLayoutManager(context) fetchSubscriptions() + binding.groupName.addTextChangedListener { + updateConfirmStatus() + } + binding.searchInput.addTextChangedListener { showChannels(channels, it?.toString()) } @@ -46,6 +53,7 @@ class EditChannelGroupSheet( dismiss() } + updateConfirmStatus() binding.confirm.setOnClickListener { group.name = binding.groupName.text.toString() if (group.name.isBlank()) return@setOnClickListener @@ -78,8 +86,33 @@ class EditChannelGroupSheet( group ) { group = it + updateConfirmStatus() } binding.subscriptionsContainer.isVisible = true binding.progress.isVisible = false } + + private fun updateConfirmStatus() { + with(binding) { + val name = groupName.text.toString() + groupName.error = getGroupNameError(name) + + confirm.isEnabled = groupName.error == null && group.channels.isNotEmpty() + } + } + + private fun getGroupNameError(name: String): String? { + if (name.isBlank()) { + return getString(R.string.group_name_error_empty) + } + + val groupExists = runBlocking(Dispatchers.IO) { + DatabaseHolder.Database.subscriptionGroupsDao().exists(name) + } + if (groupExists) { + return getString(R.string.group_name_error_exists) + } + + return null + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 816454555..aad505270 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -406,6 +406,8 @@ Channel groups New Group name + Please enter a name + Please choose a name that is unique Edit group Play automatically Start playing video automatically when selecting