mirror of https://github.com/tasks/tasks
Add AlarmRow composable
parent
00c80337de
commit
1cac090c9d
@ -0,0 +1,196 @@
|
|||||||
|
package org.tasks.compose.edit
|
||||||
|
|
||||||
|
import android.content.res.Configuration
|
||||||
|
import androidx.compose.foundation.clickable
|
||||||
|
import androidx.compose.foundation.interaction.MutableInteractionSource
|
||||||
|
import androidx.compose.foundation.layout.*
|
||||||
|
import androidx.compose.material.MaterialTheme
|
||||||
|
import androidx.compose.material.Text
|
||||||
|
import androidx.compose.material.ripple.rememberRipple
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.ui.ExperimentalComposeUiApi
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import androidx.compose.ui.res.colorResource
|
||||||
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.text.style.TextDecoration
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||||
|
import com.google.accompanist.permissions.ExperimentalPermissionsApi
|
||||||
|
import com.google.accompanist.permissions.PermissionStatus
|
||||||
|
import com.google.android.material.composethemeadapter.MdcTheme
|
||||||
|
import com.todoroo.astrid.ui.ReminderControlSet
|
||||||
|
import com.todoroo.astrid.ui.ReminderControlSetViewModel
|
||||||
|
import org.tasks.R
|
||||||
|
import org.tasks.compose.AddReminderDialog
|
||||||
|
import org.tasks.compose.DisabledText
|
||||||
|
import org.tasks.compose.TaskEditRow
|
||||||
|
import org.tasks.compose.collectAsStateLifecycleAware
|
||||||
|
import org.tasks.data.Alarm
|
||||||
|
import org.tasks.reminders.AlarmToString
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
@OptIn(ExperimentalPermissionsApi::class, ExperimentalComposeUiApi::class)
|
||||||
|
@Composable
|
||||||
|
fun AlarmRow(
|
||||||
|
vm: ReminderControlSetViewModel = viewModel(),
|
||||||
|
permissionStatus: PermissionStatus,
|
||||||
|
launchPermissionRequest: () -> Unit,
|
||||||
|
alarms: List<Alarm>,
|
||||||
|
ringMode: Int,
|
||||||
|
locale: Locale,
|
||||||
|
newAlarm: () -> Unit,
|
||||||
|
addAlarm: (Alarm) -> Unit,
|
||||||
|
deleteAlarm: (Alarm) -> Unit,
|
||||||
|
openRingType: () -> Unit,
|
||||||
|
) {
|
||||||
|
TaskEditRow(
|
||||||
|
iconRes = R.drawable.ic_outline_notifications_24px,
|
||||||
|
content = {
|
||||||
|
val viewState = vm.viewState.collectAsStateLifecycleAware()
|
||||||
|
val current: ReminderControlSet.ViewState = viewState.value
|
||||||
|
|
||||||
|
when (permissionStatus) {
|
||||||
|
PermissionStatus.Granted -> {
|
||||||
|
Alarms(
|
||||||
|
alarms = alarms,
|
||||||
|
ringMode = ringMode,
|
||||||
|
locale = locale,
|
||||||
|
addAlarm = newAlarm,
|
||||||
|
deleteAlarm = deleteAlarm,
|
||||||
|
openRingType = openRingType,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
is PermissionStatus.Denied -> {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(end = 16.dp)
|
||||||
|
.clickable {
|
||||||
|
launchPermissionRequest()
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
Spacer(modifier = Modifier.height(20.dp))
|
||||||
|
Text(
|
||||||
|
text = stringResource(id = R.string.enable_reminders),
|
||||||
|
color = colorResource(id = R.color.red_500),
|
||||||
|
)
|
||||||
|
Text(
|
||||||
|
text = stringResource(id = R.string.enable_reminders_description),
|
||||||
|
style = MaterialTheme.typography.caption,
|
||||||
|
color = colorResource(id = R.color.red_500),
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.height(20.dp))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AddReminderDialog.AddCustomReminderDialog(
|
||||||
|
openDialog = current.showCustomDialog,
|
||||||
|
addAlarm = addAlarm,
|
||||||
|
closeDialog = { vm.showCustomDialog(visible = false) }
|
||||||
|
)
|
||||||
|
|
||||||
|
AddReminderDialog.AddRandomReminderDialog(
|
||||||
|
openDialog = current.showRandomDialog,
|
||||||
|
addAlarm = addAlarm,
|
||||||
|
closeDialog = { vm.showRandomDialog(visible = false) }
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun Alarms(
|
||||||
|
alarms: List<Alarm>,
|
||||||
|
ringMode: Int,
|
||||||
|
locale: Locale,
|
||||||
|
addAlarm: () -> Unit,
|
||||||
|
deleteAlarm: (Alarm) -> Unit,
|
||||||
|
openRingType: () -> Unit,
|
||||||
|
) {
|
||||||
|
Column {
|
||||||
|
Spacer(modifier = Modifier.height(8.dp))
|
||||||
|
alarms.forEach { alarm ->
|
||||||
|
org.tasks.compose.AlarmRow(AlarmToString(LocalContext.current, locale).toString(alarm)) {
|
||||||
|
deleteAlarm(alarm)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Row(modifier = Modifier.fillMaxWidth()) {
|
||||||
|
DisabledText(
|
||||||
|
text = stringResource(id = R.string.add_reminder),
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(vertical = 12.dp)
|
||||||
|
.clickable(
|
||||||
|
interactionSource = remember { MutableInteractionSource() },
|
||||||
|
indication = rememberRipple(bounded = false),
|
||||||
|
onClick = { addAlarm() }
|
||||||
|
)
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.weight(1f))
|
||||||
|
if (alarms.isNotEmpty()) {
|
||||||
|
Text(
|
||||||
|
text = stringResource(
|
||||||
|
id = when (ringMode) {
|
||||||
|
2 -> R.string.ring_nonstop
|
||||||
|
1 -> R.string.ring_five_times
|
||||||
|
else -> R.string.ring_once
|
||||||
|
}
|
||||||
|
),
|
||||||
|
style = MaterialTheme.typography.body1.copy(
|
||||||
|
textDecoration = TextDecoration.Underline
|
||||||
|
),
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(vertical = 12.dp, horizontal = 16.dp)
|
||||||
|
.clickable(
|
||||||
|
interactionSource = remember { MutableInteractionSource() },
|
||||||
|
indication = rememberRipple(bounded = false),
|
||||||
|
onClick = openRingType
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Spacer(modifier = Modifier.height(8.dp))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalPermissionsApi::class)
|
||||||
|
@Preview(showBackground = true, widthDp = 320)
|
||||||
|
@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES, widthDp = 320)
|
||||||
|
@Composable
|
||||||
|
fun NoAlarms() {
|
||||||
|
MdcTheme {
|
||||||
|
AlarmRow(
|
||||||
|
alarms = emptyList(),
|
||||||
|
ringMode = 0,
|
||||||
|
locale = Locale.getDefault(),
|
||||||
|
newAlarm = {},
|
||||||
|
addAlarm = {},
|
||||||
|
deleteAlarm = {},
|
||||||
|
openRingType = {},
|
||||||
|
permissionStatus = PermissionStatus.Granted,
|
||||||
|
launchPermissionRequest = {}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalPermissionsApi::class)
|
||||||
|
@Preview(showBackground = true, widthDp = 320)
|
||||||
|
@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES, widthDp = 320)
|
||||||
|
@Composable
|
||||||
|
fun PermissionDenied() {
|
||||||
|
MdcTheme {
|
||||||
|
AlarmRow(
|
||||||
|
alarms = emptyList(),
|
||||||
|
ringMode = 0,
|
||||||
|
locale = Locale.getDefault(),
|
||||||
|
newAlarm = {},
|
||||||
|
addAlarm = {},
|
||||||
|
deleteAlarm = {},
|
||||||
|
openRingType = {},
|
||||||
|
permissionStatus = PermissionStatus.Denied(true),
|
||||||
|
launchPermissionRequest = {}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue