You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tasks/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActiv...

160 lines
5.9 KiB
Kotlin

package org.tasks.caldav
import android.os.Bundle
import androidx.activity.viewModels
import androidx.compose.material.FloatingActionButton
import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.res.painterResource
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.google.android.material.composethemeadapter.MdcTheme
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.tasks.R
import org.tasks.compose.ListSettingsComposables.PrincipalList
import org.tasks.compose.ShareInvite.ShareInviteDialog
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.data.PrincipalWithAccess
import org.tasks.data.dao.PrincipalDao
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavAccount.Companion.SERVER_NEXTCLOUD
import org.tasks.data.entity.CaldavAccount.Companion.SERVER_OWNCLOUD
import org.tasks.data.entity.CaldavAccount.Companion.SERVER_SABREDAV
import org.tasks.data.entity.CaldavAccount.Companion.SERVER_TASKS
import org.tasks.data.entity.CaldavCalendar
import org.tasks.data.entity.CaldavCalendar.Companion.ACCESS_OWNER
import javax.inject.Inject
@AndroidEntryPoint
class CaldavCalendarSettingsActivity : BaseCaldavCalendarSettingsActivity() {
@Inject lateinit var principalDao: PrincipalDao
private val viewModel: CaldavCalendarViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.inFlight.observe(this) { progressView.isVisible = it }
viewModel.error.observe(this) { throwable ->
throwable?.let {
requestFailed(it)
viewModel.error.value = null
}
}
viewModel.finish.observe(this) {
setResult(RESULT_OK, it)
finish()
}
caldavCalendar?.takeIf { it.id > 0 }?.let {
findViewById<ComposeView>(R.id.people).setContent {
MdcTheme {
val principals = principalDao.getPrincipals(it.id).collectAsStateLifecycleAware(initial = emptyList()).value
PrincipalList(
principals = principals,
onRemove = if (canRemovePrincipals) { { onRemove(it) } } else null,
)
}
}
}
if (caldavAccount.canShare && (isNew || caldavCalendar?.access == ACCESS_OWNER)) {
findViewById<ComposeView>(R.id.fab)
.apply { isVisible = true }
.setContent {
MdcTheme {
val openDialog = rememberSaveable { mutableStateOf(false) }
ShareInviteDialog(
openDialog,
email = caldavAccount.serverType != SERVER_OWNCLOUD
) { input ->
lifecycleScope.launch {
share(input)
openDialog.value = false
}
}
FloatingActionButton(onClick = { openDialog.value = true }) {
Icon(
painter = painterResource(R.drawable.ic_outline_person_add_24),
contentDescription = null,
tint = MaterialTheme.colors.onPrimary,
)
}
}
}
}
}
private val canRemovePrincipals: Boolean
get() = caldavCalendar?.access == ACCESS_OWNER && caldavAccount.canRemovePrincipal
private fun onRemove(principal: PrincipalWithAccess) {
if (requestInProgress()) {
return
}
dialogBuilder
.newDialog(R.string.remove_user)
.setMessage(R.string.remove_user_confirmation, principal.name, caldavCalendar?.name)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(R.string.ok) { _, _ -> removePrincipal(principal) }
.show()
}
private fun removePrincipal(principal: PrincipalWithAccess) = lifecycleScope.launch {
try {
viewModel.removeUser(caldavAccount, caldavCalendar!!, principal)
} catch (e: Exception) {
requestFailed(e)
}
}
override suspend fun createCalendar(caldavAccount: CaldavAccount, name: String, color: Int) {
caldavCalendar = viewModel.createCalendar(caldavAccount, name, color, selectedIcon)
}
override suspend fun updateNameAndColor(
account: CaldavAccount,
calendar: CaldavCalendar,
name: String,
color: Int
) {
viewModel.updateCalendar(account, calendar, name, color, selectedIcon)
}
override suspend fun deleteCalendar(
caldavAccount: CaldavAccount,
caldavCalendar: CaldavCalendar
) {
viewModel.deleteCalendar(caldavAccount, caldavCalendar)
}
private suspend fun share(email: String) {
if (isNew) {
viewModel.ignoreFinish = true
try {
save()
} finally {
viewModel.ignoreFinish = false
}
}
caldavCalendar?.let { viewModel.addUser(caldavAccount, it, email) }
}
companion object {
val CaldavAccount.canRemovePrincipal: Boolean
get() = when (serverType) {
SERVER_TASKS, SERVER_OWNCLOUD, SERVER_SABREDAV, SERVER_NEXTCLOUD -> true
else -> false
}
val CaldavAccount.canShare: Boolean
get() = when (serverType) {
SERVER_TASKS, SERVER_OWNCLOUD, SERVER_SABREDAV, SERVER_NEXTCLOUD -> true
else -> false
}
}
}